From fcf8e24d7a4eb7ec6f355729f20cad9c14ccb331 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 9 Oct 2021 06:12:00 +0100 Subject: [PATCH 001/325] Release 2709: removed generated schemas from git --- .gitignore | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a5a3a734..3d712cc1 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,8 @@ yarn-error.log* # keystone .keystone -app.db \ No newline at end of file +app.db + +migrations/migration_lock.toml +schema.prisma +schema.graphql \ No newline at end of file From 3b42dc86089591e2ee41b4f58eba42d16200fd53 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 9 Oct 2021 06:23:43 +0100 Subject: [PATCH 002/325] Release 2714: git having problems syncing : 5 --- .gitignore | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitignore b/.gitignore index 3d712cc1..7ea499fb 100644 --- a/.gitignore +++ b/.gitignore @@ -38,5 +38,3 @@ yarn-error.log* app.db migrations/migration_lock.toml -schema.prisma -schema.graphql \ No newline at end of file From f4986544a7e49a93758bfcdff089e62ca82118a9 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 9 Oct 2021 06:49:32 +0100 Subject: [PATCH 003/325] Release 2716: git having problems syncing : 8 --- .gitignore | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 7ea499fb..dc06d382 100644 --- a/.gitignore +++ b/.gitignore @@ -1,19 +1,19 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. # dependencies -/node_modules -/.pnp +node_modules/ +.pnp .pnp.js # testing -/coverage +coverage/ # next.js -/.next/ -/out/ +.next/ +out/ # production -/build +build/ # misc .DS_Store @@ -34,7 +34,7 @@ yarn-error.log* .vercel # keystone -.keystone +.keystone/ app.db migrations/migration_lock.toml From 42f23ebe6aee0172f495625b0cf42de9da533fd9 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 9 Oct 2021 10:19:56 +0100 Subject: [PATCH 004/325] Release 2719: -a --- .eslintrc.json | 3 + .gitignore | 80 +- README.md | 130 +- keystone.ts | 104 +- .../migration.sql | 146 +- next-env.d.ts | 12 +- next.config.js | 20 +- package.json | 88 +- pages/_app.tsx | 46 +- pages/index.tsx | 180 +- pages/post/[slug].tsx | 132 +- pages/signin.tsx | 168 +- pages/signup.tsx | 170 +- schema.ts | 26 +- schema/access.ts | 94 +- schema/content.ts | 264 +- schema/fields/content/components.tsx | 402 +- schema/fields/content/renderers.tsx | 376 +- schema/fields/githubRepos/field.ts | 180 +- schema/mutations.ts | 116 +- schema/polls.ts | 192 +- schema/users.ts | 264 +- tailwind.config.js | 32 +- tsconfig.json | 158 +- yarn.lock | 14034 ++++++++-------- 25 files changed, 9111 insertions(+), 8306 deletions(-) create mode 100644 .eslintrc.json diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000..c8b03e11 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/.gitignore b/.gitignore index dc06d382..c458a73b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,40 +1,40 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -node_modules/ -.pnp -.pnp.js - -# testing -coverage/ - -# next.js -.next/ -out/ - -# production -build/ - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env.local -.env.development.local -.env.test.local -.env.production.local - -# vercel -.vercel - -# keystone -.keystone/ -app.db - -migrations/migration_lock.toml +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +node_modules/ +.pnp +.pnp.js + +# testing +coverage/ + +# next.js +.next/ +out/ + +# production +build/ + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env.local +.env.development.local +.env.test.local +.env.production.local + +# vercel +.vercel + +# keystone +.keystone/ +app.db + +migrations/migration_lock.toml diff --git a/README.md b/README.md index 1f9d5f14..10614e13 100644 --- a/README.md +++ b/README.md @@ -1,65 +1,65 @@ -# Prisma Day 2021 Workshop - -This is the sample app built for Jed's Prisma Day 2021 Workshop. - -It's both the front and back-end for a Blog built with Prisma, KeystoneJS, GraphQL, Next.js and Tailwind. - -The App includes public auth and signup, role-based access control, and custom design-system based components in the Content field. Content authors can embed Polls in post content, and authenticated visitors can vote on responses. - -## About KeystoneJS - -**Keystone 6** is the next-gen CMS for Node.js built with Prisma, Apollo Server, and Next.js. - -Fully open source, it's not just a great headless CMS, it's also a powerful API server and app back-end. - -Learn more at [keystonejs.com](https://keystonejs.com) - -## Running this app - -Make sure you have: - -- Node v12 or v14 -- Yarn -- Postgres - -Then, clone this repo and run `yarn` to install the dependencies. - -### Starting the API - -Start the API Server first by running `yarn api:dev`. This will start Keystone's GraphQL API and Admin UI on `localhost:3000` - -The first time you open that link you will be prompted to create a new user. - -### Starting the Site - -With the API running, in a separate terminal run `yarn site:dev`. This will start the front-end Next.js app on `localhost:8000` - -## About the codebase - -The Keystone and Next.js app are colocated in the same repo for ease of demonstration, but you'd often separate them into different packages in a monorepo or even separate repositories. - -The back-end files include: - -``` -keystone.ts -schema.graphql (generated) -schema.prisma (generated) -schema.ts -schema/* -``` - -The front-end files include: - -``` -components/* -pages/* -next-env.d.ts -next.config.js -postcss.config.js -tailwind.config.js -utils.js -``` - -## License - -Copyright (c) 2021 Thinkmill Labs Pty Ltd. Licensed under the MIT License. +# Prisma Day 2021 Workshop + +This is the sample app built for Jed's Prisma Day 2021 Workshop. + +It's both the front and back-end for a Blog built with Prisma, KeystoneJS, GraphQL, Next.js and Tailwind. + +The App includes public auth and signup, role-based access control, and custom design-system based components in the Content field. Content authors can embed Polls in post content, and authenticated visitors can vote on responses. + +## About KeystoneJS + +**Keystone 6** is the next-gen CMS for Node.js built with Prisma, Apollo Server, and Next.js. + +Fully open source, it's not just a great headless CMS, it's also a powerful API server and app back-end. + +Learn more at [keystonejs.com](https://keystonejs.com) + +## Running this app + +Make sure you have: + +- Node v12 or v14 +- Yarn +- Postgres + +Then, clone this repo and run `yarn` to install the dependencies. + +### Starting the API + +Start the API Server first by running `yarn api:dev`. This will start Keystone's GraphQL API and Admin UI on `localhost:3000` + +The first time you open that link you will be prompted to create a new user. + +### Starting the Site + +With the API running, in a separate terminal run `yarn site:dev`. This will start the front-end Next.js app on `localhost:8000` + +## About the codebase + +The Keystone and Next.js app are colocated in the same repo for ease of demonstration, but you'd often separate them into different packages in a monorepo or even separate repositories. + +The back-end files include: + +``` +keystone.ts +schema.graphql (generated) +schema.prisma (generated) +schema.ts +schema/* +``` + +The front-end files include: + +``` +components/* +pages/* +next-env.d.ts +next.config.js +postcss.config.js +tailwind.config.js +utils.js +``` + +## License + +Copyright (c) 2021 Thinkmill Labs Pty Ltd. Licensed under the MIT License. diff --git a/keystone.ts b/keystone.ts index c9627282..5963d12c 100644 --- a/keystone.ts +++ b/keystone.ts @@ -1,52 +1,52 @@ -import { config } from '@keystone-next/keystone'; -import { statelessSessions } from '@keystone-next/keystone/session'; -import { createAuth } from '@keystone-next/auth'; - -import { lists, extendGraphqlSchema } from './schema'; -import { rules } from './schema/access'; - -const dbUrl = - process.env.DATABASE_URL || - `postgres://${process.env.USER}@localhost/prisma-day-workshop`; - -const sessionSecret = - process.env.SESSION_SECERT || - 'iLqbHhm7qwiBNc8KgL4NQ8tD8fFVhNhNqZ2nRdprgnKNjgJHgvitWx6DPoZJpYHa'; - -const auth = createAuth({ - identityField: 'email', - secretField: 'password', - listKey: 'User', - sessionData: `id name role { - canManageContent - canManageUsers - }`, - initFirstItem: { - fields: ['name', 'email', 'password'], - itemData: { - role: { - create: { - name: 'Super User', - canManageContent: true, - canManageUsers: true, - }, - }, - }, - }, -}); - -export default auth.withAuth( - config({ - db: { - url: dbUrl, - provider: 'postgresql', - useMigrations: true, - }, - ui: { isAccessAllowed: rules.canUseAdminUI }, - lists, - session: statelessSessions({ - secret: sessionSecret, - }), - extendGraphqlSchema, - }) -); +import { config } from '@keystone-next/keystone'; +import { statelessSessions } from '@keystone-next/keystone/session'; +import { createAuth } from '@keystone-next/auth'; + +import { lists, extendGraphqlSchema } from './schema'; +import { rules } from './schema/access'; + +const dbUrl = + process.env.DATABASE_URL || + `postgres://${process.env.USER}@localhost/prisma-day-workshop`; + +const sessionSecret = + process.env.SESSION_SECERT || + 'iLqbHhm7qwiBNc8KgL4NQ8tD8fFVhNhNqZ2nRdprgnKNjgJHgvitWx6DPoZJpYHa'; + +const auth = createAuth({ + identityField: 'email', + secretField: 'password', + listKey: 'User', + sessionData: `id name role { + canManageContent + canManageUsers + }`, + initFirstItem: { + fields: ['name', 'email', 'password'], + itemData: { + role: { + create: { + name: 'Super User', + canManageContent: true, + canManageUsers: true, + }, + }, + }, + }, +}); + +export default auth.withAuth( + config({ + db: { + url: dbUrl, + provider: 'postgresql', + useMigrations: true, + }, + ui: { isAccessAllowed: rules.canUseAdminUI }, + lists, + session: statelessSessions({ + secret: sessionSecret, + }), + extendGraphqlSchema, + }) +); diff --git a/migrations/20211008010740_upgrade_to_keystone_26/migration.sql b/migrations/20211008010740_upgrade_to_keystone_26/migration.sql index 4a065602..572c0430 100644 --- a/migrations/20211008010740_upgrade_to_keystone_26/migration.sql +++ b/migrations/20211008010740_upgrade_to_keystone_26/migration.sql @@ -1,73 +1,73 @@ -/* - Warnings: - - - Made the column `name` on table `Label` required. This step will fail if there are existing NULL values in that column. - - Made the column `label` on table `Poll` required. This step will fail if there are existing NULL values in that column. - - Made the column `label` on table `PollAnswer` required. This step will fail if there are existing NULL values in that column. - - Made the column `title` on table `Post` required. This step will fail if there are existing NULL values in that column. - - Made the column `slug` on table `Post` required. This step will fail if there are existing NULL values in that column. - - Made the column `intro` on table `Post` required. This step will fail if there are existing NULL values in that column. - - Made the column `content` on table `Post` required. This step will fail if there are existing NULL values in that column. - - Made the column `name` on table `Role` required. This step will fail if there are existing NULL values in that column. - - Made the column `canManageContent` on table `Role` required. This step will fail if there are existing NULL values in that column. - - Made the column `canManageUsers` on table `Role` required. This step will fail if there are existing NULL values in that column. - - Made the column `name` on table `User` required. This step will fail if there are existing NULL values in that column. - - Made the column `email` on table `User` required. This step will fail if there are existing NULL values in that column. - - Made the column `password` on table `User` required. This step will fail if there are existing NULL values in that column. - - Made the column `githubUsername` on table `User` required. This step will fail if there are existing NULL values in that column. - -*/ --- AlterTable -ALTER TABLE "Label" ALTER COLUMN "name" SET NOT NULL, -ALTER COLUMN "name" SET DEFAULT E''; - --- AlterTable -ALTER TABLE "Poll" ALTER COLUMN "label" SET NOT NULL, -ALTER COLUMN "label" SET DEFAULT E''; - --- AlterTable -ALTER TABLE "PollAnswer" ALTER COLUMN "label" SET NOT NULL, -ALTER COLUMN "label" SET DEFAULT E''; - --- AlterTable -ALTER TABLE "Post" ALTER COLUMN "title" SET NOT NULL, -ALTER COLUMN "title" SET DEFAULT E'', -ALTER COLUMN "slug" SET NOT NULL, -ALTER COLUMN "slug" SET DEFAULT E'', -ALTER COLUMN "status" SET DEFAULT E'draft', -ALTER COLUMN "intro" SET NOT NULL, -ALTER COLUMN "intro" SET DEFAULT E'[{"type":"paragraph","children":[{"text":""}]}]', -ALTER COLUMN "content" SET NOT NULL, -ALTER COLUMN "content" SET DEFAULT E'[{"type":"paragraph","children":[{"text":""}]}]'; - --- AlterTable -ALTER TABLE "Role" ALTER COLUMN "name" SET NOT NULL, -ALTER COLUMN "name" SET DEFAULT E'', -ALTER COLUMN "canManageContent" SET NOT NULL, -ALTER COLUMN "canManageContent" SET DEFAULT false, -ALTER COLUMN "canManageUsers" SET NOT NULL, -ALTER COLUMN "canManageUsers" SET DEFAULT false; - --- AlterTable -ALTER TABLE "User" ALTER COLUMN "name" SET NOT NULL, -ALTER COLUMN "name" SET DEFAULT E'', -ALTER COLUMN "email" SET NOT NULL, -ALTER COLUMN "email" SET DEFAULT E'', -ALTER COLUMN "password" SET NOT NULL, -ALTER COLUMN "githubUsername" SET NOT NULL, -ALTER COLUMN "githubUsername" SET DEFAULT E''; - --- RenameIndex -ALTER INDEX "PollAnswer.poll_index" RENAME TO "PollAnswer_poll_idx"; - --- RenameIndex -ALTER INDEX "Post.author_index" RENAME TO "Post_author_idx"; - --- RenameIndex -ALTER INDEX "Post.slug_unique" RENAME TO "Post_slug_key"; - --- RenameIndex -ALTER INDEX "User.email_unique" RENAME TO "User_email_key"; - --- RenameIndex -ALTER INDEX "User.role_index" RENAME TO "User_role_idx"; +/* + Warnings: + + - Made the column `name` on table `Label` required. This step will fail if there are existing NULL values in that column. + - Made the column `label` on table `Poll` required. This step will fail if there are existing NULL values in that column. + - Made the column `label` on table `PollAnswer` required. This step will fail if there are existing NULL values in that column. + - Made the column `title` on table `Post` required. This step will fail if there are existing NULL values in that column. + - Made the column `slug` on table `Post` required. This step will fail if there are existing NULL values in that column. + - Made the column `intro` on table `Post` required. This step will fail if there are existing NULL values in that column. + - Made the column `content` on table `Post` required. This step will fail if there are existing NULL values in that column. + - Made the column `name` on table `Role` required. This step will fail if there are existing NULL values in that column. + - Made the column `canManageContent` on table `Role` required. This step will fail if there are existing NULL values in that column. + - Made the column `canManageUsers` on table `Role` required. This step will fail if there are existing NULL values in that column. + - Made the column `name` on table `User` required. This step will fail if there are existing NULL values in that column. + - Made the column `email` on table `User` required. This step will fail if there are existing NULL values in that column. + - Made the column `password` on table `User` required. This step will fail if there are existing NULL values in that column. + - Made the column `githubUsername` on table `User` required. This step will fail if there are existing NULL values in that column. + +*/ +-- AlterTable +ALTER TABLE "Label" ALTER COLUMN "name" SET NOT NULL, +ALTER COLUMN "name" SET DEFAULT E''; + +-- AlterTable +ALTER TABLE "Poll" ALTER COLUMN "label" SET NOT NULL, +ALTER COLUMN "label" SET DEFAULT E''; + +-- AlterTable +ALTER TABLE "PollAnswer" ALTER COLUMN "label" SET NOT NULL, +ALTER COLUMN "label" SET DEFAULT E''; + +-- AlterTable +ALTER TABLE "Post" ALTER COLUMN "title" SET NOT NULL, +ALTER COLUMN "title" SET DEFAULT E'', +ALTER COLUMN "slug" SET NOT NULL, +ALTER COLUMN "slug" SET DEFAULT E'', +ALTER COLUMN "status" SET DEFAULT E'draft', +ALTER COLUMN "intro" SET NOT NULL, +ALTER COLUMN "intro" SET DEFAULT E'[{"type":"paragraph","children":[{"text":""}]}]', +ALTER COLUMN "content" SET NOT NULL, +ALTER COLUMN "content" SET DEFAULT E'[{"type":"paragraph","children":[{"text":""}]}]'; + +-- AlterTable +ALTER TABLE "Role" ALTER COLUMN "name" SET NOT NULL, +ALTER COLUMN "name" SET DEFAULT E'', +ALTER COLUMN "canManageContent" SET NOT NULL, +ALTER COLUMN "canManageContent" SET DEFAULT false, +ALTER COLUMN "canManageUsers" SET NOT NULL, +ALTER COLUMN "canManageUsers" SET DEFAULT false; + +-- AlterTable +ALTER TABLE "User" ALTER COLUMN "name" SET NOT NULL, +ALTER COLUMN "name" SET DEFAULT E'', +ALTER COLUMN "email" SET NOT NULL, +ALTER COLUMN "email" SET DEFAULT E'', +ALTER COLUMN "password" SET NOT NULL, +ALTER COLUMN "githubUsername" SET NOT NULL, +ALTER COLUMN "githubUsername" SET DEFAULT E''; + +-- RenameIndex +ALTER INDEX "PollAnswer.poll_index" RENAME TO "PollAnswer_poll_idx"; + +-- RenameIndex +ALTER INDEX "Post.author_index" RENAME TO "Post_author_idx"; + +-- RenameIndex +ALTER INDEX "Post.slug_unique" RENAME TO "Post_slug_key"; + +-- RenameIndex +ALTER INDEX "User.email_unique" RENAME TO "User_email_key"; + +-- RenameIndex +ALTER INDEX "User.role_index" RENAME TO "User_role_idx"; diff --git a/next-env.d.ts b/next-env.d.ts index 9bc3dd46..534a39ea 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,6 +1,6 @@ -/// -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +/// +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/next.config.js b/next.config.js index 7ebcc584..30ca75e2 100644 --- a/next.config.js +++ b/next.config.js @@ -1,10 +1,10 @@ -module.exports = { - async rewrites() { - return [ - { - source: '/api/graphql', - destination: 'http://localhost:3000/api/graphql', - }, - ]; - }, -}; +module.exports = { + async rewrites() { + return [ + { + source: '/api/graphql', + destination: 'http://localhost:3000/api/graphql', + }, + ]; + }, +}; diff --git a/package.json b/package.json index 65dacae9..bcf319bd 100644 --- a/package.json +++ b/package.json @@ -1,43 +1,45 @@ -{ - "name": "keystone-react-todo-demo", - "version": "1.0.0", - "private": true, - "scripts": { - "postinstall": "keystone-next postinstall", - "site:dev": "next dev -p 8000", - "site:build": "next build", - "site:start": "next start -p 8000", - "dev": "keystone-next dev", - "start": "keystone-next start", - "build": "keystone-next build", - "migrate": "keystone-next prisma migrate deploy", - "format": "prettier --write \"**/*.ts\"" - }, - "dependencies": { - "@keystone-next/auth": "33.0.0", - "@keystone-next/document-renderer": "^4.0.0", - "@keystone-next/fields-document": "^10.0.0", - "@keystone-next/keystone": "^26.0.1", - "classnames": "^2.3.1", - "graphql": "^15.6.1", - "next": "^11.1.2", - "node-fetch": "^2.6.1", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "urql": "^2.0.5" - }, - "devDependencies": { - "@tailwindcss/forms": "^0.3.3", - "@types/react": "17.0.27", - "autoprefixer": "^10.3.7", - "postcss": "^8.3.9", - "prettier": "^2.4.1", - "tailwindcss": "^2.2.4", - "typescript": "4.4.3" - }, - "prettier": { - "singleQuote": true, - "trailingComma": "es5", - "arrowParens": "avoid" - } -} +{ + "name": "keystone-react-todo-demo", + "version": "1.0.0", + "private": true, + "scripts": { + "postinstall": "keystone-next postinstall", + "site:dev": "next dev -p 8000", + "site:build": "next build", + "site:start": "next start -p 8000", + "dev": "keystone-next dev", + "start": "keystone-next start", + "build": "keystone-next build", + "migrate": "keystone-next prisma migrate deploy", + "format": "prettier --write \"**/*.ts\"" + }, + "dependencies": { + "@keystone-next/auth": "33.0.0", + "@keystone-next/document-renderer": "^4.0.0", + "@keystone-next/fields-document": "^10.0.0", + "@keystone-next/keystone": "^26.0.1", + "classnames": "^2.3.1", + "graphql": "^15.6.1", + "next": "^11.1.2", + "node-fetch": "^2.6.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "urql": "^2.0.5" + }, + "devDependencies": { + "@tailwindcss/forms": "^0.3.3", + "@types/react": "17.0.27", + "autoprefixer": "^10.3.7", + "eslint": "7.32.0", + "eslint-config-next": "11.1.2", + "postcss": "^8.3.9", + "prettier": "^2.4.1", + "tailwindcss": "^2.2.4", + "typescript": "4.4.3" + }, + "prettier": { + "singleQuote": true, + "trailingComma": "es5", + "arrowParens": "avoid" + } +} diff --git a/pages/_app.tsx b/pages/_app.tsx index 500a029f..2f47b738 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,23 +1,23 @@ -import 'tailwindcss/tailwind.css'; -import type { AppProps } from 'next/app'; -import { createClient, Provider } from 'urql'; - -import { AuthProvider } from '../components/auth'; - -export const client = createClient({ - url: - typeof window === undefined - ? 'http://localhost:3000/api/graphql' - : '/api/graphql', -}); - -function MyApp({ Component, pageProps }: AppProps) { - return ( - - - - - - ); -} -export default MyApp; +import 'tailwindcss/tailwind.css'; +import type { AppProps } from 'next/app'; +import { createClient, Provider } from 'urql'; + +import { AuthProvider } from '../components/auth'; + +export const client = createClient({ + url: + typeof window === undefined + ? 'http://localhost:3000/api/graphql' + : '/api/graphql', +}); + +function MyApp({ Component, pageProps }: AppProps) { + return ( + + + + + + ); +} +export default MyApp; diff --git a/pages/index.tsx b/pages/index.tsx index 3739309a..6df6b3ed 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,90 +1,90 @@ -import React, { useState } from 'react'; -import { GetStaticPropsContext } from 'next'; - -import { fetchGraphQL, gql } from '../utils'; -import { DocumentRenderer } from '../schema/fields/content/renderers'; - -import { Container } from '../components/ui/layout'; -import { Link } from '../components/ui/link'; -import { H1 } from '../components/ui/typography'; -import { useAuth } from '../components/auth'; - -type Post = { - id: string; - slug: string; - title: string; - publishedDate: string; - intro: { - document: any; - }; - author: { - name: string; - }; -}; - -export default function Home({ posts }: { posts: Post[] }) { - const auth = useAuth(); - return ( - -

My Blog

- {auth.ready && auth.sessionData ? ( -

- You're signed in as {auth.sessionData.name} |{' '} - -

- ) : ( -

- Sign In | Join -

- )} - -
- {posts.map(post => { - const date = post.publishedDate - ? new Date(post.publishedDate).toLocaleDateString() - : null; - return ( -
-
{date}
-

- {post.title} -

- {post.intro?.document && ( - - )} -
- Read the full story -
-
- ); - })} -
-
- ); -} - -export async function getStaticProps({ params }: GetStaticPropsContext) { - const data = await fetchGraphQL( - gql` - query { - posts( - where: { status: { equals: "published" } } - orderBy: [{ publishedDate: desc }] - ) { - id - title - slug - publishedDate - intro { - document(hydrateRelationships: true) - } - author { - id - name - } - } - } - ` - ); - return { props: { posts: data.posts }, revalidate: 60 }; -} +import React, { useState } from 'react'; +import { GetStaticPropsContext } from 'next'; + +import { fetchGraphQL, gql } from '../utils'; +import { DocumentRenderer } from '../schema/fields/content/renderers'; + +import { Container } from '../components/ui/layout'; +import { Link } from '../components/ui/link'; +import { H1 } from '../components/ui/typography'; +import { useAuth } from '../components/auth'; + +type Post = { + id: string; + slug: string; + title: string; + publishedDate: string; + intro: { + document: any; + }; + author: { + name: string; + }; +}; + +export default function Home({ posts }: { posts: Post[] }) { + const auth = useAuth(); + return ( + +

My Blog

+ {auth.ready && auth.sessionData ? ( +

+ You're signed in as {auth.sessionData.name} |{' '} + +

+ ) : ( +

+ Sign In | Join +

+ )} + +
+ {posts.map(post => { + const date = post.publishedDate + ? new Date(post.publishedDate).toLocaleDateString() + : null; + return ( +
+
{date}
+

+ {post.title} +

+ {post.intro?.document && ( + + )} +
+ Read the full story +
+
+ ); + })} +
+
+ ); +} + +export async function getStaticProps({ params }: GetStaticPropsContext) { + const data = await fetchGraphQL( + gql` + query { + posts( + where: { status: { equals: "published" } } + orderBy: [{ publishedDate: desc }] + ) { + id + title + slug + publishedDate + intro { + document(hydrateRelationships: true) + } + author { + id + name + } + } + } + ` + ); + return { props: { posts: data.posts }, revalidate: 60 }; +} diff --git a/pages/post/[slug].tsx b/pages/post/[slug].tsx index 074a3429..79a472c1 100644 --- a/pages/post/[slug].tsx +++ b/pages/post/[slug].tsx @@ -1,66 +1,66 @@ -import { GetStaticPathsResult, GetStaticPropsContext } from 'next'; -import React from 'react'; - -import { fetchGraphQL, gql } from '../../utils'; -import { DocumentRenderer } from '../../schema/fields/content/renderers'; - -import { Container, HomeLink } from '../../components/ui/layout'; -import { Link } from '../../components/ui/link'; -import { H1 } from '../../components/ui/typography'; - -export default function Post({ post }: { post: any }) { - return ( - - -
-

{post.title}

- {post.author?.name && ( -

- By {post.author.name} -

- )} - {post.content?.document && ( - - )} -
-
- ); -} - -export async function getStaticPaths(): Promise { - const data = await fetchGraphQL( - gql` - query { - posts { - slug - } - } - ` - ); - return { - paths: data.posts.map((post: any) => ({ params: { slug: post.slug } })), - fallback: 'blocking', - }; -} - -export async function getStaticProps({ params }: GetStaticPropsContext) { - const data = await fetchGraphQL( - gql` - query ($slug: String!) { - post(where: { slug: $slug }) { - title - content { - document(hydrateRelationships: true) - } - publishedDate - author { - id - name - } - } - } - `, - { slug: params!.slug } - ); - return { props: { post: data.post }, revalidate: 60 }; -} +import { GetStaticPathsResult, GetStaticPropsContext } from 'next'; +import React from 'react'; + +import { fetchGraphQL, gql } from '../../utils'; +import { DocumentRenderer } from '../../schema/fields/content/renderers'; + +import { Container, HomeLink } from '../../components/ui/layout'; +import { Link } from '../../components/ui/link'; +import { H1 } from '../../components/ui/typography'; + +export default function Post({ post }: { post: any }) { + return ( + + +
+

{post.title}

+ {post.author?.name && ( +

+ By {post.author.name} +

+ )} + {post.content?.document && ( + + )} +
+
+ ); +} + +export async function getStaticPaths(): Promise { + const data = await fetchGraphQL( + gql` + query { + posts { + slug + } + } + ` + ); + return { + paths: data.posts.map((post: any) => ({ params: { slug: post.slug } })), + fallback: 'blocking', + }; +} + +export async function getStaticProps({ params }: GetStaticPropsContext) { + const data = await fetchGraphQL( + gql` + query ($slug: String!) { + post(where: { slug: $slug }) { + title + content { + document(hydrateRelationships: true) + } + publishedDate + author { + id + name + } + } + } + `, + { slug: params!.slug } + ); + return { props: { post: data.post }, revalidate: 60 }; +} diff --git a/pages/signin.tsx b/pages/signin.tsx index bd46651d..558bcfdc 100644 --- a/pages/signin.tsx +++ b/pages/signin.tsx @@ -1,84 +1,84 @@ -import React, { useState } from 'react'; - -import { Button } from '../components/ui/controls'; -import { Container, HomeLink } from '../components/ui/layout'; -import { H1 } from '../components/ui/typography'; -import { FieldContainer, FieldLabel, TextInput } from '../components/ui/forms'; -import { Link } from '../components/ui/link'; -import { useRouter } from 'next/router'; -import { useAuth } from '../components/auth'; - -export default function SigninPage() { - const auth = useAuth(); - const [email, setEmail] = useState('admin@demo.com'); - const [password, setPassword] = useState('password'); - const [error, setError] = useState(''); - - // const router = useRouter(); - - const signIn = async () => { - if (!auth.ready) { - setError('Auth is not ready, try again in a moment.'); - return; - } - if (!email.length || !password.length) { - setError('Please enter a username and password.'); - return; - } - setError(''); - const result = await auth.signIn({ email, password }); - if (result.success) { - // FIXME: there's a cache issue with Urql where it's not reloading the - // current user properly if we do a client-side redirect here. - // router.push('/'); - top.location.href = '/'; - } else { - setEmail(''); - setPassword(''); - setError(result.message); - } - }; - - return ( - - -

Sign in

- {error ?
{error}
: null} -
{ - event.preventDefault(); - signIn(); - }} - > - - Email address - { - setEmail(event.target.value); - }} - /> - - - Password - { - setPassword(event.target.value); - }} - /> - - -
-
-
- Want to join instead? -
-
- ); -} +import React, { useState } from 'react'; + +import { Button } from '../components/ui/controls'; +import { Container, HomeLink } from '../components/ui/layout'; +import { H1 } from '../components/ui/typography'; +import { FieldContainer, FieldLabel, TextInput } from '../components/ui/forms'; +import { Link } from '../components/ui/link'; +import { useRouter } from 'next/router'; +import { useAuth } from '../components/auth'; + +export default function SigninPage() { + const auth = useAuth(); + const [email, setEmail] = useState('admin@demo.com'); + const [password, setPassword] = useState('password'); + const [error, setError] = useState(''); + + // const router = useRouter(); + + const signIn = async () => { + if (!auth.ready) { + setError('Auth is not ready, try again in a moment.'); + return; + } + if (!email.length || !password.length) { + setError('Please enter a username and password.'); + return; + } + setError(''); + const result = await auth.signIn({ email, password }); + if (result.success) { + // FIXME: there's a cache issue with Urql where it's not reloading the + // current user properly if we do a client-side redirect here. + // router.push('/'); + top!.location!.href = '/'; + } else { + setEmail(''); + setPassword(''); + setError(result.message); + } + }; + + return ( + + +

Sign in

+ {error ?
{error}
: null} +
{ + event.preventDefault(); + signIn(); + }} + > + + Email address + { + setEmail(event.target.value); + }} + /> + + + Password + { + setPassword(event.target.value); + }} + /> + + +
+
+
+ Want to join instead? +
+
+ ); +} diff --git a/pages/signup.tsx b/pages/signup.tsx index 555246b7..e89b87d3 100644 --- a/pages/signup.tsx +++ b/pages/signup.tsx @@ -1,85 +1,85 @@ -import { useState } from 'react'; -import { gql, useMutation } from 'urql'; - -import { Button } from '../components/ui/controls'; -import { Container, HomeLink } from '../components/ui/layout'; -import { H1 } from '../components/ui/typography'; -import { FieldContainer, FieldLabel, TextInput } from '../components/ui/forms'; -import { useRouter } from 'next/router'; -import { Link } from '../components/ui/link'; - -export default function SignupPage() { - const [{ error, data }, signup] = useMutation(gql` - mutation ($name: String!, $email: String!, $password: String!) { - createUser(data: { name: $name, email: $email, password: $password }) { - __typename - id - } - authenticateUserWithPassword(email: $email, password: $password) { - __typename - } - } - `); - const [name, setName] = useState(''); - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); - - const router = useRouter(); - - return ( - - -

Join

-
{ - event.preventDefault(); - signup({ name, email, password }).then(result => { - if (result.data?.createUser) { - // FIXME: there's a cache issue with Urql where it's not reloading the - // current user properly if we do a client-side redirect here. - // router.push('/'); - top.location.href = '/'; - } - }); - }} - > - {error &&
{error.toString()}
} - - Name - { - setName(event.target.value); - }} - /> - - - Email address - { - setEmail(event.target.value); - }} - /> - - - Password - { - setPassword(event.target.value); - }} - /> - - -
-
-
- Already have an account? Sign in -
-
- ); -} +import { useState } from 'react'; +import { gql, useMutation } from 'urql'; + +import { Button } from '../components/ui/controls'; +import { Container, HomeLink } from '../components/ui/layout'; +import { H1 } from '../components/ui/typography'; +import { FieldContainer, FieldLabel, TextInput } from '../components/ui/forms'; +import { useRouter } from 'next/router'; +import { Link } from '../components/ui/link'; + +export default function SignupPage() { + const [{ error, data }, signup] = useMutation(gql` + mutation ($name: String!, $email: String!, $password: String!) { + createUser(data: { name: $name, email: $email, password: $password }) { + __typename + id + } + authenticateUserWithPassword(email: $email, password: $password) { + __typename + } + } + `); + const [name, setName] = useState(''); + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + + const router = useRouter(); + + return ( + + +

Join

+
{ + event.preventDefault(); + signup({ name, email, password }).then(result => { + if (result.data?.createUser) { + // FIXME: there's a cache issue with Urql where it's not reloading the + // current user properly if we do a client-side redirect here. + // router.push('/'); + top!.location!.href = '/'; + } + }); + }} + > + {error &&
{error.toString()}
} + + Name + { + setName(event.target.value); + }} + /> + + + Email address + { + setEmail(event.target.value); + }} + /> + + + Password + { + setPassword(event.target.value); + }} + /> + + +
+
+
+ Already have an account? Sign in +
+
+ ); +} diff --git a/schema.ts b/schema.ts index 502f4a81..07667ed5 100644 --- a/schema.ts +++ b/schema.ts @@ -1,13 +1,13 @@ -import { Poll, PollAnswer } from './schema/polls'; -import { User, Role } from './schema/users'; -import { Post, Label } from './schema/content'; -export { extendGraphqlSchema } from './schema/mutations'; - -export const lists = { - Post, - Label, - Poll, - PollAnswer, - User, - Role, -}; +import { Poll, PollAnswer } from './schema/polls'; +import { User, Role } from './schema/users'; +import { Post, Label } from './schema/content'; +export { extendGraphqlSchema } from './schema/mutations'; + +export const lists = { + Post, + Label, + Poll, + PollAnswer, + User, + Role, +}; diff --git a/schema/access.ts b/schema/access.ts index 25cea95c..595cb58c 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -1,47 +1,47 @@ -type SessionContext = { - session?: { - data: { - name: string; - role: { - canManageContent: boolean; - canManageUsers: boolean; - }; - }; - itemId: string; - listKey: string; - }; -}; -type ItemContext = { item: any; } & SessionContext; - -export const isSignedIn = ({ session }: SessionContext) => { - return !!session; -}; - -export const permissions = { - canManageContent: ({ session }: SessionContext) => { - return !!session?.data.role?.canManageContent; - }, - canManageUsers: ({ session }: SessionContext) => { - return !!session?.data.role?.canManageUsers; - }, -}; - -export const rules = { - canUseAdminUI: ({ session }: SessionContext) => { - return !!session?.data.role; - }, - canReadContentList: ({ session }: SessionContext) => { - if (permissions.canManageContent({ session })) return true; - return { status: { equals: 'published' } }; - }, - canManageUser: ({ session, item }: ItemContext) => { - if (permissions.canManageUsers({ session })) return true; - if (session?.itemId === item.id) return true; - return false; - }, - canManageUserList: ({ session }: SessionContext) => { - if (permissions.canManageUsers({ session })) return true; - if (!isSignedIn({ session })) return false; - return { where: { id: { equals: session!.itemId } } }; - }, -}; +type SessionContext = { + session?: { + data: { + name: string; + role: { + canManageContent: boolean; + canManageUsers: boolean; + }; + }; + itemId: string; + listKey: string; + }; +}; +type ItemContext = { item: any; } & SessionContext; + +export const isSignedIn = ({ session }: SessionContext) => { + return !!session; +}; + +export const permissions = { + canManageContent: ({ session }: SessionContext) => { + return !!session?.data.role?.canManageContent; + }, + canManageUsers: ({ session }: SessionContext) => { + return !!session?.data.role?.canManageUsers; + }, +}; + +export const rules = { + canUseAdminUI: ({ session }: SessionContext) => { + return !!session?.data.role; + }, + canReadContentList: ({ session }: SessionContext) => { + if (permissions.canManageContent({ session })) return true; + return { status: { equals: 'published' } }; + }, + canManageUser: ({ session, item }: ItemContext) => { + if (permissions.canManageUsers({ session })) return true; + if (session?.itemId === item.id) return true; + return false; + }, + canManageUserList: ({ session }: SessionContext) => { + if (permissions.canManageUsers({ session })) return true; + if (!isSignedIn({ session })) return false; + return { where: { id: { equals: session!.itemId } } }; + }, +}; diff --git a/schema/content.ts b/schema/content.ts index f31cd729..3ae0ae65 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -1,132 +1,132 @@ -import { relationship, select, text, timestamp } from '@keystone-next/keystone/fields'; -import { document } from '@keystone-next/fields-document'; -import { list } from '@keystone-next/keystone'; - -import { permissions, rules } from './access'; -import { componentBlocks } from '../schema/fields/content/components'; - -export const contentListAccess = { - filter: { - create: permissions.canManageContent, - update: permissions.canManageContent, - delete: permissions.canManageContent, - } -}; - -export const contentUIConfig = { - hideCreate: (context: any) => !permissions.canManageContent(context), - hideDelete: (context: any) => !permissions.canManageContent(context), - itemView: { - defaultFieldMode: (context: any) => - permissions.canManageContent(context) ? 'edit' : 'read', - }, -}; - -export const Label = list({ - access: contentListAccess, - ui: contentUIConfig, - fields: { - name: text(), - posts: relationship({ - ref: 'Post.labels', - many: true, - ui: { - displayMode: 'count', - }, - }), - }, -}); - -function defaultSlug({ context, inputData }: any) { - const date = new Date(); - return `${inputData?.title - ?.trim() - ?.toLowerCase() - ?.replace(/[^\w ]+/g, '') - ?.replace(/ +/g, '-') ?? '' - }-${date?.getFullYear() ?? ''}${date?.getMonth() + 1 ?? ''}${date?.getDate() ?? '' - }`; -} - -function defaultTimestamp() { - return new Date().toISOString(); -} - -export const Post = list({ - access: { - filter: { - ...contentListAccess.filter, - query: rules.canReadContentList, - }, - }, - ui: contentUIConfig, - fields: { - title: text(), - slug: text({ - ui: { createView: { fieldMode: 'hidden' } }, - isIndexed: 'unique', - hooks: { - resolveInput: ({ operation, resolvedData, inputData, context }) => { - if (operation === 'create' && !inputData.slug) { - return defaultSlug({ context, inputData }); - } - return resolvedData.slug; - } - } - }), - status: select({ - options: [ - { label: 'Draft', value: 'draft' }, - { label: 'Published', value: 'published' }, - { label: 'Archived', value: 'archived' }, - ], - defaultValue: 'draft', - ui: { displayMode: 'segmented-control' }, - }), - publishedDate: timestamp({ - hooks: { - resolveInput: ({ inputData, operation, resolvedData }) => { - if (operation === 'create' && !inputData.slug) { - return defaultTimestamp(); - } - return resolvedData.slug; - } - } - }), - author: relationship({ ref: 'User.authoredPosts' }), - labels: relationship({ ref: 'Label.posts', many: true }), - intro: document({ - formatting: { - inlineMarks: true, - blockTypes: true, - listTypes: true, - softBreaks: true, - }, - links: true, - }), - content: document({ - formatting: true, - links: true, - dividers: true, - relationships: { - poll: { - listKey: 'Poll', - kind: 'prop', - selection: ` - id - label - answers { - id - label - voteCount - } - userAnswer { - id - }`, - }, - }, - componentBlocks, - ui: { views: require.resolve('./fields/content/components') }, - }), - }, -}); +import { relationship, select, text, timestamp } from '@keystone-next/keystone/fields'; +import { document } from '@keystone-next/fields-document'; +import { list } from '@keystone-next/keystone'; + +import { permissions, rules } from './access'; +import { componentBlocks } from '../schema/fields/content/components'; + +export const contentListAccess = { + filter: { + create: permissions.canManageContent, + update: permissions.canManageContent, + delete: permissions.canManageContent, + } +}; + +export const contentUIConfig = { + hideCreate: (context: any) => !permissions.canManageContent(context), + hideDelete: (context: any) => !permissions.canManageContent(context), + itemView: { + defaultFieldMode: (context: any) => + permissions.canManageContent(context) ? 'edit' : 'read', + }, +}; + +export const Label = list({ + access: contentListAccess, + ui: contentUIConfig, + fields: { + name: text(), + posts: relationship({ + ref: 'Post.labels', + many: true, + ui: { + displayMode: 'count', + }, + }), + }, +}); + +function defaultSlug({ context, inputData }: any) { + const date = new Date(); + return `${inputData?.title + ?.trim() + ?.toLowerCase() + ?.replace(/[^\w ]+/g, '') + ?.replace(/ +/g, '-') ?? '' + }-${date?.getFullYear() ?? ''}${date?.getMonth() + 1 ?? ''}${date?.getDate() ?? '' + }`; +} + +function defaultTimestamp() { + return new Date().toISOString(); +} + +export const Post = list({ + access: { + filter: { + ...contentListAccess.filter, + query: rules.canReadContentList, + }, + }, + ui: contentUIConfig, + fields: { + title: text(), + slug: text({ + ui: { createView: { fieldMode: 'hidden' } }, + isIndexed: 'unique', + hooks: { + resolveInput: ({ operation, resolvedData, inputData, context }) => { + if (operation === 'create' && !inputData.slug) { + return defaultSlug({ context, inputData }); + } + return resolvedData.slug; + } + } + }), + status: select({ + options: [ + { label: 'Draft', value: 'draft' }, + { label: 'Published', value: 'published' }, + { label: 'Archived', value: 'archived' }, + ], + defaultValue: 'draft', + ui: { displayMode: 'segmented-control' }, + }), + publishedDate: timestamp({ + hooks: { + resolveInput: ({ inputData, operation, resolvedData }) => { + if (operation === 'create' && !inputData.slug) { + return defaultTimestamp(); + } + return resolvedData.slug; + } + } + }), + author: relationship({ ref: 'User.authoredPosts' }), + labels: relationship({ ref: 'Label.posts', many: true }), + intro: document({ + formatting: { + inlineMarks: true, + blockTypes: true, + listTypes: true, + softBreaks: true, + }, + links: true, + }), + content: document({ + formatting: true, + links: true, + dividers: true, + relationships: { + poll: { + listKey: 'Poll', + kind: 'prop', + selection: ` + id + label + answers { + id + label + voteCount + } + userAnswer { + id + }`, + }, + }, + componentBlocks, + ui: { views: require.resolve('./fields/content/components') }, + }), + }, +}); diff --git a/schema/fields/content/components.tsx b/schema/fields/content/components.tsx index b4f86c60..436042e1 100644 --- a/schema/fields/content/components.tsx +++ b/schema/fields/content/components.tsx @@ -1,201 +1,201 @@ -/** @jsxRuntime classic */ -/** @jsx jsx */ - -import { jsx, useTheme } from '@keystone-ui/core'; -import { InfoIcon } from '@keystone-ui/icons/icons/InfoIcon'; -import { AlertTriangleIcon } from '@keystone-ui/icons/icons/AlertTriangleIcon'; -import { AlertOctagonIcon } from '@keystone-ui/icons/icons/AlertOctagonIcon'; -import { CheckCircleIcon } from '@keystone-ui/icons/icons/CheckCircleIcon'; -import { Trash2Icon } from '@keystone-ui/icons/icons/Trash2Icon'; -import { Tooltip } from '@keystone-ui/tooltip'; -import { - component, - fields, - NotEditable, -} from '@keystone-next/fields-document/component-blocks'; -import { - ToolbarButton, - ToolbarGroup, - ToolbarSeparator, -} from '@keystone-next/fields-document/primitives'; - -const appearances = { - info: { - icon: InfoIcon, - backgroundColor: '#E0F2FE', - borderColor: '#38BDF8', - foregroundColor: '#0C4A6E', - }, - error: { - icon: AlertOctagonIcon, - backgroundColor: '#FFE4E6', - borderColor: '#FB7185', - foregroundColor: '#881337', - }, - warning: { - icon: AlertTriangleIcon, - backgroundColor: '#FEF3C7', - borderColor: '#FBBF24', - foregroundColor: '#78350F', - }, - success: { - icon: CheckCircleIcon, - backgroundColor: '#D1FAE5', - borderColor: '#34D399', - foregroundColor: '#064E3B', - }, -} as const; - -export const componentBlocks = { - callout: component({ - component: function Callout({ content, appearance }) { - const { palette, radii, spacing } = useTheme(); - const intentConfig = appearances[appearance.value]; - - return ( -
- -
- -
-
-
{content}
-
- ); - }, - label: 'Notice', - chromeless: true, - props: { - appearance: fields.select({ - label: 'Appearance', - options: [ - { value: 'info', label: 'Info' }, - { value: 'error', label: 'Error' }, - { value: 'warning', label: 'Warning' }, - { value: 'success', label: 'Success' }, - ] as const, - defaultValue: 'info', - }), - content: fields.child({ - kind: 'block', - placeholder: '', - formatting: 'inherit', - dividers: 'inherit', - links: 'inherit', - }), - }, - toolbar({ props, onRemove }) { - return ( - - {props.appearance.options.map(opt => { - const Icon = appearances[opt.value].icon; - - return ( - - {attrs => ( - { - props.appearance.onChange(opt.value); - }} - {...attrs} - > - - - )} - - ); - })} - - - - - {attrs => ( - - - - )} - - - ); - }, - }), - quote: component({ - component: ({ content, name, position }) => { - return ( -
-
{content}
-
- {name} -
-
{position}
-
- ); - }, - label: 'Quote', - props: { - content: fields.child({ - kind: 'block', - placeholder: 'Quote...', - formatting: { inlineMarks: 'inherit', softBreaks: 'inherit' }, - links: 'inherit', - }), - name: fields.child({ - kind: 'inline', - placeholder: 'Name...', - }), - position: fields.child({ - kind: 'inline', - placeholder: 'Description...', - }), - image: fields.text({ label: 'Profile Photo URL' }), - href: fields.text({ label: 'Profile Link URL' }), - }, - }), - poll: component({ - component: ({ poll }) => { - if (!poll.value) return No Poll Selected; - return ( - -

{poll.value.label}

-
    - {poll.value.data.answers.map((answer: any) => { - return ( -
  • - {answer.label} ({answer.voteCount} answers) -
  • - ); - })} -
-
- ); - }, - label: 'Poll', - props: { - poll: fields.relationship<'one'>({ - label: 'Poll', - relationship: 'poll', - }), - }, - }), -}; +/** @jsxRuntime classic */ +/** @jsx jsx */ + +import { jsx, useTheme } from '@keystone-ui/core'; +import { InfoIcon } from '@keystone-ui/icons/icons/InfoIcon'; +import { AlertTriangleIcon } from '@keystone-ui/icons/icons/AlertTriangleIcon'; +import { AlertOctagonIcon } from '@keystone-ui/icons/icons/AlertOctagonIcon'; +import { CheckCircleIcon } from '@keystone-ui/icons/icons/CheckCircleIcon'; +import { Trash2Icon } from '@keystone-ui/icons/icons/Trash2Icon'; +import { Tooltip } from '@keystone-ui/tooltip'; +import { + component, + fields, + NotEditable, +} from '@keystone-next/fields-document/component-blocks'; +import { + ToolbarButton, + ToolbarGroup, + ToolbarSeparator, +} from '@keystone-next/fields-document/primitives'; + +const appearances = { + info: { + icon: InfoIcon, + backgroundColor: '#E0F2FE', + borderColor: '#38BDF8', + foregroundColor: '#0C4A6E', + }, + error: { + icon: AlertOctagonIcon, + backgroundColor: '#FFE4E6', + borderColor: '#FB7185', + foregroundColor: '#881337', + }, + warning: { + icon: AlertTriangleIcon, + backgroundColor: '#FEF3C7', + borderColor: '#FBBF24', + foregroundColor: '#78350F', + }, + success: { + icon: CheckCircleIcon, + backgroundColor: '#D1FAE5', + borderColor: '#34D399', + foregroundColor: '#064E3B', + }, +} as const; + +export const componentBlocks = { + callout: component({ + component: function Callout({ content, appearance }) { + const { palette, radii, spacing } = useTheme(); + const intentConfig = appearances[appearance.value]; + + return ( +
+ +
+ +
+
+
{content}
+
+ ); + }, + label: 'Notice', + chromeless: true, + props: { + appearance: fields.select({ + label: 'Appearance', + options: [ + { value: 'info', label: 'Info' }, + { value: 'error', label: 'Error' }, + { value: 'warning', label: 'Warning' }, + { value: 'success', label: 'Success' }, + ] as const, + defaultValue: 'info', + }), + content: fields.child({ + kind: 'block', + placeholder: '', + formatting: 'inherit', + dividers: 'inherit', + links: 'inherit', + }), + }, + toolbar({ props, onRemove }) { + return ( + + {props.appearance.options.map(opt => { + const Icon = appearances[opt.value].icon; + + return ( + + {attrs => ( + { + props.appearance.onChange(opt.value); + }} + {...attrs} + > + + + )} + + ); + })} + + + + + {attrs => ( + + + + )} + + + ); + }, + }), + quote: component({ + component: ({ content, name, position }) => { + return ( +
+
{content}
+
+ {name} +
+
{position}
+
+ ); + }, + label: 'Quote', + props: { + content: fields.child({ + kind: 'block', + placeholder: 'Quote...', + formatting: { inlineMarks: 'inherit', softBreaks: 'inherit' }, + links: 'inherit', + }), + name: fields.child({ + kind: 'inline', + placeholder: 'Name...', + }), + position: fields.child({ + kind: 'inline', + placeholder: 'Description...', + }), + image: fields.text({ label: 'Profile Photo URL' }), + href: fields.text({ label: 'Profile Link URL' }), + }, + }), + poll: component({ + component: ({ poll }) => { + if (!poll.value) return No Poll Selected; + return ( + +

{poll.value.label}

+
    + {poll.value.data.answers.map((answer: any) => { + return ( +
  • + {answer.label} ({answer.voteCount} answers) +
  • + ); + })} +
+
+ ); + }, + label: 'Poll', + props: { + poll: fields.relationship<'one'>({ + label: 'Poll', + relationship: 'poll', + }), + }, + }), +}; diff --git a/schema/fields/content/renderers.tsx b/schema/fields/content/renderers.tsx index 835a1cb0..fae47a99 100644 --- a/schema/fields/content/renderers.tsx +++ b/schema/fields/content/renderers.tsx @@ -1,187 +1,189 @@ -import { InferRenderersForComponentBlocks } from '@keystone-next/fields-document/component-blocks'; -import { - DocumentRenderer as KeystoneDocumentRenderer, - DocumentRendererProps, -} from '@keystone-next/document-renderer'; -import React, { ComponentProps, Fragment } from 'react'; - -import { H1, H2, H3, H4, H5, H6, P } from '../../../components/ui/typography'; -import { Divider } from '../../../components/ui/layout'; -import { useAuth } from '../../../components/auth'; -import { Button } from '../../../components/ui/controls'; -import { Link } from '../../../components/ui/link'; -import { gql, useMutation, useQuery } from 'urql'; - -// by default the DocumentRenderer will render unstyled html elements -// we're customising how headings are rendered here but you can customise any of the renderers that the DocumentRenderer uses -export const renderers: DocumentRendererProps['renderers'] = { - block: { - heading({ level, children, textAlign }) { - switch (level) { - case 1: - return

{children}

; - case 2: - return

{children}

; - case 3: - return

{children}

; - case 4: - return

{children}

; - case 5: - return
{children}
; - default: - return
{children}
; - } - }, - paragraph({ children, textAlign }) { - return

{children}

; - }, - divider() { - return ; - }, - }, -}; - -type Answer = { - id: string; - label: string; - voteCount: number; -}; -type Poll = { - id: string; - label: string; - answers: Answer[]; - userAnswer: { id: string } | null; -}; - -const calloutStyles = { - info: 'text-blue-800 bg-blue-50 border-blue-300', - error: 'text-red-800 bg-red-50 border-red-300', - warning: 'text-yellow-800 bg-yellow-50 border-yellow-300', - success: 'text-green-800 bg-green-50 border-green-300', -}; - -export const componentBlockRenderers: InferRenderersForComponentBlocks< - typeof import('./components').componentBlocks -> = { - callout: function Callout({ appearance, content }) { - const classes = `my-4 py-2 px-4 rounded border-l-4 ${calloutStyles[appearance]}`; - return
{content}
; - }, - quote: function Quote({ content, name, position, image, href }) { - return ( -
-
{content}
-
- {href ? ( - - {name} - - ) : ( - name - )} -
-
{position}
-
- ); - }, - poll: function Poll({ poll: relatedPoll }) { - if (!relatedPoll?.data) return null; - const [{ data }] = useQuery({ - query: gql` - query ($id: ID!) { - Poll(where: { id: $id }) { - id - label - answers { - id - label - voteCount - } - userAnswer { - id - } - } - } - `, - variables: { id: relatedPoll.id }, - }); - const poll = (data?.Poll || relatedPoll.data) as Poll; - - const [{}, voteForPoll] = useMutation(gql` - mutation ($answerId: ID!) { - voteForPoll(answerId: $answerId) - } - `); - const [{}, clearVoteForPoll] = useMutation(gql` - mutation ($pollId: ID!) { - clearVoteForPoll(pollId: $pollId) - } - `); - const auth = useAuth(); - return ( -
-
- {poll.label} -
-
- {poll.answers.map(answer => { - return ( - - ); - })} -
- {auth.ready && !auth.sessionData && ( - - Sign In or{' '} - Join to vote - - )} - {poll.userAnswer?.id && ( - - )} -
- ); - }, -}; - -export function DocumentRenderer({ - document, -}: Pick, 'document'>) { - return ( - - ); -} +import { InferRenderersForComponentBlocks } from '@keystone-next/fields-document/component-blocks'; +import { + DocumentRenderer as KeystoneDocumentRenderer, + DocumentRendererProps, +} from '@keystone-next/document-renderer'; +import React, { ComponentProps, Fragment } from 'react'; + +import { H1, H2, H3, H4, H5, H6, P } from '../../../components/ui/typography'; +import { Divider } from '../../../components/ui/layout'; +import { useAuth } from '../../../components/auth'; +import { Button } from '../../../components/ui/controls'; +import { Link } from '../../../components/ui/link'; +import { gql, useMutation, useQuery } from 'urql'; + +// by default the DocumentRenderer will render unstyled html elements +// we're customising how headings are rendered here but you can customise any of the renderers that the DocumentRenderer uses +export const renderers: DocumentRendererProps['renderers'] = { + block: { + heading({ level, children, textAlign }) { + switch (level) { + case 1: + return

{children}

; + case 2: + return

{children}

; + case 3: + return

{children}

; + case 4: + return

{children}

; + case 5: + return
{children}
; + default: + return
{children}
; + } + }, + paragraph({ children, textAlign }) { + return

{children}

; + }, + divider() { + return ; + }, + }, +}; + +type Answer = { + id: string; + label: string; + voteCount: number; +}; +type Poll = { + id: string; + label: string; + answers: Answer[]; + userAnswer: { id: string } | null; +}; + +const calloutStyles = { + info: 'text-blue-800 bg-blue-50 border-blue-300', + error: 'text-red-800 bg-red-50 border-red-300', + warning: 'text-yellow-800 bg-yellow-50 border-yellow-300', + success: 'text-green-800 bg-green-50 border-green-300', +}; + +export const componentBlockRenderers: InferRenderersForComponentBlocks< + typeof import('./components').componentBlocks +> = { + callout: function Callout({ appearance, content }) { + const classes = `my-4 py-2 px-4 rounded border-l-4 ${calloutStyles[appearance]}`; + return
{content}
; + }, + quote: function Quote({ content, name, position, image, href }) { + return ( +
+
{content}
+
+ {href ? ( + + {name} + + ) : ( + name + )} +
+
{position}
+
+ ); + }, + poll: function Poll({ poll: relatedPoll }) { + if (!relatedPoll?.data) return null; + const [{ data }] = useQuery({ + query: gql` + query ($id: ID!) { + poll(where: { id: $id }) { + id + label + answers { + id + label + voteCount + } + userAnswer { + id + } + } + } + `, + variables: { id: relatedPoll.id }, + }); + const poll = (data?.poll || relatedPoll.data) as Poll; + + const [{}, voteForPoll] = + useMutation(gql` + mutation ($answerId: ID!) { + voteForPoll(answerId: $answerId) + } + `) + ; + const [{}, clearVoteForPoll] = useMutation(gql` + mutation ($pollId: ID!) { + clearVoteForPoll(pollId: $pollId) + } + `); + const auth = useAuth(); + return ( +
+
+ {poll.label} +
+
+ {poll.answers.map(answer => { + return ( + + ); + })} +
+ {auth.ready && !auth.sessionData && ( + + Sign In or{' '} + Join to vote + + )} + {poll.userAnswer?.id && ( + + )} +
+ ); + }, +}; + +export function DocumentRenderer({ + document, +}: Pick, 'document'>) { + return ( + + ); +} diff --git a/schema/fields/githubRepos/field.ts b/schema/fields/githubRepos/field.ts index fec8d4b5..d93e10c3 100644 --- a/schema/fields/githubRepos/field.ts +++ b/schema/fields/githubRepos/field.ts @@ -1,90 +1,90 @@ -// Note: without a personal github access token in your env, the server will be rate limited to 60 requests per hour -// https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token - -import { graphql } from '@keystone-next/keystone'; -import fetch from 'node-fetch'; - -type GitubRepoData = { - id: number; - name: string; - full_name: string; - html_url: string; - description: string; - created_at: string; - updated_at: string; - pushed_at: string; - homepage: string; - size: number; - stargazers_count: number; - watchers_count: number; - language: string; - forks_count: number; -}; - -export const GitHubRepo = graphql.object()({ - name: 'GitHubRepo', - fields: { - id: graphql.field({ type: graphql.Int }), - name: graphql.field({ type: graphql.String }), - fullName: graphql.field({ - type: graphql.String, - resolve: val => val.full_name, - }), - htmlUrl: graphql.field({ - type: graphql.String, - resolve: val => val.html_url, - }), - description: graphql.field({ type: graphql.String }), - createdAt: graphql.field({ - type: graphql.String, - resolve: val => val.created_at, - }), - updatedAt: graphql.field({ - type: graphql.String, - resolve: val => val.updated_at, - }), - pushedAt: graphql.field({ - type: graphql.String, - resolve: val => val.pushed_at, - }), - homepage: graphql.field({ type: graphql.String }), - size: graphql.field({ type: graphql.Int }), - stargazersCount: graphql.field({ - type: graphql.Int, - resolve: val => val.stargazers_count, - }), - watchersCount: graphql.field({ - type: graphql.Int, - resolve: val => val.watchers_count, - }), - language: graphql.field({ type: graphql.String }), - forksCount: graphql.field({ - type: graphql.Int, - resolve: val => val.forks_count, - }), - }, -}); - -export async function githubReposResolver(item: any) { - if (!item.githubUsername) return []; - try { - const token = process.env.GITHUB_AUTH_TOKEN; - const options = token - ? { headers: { Authorization: `token ${token}` } } - : undefined; - const result = await fetch( - `https://api.github.com/users/${item.githubUsername}/repos?type=public&per_page=100`, - options - ); - const allRepos = await result.json(); - return allRepos - .filter( - (repo: any) => - !(repo.fork || repo.private || repo.disabled || repo.private) - ) - .sort((a: any, b: any) => b.stargazers_count - a.stargazers_count); - } catch (err) { - console.error(err); - return []; - } -} +// Note: without a personal github access token in your env, the server will be rate limited to 60 requests per hour +// https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token + +import { graphql } from '@keystone-next/keystone'; +import fetch from 'node-fetch'; + +type GitubRepoData = { + id: number; + name: string; + full_name: string; + html_url: string; + description: string; + created_at: string; + updated_at: string; + pushed_at: string; + homepage: string; + size: number; + stargazers_count: number; + watchers_count: number; + language: string; + forks_count: number; +}; + +export const GitHubRepo = graphql.object()({ + name: 'GitHubRepo', + fields: { + id: graphql.field({ type: graphql.Int }), + name: graphql.field({ type: graphql.String }), + fullName: graphql.field({ + type: graphql.String, + resolve: val => val.full_name, + }), + htmlUrl: graphql.field({ + type: graphql.String, + resolve: val => val.html_url, + }), + description: graphql.field({ type: graphql.String }), + createdAt: graphql.field({ + type: graphql.String, + resolve: val => val.created_at, + }), + updatedAt: graphql.field({ + type: graphql.String, + resolve: val => val.updated_at, + }), + pushedAt: graphql.field({ + type: graphql.String, + resolve: val => val.pushed_at, + }), + homepage: graphql.field({ type: graphql.String }), + size: graphql.field({ type: graphql.Int }), + stargazersCount: graphql.field({ + type: graphql.Int, + resolve: val => val.stargazers_count, + }), + watchersCount: graphql.field({ + type: graphql.Int, + resolve: val => val.watchers_count, + }), + language: graphql.field({ type: graphql.String }), + forksCount: graphql.field({ + type: graphql.Int, + resolve: val => val.forks_count, + }), + }, +}); + +export async function githubReposResolver(item: any) { + if (!item.githubUsername) return []; + try { + const token = process.env.GITHUB_AUTH_TOKEN; + const options = token + ? { headers: { Authorization: `token ${token}` } } + : undefined; + const result = await fetch( + `https://api.github.com/users/${item.githubUsername}/repos?type=public&per_page=100`, + options + ); + const allRepos = await result.json(); + return allRepos + .filter( + (repo: any) => + !(repo.fork || repo.private || repo.disabled || repo.private) + ) + .sort((a: any, b: any) => b.stargazers_count - a.stargazers_count); + } catch (err) { + console.error(err); + return []; + } +} diff --git a/schema/mutations.ts b/schema/mutations.ts index 747dd511..423d9d17 100644 --- a/schema/mutations.ts +++ b/schema/mutations.ts @@ -1,58 +1,58 @@ -import { graphQLSchemaExtension } from '@keystone-next/keystone'; -import { KeystoneContext, PollWhereInput } from '.keystone/types'; - -const gql = ([content]: TemplateStringsArray) => content; - -async function clearVote( - _context: KeystoneContext, - pollFilter: PollWhereInput -) { - const context = _context.sudo(); - if (!context.session) { - throw new Error('You must be signed in to vote'); - } - - const answers = await context.db.PollAnswer.findMany({ - where: { - poll: pollFilter, - answeredByUsers_some: { id: context.session.itemId }, - }, - }); - - if (answers.length) { - await context.db.PollAnswer.updateMany({ - data: answers.map((answer: any) => ({ - where: { id: answer.id }, - data: { - answeredByUsers: { disconnect: { id: context.session.itemId } }, - }, - })), - }); - } -} - -export const extendGraphqlSchema = graphQLSchemaExtension({ - typeDefs: gql` - type Mutation { - voteForPoll(answerId: ID!): Boolean - clearVoteForPoll(pollId: ID!): Boolean - } - `, - resolvers: { - Mutation: { - async clearVoteForPoll(rootVal, { pollId }, context) { - await clearVote(context as KeystoneContext, { id: pollId }); - }, - async voteForPoll(rootVal, { answerId }, _context) { - const context = _context.sudo() as KeystoneContext; - clearVote(context, { answers: { some: { id: answerId } } }); - await context.db.PollAnswer.updateOne({ - where: { id: answerId }, - data: { - answeredByUsers: { connect: { id: context.session.itemId } }, - }, - }); - }, - }, - }, -}); +import { graphQLSchemaExtension } from '@keystone-next/keystone'; +import { KeystoneContext, PollWhereInput } from '.keystone/types'; + +const gql = ([content]: TemplateStringsArray) => content; + +async function clearVote( + _context: KeystoneContext, + pollFilter: PollWhereInput +) { + const context = _context.sudo(); + if (!context.session) { + throw new Error('You must be signed in to vote'); + } + + const answers = await context.db.PollAnswer.findMany({ + where: { + + answeredByUsers: { some: { id: {equals: context.session.itemId}} }, + }, + }); + + if (answers.length) { + await context.db.PollAnswer.updateMany({ + data: answers.map((answer: any) => ({ + where: { id: answer.id }, + data: { + answeredByUsers: { set: [] }, + }, + })), + }); + } +} + +export const extendGraphqlSchema = graphQLSchemaExtension({ + typeDefs: gql` + type Mutation { + voteForPoll(answerId: ID!): Boolean + clearVoteForPoll(pollId: ID!): Boolean + } + `, + resolvers: { + Mutation: { + async clearVoteForPoll(rootVal, { pollId }, context) { + await clearVote(context as KeystoneContext, { id: pollId }); + }, + async voteForPoll(rootVal, { answerId }, _context) { + const context = _context.sudo() as KeystoneContext; + clearVote(context, { answers: { some: { id: { equals: answerId }} } }); + await context.db.PollAnswer.updateOne({ + where: { id: answerId }, + data: { + answeredByUsers: { connect: { id: context.session.itemId } }, + }, + }); + }, + }, + }, +}); diff --git a/schema/polls.ts b/schema/polls.ts index 0c14db8d..d5c1b9b3 100644 --- a/schema/polls.ts +++ b/schema/polls.ts @@ -1,95 +1,97 @@ -import { relationship, text, virtual } from '@keystone-next/keystone/fields'; -import { graphql, list } from '@keystone-next/keystone'; -import { KeystoneListsAPI, KeystoneDbAPI } from '.keystone/types'; - -import { isSignedIn, permissions } from './access'; -import { contentListAccess, contentUIConfig } from './content'; - -export const Poll = list({ - access: contentListAccess, - ui: contentUIConfig, - fields: { - label: text(), - answers: relationship({ - ref: 'PollAnswer.poll', - many: true, - ui: { - displayMode: 'cards', - cardFields: ['label', 'voteCount'], - inlineCreate: { - fields: ['label'], - }, - inlineEdit: { - fields: ['label'], - }, - removeMode: 'disconnect', - inlineConnect: true, - }, - }), - responsesCount: virtual({ - field: graphql.field({ - type: graphql.Int, - resolve(poll, args, context) { - const lists = context.query as KeystoneListsAPI; - return lists.User.count({ - where: { - pollAnswers: { some: { poll: { id: { equals: poll.id.toString() } } } }, - }, - }); - }, - }), - }), - userAnswer: virtual({ - field: lists => - graphql.field({ - type: lists.PollAnswer.types.output, - async resolve(poll, args, context) { - if (!isSignedIn(context)) return null; - const lists = context.db as KeystoneDbAPI; - const pollAnswers = await lists.PollAnswer.findMany({ - where: { - poll: { id: { equals: poll.id.toString() } }, - answeredByUsers: { some: { id: { equals: context.session.itemId } } }, - }, - }); - return pollAnswers[0]; - }, - }), - ui: { query: '{ id label }' }, - }), - }, -}); - -export const PollAnswer = list({ - access: contentListAccess, - ui: contentUIConfig, - fields: { - label: text(), - poll: relationship({ ref: 'Poll.answers' }), - voteCount: virtual({ - field: graphql.field({ - type: graphql.Int, - resolve(pollAnswer, args, context) { - const lists = context.query as KeystoneListsAPI; - - return lists.User.count({ - where: { pollAnswers: { some: { id: { equals: pollAnswer.id.toString() } } } }, - }); - }, - }), - ui: { - itemView: { fieldMode: 'hidden' }, - }, - }), - answeredByUsers: relationship({ - ref: 'User.pollAnswers', - many: true, - access: { read: permissions.canManageContent }, - ui: { - displayMode: 'count', - createView: { fieldMode: 'hidden' }, - listView: { fieldMode: 'hidden' }, - }, - }), - }, -}); +import { relationship, text, virtual } from '@keystone-next/keystone/fields'; +import { graphql, list } from '@keystone-next/keystone'; +import { KeystoneListsAPI, KeystoneDbAPI } from '.keystone/types'; + +import { isSignedIn, permissions } from './access'; +import { contentListAccess, contentUIConfig } from './content'; + +export const Poll = list({ + access: contentListAccess, + ui: contentUIConfig, + fields: { + label: text(), + answers: relationship({ + ref: 'PollAnswer.poll', + isFilterable: true, + many: true, + ui: { + displayMode: 'cards', + cardFields: ['label', 'voteCount'], + inlineCreate: { + fields: ['label'], + }, + inlineEdit: { + fields: ['label'], + }, + removeMode: 'disconnect', + inlineConnect: true, + }, + }), + responsesCount: virtual({ + field: graphql.field({ + type: graphql.Int, + resolve(poll, args, context) { + const lists = context.query as KeystoneListsAPI; + return lists.User.count({ + where: { + pollAnswers: { some: { poll: { id: { equals: poll.id.toString() } } } }, + }, + }); + }, + }), + }), + userAnswer: virtual({ + field: lists => + graphql.field({ + type: lists.PollAnswer.types.output, + async resolve(poll, args, context) { + if (!isSignedIn(context)) return null; + const lists = context.db as KeystoneDbAPI; + const pollAnswers = await lists.PollAnswer.findMany({ + where: { + poll: { id: { equals: poll.id.toString() } }, + answeredByUsers: { some: { id: { equals: context.session.itemId } } }, + }, + }); + return pollAnswers[0]; + }, + }), + ui: { query: '{ id label }' }, + }), + }, +}); + +export const PollAnswer = list({ + access: contentListAccess, + ui: contentUIConfig, + fields: { + label: text(), + poll: relationship({isFilterable: true, ref: 'Poll.answers' }), + voteCount: virtual({ + field: graphql.field({ + type: graphql.Int, + resolve(pollAnswer, args, context) { + const lists = context.query as KeystoneListsAPI; + + return lists.User.count({ + where: { pollAnswers: { some: { id: { equals: pollAnswer.id.toString() } } } }, + }); + }, + }), + ui: { + itemView: { fieldMode: 'hidden' }, + }, + }), + answeredByUsers: relationship({ + ref: 'User.pollAnswers', + isFilterable: true, + many: true, + access: { read: permissions.canManageContent }, + ui: { + displayMode: 'count', + createView: { fieldMode: 'hidden' }, + listView: { fieldMode: 'hidden' }, + }, + }), + }, +}); diff --git a/schema/users.ts b/schema/users.ts index cbe3b002..7188ceb4 100644 --- a/schema/users.ts +++ b/schema/users.ts @@ -1,132 +1,132 @@ -import { - checkbox, - password, - relationship, - text, - virtual, -} from '@keystone-next/keystone/fields'; -import { list, graphql } from '@keystone-next/keystone'; - -import { permissions, rules } from './access'; -import { GitHubRepo, githubReposResolver } from './fields/githubRepos/field'; - -const fieldModes = { - editSelfOrRead: ({ session, item }: any) => - permissions.canManageUsers({ session }) || session.itemId === item.id - ? 'edit' - : 'read', - editSelfOrHidden: ({ session, item }: any) => - permissions.canManageUsers({ session }) || session.itemId === item.id - ? 'edit' - : 'hidden', -}; - -export const User = list({ - access: { - operation: { - create: () => true, - }, - filter: { - query: () => true, - update: rules.canManageUserList, - delete: rules.canManageUserList, - } - }, - ui: { - hideCreate: context => !permissions.canManageUsers(context), - hideDelete: context => !permissions.canManageUsers(context), - itemView: { - defaultFieldMode: context => - permissions.canManageUsers(context) ? 'edit' : 'hidden', - }, - listView: { - defaultFieldMode: context => - permissions.canManageUsers(context) ? 'read' : 'hidden', - }, - }, - fields: { - name: text({ - ui: { - itemView: { fieldMode: fieldModes.editSelfOrRead }, - }, - }), - email: text({ - isIndexed: 'unique', - validation: { - isRequired: true, - }, - access: { - read: rules.canManageUser, - }, - ui: { - itemView: { fieldMode: fieldModes.editSelfOrHidden }, - }, - }), - password: password({ - validation: { - isRequired: true, - }, - ui: { - itemView: { fieldMode: fieldModes.editSelfOrHidden }, - }, - }), - role: relationship({ - ref: 'Role.users', - access: permissions.canManageUsers, - }), - githubUsername: text({ - label: 'GitHub Username', - ui: { - itemView: { fieldMode: fieldModes.editSelfOrRead }, - }, - }), - githubRepos: virtual({ - field: graphql.field({ - type: graphql.nonNull(graphql.list(GitHubRepo)), - resolve: githubReposResolver, - }), - ui: { - views: require.resolve('./fields/githubRepos/components'), - createView: { fieldMode: 'hidden' }, - listView: { fieldMode: 'hidden' }, - itemView: { fieldMode: 'read' }, - query: '{ name htmlUrl description homepage stargazersCount }', - }, - }), - authoredPosts: relationship({ - ref: 'Post.author', - many: true, - ui: { - createView: { fieldMode: 'hidden' }, - }, - }), - pollAnswers: relationship({ - ref: 'PollAnswer.answeredByUsers', - many: true, - access: permissions.canManageUsers, - ui: { - hideCreate: true, - createView: { fieldMode: 'hidden' }, - }, - }), - }, -}); - -export const Role = list({ - access: { - filter: { - delete: permissions.canManageUsers, - query: permissions.canManageUsers, - update: permissions.canManageUsers, - } - }, - ui: { - isHidden: context => !permissions.canManageUsers(context), - }, - fields: { - name: text(), - canManageContent: checkbox({ defaultValue: false }), - canManageUsers: checkbox({ defaultValue: false }), - users: relationship({ ref: 'User.role', many: true }), - }, -}); +import { + checkbox, + password, + relationship, + text, + virtual, +} from '@keystone-next/keystone/fields'; +import { list, graphql } from '@keystone-next/keystone'; + +import { permissions, rules } from './access'; +import { GitHubRepo, githubReposResolver } from './fields/githubRepos/field'; + +const fieldModes = { + editSelfOrRead: ({ session, item }: any) => + permissions.canManageUsers({ session }) || session.itemId === item.id + ? 'edit' + : 'read', + editSelfOrHidden: ({ session, item }: any) => + permissions.canManageUsers({ session }) || session.itemId === item.id + ? 'edit' + : 'hidden', +}; + +export const User = list({ + access: { + operation: { + create: () => true, + }, + filter: { + query: () => true, + update: rules.canManageUserList, + delete: rules.canManageUserList, + } + }, + ui: { + hideCreate: context => !permissions.canManageUsers(context), + hideDelete: context => !permissions.canManageUsers(context), + itemView: { + defaultFieldMode: context => + permissions.canManageUsers(context) ? 'edit' : 'hidden', + }, + listView: { + defaultFieldMode: context => + permissions.canManageUsers(context) ? 'read' : 'hidden', + }, + }, + fields: { + name: text({ + ui: { + itemView: { fieldMode: fieldModes.editSelfOrRead }, + }, + }), + email: text({ + isIndexed: 'unique', + validation: { + isRequired: true, + }, + access: { + read: rules.canManageUser, + }, + ui: { + itemView: { fieldMode: fieldModes.editSelfOrHidden }, + }, + }), + password: password({ + validation: { + isRequired: true, + }, + ui: { + itemView: { fieldMode: fieldModes.editSelfOrHidden }, + }, + }), + role: relationship({ + ref: 'Role.users', + access: permissions.canManageUsers, + }), + githubUsername: text({ + label: 'GitHub Username', + ui: { + itemView: { fieldMode: fieldModes.editSelfOrRead }, + }, + }), + githubRepos: virtual({ + field: graphql.field({ + type: graphql.nonNull(graphql.list(GitHubRepo)), + resolve: githubReposResolver, + }), + ui: { + views: require.resolve('./fields/githubRepos/components'), + createView: { fieldMode: 'hidden' }, + listView: { fieldMode: 'hidden' }, + itemView: { fieldMode: 'read' }, + query: '{ name htmlUrl description homepage stargazersCount }', + }, + }), + authoredPosts: relationship({ + ref: 'Post.author', + many: true, + ui: { + createView: { fieldMode: 'hidden' }, + }, + }), + pollAnswers: relationship({ + ref: 'PollAnswer.answeredByUsers', + many: true, + access: permissions.canManageUsers, + ui: { + hideCreate: true, + createView: { fieldMode: 'hidden' }, + }, + }), + }, +}); + +export const Role = list({ + access: { + filter: { + delete: permissions.canManageUsers, + query: permissions.canManageUsers, + update: permissions.canManageUsers, + } + }, + ui: { + isHidden: context => !permissions.canManageUsers(context), + }, + fields: { + name: text(), + canManageContent: checkbox({ defaultValue: false }), + canManageUsers: checkbox({ defaultValue: false }), + users: relationship({ ref: 'User.role', many: true }), + }, +}); diff --git a/tailwind.config.js b/tailwind.config.js index 54e2d89d..e75a1293 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,16 +1,16 @@ -module.exports = { - purge: [], - darkMode: false, // or 'media' or 'class' - theme: { - screens: { - sm: '640px', - md: '768px', - lg: '1024px', - xl: '1280px', - }, - }, - variants: { - extend: {}, - }, - plugins: [], -}; +module.exports = { + purge: [], + darkMode: false, // or 'media' or 'class' + theme: { + screens: { + sm: '640px', + md: '768px', + lg: '1024px', + xl: '1280px', + }, + }, + variants: { + extend: {}, + }, + plugins: [], +}; diff --git a/tsconfig.json b/tsconfig.json index 664f21bf..bc613d9d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,79 +1,79 @@ -{ - "compilerOptions": { - /* Visit https://aka.ms/tsconfig.json to read more about this file */ - /* Basic Options */ - // "incremental": true, /* Enable incremental compilation */ - "target": "esnext", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */ - "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ // "lib": [], /* Specify library files to be included in the compilation. */ - // "allowJs": true, /* Allow javascript files to be compiled. */ - // "checkJs": true, /* Report errors in .js files. */ - "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ // "declaration": true, /* Generates corresponding '.d.ts' file. */ - // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - // "sourceMap": true, /* Generates corresponding '.map' file. */ - // "outFile": "./", /* Concatenate and emit output to single file. */ - // "outDir": "./", /* Redirect output structure to the directory. */ - // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - // "composite": true, /* Enable project compilation */ - // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ - // "removeComments": true, /* Do not emit comments to output. */ - "noEmit": true, /* Do not emit outputs. */ // "importHelpers": true, /* Import emit helpers from 'tslib'. */ - // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - /* Strict Type-Checking Options */ - "strict": true, /* Enable all strict type-checking options. */ // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* Enable strict null checks. */ - // "strictFunctionTypes": true, /* Enable strict checking of function types. */ - // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ - // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ - // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - /* Additional Checks */ - // "noUnusedLocals": true, /* Report errors on unused locals. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an 'override' modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */ - /* Module Resolution Options */ - // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - // "types": [], /* Type declaration files to be included in compilation. */ - // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - /* Source Map Options */ - // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - /* Experimental Options */ - // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - /* Advanced Options */ - // "skipLibCheck": true, /* Skip type checking of declaration files. */ - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], - "allowJs": false, - // "skipLibCheck": true, - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "skipLibCheck": true - }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx" - ], - "exclude": [ - "node_modules" - ] -} +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "esnext", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + // "outDir": "./", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + "noEmit": true, /* Do not emit outputs. */ // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an 'override' modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */ + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + /* Advanced Options */ + // "skipLibCheck": true, /* Skip type checking of declaration files. */ + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": false, + // "skipLibCheck": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "skipLibCheck": true + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/yarn.lock b/yarn.lock index 1df670d0..e002ced9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,6619 +1,7415 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@apollo/client@^3.1.3": - version "3.3.21" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.3.21.tgz#2862baa4e1ced8c5e89ebe6fc52877fc64a726aa" - integrity sha512-RAmZReFuKCKx0Rs5C0nVJwKomAHUHn+gGP/YvbEsXQWu0sXoncEUZa71UqlfCPVXa/0MkYOIbCXSQdOcuRrHgw== - dependencies: - "@graphql-typed-document-node/core" "^3.0.0" - "@types/zen-observable" "^0.8.0" - "@wry/context" "^0.6.0" - "@wry/equality" "^0.5.0" - fast-json-stable-stringify "^2.0.0" - graphql-tag "^2.12.0" - hoist-non-react-statics "^3.3.2" - optimism "^0.16.0" - prop-types "^15.7.2" - symbol-observable "^4.0.0" - ts-invariant "^0.8.0" - tslib "^1.10.0" - zen-observable "^0.8.14" - -"@apollo/client@^3.4.15": - version "3.4.16" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.4.16.tgz#67090d5655aa843fa64d26f1913315e384a5fa0f" - integrity sha512-iF4zEYwvebkri0BZQyv8zfavPfVEafsK0wkOofa6eC2yZu50J18uTutKtC174rjHZ2eyxZ8tV7NvAPKRT+OtZw== - dependencies: - "@graphql-typed-document-node/core" "^3.0.0" - "@wry/context" "^0.6.0" - "@wry/equality" "^0.5.0" - "@wry/trie" "^0.3.0" - graphql-tag "^2.12.3" - hoist-non-react-statics "^3.3.2" - optimism "^0.16.1" - prop-types "^15.7.2" - symbol-observable "^4.0.0" - ts-invariant "^0.9.0" - tslib "^2.3.0" - zen-observable-ts "~1.1.0" - -"@apollo/protobufjs@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.2.tgz#4bd92cd7701ccaef6d517cdb75af2755f049f87c" - integrity sha512-vF+zxhPiLtkwxONs6YanSt1EpwpGilThpneExUN5K3tCymuxNnVq2yojTvnpRjv2QfsEIt/n7ozPIIzBLwGIDQ== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.0" - "@types/node" "^10.1.0" - long "^4.0.0" - -"@apollographql/apollo-tools@^0.5.1": - version "0.5.1" - resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.5.1.tgz#f0baef739ff7e2fafcb8b98ad29f6ac817e53e32" - integrity sha512-ZII+/xUFfb9ezDU2gad114+zScxVFMVlZ91f8fGApMzlS1kkqoyLnC4AJaQ1Ya/X+b63I20B4Gd+eCL8QuB4sA== - -"@apollographql/graphql-playground-html@1.6.29": - version "1.6.29" - resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.29.tgz#a7a646614a255f62e10dcf64a7f68ead41dec453" - integrity sha512-xCcXpoz52rI4ksJSdOCxeOCn2DLocxwHf9dVT/Q90Pte1LX+LY+91SFtJF3KXVHH8kEin+g1KKCQPKBjZJfWNA== - dependencies: - xss "^1.0.8" - -"@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.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/code-frame@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503" - integrity sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg== - dependencies: - "@babel/highlight" "^7.14.5" - -"@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.15.5": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.8.tgz#195b9f2bffe995d2c6c159e72fe525b4114e8c10" - integrity sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og== - dependencies: - "@babel/code-frame" "^7.15.8" - "@babel/generator" "^7.15.8" - "@babel/helper-compilation-targets" "^7.15.4" - "@babel/helper-module-transforms" "^7.15.8" - "@babel/helpers" "^7.15.4" - "@babel/parser" "^7.15.8" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.6" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/generator@^7.15.4", "@babel/generator@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.8.tgz#fa56be6b596952ceb231048cf84ee499a19c0cd1" - integrity sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g== - dependencies: - "@babel/types" "^7.15.6" - jsesc "^2.5.1" - source-map "^0.5.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== - dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.16.6" - semver "^6.3.0" - -"@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== - 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.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== - dependencies: - "@babel/types" "^7.15.4" - -"@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== - dependencies: - "@babel/types" "^7.15.4" - -"@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== - dependencies: - "@babel/types" "^7.15.4" - -"@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== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-module-transforms@^7.15.4", "@babel/helper-module-transforms@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz#d8c0e75a87a52e374a8f25f855174786a09498b2" - integrity sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg== - 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-validator-identifier" "^7.15.7" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.6" - -"@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== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-plugin-utils@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== - -"@babel/helper-replace-supers@^7.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== - 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-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== - dependencies: - "@babel/types" "^7.15.4" - -"@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== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.8": - version "7.14.8" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz#32be33a756f29e278a0d644fa08a2c9e0f88a34c" - integrity sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow== - -"@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": - version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" - integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== - -"@babel/helper-validator-option@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" - integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== - -"@babel/helpers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" - integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== - dependencies: - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" - -"@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== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0": - version "7.14.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.8.tgz#66fd41666b2d7b840bd5ace7f7416d5ac60208d4" - integrity sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA== - -"@babel/parser@^7.15.4", "@babel/parser@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" - integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== - -"@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== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@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== - dependencies: - "@babel/helper-module-transforms" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.15.4" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/runtime@7.15.3": - version "7.15.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.3.tgz#2e1c2880ca118e5b2f9988322bd8a7656a32502b" - integrity sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.14.8" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.8.tgz#7119a56f421018852694290b9f9148097391b446" - integrity sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.15.3", "@babel/runtime@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" - integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.15.4": - 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.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" - integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.4" - "@babel/helper-function-name" "^7.15.4" - "@babel/helper-hoist-variables" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" - "@babel/parser" "^7.15.4" - "@babel/types" "^7.15.4" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd" - integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ== - dependencies: - "@babel/helper-validator-identifier" "^7.14.9" - to-fast-properties "^2.0.0" - -"@babel/types@^7.0.0", "@babel/types@^7.3.0": - version "7.14.8" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.8.tgz#38109de8fcadc06415fbd9b74df0065d4d41c728" - integrity sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q== - dependencies: - "@babel/helper-validator-identifier" "^7.14.8" - to-fast-properties "^2.0.0" - -"@babel/types@^7.15.4", "@babel/types@^7.15.6": - 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== - dependencies: - "@babel/helper-validator-identifier" "^7.14.9" - to-fast-properties "^2.0.0" - -"@braintree/sanitize-url@^5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-5.0.2.tgz#b23080fa35520e993a8a37a0f5bca26aa4650a48" - integrity sha512-NBEJlHWrhQucLhZGHtSxM2loSaNUMajC7KOYJLyfcdW/6goVoff2HoYI3bz8YCDN0wKGbxtUL0gx2dvHpvnWlw== - -"@emotion/cache@^11.4.0": - version "11.4.0" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.4.0.tgz#293fc9d9a7a38b9aad8e9337e5014366c3b09ac0" - integrity sha512-Zx70bjE7LErRO9OaZrhf22Qye1y4F7iDl+ITjet0J+i+B88PrAOBkKvaAWhxsZf72tDLajwCgfCjJ2dvH77C3g== - dependencies: - "@emotion/memoize" "^0.7.4" - "@emotion/sheet" "^1.0.0" - "@emotion/utils" "^1.0.0" - "@emotion/weak-memoize" "^0.2.5" - stylis "^4.0.3" - -"@emotion/hash@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" - integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== - -"@emotion/memoize@^0.7.4": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50" - integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ== - -"@emotion/react@^11.1.1": - version "11.4.0" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.4.0.tgz#2465ad7b073a691409b88dfd96dc17097ddad9b7" - integrity sha512-4XklWsl9BdtatLoJpSjusXhpKv9YVteYKh9hPKP1Sxl+mswEFoUe0WtmtWjxEjkA51DQ2QRMCNOvKcSlCQ7ivg== - dependencies: - "@babel/runtime" "^7.13.10" - "@emotion/cache" "^11.4.0" - "@emotion/serialize" "^1.0.2" - "@emotion/sheet" "^1.0.1" - "@emotion/utils" "^1.0.0" - "@emotion/weak-memoize" "^0.2.5" - hoist-non-react-statics "^3.3.1" - -"@emotion/react@^11.4.1": - version "11.4.1" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.4.1.tgz#a1b0b767b5bad57515ffb0cad9349614d27f4d57" - integrity sha512-pRegcsuGYj4FCdZN6j5vqCALkNytdrKw3TZMekTzNXixRg4wkLsU5QEaBG5LC6l01Vppxlp7FE3aTHpIG5phLg== - dependencies: - "@babel/runtime" "^7.13.10" - "@emotion/cache" "^11.4.0" - "@emotion/serialize" "^1.0.2" - "@emotion/sheet" "^1.0.2" - "@emotion/utils" "^1.0.0" - "@emotion/weak-memoize" "^0.2.5" - hoist-non-react-statics "^3.3.1" - -"@emotion/serialize@^1.0.0", "@emotion/serialize@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.2.tgz#77cb21a0571c9f68eb66087754a65fa97bfcd965" - integrity sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A== - dependencies: - "@emotion/hash" "^0.8.0" - "@emotion/memoize" "^0.7.4" - "@emotion/unitless" "^0.7.5" - "@emotion/utils" "^1.0.0" - csstype "^3.0.2" - -"@emotion/sheet@^1.0.0", "@emotion/sheet@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.0.1.tgz#245f54abb02dfd82326e28689f34c27aa9b2a698" - integrity sha512-GbIvVMe4U+Zc+929N1V7nW6YYJtidj31lidSmdYcWozwoBIObXBnaJkKNDjZrLm9Nc0BR+ZyHNaRZxqNZbof5g== - -"@emotion/sheet@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.0.2.tgz#1d9ffde531714ba28e62dac6a996a8b1089719d0" - integrity sha512-QQPB1B70JEVUHuNtzjHftMGv6eC3Y9wqavyarj4x4lg47RACkeSfNo5pxIOKizwS9AEFLohsqoaxGQj4p0vSIw== - -"@emotion/unitless@^0.7.5": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== - -"@emotion/utils@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.0.0.tgz#abe06a83160b10570816c913990245813a2fd6af" - integrity sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA== - -"@emotion/weak-memoize@^0.2.5": - version "0.2.5" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" - integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== - -"@graphql-tools/merge@6.2.15": - version "6.2.15" - resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-6.2.15.tgz#d5136a5b7a47807b187d8156573c3185321838f5" - integrity sha512-HmM7o00ecvxIm2xqMycGNf8018iv8+UbGmaj4nAa/EhVjGQefYJTB8ihW2RhpfpcMSq2830e8XskwvZ/MoIi9g== - dependencies: - "@graphql-tools/schema" "^8.0.0" - "@graphql-tools/utils" "^8.0.0" - tslib "~2.3.0" - -"@graphql-tools/merge@^8.1.0": - version "8.1.2" - resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.1.2.tgz#50f5763927c51de764d09c5bfd20261671976e24" - integrity sha512-kFLd4kKNJXYXnKIhM8q9zgGAtbLmsy3WmGdDxYq3YHBJUogucAxnivQYyRIseUq37KGmSAIWu3pBQ23TKGsGOw== - dependencies: - "@graphql-tools/utils" "^8.2.2" - tslib "~2.3.0" - -"@graphql-tools/mock@^8.1.2": - version "8.4.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/mock/-/mock-8.4.0.tgz#c4a5d0c35cc5760b99b3e062145f36ac9cfe9ffb" - integrity sha512-RKcqmw7P5pC2ULh2/kg/erxxsd7lEV/wnI5jNgahkCw8wiSC8OI3SwNMwjfrlpYogs7eEhiXi7Ix6abCiFUURw== - dependencies: - "@graphql-tools/schema" "^8.2.0" - "@graphql-tools/utils" "^8.2.3" - fast-json-stable-stringify "^2.1.0" - tslib "~2.3.0" - -"@graphql-tools/schema@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-8.0.0.tgz#65fd4d8c598300c1310d1dbfcd7dc6a10d665111" - integrity sha512-U/wFPxGnWTvWO0N8qfrgyRwGaH4UqWxFClYvLxR5zHz+GOMTL4J8MpGej4NqV2iJIefhmyV55kHjG4dvYpE0AA== - dependencies: - "@graphql-tools/merge" "6.2.15" - "@graphql-tools/utils" "^8.0.0" - tslib "~2.3.0" - value-or-promise "1.0.10" - -"@graphql-tools/schema@^8.2.0": - version "8.2.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-8.2.0.tgz#ae75cbb2df6cee9ed6d89fce56be467ab23758dc" - integrity sha512-ufmI5mJQa8NJczzfkh0pUttKvspqDcT5LLakA3jUmOrrE4d4NVj6onZlazdTzF5sAepSNqanFnwhrxZpCAJMKg== - dependencies: - "@graphql-tools/merge" "^8.1.0" - "@graphql-tools/utils" "^8.2.0" - tslib "~2.3.0" - value-or-promise "1.0.10" - -"@graphql-tools/utils@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.0.0.tgz#8b50a5a80a1f5aa577a242c8cf992c5385ee817b" - integrity sha512-0BWgcvW5a13XEeYQ+EHH4CUyYJuRhv5+9CLAX0mPvLi+fGIkJ3kcYKvikYyi7x5wG1AKQ/JE6AXtUJWt+jLqOw== - dependencies: - tslib "~2.3.0" - -"@graphql-tools/utils@^8.2.0", "@graphql-tools/utils@^8.2.2", "@graphql-tools/utils@^8.2.3": - version "8.2.5" - resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.2.5.tgz#695e6d760c1187ad2b159d5d3c4696eff9c08a27" - integrity sha512-k/Rktklhy22dQfbJLKiLGfQymQCTr6Rd2BilC7g2Yk6wFSzVLYr8jeXNoTD+/p61XBQzBjTVayskvaMvNS3BDg== - dependencies: - tslib "~2.3.0" - -"@graphql-ts/schema@0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@graphql-ts/schema/-/schema-0.3.1.tgz#d98eefce24212c20808a43338ce014ebae1ca6d7" - integrity sha512-sPK1dXo0HEk4+DkMm9eE1MeylcDxtjK/sAKJJ4FJbYKK5F0gew7ohszVfgidVwk1nrjcT2/SWncdwM3plBX28g== - dependencies: - "@babel/runtime" "^7.9.2" - -"@graphql-typed-document-node/core@^3.0.0", "@graphql-typed-document-node/core@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.0.tgz#0eee6373e11418bfe0b5638f654df7a4ca6a3950" - integrity sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg== - -"@hapi/accept@5.0.2", "@hapi/accept@^5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-5.0.2.tgz#ab7043b037e68b722f93f376afb05e85c0699523" - integrity sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw== - dependencies: - "@hapi/boom" "9.x.x" - "@hapi/hoek" "9.x.x" - -"@hapi/b64@5.x.x": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@hapi/b64/-/b64-5.0.0.tgz#b8210cbd72f4774985e78569b77e97498d24277d" - integrity sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw== - dependencies: - "@hapi/hoek" "9.x.x" - -"@hapi/boom@9.x.x": - version "9.1.3" - resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.3.tgz#22cad56e39b7a4819161a99b1db19eaaa9b6cc6e" - integrity sha512-RlrGyZ603hE/eRTZtTltocRm50HHmrmL3kGOP0SQ9MasazlW1mt/fkv4C5P/6rnpFXjwld/POFX1C8tMZE3ldg== - dependencies: - "@hapi/hoek" "9.x.x" - -"@hapi/bourne@2.x.x": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.0.0.tgz#5bb2193eb685c0007540ca61d166d4e1edaf918d" - integrity sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg== - -"@hapi/cryptiles@5.x.x": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/cryptiles/-/cryptiles-5.1.0.tgz#655de4cbbc052c947f696148c83b187fc2be8f43" - integrity sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA== - dependencies: - "@hapi/boom" "9.x.x" - -"@hapi/hoek@9.x.x": - version "9.2.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.0.tgz#f3933a44e365864f4dad5db94158106d511e8131" - integrity sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug== - -"@hapi/iron@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@hapi/iron/-/iron-6.0.0.tgz#ca3f9136cda655bdd6028de0045da0de3d14436f" - integrity sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw== - dependencies: - "@hapi/b64" "5.x.x" - "@hapi/boom" "9.x.x" - "@hapi/bourne" "2.x.x" - "@hapi/cryptiles" "5.x.x" - "@hapi/hoek" "9.x.x" - -"@josephg/resolvable@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@josephg/resolvable/-/resolvable-1.0.1.tgz#69bc4db754d79e1a2f17a650d3466e038d94a5eb" - integrity sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg== - -"@keystone-next/auth@33.0.0": - version "33.0.0" - resolved "https://registry.yarnpkg.com/@keystone-next/auth/-/auth-33.0.0.tgz#d09a5e38ebd6f87b0a05747ec2e259cb9127ad1b" - integrity sha512-u/rTowJfihp80p0vI4bq6QbtWIV4w++o78iUsxTYVVoHE/7oof1ekA67cfsS1BBx/X2zddyLp+7X/vWGyZMppw== - dependencies: - "@babel/runtime" "^7.15.4" - "@graphql-tools/schema" "^8.2.0" - "@keystone-ui/button" "^5.0.1" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/fields" "^5.0.0" - "@keystone-ui/notice" "^4.1.0" - cross-fetch "^3.1.4" - fast-deep-equal "^3.1.3" - graphql "^15.6.0" - -"@keystone-next/document-renderer@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@keystone-next/document-renderer/-/document-renderer-4.0.0.tgz#f34b18643743c23256535f57949ec843ef9d5dc9" - integrity sha512-0KrkpGE2XwhrL8iugW4tXL6/WjEmtBtIgm7NN7VUvSdIZN/AMuy57AeOdBMeiux1Z7RalNeF+JyaW5KoHukADQ== - -"@keystone-next/fields-document@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@keystone-next/fields-document/-/fields-document-10.0.0.tgz#3541f9d47f39005951a0948ee714097adb64998d" - integrity sha512-19Q4CODYTBonNhhgll+Nz6x8RGcMn8rTwgA6j9qJZuQTRscBGU+gRMVZNotN8xUlT+gtNgA/7vi5pT6bAx82Rw== - dependencies: - "@babel/runtime" "^7.15.4" - "@braintree/sanitize-url" "^5.0.2" - "@emotion/weak-memoize" "^0.2.5" - "@keystone-ui/button" "^5.0.1" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/fields" "^5.0.0" - "@keystone-ui/icons" "^4.0.1" - "@keystone-ui/popover" "^4.0.4" - "@keystone-ui/tooltip" "^4.0.2" - "@types/react" "^17.0.24" - apollo-server-errors "^3.1.0" - apply-ref "^1.0.0" - fp-ts "^2.11.4" - graphql "^15.6.0" - io-ts "^2.2.16" - io-ts-excess "^1.0.1" - is-hotkey "^0.2.0" - match-sorter "^6.3.1" - mdast-util-definitions "^4.0.0" - mdast-util-from-markdown "^0.8.5" - mdast-util-gfm-autolink-literal "^0.1.3" - mdast-util-gfm-strikethrough "^0.2.3" - micromark-extension-gfm-autolink-literal "0.5.7" - micromark-extension-gfm-strikethrough "0.6.5" - react "^17.0.2" - scroll-into-view-if-needed "^2.2.28" - slate "^0.60.4" - slate-history "^0.60.4" - slate-react "^0.60.4" - -"@keystone-next/keystone@^26.0.1": - version "26.0.1" - resolved "https://registry.yarnpkg.com/@keystone-next/keystone/-/keystone-26.0.1.tgz#2cb51c1a23fe1fcd5c8f3b457181aca58d14a029" - integrity sha512-ypZkwzPmaj0b+P7Gkm2UAFj6qMi+qClbW1dgAYAxsL15J+e1boTN55VotKWVm1X3m9hThkomTrU66lgWKyrnrg== - dependencies: - "@apollo/client" "^3.4.15" - "@babel/core" "^7.15.5" - "@babel/plugin-transform-modules-commonjs" "^7.15.4" - "@babel/runtime" "^7.15.4" - "@emotion/hash" "^0.8.0" - "@emotion/weak-memoize" "^0.2.5" - "@graphql-tools/schema" "^8.2.0" - "@graphql-ts/schema" "0.3.1" - "@hapi/iron" "^6.0.0" - "@keystone-ui/button" "^5.0.1" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/fields" "^5.0.0" - "@keystone-ui/icons" "^4.0.1" - "@keystone-ui/loading" "^4.0.1" - "@keystone-ui/modals" "^4.0.1" - "@keystone-ui/notice" "^4.1.0" - "@keystone-ui/options" "^4.0.3" - "@keystone-ui/pill" "^5.0.1" - "@keystone-ui/popover" "^4.0.4" - "@keystone-ui/segmented-control" "^5.0.0" - "@keystone-ui/toast" "^4.0.3" - "@keystone-ui/tooltip" "^4.0.2" - "@preconstruct/next" "^3.0.0" - "@prisma/client" "3.1.1" - "@prisma/migrate" "3.1.1" - "@prisma/sdk" "3.1.1" - "@sindresorhus/slugify" "^1.1.2" - "@types/apollo-upload-client" "14.1.0" - "@types/babel__core" "^7.1.16" - "@types/bcryptjs" "^2.4.2" - "@types/cookie" "^0.4.1" - "@types/express" "^4.17.13" - "@types/form-data" "2.5.0" - "@types/fs-extra" "^9.0.13" - "@types/graphql-upload" "^8.0.7" - "@types/inflection" "^1.13.0" - "@types/node-fetch" "^2.5.12" - "@types/pluralize" "^0.0.29" - "@types/prettier" "^2.4.1" - "@types/prompts" "^2.0.14" - "@types/react" "^17.0.24" - "@types/source-map-support" "^0.5.4" - "@types/supertest" "^2.0.11" - "@types/uid-safe" "^2.1.2" - "@types/uuid" "^8.3.1" - apollo-server-errors "^3.1.0" - apollo-server-express "^3.3.0" - apollo-server-micro "^3.3.0" - apollo-server-types "^3.2.0" - apollo-upload-client "^16.0.0" - bcryptjs "^2.4.3" - bytes "^3.1.0" - chalk "^4.1.2" - clipboard-copy "^4.0.1" - cookie "^0.4.1" - copy-to-clipboard "^3.3.1" - cors "^2.8.5" - cuid "^2.1.8" - date-fns "^2.24.0" - decimal.js "10.3.1" - dumb-passwords "^0.2.1" - execa "^5.1.1" - express "^4.17.1" - fast-deep-equal "^3.1.3" - fast-glob "^3.2.7" - filenamify "^4.3.0" - form-data "4.0.0" - fs-extra "^10.0.0" - graphql "^15.6.0" - graphql-type-json "^0.3.2" - graphql-upload "^12.0.0" - image-size "^1.0.0" - image-type "^4.1.0" - inflection "^1.13.1" - intersection-observer "^0.12.0" - memoize-one "^5.2.1" - meow "^9.0.0" - micro "^9.3.4" - next "^11.1.0" - node-fetch "^2.6.5" - object-hash "^2.2.0" - p-limit "^2.3.0" - pirates "^4.0.1" - pluralize "^8.0.0" - prettier "^2.4.1" - prisma "3.1.1" - prompts "^2.4.1" - react "^17.0.2" - react-dom "^17.0.2" - resolve "^1.20.0" - source-map-support "^0.5.20" - supertest "^6.1.6" - uid-safe "^2.1.5" - uuid "^8.3.2" - -"@keystone-ui/button@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@keystone-ui/button/-/button-5.0.1.tgz#0a8dec20f8a27abd8f941783ab0e9db0011dc5c3" - integrity sha512-+ScnOXpODywC083y+qkP/UaMgHT5aWakM+Pp1d8ynviGG7HimW7oUst2kTHVPqS2BpbI+ER7801QGO1Kx2lavw== - dependencies: - "@babel/runtime" "^7.15.3" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/icons" "^4.0.1" - "@keystone-ui/loading" "^4.0.1" - react "^17.0.2" - -"@keystone-ui/core@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@keystone-ui/core/-/core-3.2.0.tgz#9fe51b74865746d02f67b68c8fca7be9fb82b9fe" - integrity sha512-uoj19+bZowDV7yBJJzrbkylzsRJDqBdctEA0gd/pY9N5lEiB5vOWmj1MHv9isXHuRmZ0N5aloncZzwrq+EI1aw== - dependencies: - "@babel/runtime" "^7.15.3" - "@emotion/react" "^11.4.1" - "@types/facepaint" "^1.2.2" - facepaint "^1.2.1" - -"@keystone-ui/fields@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@keystone-ui/fields/-/fields-5.0.0.tgz#58c69a75c40c28a380b0a7412895ac63ec69c148" - integrity sha512-+mIsgfuKwejFnUNvqoQ+c2/69HSPtzeTNszRZXYXGmYFcDGhUsslQijJn/hq6HPldPsq2VnL/r9AP6/HBJkUWw== - dependencies: - "@babel/runtime" "^7.15.4" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/icons" "^4.0.1" - "@keystone-ui/popover" "^4.0.4" - "@types/react-select" "^4.0.18" - date-fns "^2.24.0" - react "^17.0.2" - react-day-picker "npm:react-day-picker@^7.4.8" - react-focus-lock "^2.5.2" - react-select "^5.0.0" - -"@keystone-ui/icons@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@keystone-ui/icons/-/icons-4.0.1.tgz#ece7c6557cbc866cd69916bc743701d2aafa1b09" - integrity sha512-OzTk9rwB7AqyagtYeNleU/Lut6jVdekmh1FDb8RAAE+Qd+Lde0nfswYiwnNW0w+BsNA9WyTAG/4Ps11e3QJD0A== - dependencies: - "@babel/runtime" "^7.15.3" - "@keystone-ui/core" "^3.2.0" - -"@keystone-ui/loading@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@keystone-ui/loading/-/loading-4.0.1.tgz#bf43102bfd63166d6835942dca67fe27af6ca68f" - integrity sha512-ruM2OYbUWpI/PrrM2fh5b/LwLJp7ULAT3Q5vJmXM5obvtTJJW3dwWPqqWqNc3iFn0VqjzN5KMb2xi9aG6cwPAg== - dependencies: - "@babel/runtime" "^7.15.3" - "@keystone-ui/core" "^3.2.0" - react "^17.0.2" - -"@keystone-ui/modals@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@keystone-ui/modals/-/modals-4.0.1.tgz#4f42939e632cc4e49c3aef2b97beed4b68f9fbb5" - integrity sha512-nbRD9lZosU+KjRXZmI1A9QxjE3GZqeQpWgMqbu3RAsXqBMmPip9NdPSUbqQCAG4In9V31zvaLqCPxrj2x8McIQ== - dependencies: - "@babel/runtime" "^7.15.3" - "@keystone-ui/button" "^5.0.1" - "@keystone-ui/core" "^3.2.0" - react "^17.0.2" - react-focus-lock "^2.5.2" - react-remove-scroll "^2.4.3" - react-transition-group "^4.4.2" - -"@keystone-ui/notice@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@keystone-ui/notice/-/notice-4.1.0.tgz#5a10b44bc5e62af6e15cc6a630aca66b1c8f5703" - integrity sha512-LqPXF4rJpbFoSW7nvu/ZTAlDjQuB0Y38ZNV6k4pQ9E5AP10YYewB+5oKLVtiMWsh8yMYD3qJ9otzo+wht0mHwQ== - dependencies: - "@babel/runtime" "^7.15.4" - "@keystone-ui/button" "^5.0.1" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/icons" "^4.0.1" - react "^17.0.2" - -"@keystone-ui/options@^4.0.3": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@keystone-ui/options/-/options-4.0.3.tgz#7e66c6ca388b1c6111c6a219fd2375b8bbeb181a" - integrity sha512-Nz8Uqoslksgqy6tcm9cAt2PzH2EmkCjxa4GBr1hAE4CgpZXUjXo+g6Y26NyjF/yUl+jU8KNkDuGHtzFVMopPuw== - dependencies: - "@babel/runtime" "^7.15.4" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/fields" "^5.0.0" - "@keystone-ui/icons" "^4.0.1" - "@types/react-select" "^4.0.18" - react-select "^5.0.0" - -"@keystone-ui/pill@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@keystone-ui/pill/-/pill-5.0.1.tgz#4ec20adb331114ce60d594730eb9681172906891" - integrity sha512-6rYEgfar9yPTo8cCN7Qkor9B59AOV2Vedkps1sGYtjrbEE3d5IotjNOX13x6KrPt/butTF7Qympz0wrhCrWmVA== - dependencies: - "@babel/runtime" "^7.15.3" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/icons" "^4.0.1" - -"@keystone-ui/popover@^4.0.3", "@keystone-ui/popover@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@keystone-ui/popover/-/popover-4.0.4.tgz#73c7ec2e2a6f049d374412833a1e3b245829c4f2" - integrity sha512-3wTBjuVEqf6QDEXNSByS97ndmMu9UrrDLLr63N5oNTOHCZtl8FuYVBe3KrTpbm/ZnyyygTC7qXr5ncxpOJIdEw== - dependencies: - "@babel/runtime" "^7.15.4" - "@keystone-ui/core" "^3.2.0" - "@popperjs/core" "^2.10.1" - focus-trap "^6.7.1" - react-popper "^2.2.5" - -"@keystone-ui/segmented-control@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@keystone-ui/segmented-control/-/segmented-control-5.0.0.tgz#525108d8935f0cd52aa1fd93ceb7fd6aebc23129" - integrity sha512-RImgv2HrlALL5SpnksQ5XuLI1iCxwOq94wgCMvTvQTL8TcIvhDdyT2tXuChPRCilc2nSTIGAcESdh4etZXo2Ig== - dependencies: - "@babel/runtime" "^7.15.4" - "@keystone-ui/core" "^3.2.0" - -"@keystone-ui/toast@^4.0.3": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@keystone-ui/toast/-/toast-4.0.3.tgz#4989b0d57855174b644c3cfcc77e5b188ed2b708" - integrity sha512-W3swOk2JoQ652+cULErDT4BtFUPOvTUDaBovTVgEomwnTojDKNhdekZa9HjRMwasq2yUW518/oxcGwkd71AlNw== - dependencies: - "@babel/runtime" "^7.15.3" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/icons" "^4.0.1" - -"@keystone-ui/tooltip@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@keystone-ui/tooltip/-/tooltip-4.0.2.tgz#32aa010af70f72334aadb8d6a28e67eaaf50b3b9" - integrity sha512-I4GMyIomFAB0S0AHYkr9UoS+Q2UF5zlVaxGKeTJ+5u9fUUhHfktIE/OgW/wpmGjNPeVPg0cWZiik2gfAsoQe0A== - dependencies: - "@babel/runtime" "^7.15.3" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/popover" "^4.0.3" - apply-ref "^1.0.0" - -"@napi-rs/triples@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@napi-rs/triples/-/triples-1.0.3.tgz#76d6d0c3f4d16013c61e45dfca5ff1e6c31ae53c" - integrity sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA== - -"@next/env@11.1.2": - version "11.1.2" - resolved "https://registry.yarnpkg.com/@next/env/-/env-11.1.2.tgz#27996efbbc54c5f949f5e8c0a156e3aa48369b99" - integrity sha512-+fteyVdQ7C/OoulfcF6vd1Yk0FEli4453gr8kSFbU8sKseNSizYq6df5MKz/AjwLptsxrUeIkgBdAzbziyJ3mA== - -"@next/polyfill-module@11.1.2": - version "11.1.2" - resolved "https://registry.yarnpkg.com/@next/polyfill-module/-/polyfill-module-11.1.2.tgz#1fe92c364fdc81add775a16c678f5057c6aace98" - integrity sha512-xZmixqADM3xxtqBV0TpAwSFzWJP0MOQzRfzItHXf1LdQHWb0yofHHC+7eOrPFic8+ZGz5y7BdPkkgR1S25OymA== - -"@next/react-dev-overlay@11.1.2": - version "11.1.2" - resolved "https://registry.yarnpkg.com/@next/react-dev-overlay/-/react-dev-overlay-11.1.2.tgz#73795dc5454b7af168bac93df7099965ebb603be" - integrity sha512-rDF/mGY2NC69mMg2vDqzVpCOlWqnwPUXB2zkARhvknUHyS6QJphPYv9ozoPJuoT/QBs49JJd9KWaAzVBvq920A== - dependencies: - "@babel/code-frame" "7.12.11" - anser "1.4.9" - chalk "4.0.0" - classnames "2.2.6" - css.escape "1.5.1" - data-uri-to-buffer "3.0.1" - platform "1.3.6" - shell-quote "1.7.2" - source-map "0.8.0-beta.0" - stacktrace-parser "0.1.10" - strip-ansi "6.0.0" - -"@next/react-refresh-utils@11.1.2": - version "11.1.2" - resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-11.1.2.tgz#44ea40d8e773e4b77bad85e24f6ac041d5e4b4a5" - integrity sha512-hsoJmPfhVqjZ8w4IFzoo8SyECVnN+8WMnImTbTKrRUHOVJcYMmKLL7xf7T0ft00tWwAl/3f3Q3poWIN2Ueql/Q== - -"@next/swc-darwin-arm64@11.1.2": - version "11.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-11.1.2.tgz#93226c38db488c4b62b30a53b530e87c969b8251" - integrity sha512-hZuwOlGOwBZADA8EyDYyjx3+4JGIGjSHDHWrmpI7g5rFmQNltjlbaefAbiU5Kk7j3BUSDwt30quJRFv3nyJQ0w== - -"@next/swc-darwin-x64@11.1.2": - version "11.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-11.1.2.tgz#792003989f560c00677b5daeff360b35b510db83" - integrity sha512-PGOp0E1GisU+EJJlsmJVGE+aPYD0Uh7zqgsrpD3F/Y3766Ptfbe1lEPPWnRDl+OzSSrSrX1lkyM/Jlmh5OwNvA== - -"@next/swc-linux-x64-gnu@11.1.2": - version "11.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-11.1.2.tgz#8216b2ae1f21f0112958735c39dd861088108f37" - integrity sha512-YcDHTJjn/8RqvyJVB6pvEKXihDcdrOwga3GfMv/QtVeLphTouY4BIcEUfrG5+26Nf37MP1ywN3RRl1TxpurAsQ== - -"@next/swc-win32-x64-msvc@11.1.2": - version "11.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-11.1.2.tgz#e15824405df137129918205e43cb5e9339589745" - integrity sha512-e/pIKVdB+tGQYa1cW3sAeHm8gzEri/HYLZHT4WZojrUxgWXqx8pk7S7Xs47uBcFTqBDRvK3EcQpPLf3XdVsDdg== - -"@node-rs/helper@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@node-rs/helper/-/helper-1.2.1.tgz#e079b05f21ff4329d82c4e1f71c0290e4ecdc70c" - integrity sha512-R5wEmm8nbuQU0YGGmYVjEc0OHtYsuXdpRG+Ut/3wZ9XAvQWyThN08bTh2cBJgoZxHQUPtvRfeQuxcAgLuiBISg== - dependencies: - "@napi-rs/triples" "^1.0.3" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@popperjs/core@^2.10.1": - version "2.10.2" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.10.2.tgz#0798c03351f0dea1a5a4cabddf26a55a7cbee590" - integrity sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ== - -"@preconstruct/next@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@preconstruct/next/-/next-3.0.0.tgz#71781cbaecd011f43e456a149817094a43e4755f" - integrity sha512-G90cyJX9w4Zr3Bt/j2fURgDhsJb5+agqf4YUgrvDe3Dyvbbssy9a6d0tzLH0ehfa2Osxw/EEhQb+W4X+v/x06A== - -"@prisma/client@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@prisma/client/-/client-3.1.1.tgz#f4012631528049c22d12b212846dcf503db33cfe" - integrity sha512-8ud8vVFMIg37yrkZ4wPpjKoMxFbCL0Pesq5eyLnag/s0LTKsVEN7ZBIQq9JzWW+AUqOzGKXr2Jt4Sl8xdGI99w== - dependencies: - "@prisma/engines-version" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - -"@prisma/debug@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-3.0.2.tgz#a99ae8dfa075f4e58a25666d609deb900820c5be" - integrity sha512-D2/LghEqphW6h9ycT8nfdEw2rzT0LXmikBy2101aYcY28vS01rHTVIUOiz/DDaltlqY1qBat3F5vgM+6GwIqbw== - dependencies: - "@types/debug" "4.1.7" - debug "4.3.2" - ms "2.1.3" - -"@prisma/debug@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-3.1.1.tgz#1e9739715465d25c09d21d5c3ed9516694eb7602" - integrity sha512-KCpckIAxYnf3wJ6wa2HkdwK7JZdgwr00T5QulC6dHbhn0a8QCSb/yTo74m2zuiyi/5NYo5LslZVPFeQJvKU7cQ== - dependencies: - "@types/debug" "4.1.7" - debug "4.3.2" - ms "2.1.3" - -"@prisma/engine-core@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@prisma/engine-core/-/engine-core-3.1.1.tgz#1e32b4089f47d4fd31e8591408fa93dfb299d451" - integrity sha512-zq34wWm797ILXCkYdpJjZqSBXizUffgX5WIsY1Su8RBArap9r9IoO2XMt412vADbBe9+LH86vJPBg92YEaf96g== - dependencies: - "@prisma/debug" "3.1.1" - "@prisma/engines" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - "@prisma/generator-helper" "3.1.1" - "@prisma/get-platform" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - chalk "4.1.2" - execa "5.1.1" - get-stream "6.0.1" - indent-string "4.0.0" - new-github-issue-url "0.2.1" - p-retry "4.6.1" - terminal-link "2.1.1" - undici "3.3.6" - -"@prisma/engines-version@3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f": - version "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f.tgz#f9908eb7808f2a546634398063942eaecb2474ef" - integrity sha512-EuEMKLuwIcBO7uInZQHeG1yaywcfl32Tq8TDf5tgLvblk+ka70sej7S67lh3BV5gXMLTc3GdthSHPfDqZEK5uA== - -"@prisma/engines@3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f": - version "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f.tgz#7b45708e6a42523dc9bc2214e5c62781f608dc3a" - integrity sha512-6NEp0VlLho3hVtIvj2P4h0e19AYqQSXtFGts8gSIXDnV+l5pRFZaDMfGo2RiLMR0Kfrs8c3ZYxYX0sWmVL0tWw== - -"@prisma/fetch-engine@3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f": - version "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f.tgz#957143646d9a046361c45dc34ac3f3932b328192" - integrity sha512-ufywCOjqel/eNzR+yA4U7/RlbcztxFs0UfwbLRgqqNAaWR8hOk9TiTWyzgoxg+gh3nTEaBvh+GYt+n1YU98Wwg== - dependencies: - "@prisma/debug" "3.0.2" - "@prisma/get-platform" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - chalk "^4.0.0" - execa "^5.0.0" - find-cache-dir "^3.3.1" - hasha "^5.2.0" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - make-dir "^3.0.2" - node-fetch "^2.6.0" - p-filter "^2.1.0" - p-map "^4.0.0" - p-retry "^4.2.0" - progress "^2.0.3" - rimraf "^3.0.2" - temp-dir "^2.0.0" - tempy "^1.0.0" - -"@prisma/generator-helper@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@prisma/generator-helper/-/generator-helper-3.1.1.tgz#d81c2945894d365b5d4dcd890487b8ca9a556a52" - integrity sha512-Jke+zZrUE0v1gqaQ4fyMDzDk9yj7W8qMtyyPJjFWyprQNf4zMTffLmYsIrYVCULYt6C47u2AwXbQGyESlSFgJw== - dependencies: - "@prisma/debug" "3.1.1" - "@types/cross-spawn" "6.0.2" - chalk "4.1.2" - cross-spawn "7.0.3" - -"@prisma/get-platform@3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f": - version "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f.tgz#d9499dc9af9032c92f773bb510aefbc7534e76d0" - integrity sha512-m5hsHxC7UmGbqDCEe6EFYDdSjZbxcY/r2Rp53sCy5U2Km6vMBzT/p5SYAH59An0p07WUbhB1R7x7Km11lkUA0w== - dependencies: - "@prisma/debug" "3.0.2" - -"@prisma/migrate@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@prisma/migrate/-/migrate-3.1.1.tgz#464930ce048cc449c7da733dd074d2b1a08ea3c9" - integrity sha512-eZfWfyEn3/NZjN0YKu2IHaOtXdVj5rF94WpSfJuawHwS7aNQ9kZM8XBi+9r8DfhguwXyIAJcOT9fKMOt/HP+ew== - dependencies: - "@prisma/debug" "3.1.1" - "@prisma/get-platform" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - "@sindresorhus/slugify" "1.1.2" - execa "5.1.1" - global-dirs "3.0.0" - has-yarn "2.1.0" - indent-string "4.0.0" - log-update "4.0.0" - new-github-issue-url "0.2.1" - open "7.4.2" - pkg-up "3.1.0" - prompts "2.4.1" - resolve-pkg "2.0.0" - strip-ansi "6.0.0" - strip-indent "3.0.0" - -"@prisma/sdk@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@prisma/sdk/-/sdk-3.1.1.tgz#4795e1c44ce40e589a47558813fca5a81c05b0e6" - integrity sha512-rzQ4Gsvre6chTm3dV32lKdmvt7XQ3pitIXWvimZx66KhAzy3YSasjx+CmjsLhqIDT8ftT7mpOICJbCcY4HIrGA== - dependencies: - "@prisma/debug" "3.1.1" - "@prisma/engine-core" "3.1.1" - "@prisma/engines" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - "@prisma/fetch-engine" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - "@prisma/generator-helper" "3.1.1" - "@prisma/get-platform" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - "@timsuchanek/copy" "1.4.5" - archiver "4.0.2" - arg "5.0.1" - chalk "4.1.2" - checkpoint-client "1.1.20" - cli-truncate "2.1.0" - dotenv "10.0.0" - execa "5.1.1" - find-up "5.0.0" - global-dirs "3.0.0" - globby "11.0.4" - has-yarn "2.1.0" - is-ci "3.0.0" - make-dir "3.1.0" - node-fetch "2.6.2" - p-map "4.0.0" - read-pkg-up "7.0.1" - resolve "1.20.0" - rimraf "3.0.2" - shell-quote "1.7.2" - string-width "4.2.2" - strip-ansi "6.0.0" - strip-indent "3.0.0" - tar "6.1.11" - temp-dir "2.0.0" - temp-write "4.0.0" - tempy "1.0.1" - terminal-link "2.1.1" - tmp "0.2.1" - -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= - -"@sindresorhus/slugify@1.1.2", "@sindresorhus/slugify@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@sindresorhus/slugify/-/slugify-1.1.2.tgz#c2c0129298b8caace2d9156176fe244d0e83156c" - integrity sha512-V9nR/W0Xd9TSGXpZ4iFUcFGhuOJtZX82Fzxj1YISlbSgKvIiNa7eLEZrT0vAraPOt++KHauIVNYgGRgjc13dXA== - dependencies: - "@sindresorhus/transliterate" "^0.1.1" - escape-string-regexp "^4.0.0" - -"@sindresorhus/transliterate@^0.1.1": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@sindresorhus/transliterate/-/transliterate-0.1.2.tgz#ffce368271d153550e87de81486004f2637425af" - integrity sha512-5/kmIOY9FF32nicXH+5yLNTX4NJ4atl7jRgqAJuIn/iyDFXBktOKDxCvyGE/EzmF4ngSUvjXxQUQlQiZ5lfw+w== - dependencies: - escape-string-regexp "^2.0.0" - lodash.deburr "^4.1.0" - -"@tailwindcss/forms@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.3.3.tgz#a29d22668804f3dae293dcadbef1aa6315c45b64" - integrity sha512-U8Fi/gq4mSuaLyLtFISwuDYzPB73YzgozjxOIHsK6NXgg/IWD1FLaHbFlWmurAMyy98O+ao74ksdQefsquBV1Q== - dependencies: - mini-svg-data-uri "^1.2.3" - -"@timsuchanek/copy@1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@timsuchanek/copy/-/copy-1.4.5.tgz#8e9658c056e24e1928a88bed45f9eac6a72b7c40" - integrity sha512-N4+2/DvfwzQqHYL/scq07fv8yXbZc6RyUxKJoE8Clm14JpLOf9yNI4VB4D6RsV3h9zgzZ4loJUydHKM7pp3blw== - dependencies: - "@timsuchanek/sleep-promise" "^8.0.1" - commander "^2.19.0" - mkdirp "^1.0.4" - prettysize "^2.0.0" - -"@timsuchanek/sleep-promise@^8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@timsuchanek/sleep-promise/-/sleep-promise-8.0.1.tgz#81c0754b345138a519b51c2059771eb5f9b97818" - integrity sha512-cxHYbrXfnCWsklydIHSw5GCMHUPqpJ/enxWSyVHNOgNe61sit/+aOXTTI+VOdWkvVaJsI2vsB9N4+YDNITawOQ== - -"@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== - -"@types/accepts@*", "@types/accepts@^1.3.5": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" - integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== - dependencies: - "@types/node" "*" - -"@types/apollo-upload-client@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@types/apollo-upload-client/-/apollo-upload-client-14.1.0.tgz#21a57d7e3f29ff946ba51a53b3d7da46ddd21fbc" - integrity sha512-ZLvcEqu+l9qKGdrIpASt/A2WY1ghAC9L3qaoegkiBOccjxvQmWN9liZzVFiuHTuWseWpVbMklqbs/z+KEjll9Q== - dependencies: - "@apollo/client" "^3.1.3" - "@types/extract-files" "*" - graphql "^15.3.0" - -"@types/babel__core@^7.1.16": - version "7.1.16" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702" - integrity sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" - integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" - integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== - dependencies: - "@babel/types" "^7.3.0" - -"@types/bcryptjs@^2.4.2": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.2.tgz#e3530eac9dd136bfdfb0e43df2c4c5ce1f77dfae" - integrity sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ== - -"@types/body-parser@*", "@types/body-parser@1.19.1": - version "1.19.1" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.1.tgz#0c0174c42a7d017b818303d4b5d969cb0b75929c" - integrity sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/content-disposition@*": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.4.tgz#de48cf01c79c9f1560bcfd8ae43217ab028657f8" - integrity sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ== - -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - -"@types/cookiejar@*": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.2.tgz#66ad9331f63fe8a3d3d9d8c6e3906dd10f6446e8" - integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog== - -"@types/cookies@*": - version "0.7.7" - resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.7.tgz#7a92453d1d16389c05a5301eef566f34946cfd81" - integrity sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA== - dependencies: - "@types/connect" "*" - "@types/express" "*" - "@types/keygrip" "*" - "@types/node" "*" - -"@types/cors@2.8.12": - version "2.8.12" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" - integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== - -"@types/cross-spawn@6.0.2": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@types/cross-spawn/-/cross-spawn-6.0.2.tgz#168309de311cd30a2b8ae720de6475c2fbf33ac7" - integrity sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw== - dependencies: - "@types/node" "*" - -"@types/debug@4.1.7": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== - dependencies: - "@types/ms" "*" - -"@types/esrever@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@types/esrever/-/esrever-0.2.0.tgz#96404a2284b2c7527f08a1e957f8a31705f9880f" - integrity sha512-5NI6TeGzVEy/iBcuYtcPzzIC6EqlfQ2+UZ54vT0ulq8bPNGAy8UJD+XcsAyEOcnYFUjOVWuUV+k4/rVkxt9/XQ== - -"@types/express-serve-static-core@4.17.24", "@types/express-serve-static-core@^4.17.18": - version "4.17.24" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz#ea41f93bf7e0d59cd5a76665068ed6aab6815c07" - integrity sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - -"@types/express@*", "@types/express@4.17.13", "@types/express@^4.17.13": - version "4.17.13" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" - integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/extract-files@*": - version "8.1.1" - resolved "https://registry.yarnpkg.com/@types/extract-files/-/extract-files-8.1.1.tgz#11b67e795ad2c8b483431e8d4f190db2fd22944b" - integrity sha512-dMJJqBqyhsfJKuK7p7HyyNmki7qj1AlwhUKWx6KrU7i1K2T2SPsUsSUTWFmr/sEM1q8rfR8j5IyUmYrDbrhfjQ== - -"@types/facepaint@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/facepaint/-/facepaint-1.2.2.tgz#1432acb1b09696216861a457a037186afeb95346" - integrity sha512-Xl9tAINsQL1s0TdXG5IiG75kZrxem5esbnKJF5gQgFel92OdS5zLtFYnbBw6fBruCMPYJQ9mK5pVmSsMl3Puug== - -"@types/form-data@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.5.0.tgz#5025f7433016f923348434c40006d9a797c1b0e8" - integrity sha512-23/wYiuckYYtFpL+4RPWiWmRQH2BjFuqCUi2+N3amB1a1Drv+i/byTrGvlLwRVLFNAZbwpbQ7JvTK+VCAPMbcg== - dependencies: - form-data "*" - -"@types/fs-capacitor@*": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz#17113e25817f584f58100fb7a08eed288b81956e" - integrity sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ== - dependencies: - "@types/node" "*" - -"@types/fs-extra@^9.0.13": - version "9.0.13" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" - integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== - dependencies: - "@types/node" "*" - -"@types/graphql-upload@^8.0.7": - version "8.0.7" - resolved "https://registry.yarnpkg.com/@types/graphql-upload/-/graphql-upload-8.0.7.tgz#71dd5d4a8d9ddb598df91298d6e98a943061b255" - integrity sha512-uXhInuUY/W6n9a+PdCt9vcZ7z2m+NzByBJFvvDM+46pljqEwXXnIAjsEI1Dka2FKRTGthetm/imN//RhtEEYSA== - dependencies: - "@types/express" "*" - "@types/fs-capacitor" "*" - "@types/koa" "*" - graphql "^15.3.0" - -"@types/http-assert@*": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.1.tgz#d775e93630c2469c2f980fc27e3143240335db3b" - integrity sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ== - -"@types/http-errors@*": - version "1.8.1" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.1.tgz#e81ad28a60bee0328c6d2384e029aec626f1ae67" - integrity sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q== - -"@types/inflection@^1.13.0": - version "1.13.0" - resolved "https://registry.yarnpkg.com/@types/inflection/-/inflection-1.13.0.tgz#d641b773317f2e71e5c7c80809057e3101c4b2bf" - integrity sha512-kZSETqAVS74XC/K3mPX/tbMEi/Zy1KP0Wc59dB1i5P72AHz4eSW+UIpzWxmQnDxipoKSX5eRgUXy+wUr+bY73g== - -"@types/is-hotkey@^0.1.1": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@types/is-hotkey/-/is-hotkey-0.1.3.tgz#1e86be048d3af160e8e676d5cd463f6f7061589a" - integrity sha512-Hz+eHHpMWLBX1CpDXSuQre9nYXN2e2VGVHvkkldxDzo9eFtRpHm5iOlJlZvnNGvele5584cUSkRnFRQb+Wcu0w== - -"@types/keygrip@*": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" - integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== - -"@types/koa-compose@*": - version "3.2.5" - resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" - integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== - dependencies: - "@types/koa" "*" - -"@types/koa@*": - version "2.13.4" - resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.4.tgz#10620b3f24a8027ef5cbae88b393d1b31205726b" - integrity sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw== - dependencies: - "@types/accepts" "*" - "@types/content-disposition" "*" - "@types/cookies" "*" - "@types/http-assert" "*" - "@types/http-errors" "*" - "@types/keygrip" "*" - "@types/koa-compose" "*" - "@types/node" "*" - -"@types/lodash@^4.14.149": - version "4.14.171" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.171.tgz#f01b3a5fe3499e34b622c362a46a609fdb23573b" - integrity sha512-7eQ2xYLLI/LsicL2nejW9Wyko3lcpN6O/z0ZLHrEQsg280zIdCv1t/0m6UtBjUHokCGBQ3gYTbHzDkZ1xOBwwg== - -"@types/long@^4.0.0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" - integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== - -"@types/mdast@^3.0.0": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.7.tgz#cba63d0cc11eb1605cea5c0ad76e02684394166b" - integrity sha512-YwR7OK8aPmaBvMMUi+pZXBNoW2unbVbfok4YRqGMJBe1dpDlzpRkJrYEYmvjxgs5JhuQmKfDexrN98u941Zasg== - dependencies: - "@types/unist" "*" - -"@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== - -"@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== - -"@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== - -"@types/node-fetch@^2.5.12": - version "2.5.12" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66" - integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw== - dependencies: - "@types/node" "*" - form-data "^3.0.0" - -"@types/node@*": - version "16.4.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.5.tgz#eac95d4e52775190c405f0b9061ddcfb0304f7fc" - integrity sha512-+0GPv/hIFNoy8r5MFf7vRpBjnqNYNrlHdetoy23E7TYc7JB2ctwyi3GMKpviozaHQ/Sy2kBNUTvG9ywN66zV1g== - -"@types/node@^10.1.0": - version "10.17.60" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" - integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== - -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/pluralize@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/pluralize/-/pluralize-0.0.29.tgz#6ffa33ed1fc8813c469b859681d09707eb40d03c" - integrity sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA== - -"@types/prettier@^2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.1.tgz#e1303048d5389563e130f5bdd89d37a99acb75eb" - integrity sha512-Fo79ojj3vdEZOHg3wR9ksAMRz4P3S5fDB5e/YWZiFnyFQI1WY2Vftu9XoXVVtJfxB7Bpce/QTqWSSntkz2Znrw== - -"@types/prompts@^2.0.14": - version "2.0.14" - resolved "https://registry.yarnpkg.com/@types/prompts/-/prompts-2.0.14.tgz#10cb8899844bb0771cabe57c1becaaaca9a3b521" - integrity sha512-HZBd99fKxRWpYCErtm2/yxUZv6/PBI9J7N4TNFffl5JbrYMHBwF25DjQGTW3b3jmXq+9P6/8fCIb2ee57BFfYA== - dependencies: - "@types/node" "*" - -"@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/qs@*": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/react-dom@*": - version "17.0.9" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.9.tgz#441a981da9d7be117042e1a6fd3dac4b30f55add" - integrity sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg== - dependencies: - "@types/react" "*" - -"@types/react-select@^4.0.18": - version "4.0.18" - resolved "https://registry.yarnpkg.com/@types/react-select/-/react-select-4.0.18.tgz#f907f406411afa862217a9d86c54a301367a35c1" - integrity sha512-uCPRMPshd96BwHuT7oCrFduiv5d6km3VwmtW7rVl9g4XetS3VoJ9nZo540LiwtQgaFcW96POwaxQDZDAyYaepg== - dependencies: - "@emotion/serialize" "^1.0.0" - "@types/react" "*" - "@types/react-dom" "*" - "@types/react-transition-group" "*" - -"@types/react-transition-group@*": - version "4.4.2" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.2.tgz#38890fd9db68bf1f2252b99a942998dc7877c5b3" - integrity sha512-KibDWL6nshuOJ0fu8ll7QnV/LVTo3PzQ9aCPnRUYPfX7eZohHwLIdNHj7pftanREzHNP4/nJa8oeM73uSiavMQ== - dependencies: - "@types/react" "*" - -"@types/react-transition-group@^4.4.0": - version "4.4.3" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.3.tgz#b0994da0a7023d67dbb4a8910a62112bc00d5688" - integrity sha512-fUx5muOWSYP8Bw2BUQ9M9RK9+W1XBK/7FLJ8PTQpnpTEkn0ccyMffyEQvan4C3h53gHdx7KE5Qrxi/LnUGQtdg== - dependencies: - "@types/react" "*" - -"@types/react@*": - version "17.0.15" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.15.tgz#c7533dc38025677e312606502df7656a6ea626d0" - integrity sha512-uTKHDK9STXFHLaKv6IMnwp52fm0hwU+N89w/p9grdUqcFA6WuqDyPhaWopbNyE1k/VhgzmHl8pu1L4wITtmlLw== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@17.0.27", "@types/react@^17.0.24": - version "17.0.27" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.27.tgz#6498ed9b3ad117e818deb5525fa1946c09f2e0e6" - integrity sha512-zgiJwtsggVGtr53MndV7jfiUESTqrbxOcBvwfe6KS/9bzaVPCTDieTWnFNecVNx6EAaapg5xsLLWFfHHR437AA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/retry@^0.12.0": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" - integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== - -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - -"@types/serve-static@*": - version "1.13.10" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" - integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/source-map-support@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@types/source-map-support/-/source-map-support-0.5.4.tgz#574ff6a8636bc0ebae78a8014136f749b3177d58" - integrity sha512-9zGujX1sOPg32XLyfgEB/0G9ZnrjthL/Iv1ZfuAjj8LEilHZEpQSQs1scpRXPhHzGYgWiLz9ldF1cI8JhL+yMw== - dependencies: - source-map "^0.6.0" - -"@types/superagent@*": - version "4.1.13" - resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.13.tgz#0aaa3f4ff9404b94932d1dcdfb7f3d39d23997a0" - integrity sha512-YIGelp3ZyMiH0/A09PMAORO0EBGlF5xIKfDpK74wdYvWUs2o96b5CItJcWPdH409b7SAXIIG6p8NdU/4U2Maww== - dependencies: - "@types/cookiejar" "*" - "@types/node" "*" - -"@types/supertest@^2.0.11": - version "2.0.11" - resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.11.tgz#2e70f69f220bc77b4f660d72c2e1a4231f44a77d" - integrity sha512-uci4Esokrw9qGb9bvhhSVEjd6rkny/dk5PK/Qz4yxKiyppEI+dOPlNrZBahE3i+PoKFYyDxChVXZ/ysS/nrm1Q== - dependencies: - "@types/superagent" "*" - -"@types/uid-safe@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@types/uid-safe/-/uid-safe-2.1.2.tgz#8eacbfc715b4927c7fbdc044146a6411e3a060cc" - integrity sha512-Qe3A73fQbbkyoCIZvumH3kGJe01aOeUjUjKW05QHAfkfyKa8FjlDR5dP05T27S/f1/qjCtI07pQJzo4SKQWFSQ== - -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== - -"@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/zen-observable@0.8.3", "@types/zen-observable@^0.8.0": - version "0.8.3" - resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.3.tgz#781d360c282436494b32fe7d9f7f8e64b3118aa3" - integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw== - -"@urql/core@^2.3.2": - version "2.3.3" - resolved "https://registry.yarnpkg.com/@urql/core/-/core-2.3.3.tgz#e4777b95c31d8ad0ba21ea1f5c851cbbe1d0ac17" - integrity sha512-Bi9mafTFu0O1XZmI7/HrEk12LHZW+Fs/V1FqSJoUDgYIhARIJW6cCh3Havy1dJJ0FETxYmmQQXPf6kst+IP2qQ== - dependencies: - "@graphql-typed-document-node/core" "^3.1.0" - wonka "^4.0.14" - -"@wry/context@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.6.0.tgz#f903eceb89d238ef7e8168ed30f4511f92d83e06" - integrity sha512-sAgendOXR8dM7stJw3FusRxFHF/ZinU0lffsA2YTyyIOfic86JX02qlPqPVqJNZJPAxFt+2EE8bvq6ZlS0Kf+Q== - dependencies: - tslib "^2.1.0" - -"@wry/equality@^0.5.0": - version "0.5.1" - resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.1.tgz#b22e4e1674d7bf1439f8ccdccfd6a785f6de68b0" - integrity sha512-FZKbdpbcVcbDxQrKcaBClNsQaMg9nof1RKM7mReJe5DKUzM5u8S7T+PqwNqvib5O2j2xxF1R4p5O3+b6baTrbw== - dependencies: - tslib "^2.1.0" - -"@wry/trie@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.3.0.tgz#3245e74988c4e3033299e479a1bf004430752463" - integrity sha512-Yw1akIogPhAT6XPYsRHlZZIS0tIGmAl9EYXHi2scf7LPKKqdqmow/Hu4kEqP2cJR3EjaU/9L0ZlAjFf3hFxmug== - dependencies: - tslib "^2.1.0" - -accepts@^1.3.5, accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -acorn-node@^1.6.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" - integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== - dependencies: - acorn "^7.0.0" - acorn-walk "^7.0.0" - xtend "^4.0.2" - -acorn-walk@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn@^7.0.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -anser@1.4.9: - version "1.4.9" - resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz#1f85423a5dcf8da4631a341665ff675b96845760" - integrity sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA== - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.1, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -apollo-datasource@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-3.1.0.tgz#44153cb99c7602f4524397ebc8f13e486a010c09" - integrity sha512-ywcVjuWNo84eMB9uBOYygQI+00+Ne4ShyPIxJzT//sn1j1Fu3J+KStMNd6s1jyERWgjGZzxkiLn6nLmwsGymBg== - dependencies: - apollo-server-caching "^3.1.0" - apollo-server-env "^4.0.3" - -apollo-graphql@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.9.3.tgz#1ca6f625322ae10a66f57a39642849a07a7a5dc9" - integrity sha512-rcAl2E841Iko4kSzj4Pt3PRBitmyq1MvoEmpl04TQSpGnoVgl1E/ZXuLBYxMTSnEAm7umn2IsoY+c6Ll9U/10A== - dependencies: - core-js-pure "^3.10.2" - lodash.sortby "^4.7.0" - sha.js "^2.4.11" - -apollo-reporting-protobuf@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.0.0.tgz#a53966b76a3f373d9336bc953f0bc6dede487270" - integrity sha512-jmCD+6gECt8KS7PxP460hztT/5URTbv2Kg0zgnR6iWPGce88IBmSUjcqf1Z6wJJq7Teb8Hu7WbyyMhn0vN5TxQ== - dependencies: - "@apollo/protobufjs" "1.2.2" - -apollo-server-caching@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-3.1.0.tgz#c68f2159ad8a25a0bdbb18ad6bdbbde59cd4647d" - integrity sha512-bZ4bo0kSAsax9LbMQPlpuMTkQ657idF2ehOYe4Iw+8vj7vfAYa39Ii9IlaVAFMC1FxCYzLNFz+leZBm/Stn/NA== - dependencies: - lru-cache "^6.0.0" - -apollo-server-core@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-3.3.0.tgz#f973c6f755884f8e17452cb9022672ae6f0ed9e7" - integrity sha512-KmkzKVG3yjybouDyUX6Melv39u1EOFipvAKP17IlPis/TjVbubJmb6hkE0am/g2RipyhRvlpxAjHqPaCTXR1dQ== - dependencies: - "@apollographql/apollo-tools" "^0.5.1" - "@apollographql/graphql-playground-html" "1.6.29" - "@graphql-tools/mock" "^8.1.2" - "@graphql-tools/schema" "^8.0.0" - "@graphql-tools/utils" "^8.0.0" - "@josephg/resolvable" "^1.0.0" - apollo-datasource "^3.1.0" - apollo-graphql "^0.9.0" - apollo-reporting-protobuf "^3.0.0" - apollo-server-caching "^3.1.0" - apollo-server-env "^4.0.3" - apollo-server-errors "^3.1.0" - apollo-server-plugin-base "^3.2.0" - apollo-server-types "^3.2.0" - async-retry "^1.2.1" - fast-json-stable-stringify "^2.1.0" - graphql-tag "^2.11.0" - loglevel "^1.6.8" - lru-cache "^6.0.0" - sha.js "^2.4.11" - uuid "^8.0.0" - -apollo-server-env@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-4.0.3.tgz#082a5c1dd4dfb3b34de5e1fa7dc170dd15a5062f" - integrity sha512-B32+RUOM4GUJAwnQqQE1mT1BG7+VfW3a0A87Bp3gv/q8iNnhY2BIWe74Qn03pX8n27g3EGVCt0kcBuHhjG5ltA== - dependencies: - node-fetch "^2.6.1" - -apollo-server-errors@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-3.1.0.tgz#0b890dc7ae36a1f0ca4841d353e8d1c3c6524ee2" - integrity sha512-bUmobPEvtcBFt+OVHYqD390gacX/Cm5s5OI5gNZho8mYKAA6OjgnRlkm/Lti6NzniXVxEQyD5vjkC6Ox30mGFg== - -apollo-server-express@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-3.3.0.tgz#23ec8b102a4758548c1416fb4770334e814ffb12" - integrity sha512-qJedh77IxbfT+HpYsDraC2CGdy08wiWTwoKYXjRK4S/DHbe94A4957/1blw4boYO4n44xRKQd1k6zxiixCp+XQ== - dependencies: - "@types/accepts" "^1.3.5" - "@types/body-parser" "1.19.1" - "@types/cors" "2.8.12" - "@types/express" "4.17.13" - "@types/express-serve-static-core" "4.17.24" - accepts "^1.3.5" - apollo-server-core "^3.3.0" - apollo-server-types "^3.2.0" - body-parser "^1.19.0" - cors "^2.8.5" - parseurl "^1.3.3" - -apollo-server-micro@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/apollo-server-micro/-/apollo-server-micro-3.3.0.tgz#02aeed4e130f418d896371bb120c51c399c1e27d" - integrity sha512-PTyTgre87Yh89fwml9pCdac60vlmByLYaUqdGtZMG8Z6GQ4tGMo7cUYPMK+FbNFr8/27oOxK8CvEAF3ogAYlCw== - dependencies: - "@hapi/accept" "^5.0.2" - apollo-server-core "^3.3.0" - apollo-server-types "^3.2.0" - type-is "^1.6.18" - -apollo-server-plugin-base@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-3.2.0.tgz#415337a0b1b88fc1d5f5620130a51e2935dd8dbf" - integrity sha512-anjyiw79wxU4Cj2bYZFWQqZPjuaZ4mVJvxCoyvkFrNvjPua9dovCOfpng43C5NwdsqJpz78Vqs236eFM2QoeaA== - dependencies: - apollo-server-types "^3.2.0" - -apollo-server-types@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-3.2.0.tgz#6243b34d35fbb09ded2cc84bf7e5f59968ccfa21" - integrity sha512-Fh7QP84ufDZHbLzoLyyxyzznlW8cpgEZYYkGsS1i36zY4VaAt5OUOp1f+FxWdLGehq0Arwb6D1W7y712IoZ/JQ== - dependencies: - apollo-reporting-protobuf "^3.0.0" - apollo-server-caching "^3.1.0" - apollo-server-env "^4.0.3" - -apollo-upload-client@^16.0.0: - version "16.0.0" - resolved "https://registry.yarnpkg.com/apollo-upload-client/-/apollo-upload-client-16.0.0.tgz#704c9bc21e12bd4687172876eb927cf756b2e524" - integrity sha512-aLhYucyA0T8aBEQ5g+p13qnR9RUyL8xqb8FSZ7e/Kw2KUOsotLUlFluLobqaE7JSUFwc6sKfXIcwB7y4yEjbZg== - dependencies: - extract-files "^11.0.0" - -apply-ref@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/apply-ref/-/apply-ref-1.0.0.tgz#036947786ec24f64c92e905b56d6ffec2fa81951" - integrity sha512-InKjUB8TMcIiSVV/9hqmMpIXkpIjCIbRiB3qdPu4/kU9AagF2uRAdAfFgt9+ykw5xQYyqAmcIKNsgy4tqKPquQ== - -archiver-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2" - integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw== - dependencies: - glob "^7.1.4" - graceful-fs "^4.2.0" - lazystream "^1.0.0" - lodash.defaults "^4.2.0" - lodash.difference "^4.5.0" - lodash.flatten "^4.4.0" - lodash.isplainobject "^4.0.6" - lodash.union "^4.6.0" - normalize-path "^3.0.0" - readable-stream "^2.0.0" - -archiver@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-4.0.2.tgz#43c72865eadb4ddaaa2fb74852527b6a450d927c" - integrity sha512-B9IZjlGwaxF33UN4oPbfBkyA4V1SxNLeIhR1qY8sRXSsbdUkEHrrOvwlYFPx+8uQeCe9M+FG6KgO+imDmQ79CQ== - dependencies: - archiver-utils "^2.1.0" - async "^3.2.0" - buffer-crc32 "^0.2.1" - glob "^7.1.6" - readable-stream "^3.6.0" - tar-stream "^2.1.2" - zip-stream "^3.0.1" - -arg@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.0.tgz#583c518199419e0037abb74062c37f8519e575f0" - integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg== - -arg@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.1.tgz#eb0c9a8f77786cad2af8ff2b862899842d7b6adb" - integrity sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA== - -arg@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.0.tgz#a20e2bb5710e82950a516b3f933fee5ed478be90" - integrity sha512-4P8Zm2H+BRS+c/xX1LrHw0qKpEhdlZjLCgWy+d78T9vqa2Z2SiD2wMrYuWIAFy5IZUD7nnNXroRttz+0RzlrzQ== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -assert@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" - integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== - dependencies: - es6-object-assign "^1.1.0" - is-nan "^1.2.1" - object-is "^1.0.1" - util "^0.12.0" - -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - -ast-types@0.13.2: - version "0.13.2" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" - integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async-retry@^1.2.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.1.tgz#139f31f8ddce50c0870b0ba558a6079684aaed55" - integrity sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA== - dependencies: - retry "0.12.0" - -async@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" - integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -autoprefixer@^10.3.7: - version "10.3.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.3.7.tgz#cef2562058406bd378c94aacda36bb46a97b3186" - integrity sha512-EmGpu0nnQVmMhX8ROoJ7Mx8mKYPlcUHuxkwrRYEYMz85lu7H09v8w6R1P0JPdn/hKU32GjpLBFEOuIlDWCRWvg== - dependencies: - browserslist "^4.17.3" - caniuse-lite "^1.0.30001264" - fraction.js "^4.1.1" - normalize-range "^0.1.2" - picocolors "^0.2.1" - postcss-value-parser "^4.1.0" - -available-typed-arrays@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz#9e0ae84ecff20caae6a94a1c3bc39b955649b7a9" - integrity sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA== - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.0.2, base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bcryptjs@^2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" - integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms= - -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== - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== - -body-parser@1.19.0, body-parser@^1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== - dependencies: - bytes "3.1.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.1, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserify-zlib@0.2.0, browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserslist@4.16.6, browserslist@^4.16.6: - version "4.16.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" - integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== - dependencies: - caniuse-lite "^1.0.30001219" - colorette "^1.2.2" - electron-to-chromium "^1.3.723" - escalade "^3.1.1" - node-releases "^1.1.71" - -browserslist@^4.17.3: - version "4.17.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.3.tgz#2844cd6eebe14d12384b0122d217550160d2d624" - integrity sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ== - dependencies: - caniuse-lite "^1.0.30001264" - electron-to-chromium "^1.3.857" - escalade "^3.1.1" - node-releases "^1.1.77" - picocolors "^0.2.1" - -buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" - integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -buffer@^5.1.0, buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - -busboy@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" - integrity sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw== - dependencies: - dicer "0.3.0" - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - -bytes@3.1.0, bytes@^3.0.0, bytes@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -caniuse-lite@^1.0.30001202, caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001228: - version "1.0.30001248" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001248.tgz#26ab45e340f155ea5da2920dadb76a533cb8ebce" - integrity sha512-NwlQbJkxUFJ8nMErnGtT0QTM2TJ33xgz4KXJSMIrjXIbDVdaYueGyjOrLKRtJC+rTiWfi6j5cnZN1NBiSBJGNw== - -caniuse-lite@^1.0.30001264: - version "1.0.30001265" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz#0613c9e6c922e422792e6fcefdf9a3afeee4f8c3" - integrity sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw== - -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== - -chalk@2.4.2, chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" - integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@4.1.2, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0, chalk@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" - integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -checkpoint-client@1.1.20: - version "1.1.20" - resolved "https://registry.yarnpkg.com/checkpoint-client/-/checkpoint-client-1.1.20.tgz#c869eeba84130ea3e5660b1fd71440981b5df8f5" - integrity sha512-AHDELBFMXBV9Rzp4JaN0JR03YQomZpaaVFDjgH7Ue4CcPuzNV2dZ94ZORJ9OoQsASYca/uR7UNGXmeNuWHc+IQ== - dependencies: - ci-info "3.1.1" - env-paths "2.2.1" - fast-write-atomic "0.2.1" - make-dir "3.1.0" - ms "2.1.3" - node-fetch "2.6.1" - uuid "8.3.2" - -chokidar@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.5.0" - optionalDependencies: - fsevents "~2.3.1" - -chokidar@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -ci-info@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.1.1.tgz#9a32fcefdf7bcdb6f0a7e1c0f8098ec57897b80a" - integrity sha512-kdRWLBIJwdsYJWYJFtAFFYxybguqeF91qpZaggjG5Nf8QKdizFG2hjqvaTXbxFIcYbSaD74KpAXv6BSm17DHEQ== - -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== - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -classnames@2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" - integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== - -classnames@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" - integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-truncate@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== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - -clipboard-copy@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clipboard-copy/-/clipboard-copy-4.0.1.tgz#326ef9726d4ffe72d9a82a7bbe19379de692017d" - integrity sha512-wOlqdqziE/NNTUJsfSgXmBMIrYmfd5V0HCGsR8uAKHcg+h9NENWINcfRjtWGU77wDHC8B8ijV4hMTGYbrKovng== - -color-convert@^1.9.0, color-convert@^1.9.3: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" - integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" - integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== - dependencies: - color-convert "^1.9.3" - color-string "^1.6.0" - -colorette@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" - integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^2.19.0, commander@^2.20.3: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -component-emitter@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -compress-commons@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-3.0.0.tgz#833944d84596e537224dd91cf92f5246823d4f1d" - integrity sha512-FyDqr8TKX5/X0qo+aVfaZ+PVmNJHJeckFBlq8jZGSJOgnynhfifoyl24qaqdUdDIBe0EVTHByN6NAkqYvE/2Xg== - dependencies: - buffer-crc32 "^0.2.13" - crc32-stream "^3.0.1" - normalize-path "^3.0.0" - readable-stream "^2.3.7" - -compute-scroll-into-view@^1.0.17: - version "1.0.17" - resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab" - integrity sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -constants-browserify@1.0.0, constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= - -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== - dependencies: - safe-buffer "5.1.2" - -content-type@1.0.4, content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -convert-source-map@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== - -cookie@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" - integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== - -cookiejar@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" - integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== - -copy-to-clipboard@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" - integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== - dependencies: - toggle-selection "^1.0.6" - -core-js-pure@^3.10.2: - version "3.15.2" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.15.2.tgz#c8e0874822705f3385d3197af9348f7c9ae2e3ce" - integrity sha512-D42L7RYh1J2grW8ttxoY1+17Y4wXZeKe7uyplAI3FkNQyI5OgBIAjUfFiTPfL1rs0qLpxaabITNbjKl1Sp82tA== - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cors@^2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -cosmiconfig@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" - integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -crc32-stream@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-3.0.1.tgz#cae6eeed003b0e44d739d279de5ae63b171b4e85" - integrity sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w== - dependencies: - crc "^3.4.4" - readable-stream "^3.4.0" - -crc@^3.4.4: - version "3.8.0" - resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" - integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== - dependencies: - buffer "^5.1.0" - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-fetch@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" - integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== - dependencies: - node-fetch "2.6.1" - -cross-spawn@7.0.3, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-browserify@3.12.0, crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -css-unit-converter@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.2.tgz#4c77f5a1954e6dbff60695ecb214e3270436ab21" - integrity sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA== - -css.escape@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" - integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= - -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== - -cssfilter@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" - integrity sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4= - -cssnano-preset-simple@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssnano-preset-simple/-/cssnano-preset-simple-3.0.0.tgz#e95d0012699ca2c741306e9a3b8eeb495a348dbe" - integrity sha512-vxQPeoMRqUT3c/9f0vWeVa2nKQIHFpogtoBvFdW4GQ3IvEJ6uauCP6p3Y5zQDLFcI7/+40FTgX12o7XUL0Ko+w== - dependencies: - caniuse-lite "^1.0.30001202" - -cssnano-simple@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssnano-simple/-/cssnano-simple-3.0.0.tgz#a4b8ccdef4c7084af97e19bc5b93b4ecf211e90f" - integrity sha512-oU3ueli5Dtwgh0DyeohcIEE00QVfbPR3HzyXdAl89SfnQG3y0/qcpfLVW+jPIh3/rgMZGwuW96rejZGaYE9eUg== - dependencies: - cssnano-preset-simple "^3.0.0" - -csstype@^3.0.2: - version "3.0.8" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" - integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== - -cuid@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/cuid/-/cuid-2.1.8.tgz#cbb88f954171e0d5747606c0139fb65c5101eac0" - integrity sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg== - -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== - -date-fns@^2.24.0: - version "2.25.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.25.0.tgz#8c5c8f1d958be3809a9a03f4b742eba894fc5680" - integrity sha512-ovYRFnTrbGPD4nqaEqescPEv1mNwvt+UTqI3Ay9SzNtey9NZnYu6E2qCcBBgJ6/2VF1zGGygpyTDITqpQQ5e+w== - -debug@2, debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@4.3.2, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decimal.js@10.3.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== - -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= - -del@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" - integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -depd@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" - integrity sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k= - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -detect-node-es@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" - integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== - -detective@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" - integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== - dependencies: - acorn-node "^1.6.1" - defined "^1.0.0" - minimist "^1.1.1" - -dicer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" - integrity sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA== - dependencies: - streamsearch "0.1.2" - -didyoumean@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" - integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -direction@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/direction/-/direction-1.0.4.tgz#2b86fb686967e987088caf8b89059370d4837442" - integrity sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ== - -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - -dom-helpers@^5.0.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" - integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== - dependencies: - "@babel/runtime" "^7.8.7" - csstype "^3.0.2" - -domain-browser@4.19.0: - version "4.19.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.19.0.tgz#1093e17c0a17dbd521182fe90d49ac1370054af1" - integrity sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ== - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - -dotenv@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== - -dumb-passwords@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/dumb-passwords/-/dumb-passwords-0.2.1.tgz#efaba4fdc13b27d446d4b11a5f303357649ada32" - integrity sha1-76uk/cE7J9RG1LEaXzAzV2Sa2jI= - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -electron-to-chromium@^1.3.723: - version "1.3.789" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.789.tgz#c3ea060ba1e36e41c87943a47ed2daadc545be2b" - integrity sha512-lK4xn6C6ZF1kgLaC/EhOtC1MSKENExj3rMwGVnBTfHW81Z/Hb1Rge5YaWawN/YOXy3xCaESuE4KWSD50kOZ9rQ== - -electron-to-chromium@^1.3.857: - version "1.3.862" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.862.tgz#c1c5d4382449e2c9b0e67fe1652f4fc451d6d8c0" - integrity sha512-o+FMbCD+hAUJ9S8bfz/FaqA0gE8OpCCm58KhhGogOEqiA1BLFSoVYLi+tW+S/ZavnqBn++n0XZm7HQiBVPs8Jg== - -elliptic@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -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@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -encoding@0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -env-paths@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: - version "1.18.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0" - integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.2" - is-callable "^1.2.3" - is-negative-zero "^2.0.1" - is-regex "^1.1.3" - is-string "^1.0.6" - object-inspect "^1.10.3" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es6-object-assign@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" - integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -esrever@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/esrever/-/esrever-0.2.0.tgz#96e9d28f4f1b1a76784cd5d490eaae010e7407b8" - integrity sha1-lunSj08bGnZ4TNXUkOquAQ50B7g= - -etag@1.8.1, etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -events@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -execa@5.1.1, 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== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -express@^4.17.1: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== - dependencies: - accepts "~1.3.7" - array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" - content-type "~1.0.4" - cookie "0.4.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.1.2" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" - range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extract-files@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-11.0.0.tgz#b72d428712f787eef1f5193aff8ab5351ca8469a" - integrity sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ== - -facepaint@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/facepaint/-/facepaint-1.2.1.tgz#89929e601b15227278c53c516f764fc462b09c33" - integrity sha512-oNvBekbhsm/0PNSOWca5raHNAi6dG960Bx6LJgxDPNF59WpuspgQ17bN5MKwOr7JcFdQYc7StW3VZ28DBZLavQ== - -fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.1.1, fast-glob@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-safe-stringify@^2.0.7: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" - integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== - -fast-write-atomic@0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fast-write-atomic/-/fast-write-atomic-0.2.1.tgz#7ee8ef0ce3c1f531043c09ae8e5143361ab17ede" - integrity sha512-WvJe06IfNYlr+6cO3uQkdKdy3Cb1LlCJSF8zRs2eT8yuhdbSlR9nIt+TgQ92RUxiRrQm+/S7RARnMfCs5iuAjw== - -fastq@^1.6.0: - version "1.11.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.1.tgz#5d8175aae17db61947f8b162cfc7f63264d22807" - integrity sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw== - dependencies: - reusify "^1.0.4" - -file-type@^10.10.0: - version "10.11.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-10.11.0.tgz#2961d09e4675b9fb9a3ee6b69e9cd23f43fd1890" - integrity sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw== - -filename-reserved-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" - integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= - -filenamify@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.3.0.tgz#62391cb58f02b09971c9d4f9d63b3cf9aba03106" - integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg== - dependencies: - filename-reserved-regex "^2.0.0" - strip-outer "^1.0.1" - trim-repeated "^1.0.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-cache-dir@3.3.1, find-cache-dir@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" - integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -focus-lock@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.9.1.tgz#e8ec7d4821631112193ae09258107f531588da01" - integrity sha512-/2Nj60Cps6yOLSO+CkVbeSKfwfns5XbX6HOedIK9PdzODP04N9c3xqOcPXayN0WsT9YjJvAnXmI0NdqNIDf5Kw== - dependencies: - tslib "^2.0.3" - -focus-trap@^6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-6.7.1.tgz#d474f86dbaf3c7fbf0d53cf0b12295f4f4068d10" - integrity sha512-a6czHbT9twVpy2RpkWQA9vIgwQgB9Nx1PIxNNUxQT4nugG/3QibwxO+tWTh9i+zSY2SFiX4pnYhTaFaQF/6ZAg== - dependencies: - tabbable "^5.2.1" - -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - -form-data@*, form-data@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -formidable@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9" - integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q== - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fp-ts@^2.11.4: - version "2.11.4" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.11.4.tgz#ad78a0d8eafb0dcfc835a0fb200f6da6422c27f0" - integrity sha512-lhV7tGEbs2qoVw4vmqOovChS7CAoIYU0gdiPEF8Vc4bLZct+PAMMeXrCqRyBNEo33XOvwvAmFDEDIrHPWH2/fg== - -fraction.js@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.1.tgz#ac4e520473dae67012d618aab91eda09bcb400ff" - integrity sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -fs-capacitor@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-6.2.0.tgz#fa79ac6576629163cb84561995602d8999afb7f5" - integrity sha512-nKcE1UduoSKX27NSZlg879LdQc94OtbOsEmKMN2MBNudXREvijRKx2GEBsTMTfws+BrbkJoEuynbGSVRSpauvw== - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" - integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.3.1, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-nonce@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" - integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== - -get-orientation@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-orientation/-/get-orientation-1.1.2.tgz#20507928951814f8a91ded0a0e67b29dfab98947" - integrity sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ== - dependencies: - stream-parser "^0.3.1" - -get-stream@6.0.1, get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.1.tgz#42054f685eb6a44e7a7d189a96efa40a54971aa7" - integrity sha512-kEVjS71mQazDBHKcsq4E9u/vUzaLcw1A8EtUeydawvIWQCJM0qQ08G1H7/XTjFUulla6XQiDOG6MXSaG0HDKog== - dependencies: - is-glob "^4.0.1" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-dirs@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" - integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== - dependencies: - ini "2.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globby@11.0.4, globby@^11.0.1: - version "11.0.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" - integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - -graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== - -graphql-tag@^2.11.0, graphql-tag@^2.12.0, graphql-tag@^2.12.3: - version "2.12.5" - resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.5.tgz#5cff974a67b417747d05c8d9f5f3cb4495d0db8f" - integrity sha512-5xNhP4063d16Pz3HBtKprutsPrmHZi5IdUGOWRxA2B6VF7BIRGOHZ5WQvDmJXZuPcBg7rYwaFxvQYjqkSdR3TQ== - dependencies: - tslib "^2.1.0" - -graphql-type-json@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/graphql-type-json/-/graphql-type-json-0.3.2.tgz#f53a851dbfe07bd1c8157d24150064baab41e115" - integrity sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg== - -graphql-upload@^12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/graphql-upload/-/graphql-upload-12.0.0.tgz#2351d20d294e920fb25d2eba9f7c352e37a1a02b" - integrity sha512-ovZ3Q7sZ17Bmn8tYl22MfrpNR7nYM/DUszXWgkue7SFIlI9jtqszHAli8id8ZcnGBc9GF0gUTNSskYWW+5aNNQ== - dependencies: - busboy "^0.3.1" - fs-capacitor "^6.2.0" - http-errors "^1.8.0" - isobject "^4.0.0" - object-path "^0.11.5" - -graphql@^15.3.0: - version "15.5.1" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.5.1.tgz#f2f84415d8985e7b84731e7f3536f8bb9d383aad" - integrity sha512-FeTRX67T3LoE3LWAxxOlW2K3Bz+rMYAC18rRguK4wgXaTZMiJwSUwDmPFo3UadAKbzirKIg5Qy+sNJXbpPRnQw== - -graphql@^15.6.0, graphql@^15.6.1: - version "15.6.1" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.6.1.tgz#9125bdf057553525da251e19e96dab3d3855ddfc" - integrity sha512-3i5lu0z6dRvJ48QP9kFxBkJ7h4Kso7PS8eahyTFz5Jm6CvQfLtNIE8LX9N6JLnXTuwR+sIYnXzaWp6anOg0QQw== - -hard-rejection@^2.1.0: - version "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-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== - -has-yarn@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" - integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hasha@^5.2.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" - integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== - dependencies: - is-stream "^2.0.0" - type-fest "^0.8.0" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -hosted-git-info@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" - integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== - dependencies: - lru-cache "^6.0.0" - -html-tags@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" - integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== - -http-errors@1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" - integrity sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY= - dependencies: - depd "1.1.1" - inherits "2.0.3" - setprototypeof "1.0.3" - statuses ">= 1.3.1 < 2" - -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-errors@1.7.3, http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-errors@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.0.tgz#75d1bbe497e1044f51e4ee9e704a62f28d336507" - integrity sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -https-browserify@1.0.0, https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - -https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.4.19: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" - integrity sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ieee754@^1.1.13, ieee754@^1.1.4: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.1.4: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== - -image-size@1.0.0, image-size@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.0.0.tgz#58b31fe4743b1cec0a0ac26f5c914d3c5b2f0750" - integrity sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw== - dependencies: - queue "6.0.2" - -image-type@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/image-type/-/image-type-4.1.0.tgz#72a88d64ff5021371ed67b9a466442100be57cd1" - integrity sha512-CFJMJ8QK8lJvRlTCEgarL4ro6hfDQKif2HjSvYCdQZESaIPV4v9imrf7BQHK+sQeTeNeMpWciR9hyC/g8ybXEg== - dependencies: - file-type "^10.10.0" - -immer@^7.0.0: - version "7.0.15" - resolved "https://registry.yarnpkg.com/immer/-/immer-7.0.15.tgz#dc3bc6db87401659d2e737c67a21b227c484a4ad" - integrity sha512-yM7jo9+hvYgvdCQdqvhCNRRio0SCXc8xDPzA25SvKWa7b1WVPjLwQs1VYU5JPXjcJPTqAa5NP5dqpORGYBQ2AA== - -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.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" - integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== - dependencies: - resolve-from "^5.0.0" - -indent-string@4.0.0, indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflection@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.1.tgz#c5cadd80888a90cf84c2e96e340d7edc85d5f0cb" - integrity sha512-dldYtl2WlN0QDkIDtg8+xFwOS2Tbmp12t1cHa5/YClU6ZQjTFm7B66UcVbh9NQB+HvT5BAd2t5+yKsBkw5pcqA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -ini@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - -intersection-observer@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.12.0.tgz#6c84628f67ce8698e5f9ccf857d97718745837aa" - integrity sha512-2Vkz8z46Dv401zTWudDGwO7KiGHNDkMv417T5ItcNYfmvHR/1qCTVBO9vwH8zZmQ0WkA/1ARwpysR9bsnop4NQ== - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -io-ts-excess@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/io-ts-excess/-/io-ts-excess-1.0.1.tgz#8ffab189202fd22d0c0df40363b476c06c2b7f68" - integrity sha512-yJQ+pGztBMIQmfsKfSAeQ1w7UJywvj37NIFriMAZ2tMLTpp1IngUvtxqI+QlW+RlXDn7cthMxrpJ0CnOx6Dn+w== - dependencies: - io-ts "^2.0.0" - -io-ts@^2.0.0, io-ts@^2.2.16: - version "2.2.16" - resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-2.2.16.tgz#597dffa03db1913fc318c9c6df6931cb4ed808b2" - integrity sha512-y5TTSa6VP6le0hhmIyN0dqEXkrZeJLeC5KApJq6VLci3UEKF80lZ+KuoUs02RhBxNWlrqSNxzfI7otLX1Euv8Q== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-arguments@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" - integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== - dependencies: - call-bind "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-bigint@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" - integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" - integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== - dependencies: - call-bind "^1.0.2" - -is-callable@^1.1.4, is-callable@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" - integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== - -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: - version "2.5.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.5.0.tgz#f754843617c70bfd29b7bd87327400cda5c18491" - integrity sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" - integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-function@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.9.tgz#e5f82c2323673e7fcad3d12858c83c4039f6399c" - integrity sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A== - -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== - dependencies: - is-extglob "^2.1.1" - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-hotkey@^0.1.6: - version "0.1.8" - resolved "https://registry.yarnpkg.com/is-hotkey/-/is-hotkey-0.1.8.tgz#6b1f4b2d0e5639934e20c05ed24d623a21d36d25" - integrity sha512-qs3NZ1INIS+H+yeo7cD9pDfwYV/jqRh1JG9S9zYrNudkoUQg7OL7ziXqRKu+InFjUIDoP2o6HIkLYMh1pcWgyQ== - -is-hotkey@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-hotkey/-/is-hotkey-0.2.0.tgz#1835a68171a91e5c9460869d96336947c8340cef" - integrity sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw== - -is-nan@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" - integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - -is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== - -is-number-object@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" - integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-plain-object@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.1.tgz#662d92d24c0aa4302407b0d45d21f2251c85f85b" - integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g== - -is-regex@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" - integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== - dependencies: - call-bind "^1.0.2" - has-symbols "^1.0.2" - -is-stream@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.0.5, is-string@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" - integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.5.tgz#f32e6e096455e329eb7b423862456aa213f0eb4e" - integrity sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug== - dependencies: - available-typed-arrays "^1.0.2" - call-bind "^1.0.2" - es-abstract "^1.18.0-next.2" - foreach "^2.0.5" - has-symbols "^1.0.1" - -is-wsl@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" - integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== - -jest-worker@27.0.0-next.5: - version "27.0.0-next.5" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.0-next.5.tgz#5985ee29b12a4e191f4aae4bb73b97971d86ec28" - integrity sha512-mk0umAQ5lT+CaOJ+Qp01N6kz48sJG2kr2n1rX0koqKf6FIygQV0qLOdN9SCYID4IVeSigDOcPeGLozdMLYfb5g== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -kind-of@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -lazystream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" - integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= - dependencies: - readable-stream "^2.0.5" - -lilconfig@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.3.tgz#68f3005e921dafbd2a2afb48379986aa6d2579fd" - integrity sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg== - -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= - -loader-utils@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.deburr@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/lodash.deburr/-/lodash.deburr-4.1.0.tgz#ddb1bbb3ef07458c0177ba07de14422cb033ff9b" - integrity sha1-3bG7s+8HRYwBd7oH3hRCLLAz/5s= - -lodash.defaults@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= - -lodash.difference@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" - integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= - -lodash.flatten@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - -lodash.toarray@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" - integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= - -lodash.topath@^4.5.2: - version "4.5.2" - resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009" - integrity sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak= - -lodash.union@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" - integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= - -lodash@^4.17.21, lodash@^4.17.4: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-update@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - -loglevel@^1.6.8: - version "1.7.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" - integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -longest-streak@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" - integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@3.1.0, make-dir@^3.0.0, make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz#e4ea399dbc979ae735c83c863dd31bdf364277b7" - integrity sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ== - -match-sorter@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-6.3.1.tgz#98cc37fda756093424ddf3cbc62bfe9c75b92bda" - integrity sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw== - dependencies: - "@babel/runtime" "^7.12.5" - remove-accents "0.4.2" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -mdast-util-definitions@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" - integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== - dependencies: - unist-util-visit "^2.0.0" - -mdast-util-find-and-replace@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz#b7db1e873f96f66588c321f1363069abf607d1b5" - integrity sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA== - dependencies: - escape-string-regexp "^4.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -mdast-util-from-markdown@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" - integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-string "^2.0.0" - micromark "~2.11.0" - parse-entities "^2.0.0" - unist-util-stringify-position "^2.0.0" - -mdast-util-gfm-autolink-literal@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz#9c4ff399c5ddd2ece40bd3b13e5447d84e385fb7" - integrity sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A== - dependencies: - ccount "^1.0.0" - mdast-util-find-and-replace "^1.1.0" - micromark "^2.11.3" - -mdast-util-gfm-strikethrough@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz#45eea337b7fff0755a291844fbea79996c322890" - integrity sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA== - dependencies: - mdast-util-to-markdown "^0.6.0" - -mdast-util-to-markdown@^0.6.0: - version "0.6.5" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" - integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ== - dependencies: - "@types/unist" "^2.0.0" - longest-streak "^2.0.0" - mdast-util-to-string "^2.0.0" - parse-entities "^2.0.0" - repeat-string "^1.0.0" - zwitch "^1.0.0" - -mdast-util-to-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" - integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -memoize-one@^5.0.0, memoize-one@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" - integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== - -meow@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364" - integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize "^1.2.0" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@^1.1.2, methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - -micro@^9.3.4: - version "9.3.4" - resolved "https://registry.yarnpkg.com/micro/-/micro-9.3.4.tgz#745a494e53c8916f64fb6a729f8cbf2a506b35ad" - integrity sha512-smz9naZwTG7qaFnEZ2vn248YZq9XR+XoOH3auieZbkhDL4xLOxiE+KqG8qqnBeKfXA9c1uEFGCxPN1D+nT6N7w== - dependencies: - arg "4.1.0" - content-type "1.0.4" - is-stream "1.1.0" - raw-body "2.3.2" - -micromark-extension-gfm-autolink-literal@0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz#53866c1f0c7ef940ae7ca1f72c6faef8fed9f204" - integrity sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw== - dependencies: - micromark "~2.11.3" - -micromark-extension-gfm-strikethrough@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz#96cb83356ff87bf31670eefb7ad7bba73e6514d1" - integrity sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw== - dependencies: - micromark "~2.11.0" - -micromark@^2.11.3, micromark@~2.11.0, micromark@~2.11.3: - version "2.11.4" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" - integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== - dependencies: - debug "^4.0.0" - parse-entities "^2.0.0" - -micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -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-types@^2.1.12, mime-types@~2.1.24: - version "2.1.32" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" - integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== - dependencies: - mime-db "1.49.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.4.6: - version "2.5.2" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" - integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -mini-svg-data-uri@^1.2.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.3.3.tgz#91d2c09f45e056e5e1043340b8b37ba7b50f4fac" - integrity sha512-+fA2oRcR1dJI/7ITmeQJDrYWks0wodlOz0pAEhKYJ2IVc1z0AnwJUsKY2fzFmPAM3Jo9J0rBx8JAA9QQSJ5PuA== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -minipass@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" - integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== - dependencies: - yallist "^4.0.0" - -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -modern-normalize@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/modern-normalize/-/modern-normalize-1.1.0.tgz#da8e80140d9221426bd4f725c6e11283d34f90b7" - integrity sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nanoid@^3.1.23: - version "3.1.23" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81" - integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw== - -nanoid@^3.1.28: - version "3.1.29" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.29.tgz#214fb2d7a33e1a5bef4757b779dfaeb6a4e5aeb4" - integrity sha512-dW2pUSGZ8ZnCFIlBIA31SV8huOGCHb6OwzVCc7A69rb/a+SgPBwfmLvK5TKQ3INPbRkcI8a/Owo0XbiTNH19wg== - -native-url@0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.3.4.tgz#29c943172aed86c63cee62c8c04db7f5756661f8" - integrity sha512-6iM8R99ze45ivyH8vybJ7X0yekIcPf5GgLV5K0ENCbmRcaRIDoj37BC8iLEmaaBfqqb8enuZ5p0uhY+lVAbAcA== - dependencies: - querystring "^0.2.0" - -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - -new-github-issue-url@0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/new-github-issue-url/-/new-github-issue-url-0.2.1.tgz#e17be1f665a92de465926603e44b9f8685630c1d" - integrity sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA== - -next@^11.1.0, next@^11.1.2: - version "11.1.2" - resolved "https://registry.yarnpkg.com/next/-/next-11.1.2.tgz#527475787a9a362f1bc916962b0c0655cc05bc91" - integrity sha512-azEYL0L+wFjv8lstLru3bgvrzPvK0P7/bz6B/4EJ9sYkXeW8r5Bjh78D/Ol7VOg0EIPz0CXoe72hzAlSAXo9hw== - dependencies: - "@babel/runtime" "7.15.3" - "@hapi/accept" "5.0.2" - "@next/env" "11.1.2" - "@next/polyfill-module" "11.1.2" - "@next/react-dev-overlay" "11.1.2" - "@next/react-refresh-utils" "11.1.2" - "@node-rs/helper" "1.2.1" - assert "2.0.0" - ast-types "0.13.2" - browserify-zlib "0.2.0" - browserslist "4.16.6" - buffer "5.6.0" - caniuse-lite "^1.0.30001228" - chalk "2.4.2" - chokidar "3.5.1" - constants-browserify "1.0.0" - crypto-browserify "3.12.0" - cssnano-simple "3.0.0" - domain-browser "4.19.0" - encoding "0.1.13" - etag "1.8.1" - find-cache-dir "3.3.1" - get-orientation "1.1.2" - https-browserify "1.0.0" - image-size "1.0.0" - jest-worker "27.0.0-next.5" - native-url "0.3.4" - node-fetch "2.6.1" - node-html-parser "1.4.9" - node-libs-browser "^2.2.1" - os-browserify "0.3.0" - p-limit "3.1.0" - path-browserify "1.0.1" - pnp-webpack-plugin "1.6.4" - postcss "8.2.15" - process "0.11.10" - querystring-es3 "0.2.1" - raw-body "2.4.1" - react-is "17.0.2" - react-refresh "0.8.3" - stream-browserify "3.0.0" - stream-http "3.1.1" - string_decoder "1.3.0" - styled-jsx "4.0.1" - timers-browserify "2.0.12" - tty-browserify "0.0.1" - use-subscription "1.5.1" - util "0.12.4" - vm-browserify "1.1.2" - watchpack "2.1.1" - optionalDependencies: - "@next/swc-darwin-arm64" "11.1.2" - "@next/swc-darwin-x64" "11.1.2" - "@next/swc-linux-x64-gnu" "11.1.2" - "@next/swc-win32-x64-msvc" "11.1.2" - -node-emoji@^1.8.1: - version "1.10.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" - integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== - dependencies: - lodash.toarray "^4.4.0" - -node-fetch@2.6.1, node-fetch@^2.6.0, node-fetch@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== - -node-fetch@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.2.tgz#986996818b73785e47b1965cc34eb093a1d464d0" - integrity sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA== - -node-fetch@^2.6.5: - version "2.6.5" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.5.tgz#42735537d7f080a7e5f78b6c549b7146be1742fd" - integrity sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ== - dependencies: - whatwg-url "^5.0.0" - -node-html-parser@1.4.9: - version "1.4.9" - resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-1.4.9.tgz#3c8f6cac46479fae5800725edb532e9ae8fd816c" - integrity sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw== - dependencies: - he "1.2.0" - -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= - -node-releases@^1.1.71: - version "1.1.73" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" - integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== - -node-releases@^1.1.77: - version "1.1.77" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" - integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== - -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.2.tgz#cae5c410ae2434f9a6c1baa65d5bc3b9366c8699" - integrity sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg== - dependencies: - hosted-git-info "^4.0.1" - resolve "^1.20.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-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= - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -object-assign@^4, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-hash@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" - integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== - -object-inspect@^1.10.3, object-inspect@^1.9.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" - integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== - -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-path@^0.11.5: - version "0.11.5" - resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.5.tgz#d4e3cf19601a5140a55a16ad712019a9c50b577a" - integrity sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg== - -object.assign@^4.1.0, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -once@^1.3.0, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@7.4.2: - version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -optimism@^0.16.0, optimism@^0.16.1: - version "0.16.1" - resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.1.tgz#7c8efc1f3179f18307b887e18c15c5b7133f6e7d" - integrity sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg== - dependencies: - "@wry/context" "^0.6.0" - "@wry/trie" "^0.3.0" - -os-browserify@0.3.0, os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= - -p-filter@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" - integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== - dependencies: - p-map "^2.0.0" - -p-limit@3.1.0, p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@4.0.0, p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-retry@4.6.1, p-retry@^4.2.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" - integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== - dependencies: - "@types/retry" "^0.12.0" - retry "^0.13.1" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parseurl@^1.3.3, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-browserify@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -picocolors@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" - integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - -pirates@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== - dependencies: - node-modules-regexp "^1.0.0" - -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkg-up@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== - dependencies: - find-up "^3.0.0" - -platform@1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" - integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== - -pluralize@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" - integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== - -pnp-webpack-plugin@1.6.4: - version "1.6.4" - resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" - integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== - dependencies: - ts-pnp "^1.1.6" - -postcss-js@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-3.0.3.tgz#2f0bd370a2e8599d45439f6970403b5873abda33" - integrity sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw== - dependencies: - camelcase-css "^2.0.1" - postcss "^8.1.6" - -postcss-load-config@^3.1.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-nested@5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-5.0.5.tgz#f0a107d33a9fab11d7637205f5321e27223e3603" - integrity sha512-GSRXYz5bccobpTzLQZXOnSOfKl6TwVr5CyAQJUPub4nuRJSOECK5AqurxVgmtxP48p0Kc/ndY/YyS1yqldX0Ew== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.6: - 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-value-parser@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== - -postcss-value-parser@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" - integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== - -postcss@8.2.15: - version "8.2.15" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.15.tgz#9e66ccf07292817d226fc315cbbf9bc148fbca65" - integrity sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q== - dependencies: - colorette "^1.2.2" - nanoid "^3.1.23" - source-map "^0.6.1" - -postcss@^8.1.6, postcss@^8.2.1: - version "8.3.6" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.6.tgz#2730dd76a97969f37f53b9a6096197be311cc4ea" - integrity sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A== - dependencies: - colorette "^1.2.2" - nanoid "^3.1.23" - source-map-js "^0.6.2" - -postcss@^8.3.9: - version "8.3.9" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.9.tgz#98754caa06c4ee9eb59cc48bd073bb6bd3437c31" - integrity sha512-f/ZFyAKh9Dnqytx5X62jgjhhzttjZS7hMsohcI7HEI5tjELX/HxCy3EFhsRxyzGvrzFF+82XPvCS8T9TFleVJw== - dependencies: - nanoid "^3.1.28" - picocolors "^0.2.1" - source-map-js "^0.6.2" - -prettier@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" - integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== - -pretty-hrtime@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" - integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= - -prettysize@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prettysize/-/prettysize-2.0.0.tgz#902c02480d865d9cc0813011c9feb4fa02ce6996" - integrity sha512-VVtxR7sOh0VsG8o06Ttq5TrI1aiZKmC+ClSn4eBPaNf4SHr5lzbYW+kYGX3HocBL/MfpVrRfFZ9V3vCbLaiplg== - -prisma@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/prisma/-/prisma-3.1.1.tgz#4c13c35dd3a58af9134008c8ed0fdc21a632802c" - integrity sha512-+eZtWIL6hnOKUOvqq9WLBzSw2d/EbTmOx1Td1LI8/0XE40ctXMLG2N1p6NK5/+yivGaoNJ9PDpPsPL9lO4nJrQ== - dependencies: - "@prisma/engines" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@0.11.10, process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -progress@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -prompts@2.4.1, prompts@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" - integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: - version "15.7.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" - integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.8.1" - -proxy-addr@~2.0.5: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -purgecss@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-4.0.3.tgz#8147b429f9c09db719e05d64908ea8b672913742" - integrity sha512-PYOIn5ibRIP34PBU9zohUcCI09c7drPJJtTDAc0Q6QlRz2/CHQ8ywGLdE7ZhxU2VTqB7p5wkvj5Qcm05Rz3Jmw== - dependencies: - commander "^6.0.0" - glob "^7.0.0" - postcss "^8.2.1" - postcss-selector-parser "^6.0.2" - -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== - -qs@^6.9.4: - version "6.10.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" - integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== - dependencies: - side-channel "^1.0.4" - -querystring-es3@0.2.1, querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -querystring@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" - integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -queue@6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" - integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== - dependencies: - inherits "~2.0.3" - -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -random-bytes@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" - integrity sha1-T2ih3Arli9P7lYSMMDJNt11kNgs= - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" - integrity sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k= - dependencies: - bytes "3.0.0" - http-errors "1.6.2" - iconv-lite "0.4.19" - unpipe "1.0.0" - -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== - dependencies: - bytes "3.1.0" - http-errors "1.7.2" - iconv-lite "0.4.24" - unpipe "1.0.0" - -raw-body@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" - integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== - dependencies: - bytes "3.1.0" - http-errors "1.7.3" - iconv-lite "0.4.24" - unpipe "1.0.0" - -react-clientside-effect@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.5.tgz#e2c4dc3c9ee109f642fac4f5b6e9bf5bcd2219a3" - integrity sha512-2bL8qFW1TGBHozGGbVeyvnggRpMjibeZM2536AKNENLECutp2yfs44IL8Hmpn8qjFQ2K7A9PnYf3vc7aQq/cPA== - dependencies: - "@babel/runtime" "^7.12.13" - -"react-day-picker@npm:react-day-picker@^7.4.8": - version "7.4.10" - resolved "https://registry.yarnpkg.com/react-day-picker/-/react-day-picker-7.4.10.tgz#d3928fa65c04379ad28c76de22aa85374a8361e1" - integrity sha512-/QkK75qLKdyLmv0kcVzhL7HoJPazoZXS8a6HixbVoK6vWey1Od1WRLcxfyEiUsRfccAlIlf6oKHShqY2SM82rA== - dependencies: - prop-types "^15.6.2" - -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-fast-compare@^3.0.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" - integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== - -react-focus-lock@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.5.2.tgz#f1e4db5e25cd8789351f2bd5ebe91e9dcb9c2922" - integrity sha512-WzpdOnEqjf+/A3EH9opMZWauag7gV0BxFl+EY4ElA4qFqYsUsBLnmo2sELbN5OC30S16GAWMy16B9DLPpdJKAQ== - dependencies: - "@babel/runtime" "^7.0.0" - focus-lock "^0.9.1" - prop-types "^15.6.2" - react-clientside-effect "^1.2.5" - use-callback-ref "^1.2.5" - use-sidecar "^1.0.5" - -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-is@^16.7.0, react-is@^16.8.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-popper@^2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.2.5.tgz#1214ef3cec86330a171671a4fbcbeeb65ee58e96" - integrity sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw== - dependencies: - react-fast-compare "^3.0.1" - warning "^4.0.2" - -react-refresh@0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" - integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== - -react-remove-scroll-bar@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.2.0.tgz#d4d545a7df024f75d67e151499a6ab5ac97c8cdd" - integrity sha512-UU9ZBP1wdMR8qoUs7owiVcpaPwsQxUDC2lypP6mmixaGlARZa7ZIBx1jcuObLdhMOvCsnZcvetOho0wzPa9PYg== - dependencies: - react-style-singleton "^2.1.0" - tslib "^1.0.0" - -react-remove-scroll@^2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.4.3.tgz#83d19b02503b04bd8141ed6e0b9e6691a2e935a6" - integrity sha512-lGWYXfV6jykJwbFpsuPdexKKzp96f3RbvGapDSIdcyGvHb7/eqyn46C7/6h+rUzYar1j5mdU+XECITHXCKBk9Q== - dependencies: - react-remove-scroll-bar "^2.1.0" - react-style-singleton "^2.1.0" - tslib "^1.0.0" - use-callback-ref "^1.2.3" - use-sidecar "^1.0.1" - -react-select@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.1.0.tgz#ac384c8e25ba6f03126026192b2bdad0f53fbf50" - integrity sha512-SkEBD1AYsSXrIdNj5HBt7+Ehe+jxdiB448J0atJqR6lE3l/GcFlRf4JYB3NlHe/02jrW4AnIQLo1t0IqWrxXOw== - dependencies: - "@babel/runtime" "^7.12.0" - "@emotion/cache" "^11.4.0" - "@emotion/react" "^11.1.1" - "@types/react-transition-group" "^4.4.0" - memoize-one "^5.0.0" - prop-types "^15.6.0" - react-transition-group "^4.3.0" - -react-style-singleton@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.1.1.tgz#ce7f90b67618be2b6b94902a30aaea152ce52e66" - integrity sha512-jNRp07Jza6CBqdRKNgGhT3u9umWvils1xsuMOjZlghBDH2MU0PL2WZor4PGYjXpnRCa9DQSlHMs/xnABWOwYbA== - dependencies: - get-nonce "^1.0.0" - invariant "^2.2.4" - tslib "^1.0.0" - -react-transition-group@^4.3.0, react-transition-group@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" - integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== - dependencies: - "@babel/runtime" "^7.5.5" - dom-helpers "^5.0.1" - loose-envify "^1.4.0" - prop-types "^15.6.2" - -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" - -read-pkg-up@7.0.1, read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@^2.3.7: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== - dependencies: - picomatch "^2.2.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -reduce-css-calc@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz#7ef8761a28d614980dc0c982f772c93f7a99de03" - integrity sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg== - dependencies: - css-unit-converter "^1.1.1" - postcss-value-parser "^3.3.0" - -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -remove-accents@0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" - integrity sha1-CkPTqq4egNuRngeuJUsoXZ4ce7U= - -repeat-string@^1.0.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-pkg@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg/-/resolve-pkg-2.0.0.tgz#ac06991418a7623edc119084edc98b0e6bf05a41" - integrity sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ== - dependencies: - resolve-from "^5.0.0" - -resolve@1.20.0, resolve@^1.10.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== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -retry@0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -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" - -scroll-into-view-if-needed@^2.2.20, scroll-into-view-if-needed@^2.2.28: - version "2.2.28" - resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.28.tgz#5a15b2f58a52642c88c8eca584644e01703d645a" - integrity sha512-8LuxJSuFVc92+0AdNv4QOxRL4Abeo1DgLnGNkn1XlaujPH/3cCFz3QI60r2VNu4obJJROzgnIUw5TKQkZvZI1w== - dependencies: - compute-scroll-into-view "^1.0.17" - -"semver@2 || 3 || 4 || 5": - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.2, semver@^7.3.4: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.7.2" - mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -setprototypeof@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" - integrity sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ= - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" - integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= - dependencies: - is-arrayish "^0.3.1" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slate-history@^0.60.4: - version "0.60.17" - resolved "https://registry.yarnpkg.com/slate-history/-/slate-history-0.60.17.tgz#4a790a33fc28570d8f0ce03aa58d64d6797464c4" - integrity sha512-IH7455DOxfTTIF/NxZh88PQn70iX/u+Osq1SvVrIOT/oiMyK2DulMAOOKl4N8UbALnWgjvHlyoGXjpgTW3Y5eQ== - dependencies: - immer "^7.0.0" - is-plain-object "^3.0.0" - -slate-react@^0.60.4: - version "0.60.17" - resolved "https://registry.yarnpkg.com/slate-react/-/slate-react-0.60.17.tgz#7e6c38b25c4bdad4ae5bf7b325dbc554f65be5fa" - integrity sha512-gqsZPwZeTfV9aEGrU9gCiKaRu8oda/zYyWKwP31qzRL6hMaJ5d1BEicXLccZgdq+LoMbxA8dMOA+hLAsb19PVA== - dependencies: - "@types/is-hotkey" "^0.1.1" - "@types/lodash" "^4.14.149" - direction "^1.0.3" - is-hotkey "^0.1.6" - is-plain-object "^3.0.0" - lodash "^4.17.4" - scroll-into-view-if-needed "^2.2.20" - -slate@^0.60.4: - version "0.60.17" - resolved "https://registry.yarnpkg.com/slate/-/slate-0.60.17.tgz#a57896552e953bd04f43dbf2843cfc0a1d6cdbf7" - integrity sha512-zwdqCZcuX+vLj5vr30CxQKXo4zuYOX+g9R1HS7O2u3ym9CcYP2ri/hSFdJfGbIuSz7ncSo55kQHcbipuBw7seA== - dependencies: - "@types/esrever" "^0.2.0" - esrever "^0.2.0" - immer "^7.0.0" - is-plain-object "^3.0.0" - tiny-warning "^1.0.3" - -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -source-map-js@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" - integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== - -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== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -source-map@0.8.0-beta.0: - version "0.8.0-beta.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" - integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== - dependencies: - whatwg-url "^7.0.0" - -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f" - integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ== - -stacktrace-parser@0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" - integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== - dependencies: - type-fest "^0.7.1" - -"statuses@>= 1.3.1 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stream-browserify@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" - integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== - dependencies: - inherits "~2.0.4" - readable-stream "^3.5.0" - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-http@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.1.1.tgz#0370a8017cf8d050b9a8554afe608f043eaff564" - integrity sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.4" - readable-stream "^3.6.0" - xtend "^4.0.2" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-parser@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/stream-parser/-/stream-parser-0.3.1.tgz#1618548694420021a1182ff0af1911c129761773" - integrity sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M= - dependencies: - debug "2" - -streamsearch@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" - integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= - -string-hash@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" - integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= - -string-width@4.2.2, string-width@^4.1.0, string-width@^4.2.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string_decoder@1.3.0, string_decoder@^1.0.0, string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@6.0.0, strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-indent@3.0.0, strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-outer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" - integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== - dependencies: - escape-string-regexp "^1.0.2" - -styled-jsx@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-4.0.1.tgz#ae3f716eacc0792f7050389de88add6d5245b9e9" - integrity sha512-Gcb49/dRB1k8B4hdK8vhW27Rlb2zujCk1fISrizCcToIs+55B4vmUM0N9Gi4nnVfFZWe55jRdWpAqH1ldAKWvQ== - dependencies: - "@babel/plugin-syntax-jsx" "7.14.5" - "@babel/types" "7.15.0" - convert-source-map "1.7.0" - loader-utils "1.2.3" - source-map "0.7.3" - string-hash "1.1.3" - stylis "3.5.4" - stylis-rule-sheet "0.0.10" - -stylis-rule-sheet@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430" - integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw== - -stylis@3.5.4: - version "3.5.4" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" - integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== - -stylis@^4.0.3: - version "4.0.10" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.10.tgz#446512d1097197ab3f02fb3c258358c3f7a14240" - integrity sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg== - -superagent@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-6.1.0.tgz#09f08807bc41108ef164cfb4be293cebd480f4a6" - integrity sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg== - dependencies: - component-emitter "^1.3.0" - cookiejar "^2.1.2" - debug "^4.1.1" - fast-safe-stringify "^2.0.7" - form-data "^3.0.0" - formidable "^1.2.2" - methods "^1.1.2" - mime "^2.4.6" - qs "^6.9.4" - readable-stream "^3.6.0" - semver "^7.3.2" - -supertest@^6.1.6: - version "6.1.6" - resolved "https://registry.yarnpkg.com/supertest/-/supertest-6.1.6.tgz#6151c518f4c5ced2ac2aadb9f96f1bf8198174c8" - integrity sha512-0hACYGNJ8OHRg8CRITeZOdbjur7NLuNs0mBjVhdpxi7hP6t3QIbOzLON5RTUmZcy2I9riuII3+Pr2C7yztrIIg== - dependencies: - methods "^1.1.2" - superagent "^6.1.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - 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" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -symbol-observable@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" - integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== - -tabbable@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-5.2.1.tgz#e3fda7367ddbb172dcda9f871c0fdb36d1c4cd9c" - integrity sha512-40pEZ2mhjaZzK0BnI+QGNjJO8UYx9pP5v7BGe17SORTO0OEuuaAwQTkAp8whcZvqon44wKFOikD+Al11K3JICQ== - -tailwindcss@^2.2.4: - version "2.2.7" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-2.2.7.tgz#795d07a14ef46c2dc4a1610f7f906f697daaf731" - integrity sha512-jv35rugP5j8PpzbXnsria7ZAry7Evh0KtQ4MZqNd+PhF+oIKPwJTVwe/rmfRx9cZw3W7iPZyzBmeoAoNwfJ1yg== - dependencies: - arg "^5.0.0" - bytes "^3.0.0" - chalk "^4.1.1" - chokidar "^3.5.2" - color "^3.2.0" - cosmiconfig "^7.0.0" - detective "^5.2.0" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.2.7" - fs-extra "^10.0.0" - glob-parent "^6.0.0" - html-tags "^3.1.0" - is-glob "^4.0.1" - lodash "^4.17.21" - lodash.topath "^4.5.2" - modern-normalize "^1.1.0" - node-emoji "^1.8.1" - normalize-path "^3.0.0" - object-hash "^2.2.0" - postcss-js "^3.0.3" - postcss-load-config "^3.1.0" - postcss-nested "5.0.5" - postcss-selector-parser "^6.0.6" - postcss-value-parser "^4.1.0" - pretty-hrtime "^1.0.3" - purgecss "^4.0.3" - quick-lru "^5.1.1" - reduce-css-calc "^2.1.8" - resolve "^1.20.0" - tmp "^0.2.1" - -tar-stream@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -tar@6.1.11: - version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -temp-dir@2.0.0, temp-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" - integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== - -temp-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= - -temp-write@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-4.0.0.tgz#cd2e0825fc826ae72d201dc26eef3bf7e6fc9320" - integrity sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw== - dependencies: - graceful-fs "^4.1.15" - is-stream "^2.0.0" - make-dir "^3.0.0" - temp-dir "^1.0.0" - uuid "^3.3.2" - -tempy@1.0.1, tempy@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tempy/-/tempy-1.0.1.tgz#30fe901fd869cfb36ee2bd999805aa72fbb035de" - integrity sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w== - dependencies: - del "^6.0.0" - is-stream "^2.0.0" - temp-dir "^2.0.0" - type-fest "^0.16.0" - unique-string "^2.0.0" - -terminal-link@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -timers-browserify@2.0.12, timers-browserify@^2.0.4: - version "2.0.12" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" - -tiny-warning@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - -tmp@0.2.1, tmp@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toggle-selection@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" - integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= - dependencies: - punycode "^2.1.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - -trim-newlines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" - integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== - -trim-repeated@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" - integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= - dependencies: - escape-string-regexp "^1.0.2" - -ts-invariant@^0.8.0: - version "0.8.2" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.8.2.tgz#62af654ebfb8b1eeb55bc9adc2f40c6b93b0ff7e" - integrity sha512-VI1ZSMW8soizP5dU8DsMbj/TncHf7bIUqavuE7FTeYeQat454HHurJ8wbfCnVWcDOMkyiBUWOW2ytew3xUxlRw== - dependencies: - tslib "^2.1.0" - -ts-invariant@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.9.3.tgz#4b41e0a80c2530a56ce4b8fd4e14183aaac0efa8" - integrity sha512-HinBlTbFslQI0OHP07JLsSXPibSegec6r9ai5xxq/qHYCsIQbzpymLpDhAUsnXcSrDEcd0L62L8vsOEdzM0qlA== - dependencies: - tslib "^2.1.0" - -ts-pnp@^1.1.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" - integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== - -tslib@^1.0.0, tslib@^1.10.0, tslib@^1.9.3: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.3, tslib@^2.1.0, tslib@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" - integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== - -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== - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= - -tty-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" - integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== - -type-fest@^0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" - integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== - -type-fest@^0.18.0: - version "0.18.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" - integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" - integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== - -type-fest@^0.8.0, type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -type-is@^1.6.18, type-is@~1.6.17, type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typescript@4.4.3: - version "4.4.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" - integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== - -uid-safe@^2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" - integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== - dependencies: - random-bytes "~1.0.0" - -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== - dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" - which-boxed-primitive "^1.0.2" - -undici@3.3.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/undici/-/undici-3.3.6.tgz#06d3b97b7eeff46bce6f8a71079c09f64dd59dc1" - integrity sha512-/j3YTZ5AobMB4ZrTY72mzM54uFUX32v0R/JRW9G2vOyF1uSKYAx+WT8dMsAcRS13TOFISv094TxIyWYk+WEPsA== - -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== - dependencies: - "@types/unist" "^2.0.2" - -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - -unist-util-visit@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -urql@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/urql/-/urql-2.0.5.tgz#ab56bdc659fc0f4b3bc5b286359a354c74817bdb" - integrity sha512-UOl37CkNO1sfhw8jPihq+9NKUpTLnsRjpK7vmOVqPceqSO0rYXHOAEJp2TWDhyLjn2lYDlDlAfDaxNyK5m1FOA== - dependencies: - "@urql/core" "^2.3.2" - wonka "^4.0.14" - -use-callback-ref@^1.2.3, use-callback-ref@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.2.5.tgz#6115ed242cfbaed5915499c0a9842ca2912f38a5" - integrity sha512-gN3vgMISAgacF7sqsLPByqoePooY3n2emTH59Ur5d/M8eg4WTWu1xp8i8DHjohftIyEx0S08RiYxbffr4j8Peg== - -use-sidecar@^1.0.1, use-sidecar@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.0.5.tgz#ffff2a17c1df42e348624b699ba6e5c220527f2b" - integrity sha512-k9jnrjYNwN6xYLj1iaGhonDghfvmeTmYjAiGvOr7clwKfPjMXJf4/HOr7oT5tJwYafgp2tG2l3eZEOfoELiMcA== - dependencies: - detect-node-es "^1.1.0" - tslib "^1.9.3" - -use-subscription@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.5.1.tgz#73501107f02fad84c6dd57965beb0b75c68c42d1" - integrity sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA== - dependencies: - object-assign "^4.1.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= - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -util@0.12.4, util@^0.12.0: - version "0.12.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" - integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - safe-buffer "^5.1.2" - which-typed-array "^1.1.2" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@8.3.2, uuid@^8.0.0, uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -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== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -vm-browserify@1.1.2, vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -warning@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" - integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== - dependencies: - loose-envify "^1.0.0" - -watchpack@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.1.1.tgz#e99630550fca07df9f90a06056987baa40a689c7" - integrity sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-typed-array@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.4.tgz#8fcb7d3ee5adf2d771066fba7cf37e32fe8711ff" - integrity sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA== - dependencies: - available-typed-arrays "^1.0.2" - call-bind "^1.0.0" - es-abstract "^1.18.0-next.1" - foreach "^2.0.5" - function-bind "^1.1.1" - has-symbols "^1.0.1" - is-typed-array "^1.1.3" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wonka@^4.0.14: - version "4.0.15" - resolved "https://registry.yarnpkg.com/wonka/-/wonka-4.0.15.tgz#9aa42046efa424565ab8f8f451fcca955bf80b89" - integrity sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg== - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -xss@^1.0.8: - version "1.0.9" - resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.9.tgz#3ffd565571ff60d2e40db7f3b80b4677bec770d2" - integrity sha512-2t7FahYnGJys6DpHLhajusId7R0Pm2yTmuL0GV9+mV0ZlaLSnb2toBmppATfg5sWIhZQGlsTLoecSzya+l4EAQ== - dependencies: - commander "^2.20.3" - cssfilter "0.0.10" - -xtend@^4.0.0, xtend@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^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== - -yargs-parser@^20.2.3: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zen-observable-ts@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz#2d1aa9d79b87058e9b75698b92791c1838551f83" - integrity sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA== - dependencies: - "@types/zen-observable" "0.8.3" - zen-observable "0.8.15" - -zen-observable@0.8.15, zen-observable@^0.8.14: - version "0.8.15" - resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" - integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== - -zip-stream@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-3.0.1.tgz#cb8db9d324a76c09f9b76b31a12a48638b0b9708" - integrity sha512-r+JdDipt93ttDjsOVPU5zaq5bAyY+3H19bDrThkvuVxC0xMQzU1PJcS6D+KrP3u96gH9XLomcHPb+2skoDjulQ== - dependencies: - archiver-utils "^2.1.0" - compress-commons "^3.0.0" - readable-stream "^3.6.0" - -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@apollo/client@^3.1.3", "@apollo/client@^3.4.15": + version "3.4.16" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.4.16.tgz#67090d5655aa843fa64d26f1913315e384a5fa0f" + integrity sha512-iF4zEYwvebkri0BZQyv8zfavPfVEafsK0wkOofa6eC2yZu50J18uTutKtC174rjHZ2eyxZ8tV7NvAPKRT+OtZw== + dependencies: + "@graphql-typed-document-node/core" "^3.0.0" + "@wry/context" "^0.6.0" + "@wry/equality" "^0.5.0" + "@wry/trie" "^0.3.0" + graphql-tag "^2.12.3" + hoist-non-react-statics "^3.3.2" + optimism "^0.16.1" + prop-types "^15.7.2" + symbol-observable "^4.0.0" + ts-invariant "^0.9.0" + tslib "^2.3.0" + zen-observable-ts "~1.1.0" + +"@apollo/protobufjs@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.2.tgz#4bd92cd7701ccaef6d517cdb75af2755f049f87c" + integrity sha512-vF+zxhPiLtkwxONs6YanSt1EpwpGilThpneExUN5K3tCymuxNnVq2yojTvnpRjv2QfsEIt/n7ozPIIzBLwGIDQ== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.0" + "@types/node" "^10.1.0" + long "^4.0.0" + +"@apollographql/apollo-tools@^0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.5.1.tgz#f0baef739ff7e2fafcb8b98ad29f6ac817e53e32" + integrity sha512-ZII+/xUFfb9ezDU2gad114+zScxVFMVlZ91f8fGApMzlS1kkqoyLnC4AJaQ1Ya/X+b63I20B4Gd+eCL8QuB4sA== + +"@apollographql/graphql-playground-html@1.6.29": + version "1.6.29" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.29.tgz#a7a646614a255f62e10dcf64a7f68ead41dec453" + integrity sha512-xCcXpoz52rI4ksJSdOCxeOCn2DLocxwHf9dVT/Q90Pte1LX+LY+91SFtJF3KXVHH8kEin+g1KKCQPKBjZJfWNA== + dependencies: + xss "^1.0.8" + +"@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.14.5", "@babel/code-frame@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503" + integrity sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg== + dependencies: + "@babel/highlight" "^7.14.5" + +"@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.15.5": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.8.tgz#195b9f2bffe995d2c6c159e72fe525b4114e8c10" + integrity sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og== + dependencies: + "@babel/code-frame" "^7.15.8" + "@babel/generator" "^7.15.8" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.8" + "@babel/helpers" "^7.15.4" + "@babel/parser" "^7.15.8" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.6" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@^7.15.4", "@babel/generator@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.8.tgz#fa56be6b596952ceb231048cf84ee499a19c0cd1" + integrity sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g== + dependencies: + "@babel/types" "^7.15.6" + jsesc "^2.5.1" + source-map "^0.5.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== + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" + +"@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== + 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.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== + dependencies: + "@babel/types" "^7.15.4" + +"@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== + dependencies: + "@babel/types" "^7.15.4" + +"@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== + dependencies: + "@babel/types" "^7.15.4" + +"@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== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-module-transforms@^7.15.4", "@babel/helper-module-transforms@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz#d8c0e75a87a52e374a8f25f855174786a09498b2" + integrity sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg== + 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-validator-identifier" "^7.15.7" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.6" + +"@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== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-plugin-utils@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + +"@babel/helper-replace-supers@^7.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== + 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-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== + dependencies: + "@babel/types" "^7.15.4" + +"@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== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helpers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" + integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== + dependencies: + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@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== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.15.4", "@babel/parser@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" + integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== + +"@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== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@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== + dependencies: + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.15.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/runtime-corejs3@^7.10.2": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz#403139af262b9a6e8f9ba04a6fdcebf8de692bf1" + integrity sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg== + dependencies: + core-js-pure "^3.16.0" + regenerator-runtime "^0.13.4" + +"@babel/runtime@7.15.3": + version "7.15.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.3.tgz#2e1c2880ca118e5b2f9988322bd8a7656a32502b" + integrity sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.3", "@babel/runtime@^7.15.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" + integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.15.4": + 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.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" + integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd" + integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ== + dependencies: + "@babel/helper-validator-identifier" "^7.14.9" + to-fast-properties "^2.0.0" + +"@babel/types@^7.0.0", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.3.0": + 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== + dependencies: + "@babel/helper-validator-identifier" "^7.14.9" + to-fast-properties "^2.0.0" + +"@braintree/sanitize-url@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-5.0.2.tgz#b23080fa35520e993a8a37a0f5bca26aa4650a48" + integrity sha512-NBEJlHWrhQucLhZGHtSxM2loSaNUMajC7KOYJLyfcdW/6goVoff2HoYI3bz8YCDN0wKGbxtUL0gx2dvHpvnWlw== + +"@emotion/cache@^11.4.0": + version "11.4.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.4.0.tgz#293fc9d9a7a38b9aad8e9337e5014366c3b09ac0" + integrity sha512-Zx70bjE7LErRO9OaZrhf22Qye1y4F7iDl+ITjet0J+i+B88PrAOBkKvaAWhxsZf72tDLajwCgfCjJ2dvH77C3g== + dependencies: + "@emotion/memoize" "^0.7.4" + "@emotion/sheet" "^1.0.0" + "@emotion/utils" "^1.0.0" + "@emotion/weak-memoize" "^0.2.5" + stylis "^4.0.3" + +"@emotion/hash@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== + +"@emotion/memoize@^0.7.4": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50" + integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ== + +"@emotion/react@^11.1.1", "@emotion/react@^11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.4.1.tgz#a1b0b767b5bad57515ffb0cad9349614d27f4d57" + integrity sha512-pRegcsuGYj4FCdZN6j5vqCALkNytdrKw3TZMekTzNXixRg4wkLsU5QEaBG5LC6l01Vppxlp7FE3aTHpIG5phLg== + dependencies: + "@babel/runtime" "^7.13.10" + "@emotion/cache" "^11.4.0" + "@emotion/serialize" "^1.0.2" + "@emotion/sheet" "^1.0.2" + "@emotion/utils" "^1.0.0" + "@emotion/weak-memoize" "^0.2.5" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.0.0", "@emotion/serialize@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.2.tgz#77cb21a0571c9f68eb66087754a65fa97bfcd965" + integrity sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A== + dependencies: + "@emotion/hash" "^0.8.0" + "@emotion/memoize" "^0.7.4" + "@emotion/unitless" "^0.7.5" + "@emotion/utils" "^1.0.0" + csstype "^3.0.2" + +"@emotion/sheet@^1.0.0", "@emotion/sheet@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.0.2.tgz#1d9ffde531714ba28e62dac6a996a8b1089719d0" + integrity sha512-QQPB1B70JEVUHuNtzjHftMGv6eC3Y9wqavyarj4x4lg47RACkeSfNo5pxIOKizwS9AEFLohsqoaxGQj4p0vSIw== + +"@emotion/unitless@^0.7.5": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + +"@emotion/utils@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.0.0.tgz#abe06a83160b10570816c913990245813a2fd6af" + integrity sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA== + +"@emotion/weak-memoize@^0.2.5": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" + integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== + +"@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== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@graphql-tools/merge@^8.1.0": + version "8.1.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.1.2.tgz#50f5763927c51de764d09c5bfd20261671976e24" + integrity sha512-kFLd4kKNJXYXnKIhM8q9zgGAtbLmsy3WmGdDxYq3YHBJUogucAxnivQYyRIseUq37KGmSAIWu3pBQ23TKGsGOw== + dependencies: + "@graphql-tools/utils" "^8.2.2" + tslib "~2.3.0" + +"@graphql-tools/mock@^8.1.2": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/mock/-/mock-8.4.0.tgz#c4a5d0c35cc5760b99b3e062145f36ac9cfe9ffb" + integrity sha512-RKcqmw7P5pC2ULh2/kg/erxxsd7lEV/wnI5jNgahkCw8wiSC8OI3SwNMwjfrlpYogs7eEhiXi7Ix6abCiFUURw== + dependencies: + "@graphql-tools/schema" "^8.2.0" + "@graphql-tools/utils" "^8.2.3" + fast-json-stable-stringify "^2.1.0" + tslib "~2.3.0" + +"@graphql-tools/schema@^8.0.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== + dependencies: + "@graphql-tools/merge" "^8.1.0" + "@graphql-tools/utils" "^8.2.0" + tslib "~2.3.0" + value-or-promise "1.0.10" + +"@graphql-tools/utils@^8.0.0", "@graphql-tools/utils@^8.2.0", "@graphql-tools/utils@^8.2.2", "@graphql-tools/utils@^8.2.3": + version "8.2.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.2.5.tgz#695e6d760c1187ad2b159d5d3c4696eff9c08a27" + integrity sha512-k/Rktklhy22dQfbJLKiLGfQymQCTr6Rd2BilC7g2Yk6wFSzVLYr8jeXNoTD+/p61XBQzBjTVayskvaMvNS3BDg== + dependencies: + tslib "~2.3.0" + +"@graphql-ts/schema@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@graphql-ts/schema/-/schema-0.3.1.tgz#d98eefce24212c20808a43338ce014ebae1ca6d7" + integrity sha512-sPK1dXo0HEk4+DkMm9eE1MeylcDxtjK/sAKJJ4FJbYKK5F0gew7ohszVfgidVwk1nrjcT2/SWncdwM3plBX28g== + dependencies: + "@babel/runtime" "^7.9.2" + +"@graphql-typed-document-node/core@^3.0.0", "@graphql-typed-document-node/core@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.0.tgz#0eee6373e11418bfe0b5638f654df7a4ca6a3950" + integrity sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg== + +"@hapi/accept@5.0.2", "@hapi/accept@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-5.0.2.tgz#ab7043b037e68b722f93f376afb05e85c0699523" + integrity sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw== + dependencies: + "@hapi/boom" "9.x.x" + "@hapi/hoek" "9.x.x" + +"@hapi/b64@5.x.x": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@hapi/b64/-/b64-5.0.0.tgz#b8210cbd72f4774985e78569b77e97498d24277d" + integrity sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw== + dependencies: + "@hapi/hoek" "9.x.x" + +"@hapi/boom@9.x.x": + version "9.1.4" + resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.4.tgz#1f9dad367c6a7da9f8def24b4a986fc5a7bd9db6" + integrity sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw== + dependencies: + "@hapi/hoek" "9.x.x" + +"@hapi/bourne@2.x.x": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.0.0.tgz#5bb2193eb685c0007540ca61d166d4e1edaf918d" + integrity sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg== + +"@hapi/cryptiles@5.x.x": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/cryptiles/-/cryptiles-5.1.0.tgz#655de4cbbc052c947f696148c83b187fc2be8f43" + integrity sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA== + dependencies: + "@hapi/boom" "9.x.x" + +"@hapi/hoek@9.x.x": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.1.tgz#9551142a1980503752536b5050fd99f4a7f13b17" + integrity sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw== + +"@hapi/iron@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@hapi/iron/-/iron-6.0.0.tgz#ca3f9136cda655bdd6028de0045da0de3d14436f" + integrity sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw== + dependencies: + "@hapi/b64" "5.x.x" + "@hapi/boom" "9.x.x" + "@hapi/bourne" "2.x.x" + "@hapi/cryptiles" "5.x.x" + "@hapi/hoek" "9.x.x" + +"@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== + 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== + +"@josephg/resolvable@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@josephg/resolvable/-/resolvable-1.0.1.tgz#69bc4db754d79e1a2f17a650d3466e038d94a5eb" + integrity sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg== + +"@keystone-next/auth@33.0.0": + version "33.0.0" + resolved "https://registry.yarnpkg.com/@keystone-next/auth/-/auth-33.0.0.tgz#d09a5e38ebd6f87b0a05747ec2e259cb9127ad1b" + integrity sha512-u/rTowJfihp80p0vI4bq6QbtWIV4w++o78iUsxTYVVoHE/7oof1ekA67cfsS1BBx/X2zddyLp+7X/vWGyZMppw== + dependencies: + "@babel/runtime" "^7.15.4" + "@graphql-tools/schema" "^8.2.0" + "@keystone-ui/button" "^5.0.1" + "@keystone-ui/core" "^3.2.0" + "@keystone-ui/fields" "^5.0.0" + "@keystone-ui/notice" "^4.1.0" + cross-fetch "^3.1.4" + fast-deep-equal "^3.1.3" + graphql "^15.6.0" + +"@keystone-next/document-renderer@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@keystone-next/document-renderer/-/document-renderer-4.0.0.tgz#f34b18643743c23256535f57949ec843ef9d5dc9" + integrity sha512-0KrkpGE2XwhrL8iugW4tXL6/WjEmtBtIgm7NN7VUvSdIZN/AMuy57AeOdBMeiux1Z7RalNeF+JyaW5KoHukADQ== + +"@keystone-next/fields-document@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@keystone-next/fields-document/-/fields-document-10.0.0.tgz#3541f9d47f39005951a0948ee714097adb64998d" + integrity sha512-19Q4CODYTBonNhhgll+Nz6x8RGcMn8rTwgA6j9qJZuQTRscBGU+gRMVZNotN8xUlT+gtNgA/7vi5pT6bAx82Rw== + dependencies: + "@babel/runtime" "^7.15.4" + "@braintree/sanitize-url" "^5.0.2" + "@emotion/weak-memoize" "^0.2.5" + "@keystone-ui/button" "^5.0.1" + "@keystone-ui/core" "^3.2.0" + "@keystone-ui/fields" "^5.0.0" + "@keystone-ui/icons" "^4.0.1" + "@keystone-ui/popover" "^4.0.4" + "@keystone-ui/tooltip" "^4.0.2" + "@types/react" "^17.0.24" + apollo-server-errors "^3.1.0" + apply-ref "^1.0.0" + fp-ts "^2.11.4" + graphql "^15.6.0" + io-ts "^2.2.16" + io-ts-excess "^1.0.1" + is-hotkey "^0.2.0" + match-sorter "^6.3.1" + mdast-util-definitions "^4.0.0" + mdast-util-from-markdown "^0.8.5" + mdast-util-gfm-autolink-literal "^0.1.3" + mdast-util-gfm-strikethrough "^0.2.3" + micromark-extension-gfm-autolink-literal "0.5.7" + micromark-extension-gfm-strikethrough "0.6.5" + react "^17.0.2" + scroll-into-view-if-needed "^2.2.28" + slate "^0.60.4" + slate-history "^0.60.4" + slate-react "^0.60.4" + +"@keystone-next/keystone@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@keystone-next/keystone/-/keystone-26.0.1.tgz#2cb51c1a23fe1fcd5c8f3b457181aca58d14a029" + integrity sha512-ypZkwzPmaj0b+P7Gkm2UAFj6qMi+qClbW1dgAYAxsL15J+e1boTN55VotKWVm1X3m9hThkomTrU66lgWKyrnrg== + dependencies: + "@apollo/client" "^3.4.15" + "@babel/core" "^7.15.5" + "@babel/plugin-transform-modules-commonjs" "^7.15.4" + "@babel/runtime" "^7.15.4" + "@emotion/hash" "^0.8.0" + "@emotion/weak-memoize" "^0.2.5" + "@graphql-tools/schema" "^8.2.0" + "@graphql-ts/schema" "0.3.1" + "@hapi/iron" "^6.0.0" + "@keystone-ui/button" "^5.0.1" + "@keystone-ui/core" "^3.2.0" + "@keystone-ui/fields" "^5.0.0" + "@keystone-ui/icons" "^4.0.1" + "@keystone-ui/loading" "^4.0.1" + "@keystone-ui/modals" "^4.0.1" + "@keystone-ui/notice" "^4.1.0" + "@keystone-ui/options" "^4.0.3" + "@keystone-ui/pill" "^5.0.1" + "@keystone-ui/popover" "^4.0.4" + "@keystone-ui/segmented-control" "^5.0.0" + "@keystone-ui/toast" "^4.0.3" + "@keystone-ui/tooltip" "^4.0.2" + "@preconstruct/next" "^3.0.0" + "@prisma/client" "3.1.1" + "@prisma/migrate" "3.1.1" + "@prisma/sdk" "3.1.1" + "@sindresorhus/slugify" "^1.1.2" + "@types/apollo-upload-client" "14.1.0" + "@types/babel__core" "^7.1.16" + "@types/bcryptjs" "^2.4.2" + "@types/cookie" "^0.4.1" + "@types/express" "^4.17.13" + "@types/form-data" "2.5.0" + "@types/fs-extra" "^9.0.13" + "@types/graphql-upload" "^8.0.7" + "@types/inflection" "^1.13.0" + "@types/node-fetch" "^2.5.12" + "@types/pluralize" "^0.0.29" + "@types/prettier" "^2.4.1" + "@types/prompts" "^2.0.14" + "@types/react" "^17.0.24" + "@types/source-map-support" "^0.5.4" + "@types/supertest" "^2.0.11" + "@types/uid-safe" "^2.1.2" + "@types/uuid" "^8.3.1" + apollo-server-errors "^3.1.0" + apollo-server-express "^3.3.0" + apollo-server-micro "^3.3.0" + apollo-server-types "^3.2.0" + apollo-upload-client "^16.0.0" + bcryptjs "^2.4.3" + bytes "^3.1.0" + chalk "^4.1.2" + clipboard-copy "^4.0.1" + cookie "^0.4.1" + copy-to-clipboard "^3.3.1" + cors "^2.8.5" + cuid "^2.1.8" + date-fns "^2.24.0" + decimal.js "10.3.1" + dumb-passwords "^0.2.1" + execa "^5.1.1" + express "^4.17.1" + fast-deep-equal "^3.1.3" + fast-glob "^3.2.7" + filenamify "^4.3.0" + form-data "4.0.0" + fs-extra "^10.0.0" + graphql "^15.6.0" + graphql-type-json "^0.3.2" + graphql-upload "^12.0.0" + image-size "^1.0.0" + image-type "^4.1.0" + inflection "^1.13.1" + intersection-observer "^0.12.0" + memoize-one "^5.2.1" + meow "^9.0.0" + micro "^9.3.4" + next "^11.1.0" + node-fetch "^2.6.5" + object-hash "^2.2.0" + p-limit "^2.3.0" + pirates "^4.0.1" + pluralize "^8.0.0" + prettier "^2.4.1" + prisma "3.1.1" + prompts "^2.4.1" + react "^17.0.2" + react-dom "^17.0.2" + resolve "^1.20.0" + source-map-support "^0.5.20" + supertest "^6.1.6" + uid-safe "^2.1.5" + uuid "^8.3.2" + +"@keystone-ui/button@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@keystone-ui/button/-/button-5.0.1.tgz#0a8dec20f8a27abd8f941783ab0e9db0011dc5c3" + integrity sha512-+ScnOXpODywC083y+qkP/UaMgHT5aWakM+Pp1d8ynviGG7HimW7oUst2kTHVPqS2BpbI+ER7801QGO1Kx2lavw== + dependencies: + "@babel/runtime" "^7.15.3" + "@keystone-ui/core" "^3.2.0" + "@keystone-ui/icons" "^4.0.1" + "@keystone-ui/loading" "^4.0.1" + react "^17.0.2" + +"@keystone-ui/core@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@keystone-ui/core/-/core-3.2.0.tgz#9fe51b74865746d02f67b68c8fca7be9fb82b9fe" + integrity sha512-uoj19+bZowDV7yBJJzrbkylzsRJDqBdctEA0gd/pY9N5lEiB5vOWmj1MHv9isXHuRmZ0N5aloncZzwrq+EI1aw== + dependencies: + "@babel/runtime" "^7.15.3" + "@emotion/react" "^11.4.1" + "@types/facepaint" "^1.2.2" + facepaint "^1.2.1" + +"@keystone-ui/fields@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@keystone-ui/fields/-/fields-5.0.0.tgz#58c69a75c40c28a380b0a7412895ac63ec69c148" + integrity sha512-+mIsgfuKwejFnUNvqoQ+c2/69HSPtzeTNszRZXYXGmYFcDGhUsslQijJn/hq6HPldPsq2VnL/r9AP6/HBJkUWw== + dependencies: + "@babel/runtime" "^7.15.4" + "@keystone-ui/core" "^3.2.0" + "@keystone-ui/icons" "^4.0.1" + "@keystone-ui/popover" "^4.0.4" + "@types/react-select" "^4.0.18" + date-fns "^2.24.0" + react "^17.0.2" + react-day-picker "npm:react-day-picker@^7.4.8" + react-focus-lock "^2.5.2" + react-select "^5.0.0" + +"@keystone-ui/icons@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@keystone-ui/icons/-/icons-4.0.1.tgz#ece7c6557cbc866cd69916bc743701d2aafa1b09" + integrity sha512-OzTk9rwB7AqyagtYeNleU/Lut6jVdekmh1FDb8RAAE+Qd+Lde0nfswYiwnNW0w+BsNA9WyTAG/4Ps11e3QJD0A== + dependencies: + "@babel/runtime" "^7.15.3" + "@keystone-ui/core" "^3.2.0" + +"@keystone-ui/loading@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@keystone-ui/loading/-/loading-4.0.1.tgz#bf43102bfd63166d6835942dca67fe27af6ca68f" + integrity sha512-ruM2OYbUWpI/PrrM2fh5b/LwLJp7ULAT3Q5vJmXM5obvtTJJW3dwWPqqWqNc3iFn0VqjzN5KMb2xi9aG6cwPAg== + dependencies: + "@babel/runtime" "^7.15.3" + "@keystone-ui/core" "^3.2.0" + react "^17.0.2" + +"@keystone-ui/modals@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@keystone-ui/modals/-/modals-4.0.1.tgz#4f42939e632cc4e49c3aef2b97beed4b68f9fbb5" + integrity sha512-nbRD9lZosU+KjRXZmI1A9QxjE3GZqeQpWgMqbu3RAsXqBMmPip9NdPSUbqQCAG4In9V31zvaLqCPxrj2x8McIQ== + dependencies: + "@babel/runtime" "^7.15.3" + "@keystone-ui/button" "^5.0.1" + "@keystone-ui/core" "^3.2.0" + react "^17.0.2" + react-focus-lock "^2.5.2" + react-remove-scroll "^2.4.3" + react-transition-group "^4.4.2" + +"@keystone-ui/notice@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@keystone-ui/notice/-/notice-4.1.0.tgz#5a10b44bc5e62af6e15cc6a630aca66b1c8f5703" + integrity sha512-LqPXF4rJpbFoSW7nvu/ZTAlDjQuB0Y38ZNV6k4pQ9E5AP10YYewB+5oKLVtiMWsh8yMYD3qJ9otzo+wht0mHwQ== + dependencies: + "@babel/runtime" "^7.15.4" + "@keystone-ui/button" "^5.0.1" + "@keystone-ui/core" "^3.2.0" + "@keystone-ui/icons" "^4.0.1" + react "^17.0.2" + +"@keystone-ui/options@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@keystone-ui/options/-/options-4.0.3.tgz#7e66c6ca388b1c6111c6a219fd2375b8bbeb181a" + integrity sha512-Nz8Uqoslksgqy6tcm9cAt2PzH2EmkCjxa4GBr1hAE4CgpZXUjXo+g6Y26NyjF/yUl+jU8KNkDuGHtzFVMopPuw== + dependencies: + "@babel/runtime" "^7.15.4" + "@keystone-ui/core" "^3.2.0" + "@keystone-ui/fields" "^5.0.0" + "@keystone-ui/icons" "^4.0.1" + "@types/react-select" "^4.0.18" + react-select "^5.0.0" + +"@keystone-ui/pill@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@keystone-ui/pill/-/pill-5.0.1.tgz#4ec20adb331114ce60d594730eb9681172906891" + integrity sha512-6rYEgfar9yPTo8cCN7Qkor9B59AOV2Vedkps1sGYtjrbEE3d5IotjNOX13x6KrPt/butTF7Qympz0wrhCrWmVA== + dependencies: + "@babel/runtime" "^7.15.3" + "@keystone-ui/core" "^3.2.0" + "@keystone-ui/icons" "^4.0.1" + +"@keystone-ui/popover@^4.0.3", "@keystone-ui/popover@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@keystone-ui/popover/-/popover-4.0.4.tgz#73c7ec2e2a6f049d374412833a1e3b245829c4f2" + integrity sha512-3wTBjuVEqf6QDEXNSByS97ndmMu9UrrDLLr63N5oNTOHCZtl8FuYVBe3KrTpbm/ZnyyygTC7qXr5ncxpOJIdEw== + dependencies: + "@babel/runtime" "^7.15.4" + "@keystone-ui/core" "^3.2.0" + "@popperjs/core" "^2.10.1" + focus-trap "^6.7.1" + react-popper "^2.2.5" + +"@keystone-ui/segmented-control@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@keystone-ui/segmented-control/-/segmented-control-5.0.0.tgz#525108d8935f0cd52aa1fd93ceb7fd6aebc23129" + integrity sha512-RImgv2HrlALL5SpnksQ5XuLI1iCxwOq94wgCMvTvQTL8TcIvhDdyT2tXuChPRCilc2nSTIGAcESdh4etZXo2Ig== + dependencies: + "@babel/runtime" "^7.15.4" + "@keystone-ui/core" "^3.2.0" + +"@keystone-ui/toast@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@keystone-ui/toast/-/toast-4.0.3.tgz#4989b0d57855174b644c3cfcc77e5b188ed2b708" + integrity sha512-W3swOk2JoQ652+cULErDT4BtFUPOvTUDaBovTVgEomwnTojDKNhdekZa9HjRMwasq2yUW518/oxcGwkd71AlNw== + dependencies: + "@babel/runtime" "^7.15.3" + "@keystone-ui/core" "^3.2.0" + "@keystone-ui/icons" "^4.0.1" + +"@keystone-ui/tooltip@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@keystone-ui/tooltip/-/tooltip-4.0.2.tgz#32aa010af70f72334aadb8d6a28e67eaaf50b3b9" + integrity sha512-I4GMyIomFAB0S0AHYkr9UoS+Q2UF5zlVaxGKeTJ+5u9fUUhHfktIE/OgW/wpmGjNPeVPg0cWZiik2gfAsoQe0A== + dependencies: + "@babel/runtime" "^7.15.3" + "@keystone-ui/core" "^3.2.0" + "@keystone-ui/popover" "^4.0.3" + apply-ref "^1.0.0" + +"@napi-rs/triples@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@napi-rs/triples/-/triples-1.0.3.tgz#76d6d0c3f4d16013c61e45dfca5ff1e6c31ae53c" + integrity sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA== + +"@next/env@11.1.2": + version "11.1.2" + resolved "https://registry.yarnpkg.com/@next/env/-/env-11.1.2.tgz#27996efbbc54c5f949f5e8c0a156e3aa48369b99" + integrity sha512-+fteyVdQ7C/OoulfcF6vd1Yk0FEli4453gr8kSFbU8sKseNSizYq6df5MKz/AjwLptsxrUeIkgBdAzbziyJ3mA== + +"@next/eslint-plugin-next@11.1.2": + version "11.1.2" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-11.1.2.tgz#f26cf90bcb6cd2e4645e2ba253bbc9aaaa43a170" + integrity sha512-cN+ojHRsufr9Yz0rtvjv8WI5En0RPZRJnt0y16Ha7DD+0n473evz8i1ETEJHmOLeR7iPJR0zxRrxeTN/bJMOjg== + dependencies: + glob "7.1.7" + +"@next/polyfill-module@11.1.2": + version "11.1.2" + resolved "https://registry.yarnpkg.com/@next/polyfill-module/-/polyfill-module-11.1.2.tgz#1fe92c364fdc81add775a16c678f5057c6aace98" + integrity sha512-xZmixqADM3xxtqBV0TpAwSFzWJP0MOQzRfzItHXf1LdQHWb0yofHHC+7eOrPFic8+ZGz5y7BdPkkgR1S25OymA== + +"@next/react-dev-overlay@11.1.2": + version "11.1.2" + resolved "https://registry.yarnpkg.com/@next/react-dev-overlay/-/react-dev-overlay-11.1.2.tgz#73795dc5454b7af168bac93df7099965ebb603be" + integrity sha512-rDF/mGY2NC69mMg2vDqzVpCOlWqnwPUXB2zkARhvknUHyS6QJphPYv9ozoPJuoT/QBs49JJd9KWaAzVBvq920A== + dependencies: + "@babel/code-frame" "7.12.11" + anser "1.4.9" + chalk "4.0.0" + classnames "2.2.6" + css.escape "1.5.1" + data-uri-to-buffer "3.0.1" + platform "1.3.6" + shell-quote "1.7.2" + source-map "0.8.0-beta.0" + stacktrace-parser "0.1.10" + strip-ansi "6.0.0" + +"@next/react-refresh-utils@11.1.2": + version "11.1.2" + resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-11.1.2.tgz#44ea40d8e773e4b77bad85e24f6ac041d5e4b4a5" + integrity sha512-hsoJmPfhVqjZ8w4IFzoo8SyECVnN+8WMnImTbTKrRUHOVJcYMmKLL7xf7T0ft00tWwAl/3f3Q3poWIN2Ueql/Q== + +"@next/swc-darwin-arm64@11.1.2": + version "11.1.2" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-11.1.2.tgz#93226c38db488c4b62b30a53b530e87c969b8251" + integrity sha512-hZuwOlGOwBZADA8EyDYyjx3+4JGIGjSHDHWrmpI7g5rFmQNltjlbaefAbiU5Kk7j3BUSDwt30quJRFv3nyJQ0w== + +"@next/swc-darwin-x64@11.1.2": + version "11.1.2" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-11.1.2.tgz#792003989f560c00677b5daeff360b35b510db83" + integrity sha512-PGOp0E1GisU+EJJlsmJVGE+aPYD0Uh7zqgsrpD3F/Y3766Ptfbe1lEPPWnRDl+OzSSrSrX1lkyM/Jlmh5OwNvA== + +"@next/swc-linux-x64-gnu@11.1.2": + version "11.1.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-11.1.2.tgz#8216b2ae1f21f0112958735c39dd861088108f37" + integrity sha512-YcDHTJjn/8RqvyJVB6pvEKXihDcdrOwga3GfMv/QtVeLphTouY4BIcEUfrG5+26Nf37MP1ywN3RRl1TxpurAsQ== + +"@next/swc-win32-x64-msvc@11.1.2": + version "11.1.2" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-11.1.2.tgz#e15824405df137129918205e43cb5e9339589745" + integrity sha512-e/pIKVdB+tGQYa1cW3sAeHm8gzEri/HYLZHT4WZojrUxgWXqx8pk7S7Xs47uBcFTqBDRvK3EcQpPLf3XdVsDdg== + +"@node-rs/helper@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@node-rs/helper/-/helper-1.2.1.tgz#e079b05f21ff4329d82c4e1f71c0290e4ecdc70c" + integrity sha512-R5wEmm8nbuQU0YGGmYVjEc0OHtYsuXdpRG+Ut/3wZ9XAvQWyThN08bTh2cBJgoZxHQUPtvRfeQuxcAgLuiBISg== + dependencies: + "@napi-rs/triples" "^1.0.3" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@popperjs/core@^2.10.1": + version "2.10.2" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.10.2.tgz#0798c03351f0dea1a5a4cabddf26a55a7cbee590" + integrity sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ== + +"@preconstruct/next@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@preconstruct/next/-/next-3.0.0.tgz#71781cbaecd011f43e456a149817094a43e4755f" + integrity sha512-G90cyJX9w4Zr3Bt/j2fURgDhsJb5+agqf4YUgrvDe3Dyvbbssy9a6d0tzLH0ehfa2Osxw/EEhQb+W4X+v/x06A== + +"@prisma/client@3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-3.1.1.tgz#f4012631528049c22d12b212846dcf503db33cfe" + integrity sha512-8ud8vVFMIg37yrkZ4wPpjKoMxFbCL0Pesq5eyLnag/s0LTKsVEN7ZBIQq9JzWW+AUqOzGKXr2Jt4Sl8xdGI99w== + dependencies: + "@prisma/engines-version" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + +"@prisma/debug@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-3.0.2.tgz#a99ae8dfa075f4e58a25666d609deb900820c5be" + integrity sha512-D2/LghEqphW6h9ycT8nfdEw2rzT0LXmikBy2101aYcY28vS01rHTVIUOiz/DDaltlqY1qBat3F5vgM+6GwIqbw== + dependencies: + "@types/debug" "4.1.7" + debug "4.3.2" + ms "2.1.3" + +"@prisma/debug@3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-3.1.1.tgz#1e9739715465d25c09d21d5c3ed9516694eb7602" + integrity sha512-KCpckIAxYnf3wJ6wa2HkdwK7JZdgwr00T5QulC6dHbhn0a8QCSb/yTo74m2zuiyi/5NYo5LslZVPFeQJvKU7cQ== + dependencies: + "@types/debug" "4.1.7" + debug "4.3.2" + ms "2.1.3" + +"@prisma/engine-core@3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@prisma/engine-core/-/engine-core-3.1.1.tgz#1e32b4089f47d4fd31e8591408fa93dfb299d451" + integrity sha512-zq34wWm797ILXCkYdpJjZqSBXizUffgX5WIsY1Su8RBArap9r9IoO2XMt412vADbBe9+LH86vJPBg92YEaf96g== + dependencies: + "@prisma/debug" "3.1.1" + "@prisma/engines" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + "@prisma/generator-helper" "3.1.1" + "@prisma/get-platform" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + chalk "4.1.2" + execa "5.1.1" + get-stream "6.0.1" + indent-string "4.0.0" + new-github-issue-url "0.2.1" + p-retry "4.6.1" + terminal-link "2.1.1" + undici "3.3.6" + +"@prisma/engines-version@3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f": + version "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f.tgz#f9908eb7808f2a546634398063942eaecb2474ef" + integrity sha512-EuEMKLuwIcBO7uInZQHeG1yaywcfl32Tq8TDf5tgLvblk+ka70sej7S67lh3BV5gXMLTc3GdthSHPfDqZEK5uA== + +"@prisma/engines@3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f": + version "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f.tgz#7b45708e6a42523dc9bc2214e5c62781f608dc3a" + integrity sha512-6NEp0VlLho3hVtIvj2P4h0e19AYqQSXtFGts8gSIXDnV+l5pRFZaDMfGo2RiLMR0Kfrs8c3ZYxYX0sWmVL0tWw== + +"@prisma/fetch-engine@3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f": + version "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f.tgz#957143646d9a046361c45dc34ac3f3932b328192" + integrity sha512-ufywCOjqel/eNzR+yA4U7/RlbcztxFs0UfwbLRgqqNAaWR8hOk9TiTWyzgoxg+gh3nTEaBvh+GYt+n1YU98Wwg== + dependencies: + "@prisma/debug" "3.0.2" + "@prisma/get-platform" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + chalk "^4.0.0" + execa "^5.0.0" + find-cache-dir "^3.3.1" + hasha "^5.2.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + make-dir "^3.0.2" + node-fetch "^2.6.0" + p-filter "^2.1.0" + p-map "^4.0.0" + p-retry "^4.2.0" + progress "^2.0.3" + rimraf "^3.0.2" + temp-dir "^2.0.0" + tempy "^1.0.0" + +"@prisma/generator-helper@3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@prisma/generator-helper/-/generator-helper-3.1.1.tgz#d81c2945894d365b5d4dcd890487b8ca9a556a52" + integrity sha512-Jke+zZrUE0v1gqaQ4fyMDzDk9yj7W8qMtyyPJjFWyprQNf4zMTffLmYsIrYVCULYt6C47u2AwXbQGyESlSFgJw== + dependencies: + "@prisma/debug" "3.1.1" + "@types/cross-spawn" "6.0.2" + chalk "4.1.2" + cross-spawn "7.0.3" + +"@prisma/get-platform@3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f": + version "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f.tgz#d9499dc9af9032c92f773bb510aefbc7534e76d0" + integrity sha512-m5hsHxC7UmGbqDCEe6EFYDdSjZbxcY/r2Rp53sCy5U2Km6vMBzT/p5SYAH59An0p07WUbhB1R7x7Km11lkUA0w== + dependencies: + "@prisma/debug" "3.0.2" + +"@prisma/migrate@3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@prisma/migrate/-/migrate-3.1.1.tgz#464930ce048cc449c7da733dd074d2b1a08ea3c9" + integrity sha512-eZfWfyEn3/NZjN0YKu2IHaOtXdVj5rF94WpSfJuawHwS7aNQ9kZM8XBi+9r8DfhguwXyIAJcOT9fKMOt/HP+ew== + dependencies: + "@prisma/debug" "3.1.1" + "@prisma/get-platform" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + "@sindresorhus/slugify" "1.1.2" + execa "5.1.1" + global-dirs "3.0.0" + has-yarn "2.1.0" + indent-string "4.0.0" + log-update "4.0.0" + new-github-issue-url "0.2.1" + open "7.4.2" + pkg-up "3.1.0" + prompts "2.4.1" + resolve-pkg "2.0.0" + strip-ansi "6.0.0" + strip-indent "3.0.0" + +"@prisma/sdk@3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@prisma/sdk/-/sdk-3.1.1.tgz#4795e1c44ce40e589a47558813fca5a81c05b0e6" + integrity sha512-rzQ4Gsvre6chTm3dV32lKdmvt7XQ3pitIXWvimZx66KhAzy3YSasjx+CmjsLhqIDT8ftT7mpOICJbCcY4HIrGA== + dependencies: + "@prisma/debug" "3.1.1" + "@prisma/engine-core" "3.1.1" + "@prisma/engines" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + "@prisma/fetch-engine" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + "@prisma/generator-helper" "3.1.1" + "@prisma/get-platform" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + "@timsuchanek/copy" "1.4.5" + archiver "4.0.2" + arg "5.0.1" + chalk "4.1.2" + checkpoint-client "1.1.20" + cli-truncate "2.1.0" + dotenv "10.0.0" + execa "5.1.1" + find-up "5.0.0" + global-dirs "3.0.0" + globby "11.0.4" + has-yarn "2.1.0" + is-ci "3.0.0" + make-dir "3.1.0" + node-fetch "2.6.2" + p-map "4.0.0" + read-pkg-up "7.0.1" + resolve "1.20.0" + rimraf "3.0.2" + shell-quote "1.7.2" + string-width "4.2.2" + strip-ansi "6.0.0" + strip-indent "3.0.0" + tar "6.1.11" + temp-dir "2.0.0" + temp-write "4.0.0" + tempy "1.0.1" + terminal-link "2.1.1" + tmp "0.2.1" + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= + +"@rushstack/eslint-patch@^1.0.6": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.0.7.tgz#82f83dcc2eb9b1e1d559b3aca96783e285eb8592" + integrity sha512-3Zi2LGbCLDz4IIL7ir6wD0u/ggHotLkK5SlVzFzTcYaNgPR4MAt/9JYZqXWKcofPWEoptfpnCJU8Bq9sxw8QUg== + +"@sindresorhus/slugify@1.1.2", "@sindresorhus/slugify@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@sindresorhus/slugify/-/slugify-1.1.2.tgz#c2c0129298b8caace2d9156176fe244d0e83156c" + integrity sha512-V9nR/W0Xd9TSGXpZ4iFUcFGhuOJtZX82Fzxj1YISlbSgKvIiNa7eLEZrT0vAraPOt++KHauIVNYgGRgjc13dXA== + dependencies: + "@sindresorhus/transliterate" "^0.1.1" + escape-string-regexp "^4.0.0" + +"@sindresorhus/transliterate@^0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@sindresorhus/transliterate/-/transliterate-0.1.2.tgz#ffce368271d153550e87de81486004f2637425af" + integrity sha512-5/kmIOY9FF32nicXH+5yLNTX4NJ4atl7jRgqAJuIn/iyDFXBktOKDxCvyGE/EzmF4ngSUvjXxQUQlQiZ5lfw+w== + dependencies: + escape-string-regexp "^2.0.0" + lodash.deburr "^4.1.0" + +"@tailwindcss/forms@^0.3.3": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.3.4.tgz#e4939dc16450eccf4fd2029770096f38cbb556d4" + integrity sha512-vlAoBifNJUkagB+PAdW4aHMe4pKmSLroH398UPgIogBFc91D2VlHUxe4pjxQhiJl0Nfw53sHSJSQBSTQBZP3vA== + dependencies: + mini-svg-data-uri "^1.2.3" + +"@timsuchanek/copy@1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@timsuchanek/copy/-/copy-1.4.5.tgz#8e9658c056e24e1928a88bed45f9eac6a72b7c40" + integrity sha512-N4+2/DvfwzQqHYL/scq07fv8yXbZc6RyUxKJoE8Clm14JpLOf9yNI4VB4D6RsV3h9zgzZ4loJUydHKM7pp3blw== + dependencies: + "@timsuchanek/sleep-promise" "^8.0.1" + commander "^2.19.0" + mkdirp "^1.0.4" + prettysize "^2.0.0" + +"@timsuchanek/sleep-promise@^8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@timsuchanek/sleep-promise/-/sleep-promise-8.0.1.tgz#81c0754b345138a519b51c2059771eb5f9b97818" + integrity sha512-cxHYbrXfnCWsklydIHSw5GCMHUPqpJ/enxWSyVHNOgNe61sit/+aOXTTI+VOdWkvVaJsI2vsB9N4+YDNITawOQ== + +"@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== + +"@types/accepts@*", "@types/accepts@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" + integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== + dependencies: + "@types/node" "*" + +"@types/apollo-upload-client@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@types/apollo-upload-client/-/apollo-upload-client-14.1.0.tgz#21a57d7e3f29ff946ba51a53b3d7da46ddd21fbc" + integrity sha512-ZLvcEqu+l9qKGdrIpASt/A2WY1ghAC9L3qaoegkiBOccjxvQmWN9liZzVFiuHTuWseWpVbMklqbs/z+KEjll9Q== + dependencies: + "@apollo/client" "^3.1.3" + "@types/extract-files" "*" + graphql "^15.3.0" + +"@types/babel__core@^7.1.16": + version "7.1.16" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702" + integrity sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" + integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" + integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== + dependencies: + "@babel/types" "^7.3.0" + +"@types/bcryptjs@^2.4.2": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.2.tgz#e3530eac9dd136bfdfb0e43df2c4c5ce1f77dfae" + integrity sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ== + +"@types/body-parser@*", "@types/body-parser@1.19.1": + version "1.19.1" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.1.tgz#0c0174c42a7d017b818303d4b5d969cb0b75929c" + integrity sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/content-disposition@*": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.4.tgz#de48cf01c79c9f1560bcfd8ae43217ab028657f8" + integrity sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ== + +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cookiejar@*": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.2.tgz#66ad9331f63fe8a3d3d9d8c6e3906dd10f6446e8" + integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog== + +"@types/cookies@*": + version "0.7.7" + resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.7.tgz#7a92453d1d16389c05a5301eef566f34946cfd81" + integrity sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA== + dependencies: + "@types/connect" "*" + "@types/express" "*" + "@types/keygrip" "*" + "@types/node" "*" + +"@types/cors@2.8.12": + version "2.8.12" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" + integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== + +"@types/cross-spawn@6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@types/cross-spawn/-/cross-spawn-6.0.2.tgz#168309de311cd30a2b8ae720de6475c2fbf33ac7" + integrity sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw== + dependencies: + "@types/node" "*" + +"@types/debug@4.1.7": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" + +"@types/esrever@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@types/esrever/-/esrever-0.2.0.tgz#96404a2284b2c7527f08a1e957f8a31705f9880f" + integrity sha512-5NI6TeGzVEy/iBcuYtcPzzIC6EqlfQ2+UZ54vT0ulq8bPNGAy8UJD+XcsAyEOcnYFUjOVWuUV+k4/rVkxt9/XQ== + +"@types/express-serve-static-core@4.17.24", "@types/express-serve-static-core@^4.17.18": + version "4.17.24" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz#ea41f93bf7e0d59cd5a76665068ed6aab6815c07" + integrity sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@4.17.13", "@types/express@^4.17.13": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/extract-files@*": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@types/extract-files/-/extract-files-8.1.1.tgz#11b67e795ad2c8b483431e8d4f190db2fd22944b" + integrity sha512-dMJJqBqyhsfJKuK7p7HyyNmki7qj1AlwhUKWx6KrU7i1K2T2SPsUsSUTWFmr/sEM1q8rfR8j5IyUmYrDbrhfjQ== + +"@types/facepaint@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/facepaint/-/facepaint-1.2.2.tgz#1432acb1b09696216861a457a037186afeb95346" + integrity sha512-Xl9tAINsQL1s0TdXG5IiG75kZrxem5esbnKJF5gQgFel92OdS5zLtFYnbBw6fBruCMPYJQ9mK5pVmSsMl3Puug== + +"@types/form-data@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.5.0.tgz#5025f7433016f923348434c40006d9a797c1b0e8" + integrity sha512-23/wYiuckYYtFpL+4RPWiWmRQH2BjFuqCUi2+N3amB1a1Drv+i/byTrGvlLwRVLFNAZbwpbQ7JvTK+VCAPMbcg== + dependencies: + form-data "*" + +"@types/fs-capacitor@*": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz#17113e25817f584f58100fb7a08eed288b81956e" + integrity sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ== + dependencies: + "@types/node" "*" + +"@types/fs-extra@^9.0.13": + version "9.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + +"@types/graphql-upload@^8.0.7": + version "8.0.7" + resolved "https://registry.yarnpkg.com/@types/graphql-upload/-/graphql-upload-8.0.7.tgz#71dd5d4a8d9ddb598df91298d6e98a943061b255" + integrity sha512-uXhInuUY/W6n9a+PdCt9vcZ7z2m+NzByBJFvvDM+46pljqEwXXnIAjsEI1Dka2FKRTGthetm/imN//RhtEEYSA== + dependencies: + "@types/express" "*" + "@types/fs-capacitor" "*" + "@types/koa" "*" + graphql "^15.3.0" + +"@types/http-assert@*": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.3.tgz#ef8e3d1a8d46c387f04ab0f2e8ab8cb0c5078661" + integrity sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA== + +"@types/http-errors@*": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.1.tgz#e81ad28a60bee0328c6d2384e029aec626f1ae67" + integrity sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q== + +"@types/inflection@^1.13.0": + version "1.13.0" + resolved "https://registry.yarnpkg.com/@types/inflection/-/inflection-1.13.0.tgz#d641b773317f2e71e5c7c80809057e3101c4b2bf" + integrity sha512-kZSETqAVS74XC/K3mPX/tbMEi/Zy1KP0Wc59dB1i5P72AHz4eSW+UIpzWxmQnDxipoKSX5eRgUXy+wUr+bY73g== + +"@types/is-hotkey@^0.1.1": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@types/is-hotkey/-/is-hotkey-0.1.5.tgz#f3123ba21228c0408c10594abf378caddbb802f8" + integrity sha512-pZTb6AsG7I56FJgYA8Cbit3cB3NGVwyHgwyUCENjXewTQChOtQaxaV+u6BO4hqtS1o9KT1wML+NRkGhQZ6swtA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + +"@types/keygrip@*": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" + integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== + +"@types/koa-compose@*": + version "3.2.5" + resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" + integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== + dependencies: + "@types/koa" "*" + +"@types/koa@*": + version "2.13.4" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.4.tgz#10620b3f24a8027ef5cbae88b393d1b31205726b" + integrity sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw== + dependencies: + "@types/accepts" "*" + "@types/content-disposition" "*" + "@types/cookies" "*" + "@types/http-assert" "*" + "@types/http-errors" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/lodash@^4.14.149": + version "4.14.175" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.175.tgz#b78dfa959192b01fae0ad90e166478769b215f45" + integrity sha512-XmdEOrKQ8a1Y/yxQFOMbC47G/V2VDO1GvMRnl4O75M4GW/abC5tnfzadQYkqEveqRM1dEJGFFegfPNA2vvx2iw== + +"@types/long@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" + integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== + +"@types/mdast@^3.0.0": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" + integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== + dependencies: + "@types/unist" "*" + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/minimist@^1.2.0": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + +"@types/ms@*": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + +"@types/node-fetch@^2.5.12": + version "2.5.12" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66" + integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw== + dependencies: + "@types/node" "*" + form-data "^3.0.0" + +"@types/node@*": + version "16.10.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.3.tgz#7a8f2838603ea314d1d22bb3171d899e15c57bd5" + integrity sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ== + +"@types/node@^10.1.0": + version "10.17.60" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" + integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== + +"@types/normalize-package-data@^2.4.0": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/pluralize@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/pluralize/-/pluralize-0.0.29.tgz#6ffa33ed1fc8813c469b859681d09707eb40d03c" + integrity sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA== + +"@types/prettier@^2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.1.tgz#e1303048d5389563e130f5bdd89d37a99acb75eb" + integrity sha512-Fo79ojj3vdEZOHg3wR9ksAMRz4P3S5fDB5e/YWZiFnyFQI1WY2Vftu9XoXVVtJfxB7Bpce/QTqWSSntkz2Znrw== + +"@types/prompts@^2.0.14": + version "2.0.14" + resolved "https://registry.yarnpkg.com/@types/prompts/-/prompts-2.0.14.tgz#10cb8899844bb0771cabe57c1becaaaca9a3b521" + integrity sha512-HZBd99fKxRWpYCErtm2/yxUZv6/PBI9J7N4TNFffl5JbrYMHBwF25DjQGTW3b3jmXq+9P6/8fCIb2ee57BFfYA== + dependencies: + "@types/node" "*" + +"@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/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/react-dom@*": + version "17.0.9" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.9.tgz#441a981da9d7be117042e1a6fd3dac4b30f55add" + integrity sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg== + dependencies: + "@types/react" "*" + +"@types/react-select@^4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@types/react-select/-/react-select-4.0.18.tgz#f907f406411afa862217a9d86c54a301367a35c1" + integrity sha512-uCPRMPshd96BwHuT7oCrFduiv5d6km3VwmtW7rVl9g4XetS3VoJ9nZo540LiwtQgaFcW96POwaxQDZDAyYaepg== + dependencies: + "@emotion/serialize" "^1.0.0" + "@types/react" "*" + "@types/react-dom" "*" + "@types/react-transition-group" "*" + +"@types/react-transition-group@*", "@types/react-transition-group@^4.4.0": + version "4.4.3" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.3.tgz#b0994da0a7023d67dbb4a8910a62112bc00d5688" + integrity sha512-fUx5muOWSYP8Bw2BUQ9M9RK9+W1XBK/7FLJ8PTQpnpTEkn0ccyMffyEQvan4C3h53gHdx7KE5Qrxi/LnUGQtdg== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@17.0.27", "@types/react@^17.0.24": + version "17.0.27" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.27.tgz#6498ed9b3ad117e818deb5525fa1946c09f2e0e6" + integrity sha512-zgiJwtsggVGtr53MndV7jfiUESTqrbxOcBvwfe6KS/9bzaVPCTDieTWnFNecVNx6EAaapg5xsLLWFfHHR437AA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/retry@^0.12.0": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" + integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/serve-static@*": + version "1.13.10" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/source-map-support@^0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@types/source-map-support/-/source-map-support-0.5.4.tgz#574ff6a8636bc0ebae78a8014136f749b3177d58" + integrity sha512-9zGujX1sOPg32XLyfgEB/0G9ZnrjthL/Iv1ZfuAjj8LEilHZEpQSQs1scpRXPhHzGYgWiLz9ldF1cI8JhL+yMw== + dependencies: + source-map "^0.6.0" + +"@types/superagent@*": + version "4.1.13" + resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.13.tgz#0aaa3f4ff9404b94932d1dcdfb7f3d39d23997a0" + integrity sha512-YIGelp3ZyMiH0/A09PMAORO0EBGlF5xIKfDpK74wdYvWUs2o96b5CItJcWPdH409b7SAXIIG6p8NdU/4U2Maww== + dependencies: + "@types/cookiejar" "*" + "@types/node" "*" + +"@types/supertest@^2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.11.tgz#2e70f69f220bc77b4f660d72c2e1a4231f44a77d" + integrity sha512-uci4Esokrw9qGb9bvhhSVEjd6rkny/dk5PK/Qz4yxKiyppEI+dOPlNrZBahE3i+PoKFYyDxChVXZ/ysS/nrm1Q== + dependencies: + "@types/superagent" "*" + +"@types/uid-safe@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@types/uid-safe/-/uid-safe-2.1.2.tgz#8eacbfc715b4927c7fbdc044146a6411e3a060cc" + integrity sha512-Qe3A73fQbbkyoCIZvumH3kGJe01aOeUjUjKW05QHAfkfyKa8FjlDR5dP05T27S/f1/qjCtI07pQJzo4SKQWFSQ== + +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + +"@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/zen-observable@0.8.3": + version "0.8.3" + resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.3.tgz#781d360c282436494b32fe7d9f7f8e64b3118aa3" + integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw== + +"@typescript-eslint/parser@^4.20.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" + integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== + dependencies: + "@typescript-eslint/scope-manager" "4.33.0" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/typescript-estree" "4.33.0" + debug "^4.3.1" + +"@typescript-eslint/scope-manager@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" + integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== + dependencies: + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + +"@typescript-eslint/types@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" + integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== + +"@typescript-eslint/typescript-estree@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" + integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== + dependencies: + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + debug "^4.3.1" + globby "^11.0.3" + is-glob "^4.0.1" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" + integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== + dependencies: + "@typescript-eslint/types" "4.33.0" + eslint-visitor-keys "^2.0.0" + +"@urql/core@^2.3.2": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@urql/core/-/core-2.3.3.tgz#e4777b95c31d8ad0ba21ea1f5c851cbbe1d0ac17" + integrity sha512-Bi9mafTFu0O1XZmI7/HrEk12LHZW+Fs/V1FqSJoUDgYIhARIJW6cCh3Havy1dJJ0FETxYmmQQXPf6kst+IP2qQ== + dependencies: + "@graphql-typed-document-node/core" "^3.1.0" + wonka "^4.0.14" + +"@wry/context@^0.6.0": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.6.1.tgz#c3c29c0ad622adb00f6a53303c4f965ee06ebeb2" + integrity sha512-LOmVnY1iTU2D8tv4Xf6MVMZZ+juIJ87Kt/plMijjN20NMAXGmH4u8bS1t0uT74cZ5gwpocYueV58YwyI8y+GKw== + dependencies: + tslib "^2.3.0" + +"@wry/equality@^0.5.0": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.2.tgz#72c8a7a7d884dff30b612f4f8464eba26c080e73" + integrity sha512-oVMxbUXL48EV/C0/M7gLVsoK6qRHPS85x8zECofEZOVvxGmIPLA9o5Z27cc2PoAyZz1S2VoM2A7FLAnpfGlneA== + dependencies: + tslib "^2.3.0" + +"@wry/trie@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.3.1.tgz#2279b790f15032f8bcea7fc944d27988e5b3b139" + integrity sha512-WwB53ikYudh9pIorgxrkHKrQZcCqNM/Q/bDzZBffEaGUKGuHrRb3zZUT9Sh2qw9yogC7SsdRmQ1ER0pqvd3bfw== + dependencies: + tslib "^2.3.0" + +accepts@^1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-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== + +acorn-node@^1.6.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.0.0, acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +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" + +anser@1.4.9: + version "1.4.9" + resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz#1f85423a5dcf8da4631a341665ff675b96845760" + integrity sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA== + +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.0, ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.1, anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +apollo-datasource@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-3.1.0.tgz#44153cb99c7602f4524397ebc8f13e486a010c09" + integrity sha512-ywcVjuWNo84eMB9uBOYygQI+00+Ne4ShyPIxJzT//sn1j1Fu3J+KStMNd6s1jyERWgjGZzxkiLn6nLmwsGymBg== + dependencies: + apollo-server-caching "^3.1.0" + apollo-server-env "^4.0.3" + +apollo-graphql@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.9.3.tgz#1ca6f625322ae10a66f57a39642849a07a7a5dc9" + integrity sha512-rcAl2E841Iko4kSzj4Pt3PRBitmyq1MvoEmpl04TQSpGnoVgl1E/ZXuLBYxMTSnEAm7umn2IsoY+c6Ll9U/10A== + dependencies: + core-js-pure "^3.10.2" + lodash.sortby "^4.7.0" + sha.js "^2.4.11" + +apollo-reporting-protobuf@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.0.0.tgz#a53966b76a3f373d9336bc953f0bc6dede487270" + integrity sha512-jmCD+6gECt8KS7PxP460hztT/5URTbv2Kg0zgnR6iWPGce88IBmSUjcqf1Z6wJJq7Teb8Hu7WbyyMhn0vN5TxQ== + dependencies: + "@apollo/protobufjs" "1.2.2" + +apollo-server-caching@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-3.1.0.tgz#c68f2159ad8a25a0bdbb18ad6bdbbde59cd4647d" + integrity sha512-bZ4bo0kSAsax9LbMQPlpuMTkQ657idF2ehOYe4Iw+8vj7vfAYa39Ii9IlaVAFMC1FxCYzLNFz+leZBm/Stn/NA== + dependencies: + lru-cache "^6.0.0" + +apollo-server-core@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-3.3.0.tgz#f973c6f755884f8e17452cb9022672ae6f0ed9e7" + integrity sha512-KmkzKVG3yjybouDyUX6Melv39u1EOFipvAKP17IlPis/TjVbubJmb6hkE0am/g2RipyhRvlpxAjHqPaCTXR1dQ== + dependencies: + "@apollographql/apollo-tools" "^0.5.1" + "@apollographql/graphql-playground-html" "1.6.29" + "@graphql-tools/mock" "^8.1.2" + "@graphql-tools/schema" "^8.0.0" + "@graphql-tools/utils" "^8.0.0" + "@josephg/resolvable" "^1.0.0" + apollo-datasource "^3.1.0" + apollo-graphql "^0.9.0" + apollo-reporting-protobuf "^3.0.0" + apollo-server-caching "^3.1.0" + apollo-server-env "^4.0.3" + apollo-server-errors "^3.1.0" + apollo-server-plugin-base "^3.2.0" + apollo-server-types "^3.2.0" + async-retry "^1.2.1" + fast-json-stable-stringify "^2.1.0" + graphql-tag "^2.11.0" + loglevel "^1.6.8" + lru-cache "^6.0.0" + sha.js "^2.4.11" + uuid "^8.0.0" + +apollo-server-env@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-4.0.3.tgz#082a5c1dd4dfb3b34de5e1fa7dc170dd15a5062f" + integrity sha512-B32+RUOM4GUJAwnQqQE1mT1BG7+VfW3a0A87Bp3gv/q8iNnhY2BIWe74Qn03pX8n27g3EGVCt0kcBuHhjG5ltA== + dependencies: + node-fetch "^2.6.1" + +apollo-server-errors@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-3.1.0.tgz#0b890dc7ae36a1f0ca4841d353e8d1c3c6524ee2" + integrity sha512-bUmobPEvtcBFt+OVHYqD390gacX/Cm5s5OI5gNZho8mYKAA6OjgnRlkm/Lti6NzniXVxEQyD5vjkC6Ox30mGFg== + +apollo-server-express@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-3.3.0.tgz#23ec8b102a4758548c1416fb4770334e814ffb12" + integrity sha512-qJedh77IxbfT+HpYsDraC2CGdy08wiWTwoKYXjRK4S/DHbe94A4957/1blw4boYO4n44xRKQd1k6zxiixCp+XQ== + dependencies: + "@types/accepts" "^1.3.5" + "@types/body-parser" "1.19.1" + "@types/cors" "2.8.12" + "@types/express" "4.17.13" + "@types/express-serve-static-core" "4.17.24" + accepts "^1.3.5" + apollo-server-core "^3.3.0" + apollo-server-types "^3.2.0" + body-parser "^1.19.0" + cors "^2.8.5" + parseurl "^1.3.3" + +apollo-server-micro@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/apollo-server-micro/-/apollo-server-micro-3.3.0.tgz#02aeed4e130f418d896371bb120c51c399c1e27d" + integrity sha512-PTyTgre87Yh89fwml9pCdac60vlmByLYaUqdGtZMG8Z6GQ4tGMo7cUYPMK+FbNFr8/27oOxK8CvEAF3ogAYlCw== + dependencies: + "@hapi/accept" "^5.0.2" + apollo-server-core "^3.3.0" + apollo-server-types "^3.2.0" + type-is "^1.6.18" + +apollo-server-plugin-base@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-3.2.0.tgz#415337a0b1b88fc1d5f5620130a51e2935dd8dbf" + integrity sha512-anjyiw79wxU4Cj2bYZFWQqZPjuaZ4mVJvxCoyvkFrNvjPua9dovCOfpng43C5NwdsqJpz78Vqs236eFM2QoeaA== + dependencies: + apollo-server-types "^3.2.0" + +apollo-server-types@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-3.2.0.tgz#6243b34d35fbb09ded2cc84bf7e5f59968ccfa21" + integrity sha512-Fh7QP84ufDZHbLzoLyyxyzznlW8cpgEZYYkGsS1i36zY4VaAt5OUOp1f+FxWdLGehq0Arwb6D1W7y712IoZ/JQ== + dependencies: + apollo-reporting-protobuf "^3.0.0" + apollo-server-caching "^3.1.0" + apollo-server-env "^4.0.3" + +apollo-upload-client@^16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/apollo-upload-client/-/apollo-upload-client-16.0.0.tgz#704c9bc21e12bd4687172876eb927cf756b2e524" + integrity sha512-aLhYucyA0T8aBEQ5g+p13qnR9RUyL8xqb8FSZ7e/Kw2KUOsotLUlFluLobqaE7JSUFwc6sKfXIcwB7y4yEjbZg== + dependencies: + extract-files "^11.0.0" + +apply-ref@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/apply-ref/-/apply-ref-1.0.0.tgz#036947786ec24f64c92e905b56d6ffec2fa81951" + integrity sha512-InKjUB8TMcIiSVV/9hqmMpIXkpIjCIbRiB3qdPu4/kU9AagF2uRAdAfFgt9+ykw5xQYyqAmcIKNsgy4tqKPquQ== + +archiver-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2" + integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw== + dependencies: + glob "^7.1.4" + graceful-fs "^4.2.0" + lazystream "^1.0.0" + lodash.defaults "^4.2.0" + lodash.difference "^4.5.0" + lodash.flatten "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.union "^4.6.0" + normalize-path "^3.0.0" + readable-stream "^2.0.0" + +archiver@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-4.0.2.tgz#43c72865eadb4ddaaa2fb74852527b6a450d927c" + integrity sha512-B9IZjlGwaxF33UN4oPbfBkyA4V1SxNLeIhR1qY8sRXSsbdUkEHrrOvwlYFPx+8uQeCe9M+FG6KgO+imDmQ79CQ== + dependencies: + archiver-utils "^2.1.0" + async "^3.2.0" + buffer-crc32 "^0.2.1" + glob "^7.1.6" + readable-stream "^3.6.0" + tar-stream "^2.1.2" + zip-stream "^3.0.1" + +arg@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.0.tgz#583c518199419e0037abb74062c37f8519e575f0" + integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg== + +arg@5.0.1, arg@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.1.tgz#eb0c9a8f77786cad2af8ff2b862899842d7b6adb" + integrity sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-includes@^3.1.1, array-includes@^3.1.3: + version "3.1.4" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" + integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flat@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" + integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + +array.prototype.flatmap@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446" + integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.19.0" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +assert@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" + integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== + dependencies: + es6-object-assign "^1.1.0" + is-nan "^1.2.1" + object-is "^1.0.1" + util "^0.12.0" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + +ast-types@0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" + integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-retry@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" + integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== + dependencies: + retry "0.13.1" + +async@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.1.tgz#d3274ec66d107a47476a4c49136aacdb00665fc8" + integrity sha512-XdD5lRO/87udXCMC9meWdYiR+Nq6ZjUfXidViUZGu2F1MO4T3XwZ1et0hb2++BgLfhyJwy44BGB/yx80ABx8hg== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +autoprefixer@^10.3.7: + version "10.3.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.3.7.tgz#cef2562058406bd378c94aacda36bb46a97b3186" + integrity sha512-EmGpu0nnQVmMhX8ROoJ7Mx8mKYPlcUHuxkwrRYEYMz85lu7H09v8w6R1P0JPdn/hKU32GjpLBFEOuIlDWCRWvg== + dependencies: + browserslist "^4.17.3" + caniuse-lite "^1.0.30001264" + fraction.js "^4.1.1" + normalize-range "^0.1.2" + picocolors "^0.2.1" + postcss-value-parser "^4.1.0" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axe-core@^4.0.2: + version "4.3.3" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.3.tgz#b55cd8e8ddf659fe89b064680e1c6a4dceab0325" + integrity sha512-/lqqLAmuIPi79WYfRpy2i8z+x+vxU3zX2uAm0gs1q52qTuKwolOj1P8XbufpXcsydrpKx2yGn2wzAnxCMV86QA== + +axobject-query@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.0.2, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcryptjs@^2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" + integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms= + +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== + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +body-parser@1.19.0, body-parser@^1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@0.2.0, browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@4.16.6: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== + dependencies: + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" + +browserslist@^4.16.6, browserslist@^4.17.3: + version "4.17.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.3.tgz#2844cd6eebe14d12384b0122d217550160d2d624" + integrity sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ== + dependencies: + caniuse-lite "^1.0.30001264" + electron-to-chromium "^1.3.857" + escalade "^3.1.1" + node-releases "^1.1.77" + picocolors "^0.2.1" + +buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" + integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@^5.1.0, buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +busboy@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" + integrity sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw== + dependencies: + dicer "0.3.0" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0, bytes@^3.0.0, bytes@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30001202, caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001228, caniuse-lite@^1.0.30001264: + version "1.0.30001265" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz#0613c9e6c922e422792e6fcefdf9a3afeee4f8c3" + integrity sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw== + +ccount@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + +chalk@2.4.2, chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" + integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +checkpoint-client@1.1.20: + version "1.1.20" + resolved "https://registry.yarnpkg.com/checkpoint-client/-/checkpoint-client-1.1.20.tgz#c869eeba84130ea3e5660b1fd71440981b5df8f5" + integrity sha512-AHDELBFMXBV9Rzp4JaN0JR03YQomZpaaVFDjgH7Ue4CcPuzNV2dZ94ZORJ9OoQsASYca/uR7UNGXmeNuWHc+IQ== + dependencies: + ci-info "3.1.1" + env-paths "2.2.1" + fast-write-atomic "0.2.1" + make-dir "3.1.0" + ms "2.1.3" + node-fetch "2.6.1" + uuid "8.3.2" + +chokidar@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + +chokidar@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +ci-info@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.1.1.tgz#9a32fcefdf7bcdb6f0a7e1c0f8098ec57897b80a" + integrity sha512-kdRWLBIJwdsYJWYJFtAFFYxybguqeF91qpZaggjG5Nf8QKdizFG2hjqvaTXbxFIcYbSaD74KpAXv6BSm17DHEQ== + +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== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +classnames@2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + +classnames@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-truncate@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== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +clipboard-copy@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clipboard-copy/-/clipboard-copy-4.0.1.tgz#326ef9726d4ffe72d9a82a7bbe19379de692017d" + integrity sha512-wOlqdqziE/NNTUJsfSgXmBMIrYmfd5V0HCGsR8uAKHcg+h9NENWINcfRjtWGU77wDHC8B8ijV4hMTGYbrKovng== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" + integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/color/-/color-4.0.1.tgz#21df44cd10245a91b1ccf5ba031609b0e10e7d67" + integrity sha512-rpZjOKN5O7naJxkH2Rx1sZzzBgaiWECc6BYXjeCE6kF0kcASJYbUq02u7JqIHwCb/j3NhV+QhRL2683aICeGZA== + dependencies: + color-convert "^2.0.1" + color-string "^1.6.0" + +colorette@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.19.0, commander@^2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compress-commons@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-3.0.0.tgz#833944d84596e537224dd91cf92f5246823d4f1d" + integrity sha512-FyDqr8TKX5/X0qo+aVfaZ+PVmNJHJeckFBlq8jZGSJOgnynhfifoyl24qaqdUdDIBe0EVTHByN6NAkqYvE/2Xg== + dependencies: + buffer-crc32 "^0.2.13" + crc32-stream "^3.0.1" + normalize-path "^3.0.0" + readable-stream "^2.3.7" + +compute-scroll-into-view@^1.0.17: + version "1.0.17" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab" + integrity sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@1.0.0, constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@1.0.4, content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +cookie@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + +cookiejar@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" + integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== + +copy-to-clipboard@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" + integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== + dependencies: + toggle-selection "^1.0.6" + +core-js-pure@^3.10.2, core-js-pure@^3.16.0: + version "3.18.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.18.2.tgz#d8cc11d4885ea919f3de776d45e720e4c769d406" + integrity sha512-4hMMLUlZhKJKOWbbGD1/VDUxGPEhEoN/T01k7bx271WiBKCvCfkgPzy0IeRS4PB50p6/N1q/SZL4B/TRsTE5bA== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +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== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +crc32-stream@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-3.0.1.tgz#cae6eeed003b0e44d739d279de5ae63b171b4e85" + integrity sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w== + dependencies: + crc "^3.4.4" + readable-stream "^3.4.0" + +crc@^3.4.4: + version "3.8.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-fetch@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" + integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== + dependencies: + node-fetch "2.6.1" + +cross-spawn@7.0.3, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-browserify@3.12.0, crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-unit-converter@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.2.tgz#4c77f5a1954e6dbff60695ecb214e3270436ab21" + integrity sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA== + +css.escape@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= + +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== + +cssfilter@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" + integrity sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4= + +cssnano-preset-simple@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssnano-preset-simple/-/cssnano-preset-simple-3.0.0.tgz#e95d0012699ca2c741306e9a3b8eeb495a348dbe" + integrity sha512-vxQPeoMRqUT3c/9f0vWeVa2nKQIHFpogtoBvFdW4GQ3IvEJ6uauCP6p3Y5zQDLFcI7/+40FTgX12o7XUL0Ko+w== + dependencies: + caniuse-lite "^1.0.30001202" + +cssnano-simple@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssnano-simple/-/cssnano-simple-3.0.0.tgz#a4b8ccdef4c7084af97e19bc5b93b4ecf211e90f" + integrity sha512-oU3ueli5Dtwgh0DyeohcIEE00QVfbPR3HzyXdAl89SfnQG3y0/qcpfLVW+jPIh3/rgMZGwuW96rejZGaYE9eUg== + dependencies: + cssnano-preset-simple "^3.0.0" + +csstype@^3.0.2: + version "3.0.9" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.9.tgz#6410af31b26bd0520933d02cbc64fce9ce3fbf0b" + integrity sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw== + +cuid@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/cuid/-/cuid-2.1.8.tgz#cbb88f954171e0d5747606c0139fb65c5101eac0" + integrity sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg== + +damerau-levenshtein@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz#64368003512a1a6992593741a09a9d31a836f55d" + integrity sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw== + +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== + +date-fns@^2.24.0: + version "2.25.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.25.0.tgz#8c5c8f1d958be3809a9a03f4b742eba894fc5680" + integrity sha512-ovYRFnTrbGPD4nqaEqescPEv1mNwvt+UTqI3Ay9SzNtey9NZnYu6E2qCcBBgJ6/2VF1zGGygpyTDITqpQQ5e+w== + +debug@2, debug@2.6.9, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@4.3.2, debug@^4.0.0, 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== + dependencies: + ms "2.1.2" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decamelize-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decimal.js@10.3.1: + version "10.3.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" + integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + +del@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" + integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +depd@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + integrity sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== + +detective@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" + integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== + dependencies: + acorn-node "^1.6.1" + defined "^1.0.0" + minimist "^1.1.1" + +dicer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" + integrity sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA== + dependencies: + streamsearch "0.1.2" + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +direction@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/direction/-/direction-1.0.4.tgz#2b86fb686967e987088caf8b89059370d4837442" + integrity sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ== + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +domain-browser@4.19.0: + version "4.19.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.19.0.tgz#1093e17c0a17dbd521182fe90d49ac1370054af1" + integrity sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ== + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +dotenv@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + +dumb-passwords@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/dumb-passwords/-/dumb-passwords-0.2.1.tgz#efaba4fdc13b27d446d4b11a5f303357649ada32" + integrity sha1-76uk/cE7J9RG1LEaXzAzV2Sa2jI= + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.723, electron-to-chromium@^1.3.857: + version "1.3.864" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.864.tgz#6a993bcc196a2b8b3df84d28d5d4dd912393885f" + integrity sha512-v4rbad8GO6/yVI92WOeU9Wgxc4NA0n4f6P1FvZTY+jyY7JHEhw3bduYu60v3Q1h81Cg6eo4ApZrFPuycwd5hGw== + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +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== + +emoji-regex@^9.0.0: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +encoding@0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +env-paths@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.18.5, es-abstract@^1.19.0, 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" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-object-assign@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-next@11.1.2: + version "11.1.2" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-11.1.2.tgz#73c918f2fa6120d5f65080bf3fcf6b154905707e" + integrity sha512-dFutecxX2Z5/QVlLwdtKt+gIfmNMP8Qx6/qZh3LM/DFVdGJEAnUKrr4VwGmACB2kx/PQ5bx3R+QxnEg4fDPiTg== + dependencies: + "@next/eslint-plugin-next" "11.1.2" + "@rushstack/eslint-patch" "^1.0.6" + "@typescript-eslint/parser" "^4.20.0" + eslint-import-resolver-node "^0.3.4" + eslint-import-resolver-typescript "^2.4.0" + eslint-plugin-import "^2.22.1" + eslint-plugin-jsx-a11y "^6.4.1" + eslint-plugin-react "^7.23.1" + eslint-plugin-react-hooks "^4.2.0" + +eslint-import-resolver-node@^0.3.4, eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== + dependencies: + debug "^3.2.7" + resolve "^1.20.0" + +eslint-import-resolver-typescript@^2.4.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.5.0.tgz#07661966b272d14ba97f597b51e1a588f9722f0a" + integrity sha512-qZ6e5CFr+I7K4VVhQu3M/9xGv9/YmwsEXrsm3nimw8vWaVHRDrQRp26BgCypTxBp3vUp4o5aVEJRiy0F2DFddQ== + dependencies: + debug "^4.3.1" + glob "^7.1.7" + is-glob "^4.0.1" + resolve "^1.20.0" + tsconfig-paths "^3.9.0" + +eslint-module-utils@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz#94e5540dd15fe1522e8ffa3ec8db3b7fa7e7a534" + integrity sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q== + dependencies: + debug "^3.2.7" + pkg-dir "^2.0.0" + +eslint-plugin-import@^2.22.1: + version "2.24.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz#2c8cd2e341f3885918ee27d18479910ade7bb4da" + integrity sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q== + dependencies: + array-includes "^3.1.3" + array.prototype.flat "^1.2.4" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.6.2" + find-up "^2.0.0" + has "^1.0.3" + is-core-module "^2.6.0" + minimatch "^3.0.4" + object.values "^1.1.4" + pkg-up "^2.0.0" + read-pkg-up "^3.0.0" + resolve "^1.20.0" + tsconfig-paths "^3.11.0" + +eslint-plugin-jsx-a11y@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz#a2d84caa49756942f42f1ffab9002436391718fd" + integrity sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg== + dependencies: + "@babel/runtime" "^7.11.2" + aria-query "^4.2.2" + array-includes "^3.1.1" + ast-types-flow "^0.0.7" + axe-core "^4.0.2" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.6" + emoji-regex "^9.0.0" + has "^1.0.3" + jsx-ast-utils "^3.1.0" + language-tags "^1.0.5" + +eslint-plugin-react-hooks@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" + integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== + +eslint-plugin-react@^7.23.1: + version "7.26.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.26.1.tgz#41bcfe3e39e6a5ac040971c1af94437c80daa40e" + integrity sha512-Lug0+NOFXeOE+ORZ5pbsh6mSKjBKXDXItUD2sQoT+5Yl0eoT82DqnXeTMfUare4QVCn9QwXbfzO/dBLjLXwVjQ== + dependencies: + array-includes "^3.1.3" + array.prototype.flatmap "^1.2.4" + doctrine "^2.1.0" + estraverse "^5.2.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.0.4" + object.entries "^1.1.4" + object.fromentries "^2.0.4" + object.hasown "^1.0.0" + object.values "^1.1.4" + prop-types "^15.7.2" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.5" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +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" + +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.32.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== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + 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" + 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" + 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" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + 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== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +esrever@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/esrever/-/esrever-0.2.0.tgz#96e9d28f4f1b1a76784cd5d490eaae010e7407b8" + integrity sha1-lunSj08bGnZ4TNXUkOquAQ50B7g= + +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== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@1.8.1, etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@5.1.1, 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== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extract-files@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-11.0.0.tgz#b72d428712f787eef1f5193aff8ab5351ca8469a" + integrity sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ== + +facepaint@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/facepaint/-/facepaint-1.2.1.tgz#89929e601b15227278c53c516f764fc462b09c33" + integrity sha512-oNvBekbhsm/0PNSOWca5raHNAi6dG960Bx6LJgxDPNF59WpuspgQ17bN5MKwOr7JcFdQYc7StW3VZ28DBZLavQ== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.1.1, fast-glob@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fast-safe-stringify@^2.0.7: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fast-write-atomic@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fast-write-atomic/-/fast-write-atomic-0.2.1.tgz#7ee8ef0ce3c1f531043c09ae8e5143361ab17ede" + integrity sha512-WvJe06IfNYlr+6cO3uQkdKdy3Cb1LlCJSF8zRs2eT8yuhdbSlR9nIt+TgQ92RUxiRrQm+/S7RARnMfCs5iuAjw== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-type@^10.10.0: + version "10.11.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-10.11.0.tgz#2961d09e4675b9fb9a3ee6b69e9cd23f43fd1890" + integrity sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw== + +filename-reserved-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" + integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= + +filenamify@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.3.0.tgz#62391cb58f02b09971c9d4f9d63b3cf9aba03106" + integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg== + dependencies: + filename-reserved-regex "^2.0.0" + strip-outer "^1.0.1" + trim-repeated "^1.0.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + 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== + +focus-lock@^0.9.1: + version "0.9.2" + resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.9.2.tgz#9d30918aaa99b1b97677731053d017f82a540d5b" + integrity sha512-YtHxjX7a0IC0ZACL5wsX8QdncXofWpGPNoVMuI/nZUrPGp6LmNI6+D5j0pPj+v8Kw5EpweA+T5yImK0rnWf7oQ== + dependencies: + tslib "^2.0.3" + +focus-trap@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-6.7.1.tgz#d474f86dbaf3c7fbf0d53cf0b12295f4f4068d10" + integrity sha512-a6czHbT9twVpy2RpkWQA9vIgwQgB9Nx1PIxNNUxQT4nugG/3QibwxO+tWTh9i+zSY2SFiX4pnYhTaFaQF/6ZAg== + dependencies: + tabbable "^5.2.1" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + +form-data@*, form-data@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +formidable@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9" + integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fp-ts@^2.11.4: + version "2.11.4" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.11.4.tgz#ad78a0d8eafb0dcfc835a0fb200f6da6422c27f0" + integrity sha512-lhV7tGEbs2qoVw4vmqOovChS7CAoIYU0gdiPEF8Vc4bLZct+PAMMeXrCqRyBNEo33XOvwvAmFDEDIrHPWH2/fg== + +fraction.js@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.1.tgz#ac4e520473dae67012d618aab91eda09bcb400ff" + integrity sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-capacitor@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-6.2.0.tgz#fa79ac6576629163cb84561995602d8999afb7f5" + integrity sha512-nKcE1UduoSKX27NSZlg879LdQc94OtbOsEmKMN2MBNudXREvijRKx2GEBsTMTfws+BrbkJoEuynbGSVRSpauvw== + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.1, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + +get-orientation@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/get-orientation/-/get-orientation-1.1.2.tgz#20507928951814f8a91ded0a0e67b29dfab98947" + integrity sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ== + dependencies: + stream-parser "^0.3.1" + +get-stream@6.0.1, get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + 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.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +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== + dependencies: + type-fest "^0.20.2" + +globby@11.0.4, globby@^11.0.1, globby@^11.0.3: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + +graphql-tag@^2.11.0, graphql-tag@^2.12.3: + version "2.12.5" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.5.tgz#5cff974a67b417747d05c8d9f5f3cb4495d0db8f" + integrity sha512-5xNhP4063d16Pz3HBtKprutsPrmHZi5IdUGOWRxA2B6VF7BIRGOHZ5WQvDmJXZuPcBg7rYwaFxvQYjqkSdR3TQ== + dependencies: + tslib "^2.1.0" + +graphql-type-json@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/graphql-type-json/-/graphql-type-json-0.3.2.tgz#f53a851dbfe07bd1c8157d24150064baab41e115" + integrity sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg== + +graphql-upload@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/graphql-upload/-/graphql-upload-12.0.0.tgz#2351d20d294e920fb25d2eba9f7c352e37a1a02b" + integrity sha512-ovZ3Q7sZ17Bmn8tYl22MfrpNR7nYM/DUszXWgkue7SFIlI9jtqszHAli8id8ZcnGBc9GF0gUTNSskYWW+5aNNQ== + dependencies: + busboy "^0.3.1" + fs-capacitor "^6.2.0" + http-errors "^1.8.0" + isobject "^4.0.0" + object-path "^0.11.5" + +graphql@^15.3.0, graphql@^15.6.0, graphql@^15.6.1: + version "15.6.1" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.6.1.tgz#9125bdf057553525da251e19e96dab3d3855ddfc" + integrity sha512-3i5lu0z6dRvJ48QP9kFxBkJ7h4Kso7PS8eahyTFz5Jm6CvQfLtNIE8LX9N6JLnXTuwR+sIYnXzaWp6anOg0QQw== + +hard-rejection@^2.1.0: + version "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-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-yarn@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasha@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" + integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== + dependencies: + is-stream "^2.0.0" + type-fest "^0.8.0" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hosted-git-info@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" + integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== + dependencies: + lru-cache "^6.0.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-tags@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" + integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== + +http-errors@1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + integrity sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY= + dependencies: + depd "1.1.1" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@1.7.3, http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.0.tgz#75d1bbe497e1044f51e4ee9e704a62f28d336507" + integrity sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +https-browserify@1.0.0, https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + integrity sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.13, ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + 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== + +image-size@1.0.0, image-size@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.0.0.tgz#58b31fe4743b1cec0a0ac26f5c914d3c5b2f0750" + integrity sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw== + dependencies: + queue "6.0.2" + +image-type@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/image-type/-/image-type-4.1.0.tgz#72a88d64ff5021371ed67b9a466442100be57cd1" + integrity sha512-CFJMJ8QK8lJvRlTCEgarL4ro6hfDQKif2HjSvYCdQZESaIPV4v9imrf7BQHK+sQeTeNeMpWciR9hyC/g8ybXEg== + dependencies: + file-type "^10.10.0" + +immer@^7.0.0: + version "7.0.15" + resolved "https://registry.yarnpkg.com/immer/-/immer-7.0.15.tgz#dc3bc6db87401659d2e737c67a21b227c484a4ad" + integrity sha512-yM7jo9+hvYgvdCQdqvhCNRRio0SCXc8xDPzA25SvKWa7b1WVPjLwQs1VYU5JPXjcJPTqAa5NP5dqpORGYBQ2AA== + +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" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" + integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== + dependencies: + resolve-from "^5.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@4.0.0, indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflection@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.1.tgz#c5cadd80888a90cf84c2e96e340d7edc85d5f0cb" + integrity sha512-dldYtl2WlN0QDkIDtg8+xFwOS2Tbmp12t1cHa5/YClU6ZQjTFm7B66UcVbh9NQB+HvT5BAd2t5+yKsBkw5pcqA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +intersection-observer@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.12.0.tgz#6c84628f67ce8698e5f9ccf857d97718745837aa" + integrity sha512-2Vkz8z46Dv401zTWudDGwO7KiGHNDkMv417T5ItcNYfmvHR/1qCTVBO9vwH8zZmQ0WkA/1ARwpysR9bsnop4NQ== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +io-ts-excess@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/io-ts-excess/-/io-ts-excess-1.0.1.tgz#8ffab189202fd22d0c0df40363b476c06c2b7f68" + integrity sha512-yJQ+pGztBMIQmfsKfSAeQ1w7UJywvj37NIFriMAZ2tMLTpp1IngUvtxqI+QlW+RlXDn7cthMxrpJ0CnOx6Dn+w== + dependencies: + io-ts "^2.0.0" + +io-ts@^2.0.0, io-ts@^2.2.16: + version "2.2.16" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-2.2.16.tgz#597dffa03db1913fc318c9c6df6931cb4ed808b2" + integrity sha512-y5TTSa6VP6le0hhmIyN0dqEXkrZeJLeC5KApJq6VLci3UEKF80lZ+KuoUs02RhBxNWlrqSNxzfI7otLX1Euv8Q== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-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-color-stop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.6.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.7.0.tgz#3c0ef7d31b4acfc574f80c58409d568a836848e3" + integrity sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +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" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-hotkey@^0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/is-hotkey/-/is-hotkey-0.1.8.tgz#6b1f4b2d0e5639934e20c05ed24d623a21d36d25" + integrity sha512-qs3NZ1INIS+H+yeo7cD9pDfwYV/jqRh1JG9S9zYrNudkoUQg7OL7ziXqRKu+InFjUIDoP2o6HIkLYMh1pcWgyQ== + +is-hotkey@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/is-hotkey/-/is-hotkey-0.2.0.tgz#1835a68171a91e5c9460869d96336947c8340cef" + integrity sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw== + +is-nan@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.1.tgz#662d92d24c0aa4302407b0d45d21f2251c85f85b" + integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + +is-stream@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.3, is-typed-array@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" + integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.18.5" + foreach "^2.0.5" + has-tostringtag "^1.0.0" + +is-weakref@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" + integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== + dependencies: + call-bind "^1.0.0" + +is-wsl@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" + integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== + +jest-worker@27.0.0-next.5: + version "27.0.0-next.5" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.0-next.5.tgz#5985ee29b12a4e191f4aae4bb73b97971d86ec28" + integrity sha512-mk0umAQ5lT+CaOJ+Qp01N6kz48sJG2kr2n1rX0koqKf6FIygQV0qLOdN9SCYID4IVeSigDOcPeGLozdMLYfb5g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-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-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b" + integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA== + dependencies: + array-includes "^3.1.3" + object.assign "^4.1.2" + +kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +language-subtag-registry@~0.3.2: + version "0.3.21" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" + integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== + +language-tags@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= + dependencies: + language-subtag-registry "~0.3.2" + +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= + dependencies: + readable-stream "^2.0.5" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lilconfig@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.3.tgz#68f3005e921dafbd2a2afb48379986aa6d2579fd" + integrity sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg== + +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= + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +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.deburr@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lodash.deburr/-/lodash.deburr-4.1.0.tgz#ddb1bbb3ef07458c0177ba07de14422cb033ff9b" + integrity sha1-3bG7s+8HRYwBd7oH3hRCLLAz/5s= + +lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + +lodash.difference@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" + integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= + +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.topath@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009" + integrity sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak= + +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.union@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" + integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= + +lodash@^4.17.21, lodash@^4.17.4: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-update@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +loglevel@^1.6.8: + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +longest-streak@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" + integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@3.1.0, make-dir@^3.0.0, make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + +match-sorter@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-6.3.1.tgz#98cc37fda756093424ddf3cbc62bfe9c75b92bda" + integrity sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw== + dependencies: + "@babel/runtime" "^7.12.5" + remove-accents "0.4.2" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== + dependencies: + unist-util-visit "^2.0.0" + +mdast-util-find-and-replace@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz#b7db1e873f96f66588c321f1363069abf607d1b5" + integrity sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA== + dependencies: + escape-string-regexp "^4.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +mdast-util-from-markdown@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" + integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string "^2.0.0" + micromark "~2.11.0" + parse-entities "^2.0.0" + unist-util-stringify-position "^2.0.0" + +mdast-util-gfm-autolink-literal@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz#9c4ff399c5ddd2ece40bd3b13e5447d84e385fb7" + integrity sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A== + dependencies: + ccount "^1.0.0" + mdast-util-find-and-replace "^1.1.0" + micromark "^2.11.3" + +mdast-util-gfm-strikethrough@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz#45eea337b7fff0755a291844fbea79996c322890" + integrity sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA== + dependencies: + mdast-util-to-markdown "^0.6.0" + +mdast-util-to-markdown@^0.6.0: + version "0.6.5" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" + integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ== + dependencies: + "@types/unist" "^2.0.0" + longest-streak "^2.0.0" + mdast-util-to-string "^2.0.0" + parse-entities "^2.0.0" + repeat-string "^1.0.0" + zwitch "^1.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memoize-one@^5.0.0, memoize-one@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== + +meow@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364" + integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize "^1.2.0" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@^1.1.2, methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micro@^9.3.4: + version "9.3.4" + resolved "https://registry.yarnpkg.com/micro/-/micro-9.3.4.tgz#745a494e53c8916f64fb6a729f8cbf2a506b35ad" + integrity sha512-smz9naZwTG7qaFnEZ2vn248YZq9XR+XoOH3auieZbkhDL4xLOxiE+KqG8qqnBeKfXA9c1uEFGCxPN1D+nT6N7w== + dependencies: + arg "4.1.0" + content-type "1.0.4" + is-stream "1.1.0" + raw-body "2.3.2" + +micromark-extension-gfm-autolink-literal@0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz#53866c1f0c7ef940ae7ca1f72c6faef8fed9f204" + integrity sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw== + dependencies: + micromark "~2.11.3" + +micromark-extension-gfm-strikethrough@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz#96cb83356ff87bf31670eefb7ad7bba73e6514d1" + integrity sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw== + dependencies: + micromark "~2.11.0" + +micromark@^2.11.3, micromark@~2.11.0, micromark@~2.11.3: + version "2.11.4" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" + integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== + dependencies: + debug "^4.0.0" + parse-entities "^2.0.0" + +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.50.0: + version "1.50.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" + integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A== + +mime-types@^2.1.12, mime-types@~2.1.24: + version "2.1.33" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb" + integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g== + dependencies: + mime-db "1.50.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.6: + version "2.5.2" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" + integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-svg-data-uri@^1.2.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.3.3.tgz#91d2c09f45e056e5e1043340b8b37ba7b50f4fac" + integrity sha512-+fA2oRcR1dJI/7ITmeQJDrYWks0wodlOz0pAEhKYJ2IVc1z0AnwJUsKY2fzFmPAM3Jo9J0rBx8JAA9QQSJ5PuA== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass@^3.0.0: + version "3.1.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.5.tgz#71f6251b0a33a49c01b3cf97ff77eda030dff732" + integrity sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw== + dependencies: + yallist "^4.0.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +modern-normalize@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/modern-normalize/-/modern-normalize-1.1.0.tgz#da8e80140d9221426bd4f725c6e11283d34f90b7" + integrity sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.1.23, nanoid@^3.1.28: + version "3.1.29" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.29.tgz#214fb2d7a33e1a5bef4757b779dfaeb6a4e5aeb4" + integrity sha512-dW2pUSGZ8ZnCFIlBIA31SV8huOGCHb6OwzVCc7A69rb/a+SgPBwfmLvK5TKQ3INPbRkcI8a/Owo0XbiTNH19wg== + +native-url@0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.3.4.tgz#29c943172aed86c63cee62c8c04db7f5756661f8" + integrity sha512-6iM8R99ze45ivyH8vybJ7X0yekIcPf5GgLV5K0ENCbmRcaRIDoj37BC8iLEmaaBfqqb8enuZ5p0uhY+lVAbAcA== + dependencies: + querystring "^0.2.0" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +new-github-issue-url@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/new-github-issue-url/-/new-github-issue-url-0.2.1.tgz#e17be1f665a92de465926603e44b9f8685630c1d" + integrity sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA== + +next@^11.1.0, next@^11.1.2: + version "11.1.2" + resolved "https://registry.yarnpkg.com/next/-/next-11.1.2.tgz#527475787a9a362f1bc916962b0c0655cc05bc91" + integrity sha512-azEYL0L+wFjv8lstLru3bgvrzPvK0P7/bz6B/4EJ9sYkXeW8r5Bjh78D/Ol7VOg0EIPz0CXoe72hzAlSAXo9hw== + dependencies: + "@babel/runtime" "7.15.3" + "@hapi/accept" "5.0.2" + "@next/env" "11.1.2" + "@next/polyfill-module" "11.1.2" + "@next/react-dev-overlay" "11.1.2" + "@next/react-refresh-utils" "11.1.2" + "@node-rs/helper" "1.2.1" + assert "2.0.0" + ast-types "0.13.2" + browserify-zlib "0.2.0" + browserslist "4.16.6" + buffer "5.6.0" + caniuse-lite "^1.0.30001228" + chalk "2.4.2" + chokidar "3.5.1" + constants-browserify "1.0.0" + crypto-browserify "3.12.0" + cssnano-simple "3.0.0" + domain-browser "4.19.0" + encoding "0.1.13" + etag "1.8.1" + find-cache-dir "3.3.1" + get-orientation "1.1.2" + https-browserify "1.0.0" + image-size "1.0.0" + jest-worker "27.0.0-next.5" + native-url "0.3.4" + node-fetch "2.6.1" + node-html-parser "1.4.9" + node-libs-browser "^2.2.1" + os-browserify "0.3.0" + p-limit "3.1.0" + path-browserify "1.0.1" + pnp-webpack-plugin "1.6.4" + postcss "8.2.15" + process "0.11.10" + querystring-es3 "0.2.1" + raw-body "2.4.1" + react-is "17.0.2" + react-refresh "0.8.3" + stream-browserify "3.0.0" + stream-http "3.1.1" + string_decoder "1.3.0" + styled-jsx "4.0.1" + timers-browserify "2.0.12" + tty-browserify "0.0.1" + use-subscription "1.5.1" + util "0.12.4" + vm-browserify "1.1.2" + watchpack "2.1.1" + optionalDependencies: + "@next/swc-darwin-arm64" "11.1.2" + "@next/swc-darwin-x64" "11.1.2" + "@next/swc-linux-x64-gnu" "11.1.2" + "@next/swc-win32-x64-msvc" "11.1.2" + +node-emoji@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + +node-fetch@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +node-fetch@2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.2.tgz#986996818b73785e47b1965cc34eb093a1d464d0" + integrity sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA== + +node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.5: + version "2.6.5" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.5.tgz#42735537d7f080a7e5f78b6c549b7146be1742fd" + integrity sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ== + dependencies: + whatwg-url "^5.0.0" + +node-html-parser@1.4.9: + version "1.4.9" + resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-1.4.9.tgz#3c8f6cac46479fae5800725edb532e9ae8fd816c" + integrity sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw== + dependencies: + he "1.2.0" + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-releases@^1.1.71, node-releases@^1.1.77: + version "1.1.77" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" + integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== + +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-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= + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-assign@^4, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-hash@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== + +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-path@^0.11.5: + version "0.11.8" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.8.tgz#ed002c02bbdd0070b78a27455e8ae01fc14d4742" + integrity sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA== + +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.entries@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.fromentries@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" + integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.hasown@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5" + integrity sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.values@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +optimism@^0.16.1: + version "0.16.1" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.1.tgz#7c8efc1f3179f18307b887e18c15c5b7133f6e7d" + integrity sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg== + dependencies: + "@wry/context" "^0.6.0" + "@wry/trie" "^0.3.0" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +os-browserify@0.3.0, os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +p-filter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" + integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== + dependencies: + p-map "^2.0.0" + +p-limit@3.1.0, p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@4.0.0, p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-retry@4.6.1, p-retry@^4.2.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" + integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== + dependencies: + "@types/retry" "^0.12.0" + retry "^0.13.1" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parseurl@^1.3.3, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-browserify@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + +platform@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" + integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== + +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + dependencies: + ts-pnp "^1.1.6" + +postcss-js@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-3.0.3.tgz#2f0bd370a2e8599d45439f6970403b5873abda33" + integrity sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw== + dependencies: + camelcase-css "^2.0.1" + postcss "^8.1.6" + +postcss-load-config@^3.1.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-nested@5.0.6: + version "5.0.6" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-5.0.6.tgz#466343f7fc8d3d46af3e7dba3fcd47d052a945bc" + integrity sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA== + dependencies: + postcss-selector-parser "^6.0.6" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.6: + 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-value-parser@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss@8.2.15: + version "8.2.15" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.15.tgz#9e66ccf07292817d226fc315cbbf9bc148fbca65" + integrity sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q== + dependencies: + colorette "^1.2.2" + nanoid "^3.1.23" + source-map "^0.6.1" + +postcss@^8.1.6, postcss@^8.2.1, postcss@^8.3.9: + version "8.3.9" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.9.tgz#98754caa06c4ee9eb59cc48bd073bb6bd3437c31" + integrity sha512-f/ZFyAKh9Dnqytx5X62jgjhhzttjZS7hMsohcI7HEI5tjELX/HxCy3EFhsRxyzGvrzFF+82XPvCS8T9TFleVJw== + dependencies: + nanoid "^3.1.28" + picocolors "^0.2.1" + source-map-js "^0.6.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" + integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== + +pretty-hrtime@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= + +prettysize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prettysize/-/prettysize-2.0.0.tgz#902c02480d865d9cc0813011c9feb4fa02ce6996" + integrity sha512-VVtxR7sOh0VsG8o06Ttq5TrI1aiZKmC+ClSn4eBPaNf4SHr5lzbYW+kYGX3HocBL/MfpVrRfFZ9V3vCbLaiplg== + +prisma@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-3.1.1.tgz#4c13c35dd3a58af9134008c8ed0fdc21a632802c" + integrity sha512-+eZtWIL6hnOKUOvqq9WLBzSw2d/EbTmOx1Td1LI8/0XE40ctXMLG2N1p6NK5/+yivGaoNJ9PDpPsPL9lO4nJrQ== + dependencies: + "@prisma/engines" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@0.11.10, process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^2.0.0, progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +prompts@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" + integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prompts@^2.4.1: + 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" + +prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +proxy-addr@~2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +purgecss@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-4.0.3.tgz#8147b429f9c09db719e05d64908ea8b672913742" + integrity sha512-PYOIn5ibRIP34PBU9zohUcCI09c7drPJJtTDAc0Q6QlRz2/CHQ8ywGLdE7ZhxU2VTqB7p5wkvj5Qcm05Rz3Jmw== + dependencies: + commander "^6.0.0" + glob "^7.0.0" + postcss "^8.2.1" + postcss-selector-parser "^6.0.2" + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@^6.9.4: + version "6.10.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" + integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== + dependencies: + side-channel "^1.0.4" + +querystring-es3@0.2.1, querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystring@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" + integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +queue@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" + integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== + dependencies: + inherits "~2.0.3" + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +random-bytes@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" + integrity sha1-T2ih3Arli9P7lYSMMDJNt11kNgs= + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + integrity sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k= + dependencies: + bytes "3.0.0" + http-errors "1.6.2" + iconv-lite "0.4.19" + unpipe "1.0.0" + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-body@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" + integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== + dependencies: + bytes "3.1.0" + http-errors "1.7.3" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-clientside-effect@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.5.tgz#e2c4dc3c9ee109f642fac4f5b6e9bf5bcd2219a3" + integrity sha512-2bL8qFW1TGBHozGGbVeyvnggRpMjibeZM2536AKNENLECutp2yfs44IL8Hmpn8qjFQ2K7A9PnYf3vc7aQq/cPA== + dependencies: + "@babel/runtime" "^7.12.13" + +"react-day-picker@npm:react-day-picker@^7.4.8": + version "7.4.10" + resolved "https://registry.yarnpkg.com/react-day-picker/-/react-day-picker-7.4.10.tgz#d3928fa65c04379ad28c76de22aa85374a8361e1" + integrity sha512-/QkK75qLKdyLmv0kcVzhL7HoJPazoZXS8a6HixbVoK6vWey1Od1WRLcxfyEiUsRfccAlIlf6oKHShqY2SM82rA== + dependencies: + prop-types "^15.6.2" + +react-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-fast-compare@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + +react-focus-lock@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.5.2.tgz#f1e4db5e25cd8789351f2bd5ebe91e9dcb9c2922" + integrity sha512-WzpdOnEqjf+/A3EH9opMZWauag7gV0BxFl+EY4ElA4qFqYsUsBLnmo2sELbN5OC30S16GAWMy16B9DLPpdJKAQ== + dependencies: + "@babel/runtime" "^7.0.0" + focus-lock "^0.9.1" + prop-types "^15.6.2" + react-clientside-effect "^1.2.5" + use-callback-ref "^1.2.5" + use-sidecar "^1.0.5" + +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-is@^16.7.0, react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-popper@^2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.2.5.tgz#1214ef3cec86330a171671a4fbcbeeb65ee58e96" + integrity sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw== + dependencies: + react-fast-compare "^3.0.1" + warning "^4.0.2" + +react-refresh@0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" + integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== + +react-remove-scroll-bar@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.2.0.tgz#d4d545a7df024f75d67e151499a6ab5ac97c8cdd" + integrity sha512-UU9ZBP1wdMR8qoUs7owiVcpaPwsQxUDC2lypP6mmixaGlARZa7ZIBx1jcuObLdhMOvCsnZcvetOho0wzPa9PYg== + dependencies: + react-style-singleton "^2.1.0" + tslib "^1.0.0" + +react-remove-scroll@^2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.4.3.tgz#83d19b02503b04bd8141ed6e0b9e6691a2e935a6" + integrity sha512-lGWYXfV6jykJwbFpsuPdexKKzp96f3RbvGapDSIdcyGvHb7/eqyn46C7/6h+rUzYar1j5mdU+XECITHXCKBk9Q== + dependencies: + react-remove-scroll-bar "^2.1.0" + react-style-singleton "^2.1.0" + tslib "^1.0.0" + use-callback-ref "^1.2.3" + use-sidecar "^1.0.1" + +react-select@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.1.0.tgz#ac384c8e25ba6f03126026192b2bdad0f53fbf50" + integrity sha512-SkEBD1AYsSXrIdNj5HBt7+Ehe+jxdiB448J0atJqR6lE3l/GcFlRf4JYB3NlHe/02jrW4AnIQLo1t0IqWrxXOw== + dependencies: + "@babel/runtime" "^7.12.0" + "@emotion/cache" "^11.4.0" + "@emotion/react" "^11.1.1" + "@types/react-transition-group" "^4.4.0" + memoize-one "^5.0.0" + prop-types "^15.6.0" + react-transition-group "^4.3.0" + +react-style-singleton@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.1.1.tgz#ce7f90b67618be2b6b94902a30aaea152ce52e66" + integrity sha512-jNRp07Jza6CBqdRKNgGhT3u9umWvils1xsuMOjZlghBDH2MU0PL2WZor4PGYjXpnRCa9DQSlHMs/xnABWOwYbA== + dependencies: + get-nonce "^1.0.0" + invariant "^2.2.4" + tslib "^1.0.0" + +react-transition-group@^4.3.0, react-transition-group@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" + integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +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" + +read-pkg-up@7.0.1, read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@^2.3.7: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +reduce-css-calc@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz#7ef8761a28d614980dc0c982f772c93f7a99de03" + integrity sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg== + dependencies: + css-unit-converter "^1.1.1" + postcss-value-parser "^3.3.0" + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +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.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +remove-accents@0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" + integrity sha1-CkPTqq4egNuRngeuJUsoXZ4ce7U= + +repeat-string@^1.0.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +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== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-pkg@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg/-/resolve-pkg-2.0.0.tgz#ac06991418a7623edc119084edc98b0e6bf05a41" + integrity sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ== + dependencies: + resolve-from "^5.0.0" + +resolve@1.20.0, resolve@^1.10.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== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +resolve@^2.0.0-next.3: + version "2.0.0-next.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" + integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +retry@0.13.1, retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +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" + +scroll-into-view-if-needed@^2.2.20, scroll-into-view-if-needed@^2.2.28: + version "2.2.28" + resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.28.tgz#5a15b2f58a52642c88c8eca584644e01703d645a" + integrity sha512-8LuxJSuFVc92+0AdNv4QOxRL4Abeo1DgLnGNkn1XlaujPH/3cCFz3QI60r2VNu4obJJROzgnIUw5TKQkZvZI1w== + dependencies: + compute-scroll-into-view "^1.0.17" + +"semver@2 || 3 || 4 || 5": + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + integrity sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ= + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.5" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" + integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slate-history@^0.60.4: + version "0.60.17" + resolved "https://registry.yarnpkg.com/slate-history/-/slate-history-0.60.17.tgz#4a790a33fc28570d8f0ce03aa58d64d6797464c4" + integrity sha512-IH7455DOxfTTIF/NxZh88PQn70iX/u+Osq1SvVrIOT/oiMyK2DulMAOOKl4N8UbALnWgjvHlyoGXjpgTW3Y5eQ== + dependencies: + immer "^7.0.0" + is-plain-object "^3.0.0" + +slate-react@^0.60.4: + version "0.60.17" + resolved "https://registry.yarnpkg.com/slate-react/-/slate-react-0.60.17.tgz#7e6c38b25c4bdad4ae5bf7b325dbc554f65be5fa" + integrity sha512-gqsZPwZeTfV9aEGrU9gCiKaRu8oda/zYyWKwP31qzRL6hMaJ5d1BEicXLccZgdq+LoMbxA8dMOA+hLAsb19PVA== + dependencies: + "@types/is-hotkey" "^0.1.1" + "@types/lodash" "^4.14.149" + direction "^1.0.3" + is-hotkey "^0.1.6" + is-plain-object "^3.0.0" + lodash "^4.17.4" + scroll-into-view-if-needed "^2.2.20" + +slate@^0.60.4: + version "0.60.17" + resolved "https://registry.yarnpkg.com/slate/-/slate-0.60.17.tgz#a57896552e953bd04f43dbf2843cfc0a1d6cdbf7" + integrity sha512-zwdqCZcuX+vLj5vr30CxQKXo4zuYOX+g9R1HS7O2u3ym9CcYP2ri/hSFdJfGbIuSz7ncSo55kQHcbipuBw7seA== + dependencies: + "@types/esrever" "^0.2.0" + esrever "^0.2.0" + immer "^7.0.0" + is-plain-object "^3.0.0" + tiny-warning "^1.0.3" + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +source-map-js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" + integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== + +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== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +source-map@0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.10" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b" + integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +stacktrace-parser@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +"statuses@>= 1.3.1 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stream-browserify@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-http@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.1.1.tgz#0370a8017cf8d050b9a8554afe608f043eaff564" + integrity sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.4" + readable-stream "^3.6.0" + xtend "^4.0.2" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-parser@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/stream-parser/-/stream-parser-0.3.1.tgz#1618548694420021a1182ff0af1911c129761773" + integrity sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M= + dependencies: + debug "2" + +streamsearch@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= + +string-hash@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" + integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= + +string-width@4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.5: + 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" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@1.3.0, string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@3.0.0, strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-outer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" + integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== + dependencies: + escape-string-regexp "^1.0.2" + +styled-jsx@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-4.0.1.tgz#ae3f716eacc0792f7050389de88add6d5245b9e9" + integrity sha512-Gcb49/dRB1k8B4hdK8vhW27Rlb2zujCk1fISrizCcToIs+55B4vmUM0N9Gi4nnVfFZWe55jRdWpAqH1ldAKWvQ== + dependencies: + "@babel/plugin-syntax-jsx" "7.14.5" + "@babel/types" "7.15.0" + convert-source-map "1.7.0" + loader-utils "1.2.3" + source-map "0.7.3" + string-hash "1.1.3" + stylis "3.5.4" + stylis-rule-sheet "0.0.10" + +stylis-rule-sheet@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430" + integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw== + +stylis@3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" + integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== + +stylis@^4.0.3: + version "4.0.10" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.10.tgz#446512d1097197ab3f02fb3c258358c3f7a14240" + integrity sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg== + +superagent@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-6.1.0.tgz#09f08807bc41108ef164cfb4be293cebd480f4a6" + integrity sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg== + dependencies: + component-emitter "^1.3.0" + cookiejar "^2.1.2" + debug "^4.1.1" + fast-safe-stringify "^2.0.7" + form-data "^3.0.0" + formidable "^1.2.2" + methods "^1.1.2" + mime "^2.4.6" + qs "^6.9.4" + readable-stream "^3.6.0" + semver "^7.3.2" + +supertest@^6.1.6: + version "6.1.6" + resolved "https://registry.yarnpkg.com/supertest/-/supertest-6.1.6.tgz#6151c518f4c5ced2ac2aadb9f96f1bf8198174c8" + integrity sha512-0hACYGNJ8OHRg8CRITeZOdbjur7NLuNs0mBjVhdpxi7hP6t3QIbOzLON5RTUmZcy2I9riuII3+Pr2C7yztrIIg== + dependencies: + methods "^1.1.2" + superagent "^6.1.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + 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" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +symbol-observable@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" + integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== + +tabbable@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-5.2.1.tgz#e3fda7367ddbb172dcda9f871c0fdb36d1c4cd9c" + integrity sha512-40pEZ2mhjaZzK0BnI+QGNjJO8UYx9pP5v7BGe17SORTO0OEuuaAwQTkAp8whcZvqon44wKFOikD+Al11K3JICQ== + +table@^6.0.9: + version "6.7.2" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.2.tgz#a8d39b9f5966693ca8b0feba270a78722cbaf3b0" + integrity sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g== + dependencies: + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +tailwindcss@^2.2.4: + version "2.2.16" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-2.2.16.tgz#32f81bdf1758b639cb83b9d30bf7cbecdda49e5e" + integrity sha512-EireCtpQyyJ4Xz8NYzHafBoy4baCOO96flM0+HgtsFcIQ9KFy/YBK3GEtlnD+rXen0e4xm8t3WiUcKBJmN6yjg== + dependencies: + arg "^5.0.1" + bytes "^3.0.0" + chalk "^4.1.2" + chokidar "^3.5.2" + color "^4.0.1" + cosmiconfig "^7.0.1" + detective "^5.2.0" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.7" + fs-extra "^10.0.0" + glob-parent "^6.0.1" + html-tags "^3.1.0" + is-color-stop "^1.1.0" + is-glob "^4.0.1" + lodash "^4.17.21" + lodash.topath "^4.5.2" + modern-normalize "^1.1.0" + node-emoji "^1.11.0" + normalize-path "^3.0.0" + object-hash "^2.2.0" + postcss-js "^3.0.3" + postcss-load-config "^3.1.0" + postcss-nested "5.0.6" + postcss-selector-parser "^6.0.6" + postcss-value-parser "^4.1.0" + pretty-hrtime "^1.0.3" + purgecss "^4.0.3" + quick-lru "^5.1.1" + reduce-css-calc "^2.1.8" + resolve "^1.20.0" + tmp "^0.2.1" + +tar-stream@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar@6.1.11: + version "6.1.11" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +temp-dir@2.0.0, temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + +temp-write@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-4.0.0.tgz#cd2e0825fc826ae72d201dc26eef3bf7e6fc9320" + integrity sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw== + dependencies: + graceful-fs "^4.1.15" + is-stream "^2.0.0" + make-dir "^3.0.0" + temp-dir "^1.0.0" + uuid "^3.3.2" + +tempy@1.0.1, tempy@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-1.0.1.tgz#30fe901fd869cfb36ee2bd999805aa72fbb035de" + integrity sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w== + dependencies: + del "^6.0.0" + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" + +terminal-link@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +timers-browserify@2.0.12, timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tmp@0.2.1, tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + +trim-repeated@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" + integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= + dependencies: + escape-string-regexp "^1.0.2" + +ts-invariant@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.9.3.tgz#4b41e0a80c2530a56ce4b8fd4e14183aaac0efa8" + integrity sha512-HinBlTbFslQI0OHP07JLsSXPibSegec6r9ai5xxq/qHYCsIQbzpymLpDhAUsnXcSrDEcd0L62L8vsOEdzM0qlA== + dependencies: + tslib "^2.1.0" + +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + +tsconfig-paths@^3.11.0, tsconfig-paths@^3.9.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz#954c1fe973da6339c78e06b03ce2e48810b65f36" + integrity sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@^1.0.0, tslib@^1.8.1, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@~2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tty-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +type-fest@^0.8.0, type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@^1.6.18, type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typescript@4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" + integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== + +uid-safe@^2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" + integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== + dependencies: + random-bytes "~1.0.0" + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +undici@3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/undici/-/undici-3.3.6.tgz#06d3b97b7eeff46bce6f8a71079c09f64dd59dc1" + integrity sha512-/j3YTZ5AobMB4ZrTY72mzM54uFUX32v0R/JRW9G2vOyF1uSKYAx+WT8dMsAcRS13TOFISv094TxIyWYk+WEPsA== + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +urql@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/urql/-/urql-2.0.5.tgz#ab56bdc659fc0f4b3bc5b286359a354c74817bdb" + integrity sha512-UOl37CkNO1sfhw8jPihq+9NKUpTLnsRjpK7vmOVqPceqSO0rYXHOAEJp2TWDhyLjn2lYDlDlAfDaxNyK5m1FOA== + dependencies: + "@urql/core" "^2.3.2" + wonka "^4.0.14" + +use-callback-ref@^1.2.3, use-callback-ref@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.2.5.tgz#6115ed242cfbaed5915499c0a9842ca2912f38a5" + integrity sha512-gN3vgMISAgacF7sqsLPByqoePooY3n2emTH59Ur5d/M8eg4WTWu1xp8i8DHjohftIyEx0S08RiYxbffr4j8Peg== + +use-sidecar@^1.0.1, use-sidecar@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.0.5.tgz#ffff2a17c1df42e348624b699ba6e5c220527f2b" + integrity sha512-k9jnrjYNwN6xYLj1iaGhonDghfvmeTmYjAiGvOr7clwKfPjMXJf4/HOr7oT5tJwYafgp2tG2l3eZEOfoELiMcA== + dependencies: + detect-node-es "^1.1.0" + tslib "^1.9.3" + +use-subscription@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.5.1.tgz#73501107f02fad84c6dd57965beb0b75c68c42d1" + integrity sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA== + dependencies: + object-assign "^4.1.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= + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@0.12.4, util@^0.12.0: + version "0.12.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" + integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + safe-buffer "^5.1.2" + which-typed-array "^1.1.2" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@8.3.2, uuid@^8.0.0, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +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== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vm-browserify@1.1.2, vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +warning@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +watchpack@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.1.1.tgz#e99630550fca07df9f90a06056987baa40a689c7" + integrity sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" + integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.18.5" + foreach "^2.0.5" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.7" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wonka@^4.0.14: + version "4.0.15" + resolved "https://registry.yarnpkg.com/wonka/-/wonka-4.0.15.tgz#9aa42046efa424565ab8f8f451fcca955bf80b89" + integrity sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg== + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +xss@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.10.tgz#5cd63a9b147a755a14cb0455c7db8866120eb4d2" + integrity sha512-qmoqrRksmzqSKvgqzN0055UFWY7OKx1/9JWeRswwEVX9fCG5jcYRxa/A2DHcmZX6VJvjzHRQ2STeeVcQkrmLSw== + dependencies: + commander "^2.20.3" + cssfilter "0.0.10" + +xtend@^4.0.0, xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^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== + +yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zen-observable-ts@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz#2d1aa9d79b87058e9b75698b92791c1838551f83" + integrity sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA== + dependencies: + "@types/zen-observable" "0.8.3" + zen-observable "0.8.15" + +zen-observable@0.8.15: + version "0.8.15" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== + +zip-stream@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-3.0.1.tgz#cb8db9d324a76c09f9b76b31a12a48638b0b9708" + integrity sha512-r+JdDipt93ttDjsOVPU5zaq5bAyY+3H19bDrThkvuVxC0xMQzU1PJcS6D+KrP3u96gH9XLomcHPb+2skoDjulQ== + dependencies: + archiver-utils "^2.1.0" + compress-commons "^3.0.0" + readable-stream "^3.6.0" + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== From c488ba528f3618c8378d7f82c896a98ead410f83 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 9 Oct 2021 10:37:04 +0100 Subject: [PATCH 005/325] Lint config and tailwind purge --- tailwind.config.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tailwind.config.js b/tailwind.config.js index e75a1293..905e77a4 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,5 +1,16 @@ module.exports = { - purge: [], + purge: { + content: [ + './components/**/*.{js,ts,jsx,tsx}', + './pages/**/*.{js,ts,jsx,tsx}', + './schema/**/*.{js,ts,jsx,tsx}', + ], + options: { + safelist: { + standard: ['outline-none'] + } + } +}, darkMode: false, // or 'media' or 'class' theme: { screens: { From 6893b7e145d578abb18e3513b9ea61c6a7c945cb Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 9 Oct 2021 14:17:30 +0100 Subject: [PATCH 006/325] Security patch --- schema/access.ts | 21 ++++++++---- schema/users.ts | 87 +++++++++++++++++++++++++++++++----------------- 2 files changed, 71 insertions(+), 37 deletions(-) diff --git a/schema/access.ts b/schema/access.ts index 595cb58c..26a8a6ce 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -1,4 +1,4 @@ -type SessionContext = { +export type SessionContext = { session?: { data: { name: string; @@ -11,7 +11,9 @@ type SessionContext = { listKey: string; }; }; -type ItemContext = { item: any; } & SessionContext; + + +export type ItemContext = { item: any } & SessionContext; export const isSignedIn = ({ session }: SessionContext) => { return !!session; @@ -28,20 +30,25 @@ export const permissions = { export const rules = { canUseAdminUI: ({ session }: SessionContext) => { - return !!session?.data.role; + return !!session?.data?.role; }, canReadContentList: ({ session }: SessionContext) => { if (permissions.canManageContent({ session })) return true; - return { status: { equals: 'published' } }; + //return { status: 'published' }; + return false; }, canManageUser: ({ session, item }: ItemContext) => { if (permissions.canManageUsers({ session })) return true; if (session?.itemId === item.id) return true; return false; }, - canManageUserList: ({ session }: SessionContext) => { + operationCanManageUserList: ({ session }: ItemContext) => { if (permissions.canManageUsers({ session })) return true; - if (!isSignedIn({ session })) return false; - return { where: { id: { equals: session!.itemId } } }; + if (!isSignedIn({ session })) + return false; + return true; }, + filterCanManageUserList: { + canManageUsers: { equals: true } + } }; diff --git a/schema/users.ts b/schema/users.ts index 7188ceb4..6eeff870 100644 --- a/schema/users.ts +++ b/schema/users.ts @@ -5,10 +5,20 @@ import { text, virtual, } from '@keystone-next/keystone/fields'; -import { list, graphql } from '@keystone-next/keystone'; -import { permissions, rules } from './access'; +import {graphql} from '@keystone-next/keystone'; +import { list } from '@keystone-next/keystone'; + +import { permissions, rules, SessionContext} from './access'; import { GitHubRepo, githubReposResolver } from './fields/githubRepos/field'; +import { KeystoneContext} from '.keystone/types'; + +type SessionFrame = { + session: any, + context: SessionContext, + listKey: string, + operation: string +} const fieldModes = { editSelfOrRead: ({ session, item }: any) => @@ -24,23 +34,27 @@ const fieldModes = { export const User = list({ access: { operation: { - create: () => true, + create: ({ session, context, listKey, operation } : SessionFrame) => true, + query: ({ session, context, listKey, operation } : SessionFrame) => true, + update: ({ session, context, listKey, operation } : SessionFrame) => rules.operationCanManageUserList(session), + delete: ({ session, context, listKey, operation } : SessionFrame) => rules.operationCanManageUserList(session), }, filter: { - query: () => true, - update: rules.canManageUserList, - delete: rules.canManageUserList, + update: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList, + delete: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList } + }, + ui: { - hideCreate: context => !permissions.canManageUsers(context), - hideDelete: context => !permissions.canManageUsers(context), + hideCreate: (context: SessionContext) => !permissions.canManageUsers(context), + hideDelete: (context: SessionContext) => !permissions.canManageUsers(context), itemView: { - defaultFieldMode: context => + defaultFieldMode: (context: SessionContext) => permissions.canManageUsers(context) ? 'edit' : 'hidden', }, listView: { - defaultFieldMode: context => + defaultFieldMode: (context: SessionContext) => permissions.canManageUsers(context) ? 'read' : 'hidden', }, }, @@ -51,10 +65,8 @@ export const User = list({ }, }), email: text({ - isIndexed: 'unique', - validation: { - isRequired: true, - }, + isIndexed: 'unique', + isFilterable: true, access: { read: rules.canManageUser, }, @@ -63,9 +75,6 @@ export const User = list({ }, }), password: password({ - validation: { - isRequired: true, - }, ui: { itemView: { fieldMode: fieldModes.editSelfOrHidden }, }, @@ -75,6 +84,7 @@ export const User = list({ access: permissions.canManageUsers, }), githubUsername: text({ + isFilterable: true, label: 'GitHub Username', ui: { itemView: { fieldMode: fieldModes.editSelfOrRead }, @@ -90,11 +100,13 @@ export const User = list({ createView: { fieldMode: 'hidden' }, listView: { fieldMode: 'hidden' }, itemView: { fieldMode: 'read' }, - query: '{ name htmlUrl description homepage stargazersCount }', + query: + '{ name htmlUrl description homepage stargazersCount }' }, }), authoredPosts: relationship({ ref: 'Post.author', + isFilterable: true, many: true, ui: { createView: { fieldMode: 'hidden' }, @@ -102,6 +114,7 @@ export const User = list({ }), pollAnswers: relationship({ ref: 'PollAnswer.answeredByUsers', + isFilterable: true, many: true, access: permissions.canManageUsers, ui: { @@ -113,20 +126,34 @@ export const User = list({ }); export const Role = list({ - access: { - filter: { - delete: permissions.canManageUsers, - query: permissions.canManageUsers, - update: permissions.canManageUsers, + + + fields: { + name: text(), + canManageContent: checkbox({ defaultValue: false }), + canManageUsers: checkbox({ defaultValue: false }), + users: relationship({ ref: 'User.role', many: true }) + }, + + access: { + filter: { + query: ({ session, context, listKey, operation } : SessionFrame) => + { + return { canManageUsers: { equals: true } }; + }, + update: ({ session, context, listKey, operation } : SessionFrame) => + { + return { canManageUsers: { equals: true } }; + }, + delete: ({ session, context, listKey, operation } : SessionFrame) => + { + return { canManageUsers: { equals: true } }; + } } }, + //permissions.canManageUsers, ui: { - isHidden: context => !permissions.canManageUsers(context), - }, - fields: { - name: text(), - canManageContent: checkbox({ defaultValue: false }), - canManageUsers: checkbox({ defaultValue: false }), - users: relationship({ ref: 'User.role', many: true }), + isHidden: (context: SessionContext) => !permissions.canManageUsers(context), }, + }); From 3a9aab3eaba7694efad5bc55da305ad7c2794760 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 9 Oct 2021 15:45:19 +0100 Subject: [PATCH 007/325] Security: Session frame now fully typed --- schema/users.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/schema/users.ts b/schema/users.ts index 6eeff870..31a8aa45 100644 --- a/schema/users.ts +++ b/schema/users.ts @@ -9,12 +9,13 @@ import { import {graphql} from '@keystone-next/keystone'; import { list } from '@keystone-next/keystone'; -import { permissions, rules, SessionContext} from './access'; +import { permissions, rules, SessionContext, ItemContext} from './access'; import { GitHubRepo, githubReposResolver } from './fields/githubRepos/field'; -import { KeystoneContext} from '.keystone/types'; +import { KeystoneContext } from '.keystone/types' + type SessionFrame = { - session: any, + session: ItemContext, context: SessionContext, listKey: string, operation: string @@ -47,8 +48,8 @@ export const User = list({ }, ui: { - hideCreate: (context: SessionContext) => !permissions.canManageUsers(context), - hideDelete: (context: SessionContext) => !permissions.canManageUsers(context), + hideCreate: (session: SessionContext) => !permissions.canManageUsers(session), + hideDelete: (session: SessionContext) => !permissions.canManageUsers(session), itemView: { defaultFieldMode: (context: SessionContext) => permissions.canManageUsers(context) ? 'edit' : 'hidden', @@ -153,7 +154,7 @@ export const Role = list({ }, //permissions.canManageUsers, ui: { - isHidden: (context: SessionContext) => !permissions.canManageUsers(context), + isHidden: (session: SessionContext) => !permissions.canManageUsers(session), }, }); From a918b3c6dc2732b91e6760b61b5954463d4364f9 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 9 Oct 2021 17:41:16 +0100 Subject: [PATCH 008/325] Release 2720: -a --- schema/access.ts | 33 ++++++++++++++++++++++----------- schema/users.ts | 18 ++++++------------ 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/schema/access.ts b/schema/access.ts index 26a8a6ce..f261e223 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -13,8 +13,16 @@ export type SessionContext = { }; + + + export type ItemContext = { item: any } & SessionContext; +export type MiniSessionFrame = { + session: ItemContext, + context: SessionContext, +} + export const isSignedIn = ({ session }: SessionContext) => { return !!session; }; @@ -29,26 +37,29 @@ export const permissions = { }; export const rules = { - canUseAdminUI: ({ session }: SessionContext) => { + canUseAdminUI: ({ session }: SessionContext) : boolean => { return !!session?.data?.role; }, - canReadContentList: ({ session }: SessionContext) => { - if (permissions.canManageContent({ session })) return true; + canReadContentList: ({ session }: SessionContext) : boolean => { + //if (permissions.canManageContent({ session })) return true; //return { status: 'published' }; - return false; + return true; + }, + filterCanReadContentList: ({ session }: SessionContext) => { + return {OR: [{canManageContent: { equals: true }}, {status: {equals: 'published'}}]} }, - canManageUser: ({ session, item }: ItemContext) => { - if (permissions.canManageUsers({ session })) return true; + canManageUser: ( session : ItemContext, context : SessionContext ) : boolean => { + if (permissions.canManageUsers( session )) return true; if (session?.itemId === item.id) return true; return false; }, - operationCanManageUserList: ({ session }: ItemContext) => { - if (permissions.canManageUsers({ session })) return true; - if (!isSignedIn({ session })) + operationCanManageUserList: ({ session, context } : MiniSessionFrame) : boolean => { + if (permissions.canManageUsers( session )) return true; + if (!isSignedIn( session )) return false; return true; }, - filterCanManageUserList: { - canManageUsers: { equals: true } + filterCanManageUserList: ( session : ItemContext, context : SessionContext ) => { + return {OR: [{canManageUsers: { equals: true }}, {AND: [{id: {equals: context?.itemId}}, {id: {equals: context.itemId}}]}]} } }; diff --git a/schema/users.ts b/schema/users.ts index 31a8aa45..b579853c 100644 --- a/schema/users.ts +++ b/schema/users.ts @@ -41,8 +41,8 @@ export const User = list({ delete: ({ session, context, listKey, operation } : SessionFrame) => rules.operationCanManageUserList(session), }, filter: { - update: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList, - delete: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList + update: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList(session), + delete: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList(session) } }, @@ -138,18 +138,12 @@ export const Role = list({ access: { filter: { - query: ({ session, context, listKey, operation } : SessionFrame) => - { - return { canManageUsers: { equals: true } }; - }, + query: ({ session : ItemContext, context : sessionContext, listKey, operation } ) => + rules.filterCanManageUserList({session, context}), update: ({ session, context, listKey, operation } : SessionFrame) => - { - return { canManageUsers: { equals: true } }; - }, + rules.filterCanManageUserList({session, context}), delete: ({ session, context, listKey, operation } : SessionFrame) => - { - return { canManageUsers: { equals: true } }; - } + rules.filterCanManageUserList({session, context}), } }, //permissions.canManageUsers, From ef48eefd2d17707b5951e5290ffd732630805972 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 9 Oct 2021 18:48:01 +0100 Subject: [PATCH 009/325] Security patch for authentication. Pre heavy testing. Early tests suggest its behaving much better than previous versions --- schema/access.ts | 37 +++++++++++++++++-------------------- schema/content.ts | 5 ++++- schema/users.ts | 8 ++++---- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/schema/access.ts b/schema/access.ts index f261e223..87f58aaa 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -1,3 +1,7 @@ +import {KeystoneContext} from '.keystone/types' + +declare type MaybePromise = Promise | T; + export type SessionContext = { session?: { data: { @@ -14,15 +18,8 @@ export type SessionContext = { - - export type ItemContext = { item: any } & SessionContext; -export type MiniSessionFrame = { - session: ItemContext, - context: SessionContext, -} - export const isSignedIn = ({ session }: SessionContext) => { return !!session; }; @@ -37,29 +34,29 @@ export const permissions = { }; export const rules = { - canUseAdminUI: ({ session }: SessionContext) : boolean => { - return !!session?.data?.role; + canUseAdminUI: ({ session }: SessionContext) => { + return !!session?.data.role; }, - canReadContentList: ({ session }: SessionContext) : boolean => { - //if (permissions.canManageContent({ session })) return true; + canReadContentList: ({ session }: SessionContext) => { + if (!permissions.canManageContent({ session })) return false; //return { status: 'published' }; return true; }, filterCanReadContentList: ({ session }: SessionContext) => { return {OR: [{canManageContent: { equals: true }}, {status: {equals: 'published'}}]} }, - canManageUser: ( session : ItemContext, context : SessionContext ) : boolean => { - if (permissions.canManageUsers( session )) return true; - if (session?.itemId === item.id) return true; - return false; + canManageUser: ( { session, item }: ItemContext ) => { + if (!permissions.canManageUsers({ session })) return false; + if (session?.itemId !== item.id) return false; + return true; }, - operationCanManageUserList: ({ session, context } : MiniSessionFrame) : boolean => { - if (permissions.canManageUsers( session )) return true; - if (!isSignedIn( session )) + operationCanManageUserList: ({ session }: SessionContext) => { + if (!permissions.canManageUsers({ session })) return false; + if (!isSignedIn({ session })) return false; return true; }, - filterCanManageUserList: ( session : ItemContext, context : SessionContext ) => { - return {OR: [{canManageUsers: { equals: true }}, {AND: [{id: {equals: context?.itemId}}, {id: {equals: context.itemId}}]}]} + filterCanManageUserList: ({ session }: SessionContext) => { + return {where: {OR: [{canManageUsers: { equals: true }}, {id: { equals: session!.itemId }}]}} } }; diff --git a/schema/content.ts b/schema/content.ts index 3ae0ae65..2e3d5a85 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -54,9 +54,12 @@ function defaultTimestamp() { export const Post = list({ access: { + operation : { + query: rules.canReadContentList + }, filter: { ...contentListAccess.filter, - query: rules.canReadContentList, + query: rules.filterCanReadContentList, }, }, ui: contentUIConfig, diff --git a/schema/users.ts b/schema/users.ts index b579853c..0daa65be 100644 --- a/schema/users.ts +++ b/schema/users.ts @@ -138,12 +138,12 @@ export const Role = list({ access: { filter: { - query: ({ session : ItemContext, context : sessionContext, listKey, operation } ) => - rules.filterCanManageUserList({session, context}), + query: ({ session , context, listKey, operation } : SessionFrame) => + rules.filterCanManageUserList(session), update: ({ session, context, listKey, operation } : SessionFrame) => - rules.filterCanManageUserList({session, context}), + rules.filterCanManageUserList(session), delete: ({ session, context, listKey, operation } : SessionFrame) => - rules.filterCanManageUserList({session, context}), + rules.filterCanManageUserList(session), } }, //permissions.canManageUsers, From db38ae928d39290e373b808ed1587e2435871cde Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 9 Oct 2021 22:08:20 +0100 Subject: [PATCH 010/325] Added where clause, but filtering is not working as expected --- schema/access.ts | 4 +++- schema/content.ts | 4 +--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/schema/access.ts b/schema/access.ts index 87f58aaa..2fa4a5ea 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -38,12 +38,14 @@ export const rules = { return !!session?.data.role; }, canReadContentList: ({ session }: SessionContext) => { + console.log("rules.canReadContentList"); if (!permissions.canManageContent({ session })) return false; //return { status: 'published' }; return true; }, filterCanReadContentList: ({ session }: SessionContext) => { - return {OR: [{canManageContent: { equals: true }}, {status: {equals: 'published'}}]} + console.log("rules.filterCanReadContentList"); + return {where: false} }, canManageUser: ( { session, item }: ItemContext ) => { if (!permissions.canManageUsers({ session })) return false; diff --git a/schema/content.ts b/schema/content.ts index 2e3d5a85..11cb88f3 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -54,9 +54,7 @@ function defaultTimestamp() { export const Post = list({ access: { - operation : { - query: rules.canReadContentList - }, + filter: { ...contentListAccess.filter, query: rules.filterCanReadContentList, From 5b93588a09fe5477d8ff6c8e40cbc25785ff02b9 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sun, 10 Oct 2021 10:48:00 +0100 Subject: [PATCH 011/325] Broken admin UI login --- schema.graphql | 5 +++++ schema.prisma | 2 +- schema/access.ts | 26 ++++++++++++++++---------- schema/content.ts | 23 +++++++++++++---------- schema/users.ts | 28 ++++++++++------------------ 5 files changed, 45 insertions(+), 39 deletions(-) diff --git a/schema.graphql b/schema.graphql index 911e07d3..5500658d 100644 --- a/schema.graphql +++ b/schema.graphql @@ -539,12 +539,17 @@ input UserWhereInput { id: IDFilter name: StringFilter email: StringFilter + password: PasswordFilter role: RoleWhereInput githubUsername: StringFilter authoredPosts: PostManyRelationFilter pollAnswers: PollAnswerManyRelationFilter } +input PasswordFilter { + isSet: Boolean! +} + input UserOrderByInput { id: OrderDirection name: OrderDirection diff --git a/schema.prisma b/schema.prisma index 3be0f0b3..0a8a5e6a 100644 --- a/schema.prisma +++ b/schema.prisma @@ -53,7 +53,7 @@ model User { id String @id @default(cuid()) name String @default("") email String @unique @default("") - password String + password String? role Role? @relation("User_role", fields: [roleId], references: [id]) roleId String? @map("role") githubUsername String @default("") diff --git a/schema/access.ts b/schema/access.ts index 2fa4a5ea..bb9ede15 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -1,5 +1,5 @@ -import {KeystoneContext} from '.keystone/types' +import {KeystoneContext} from '.keystone/types' declare type MaybePromise = Promise | T; export type SessionContext = { @@ -16,7 +16,12 @@ export type SessionContext = { }; }; - +export type SessionFrame = { + session: ItemContext, + context: SessionContext, + listKey: string, + operation: string +} export type ItemContext = { item: any } & SessionContext; @@ -34,31 +39,32 @@ export const permissions = { }; export const rules = { - canUseAdminUI: ({ session }: SessionContext) => { - return !!session?.data.role; + canUseAdminUI: ( session: any ) => { + console.log("Typeof session: " + typeof(session)) + return !!session?.data.role as MaybePromise; }, canReadContentList: ({ session }: SessionContext) => { console.log("rules.canReadContentList"); if (!permissions.canManageContent({ session })) return false; - //return { status: 'published' }; + return true; }, filterCanReadContentList: ({ session }: SessionContext) => { console.log("rules.filterCanReadContentList"); - return {where: false} + return {where: {OR: [{canManageContent: { equals: true }}, {status: {equals: 'published'}}]}} }, - canManageUser: ( { session, item }: ItemContext ) => { + canManageUser: ( { item, session }: ItemContext ) => { if (!permissions.canManageUsers({ session })) return false; if (session?.itemId !== item.id) return false; return true; }, - operationCanManageUserList: ({ session }: SessionContext) => { + operationCanManageUserList: ({ session }: ItemContext) => { if (!permissions.canManageUsers({ session })) return false; if (!isSignedIn({ session })) return false; return true; }, - filterCanManageUserList: ({ session }: SessionContext) => { - return {where: {OR: [{canManageUsers: { equals: true }}, {id: { equals: session!.itemId }}]}} + filterCanManageUserList: () => { + return { where: {canManageUsers: { equals: true }}} } }; diff --git a/schema/content.ts b/schema/content.ts index 11cb88f3..e317617d 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -2,23 +2,23 @@ import { relationship, select, text, timestamp } from '@keystone-next/keystone/f import { document } from '@keystone-next/fields-document'; import { list } from '@keystone-next/keystone'; -import { permissions, rules } from './access'; +import { permissions, rules, SessionFrame, ItemContext } from './access'; import { componentBlocks } from '../schema/fields/content/components'; export const contentListAccess = { filter: { - create: permissions.canManageContent, - update: permissions.canManageContent, - delete: permissions.canManageContent, + create: ({ session, context, listKey, operation } : SessionFrame) => permissions.canManageContent(session), + update: ({ session, context, listKey, operation } : SessionFrame) => permissions.canManageContent(session), + delete: ({ session, context, listKey, operation } : SessionFrame) => permissions.canManageContent(session), } }; export const contentUIConfig = { - hideCreate: (context: any) => !permissions.canManageContent(context), - hideDelete: (context: any) => !permissions.canManageContent(context), + hideCreate: (session: any) => !permissions.canManageContent(session), + hideDelete: (session: any) => !permissions.canManageContent(session), itemView: { - defaultFieldMode: (context: any) => - permissions.canManageContent(context) ? 'edit' : 'read', + defaultFieldMode: (session: ItemContext) => + permissions.canManageContent(session) ? 'edit' : 'read', }, }; @@ -54,10 +54,13 @@ function defaultTimestamp() { export const Post = list({ access: { - + operation: { + query:({ session, context, listKey, operation } : SessionFrame) => rules.canReadContentList(context), + }, filter: { ...contentListAccess.filter, - query: rules.filterCanReadContentList, + + query:({ session, context, listKey, operation } : SessionFrame) => rules.filterCanReadContentList(session), }, }, ui: contentUIConfig, diff --git a/schema/users.ts b/schema/users.ts index 0daa65be..c84bc8cc 100644 --- a/schema/users.ts +++ b/schema/users.ts @@ -9,17 +9,12 @@ import { import {graphql} from '@keystone-next/keystone'; import { list } from '@keystone-next/keystone'; -import { permissions, rules, SessionContext, ItemContext} from './access'; +import { permissions, rules, SessionContext, SessionFrame, ItemContext} from './access'; import { GitHubRepo, githubReposResolver } from './fields/githubRepos/field'; -import { KeystoneContext } from '.keystone/types' -type SessionFrame = { - session: ItemContext, - context: SessionContext, - listKey: string, - operation: string -} + + const fieldModes = { editSelfOrRead: ({ session, item }: any) => @@ -41,8 +36,8 @@ export const User = list({ delete: ({ session, context, listKey, operation } : SessionFrame) => rules.operationCanManageUserList(session), }, filter: { - update: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList(session), - delete: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList(session) + update: rules.filterCanManageUserList, + delete: rules.filterCanManageUserList } }, @@ -69,7 +64,7 @@ export const User = list({ isIndexed: 'unique', isFilterable: true, access: { - read: rules.canManageUser, + read: ({ session, context, listKey, operation } : SessionFrame) => rules.canManageUser(session), }, ui: { itemView: { fieldMode: fieldModes.editSelfOrHidden }, @@ -138,17 +133,14 @@ export const Role = list({ access: { filter: { - query: ({ session , context, listKey, operation } : SessionFrame) => - rules.filterCanManageUserList(session), - update: ({ session, context, listKey, operation } : SessionFrame) => - rules.filterCanManageUserList(session), - delete: ({ session, context, listKey, operation } : SessionFrame) => - rules.filterCanManageUserList(session), + query: rules.filterCanManageUserList, + update: rules.filterCanManageUserList, + delete: rules.filterCanManageUserList, } }, //permissions.canManageUsers, ui: { - isHidden: (session: SessionContext) => !permissions.canManageUsers(session), + isHidden: (session) => !permissions.canManageUsers(session), }, }); From ffc408fa0c4df8ce0f94c3debbd4e567da3b72c5 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sun, 10 Oct 2021 11:36:07 +0100 Subject: [PATCH 012/325] Building and loging in --- schema/access.ts | 23 ++++++++++++----------- schema/users.ts | 12 ++++++------ 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/schema/access.ts b/schema/access.ts index bb9ede15..e8656539 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -31,15 +31,15 @@ export const isSignedIn = ({ session }: SessionContext) => { export const permissions = { canManageContent: ({ session }: SessionContext) => { - return !!session?.data.role?.canManageContent; + return !!session?.data?.role?.canManageContent; }, canManageUsers: ({ session }: SessionContext) => { - return !!session?.data.role?.canManageUsers; + return !!session?.data?.role?.canManageUsers; }, }; export const rules = { - canUseAdminUI: ( session: any ) => { + canUseAdminUI: ( { session }: SessionContext ) => { console.log("Typeof session: " + typeof(session)) return !!session?.data.role as MaybePromise; }, @@ -51,20 +51,21 @@ export const rules = { }, filterCanReadContentList: ({ session }: SessionContext) => { console.log("rules.filterCanReadContentList"); - return {where: {OR: [{canManageContent: { equals: true }}, {status: {equals: 'published'}}]}} + return {status: {equals: 'published'}} }, canManageUser: ( { item, session }: ItemContext ) => { if (!permissions.canManageUsers({ session })) return false; - if (session?.itemId !== item.id) return false; + if (session?.itemId !== item?.id) return false; return true; }, - operationCanManageUserList: ({ session }: ItemContext) => { - if (!permissions.canManageUsers({ session })) return false; + operationCanManageUserList: ({ item, session }: ItemContext) => { if (!isSignedIn({ session })) - return false; - return true; + return false; + if (permissions.canManageUsers({ session })) return true; + + return false; }, - filterCanManageUserList: () => { - return { where: {canManageUsers: { equals: true }}} + filterCanManageUserList: ({item,session}: ItemContext) => { + return {true: {equals: true}} } }; diff --git a/schema/users.ts b/schema/users.ts index c84bc8cc..d28b37ab 100644 --- a/schema/users.ts +++ b/schema/users.ts @@ -36,8 +36,8 @@ export const User = list({ delete: ({ session, context, listKey, operation } : SessionFrame) => rules.operationCanManageUserList(session), }, filter: { - update: rules.filterCanManageUserList, - delete: rules.filterCanManageUserList + update: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList(session), + delete: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList(session) } }, @@ -132,10 +132,10 @@ export const Role = list({ }, access: { - filter: { - query: rules.filterCanManageUserList, - update: rules.filterCanManageUserList, - delete: rules.filterCanManageUserList, + operation: { + query: ({ session, context, listKey, operation } : SessionFrame) => rules.operationCanManageUserList(session), + update: ({ session, context, listKey, operation } : SessionFrame) => rules.operationCanManageUserList(session), + delete: ({ session, context, listKey, operation } : SessionFrame) => rules.operationCanManageUserList(session), } }, //permissions.canManageUsers, From 32500155dda41366d1e318ec1437b49a12327de3 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sun, 10 Oct 2021 18:59:57 +0100 Subject: [PATCH 013/325] Auth/filter playing badly upstream. There are other known bugs in this repo, it's for reference purposes only until matter are resolved upstream --- schema/access.ts | 20 +++++++++++++++----- schema/content.ts | 17 +++++++++++------ schema/users.ts | 4 ++-- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/schema/access.ts b/schema/access.ts index e8656539..d9b89bad 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -43,22 +43,32 @@ export const rules = { console.log("Typeof session: " + typeof(session)) return !!session?.data.role as MaybePromise; }, - canReadContentList: ({ session }: SessionContext) => { + operationCanReadContentList: ({item}: ItemContext) => { + console.log("rules.operationCanReadContentList"); + if (!permissions.canManageContent(item)) return false; + + return true; + }, + filterCanReadContent: () => { + console.log("rules.filterCanReadContent"); + return {status: {equals: 'published'}} + }, + canReadContentList: ({item}: ItemContext) => { console.log("rules.canReadContentList"); - if (!permissions.canManageContent({ session })) return false; + if (!permissions.canManageContent(item)) return false; return true; }, - filterCanReadContentList: ({ session }: SessionContext) => { + filterCanReadContentList: ({ session }: SessionContext) => { console.log("rules.filterCanReadContentList"); - return {status: {equals: 'published'}} + return {true: {equals: true}} }, canManageUser: ( { item, session }: ItemContext ) => { if (!permissions.canManageUsers({ session })) return false; if (session?.itemId !== item?.id) return false; return true; }, - operationCanManageUserList: ({ item, session }: ItemContext) => { + operationCanManageUserList: ({ session }: SessionContext) => { if (!isSignedIn({ session })) return false; if (permissions.canManageUsers({ session })) return true; diff --git a/schema/content.ts b/schema/content.ts index e317617d..365bfeb7 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -55,14 +55,19 @@ function defaultTimestamp() { export const Post = list({ access: { operation: { - query:({ session, context, listKey, operation } : SessionFrame) => rules.canReadContentList(context), + create: ({ session, context, listKey, operation } : SessionFrame) => permissions.canManageContent(session), + update: ({ session, context, listKey, operation } : SessionFrame) => permissions.canManageContent(session), + delete: ({ session, context, listKey, operation } : SessionFrame) => permissions.canManageContent(session), + }, filter: { - ...contentListAccess.filter, - - query:({ session, context, listKey, operation } : SessionFrame) => rules.filterCanReadContentList(session), - }, - }, + query: ({ session, context, listKey, operation } : SessionFrame) => { + console.log("permissions?.canManageContent( session ) " + permissions?.canManageContent( session )) + if (!!permissions?.canManageContent( session ) ) + return {status: {in: ['published','draft','archive']}}; + return {status: {in: ['published']}} + } + }}, ui: contentUIConfig, fields: { title: text(), diff --git a/schema/users.ts b/schema/users.ts index d28b37ab..a5f3f8d0 100644 --- a/schema/users.ts +++ b/schema/users.ts @@ -36,8 +36,8 @@ export const User = list({ delete: ({ session, context, listKey, operation } : SessionFrame) => rules.operationCanManageUserList(session), }, filter: { - update: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList(session), - delete: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList(session) + //update: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList(session), + //delete: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList(session) } }, From 827e61da1902e34eb0fdde721c32e288252513ea Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Mon, 11 Oct 2021 16:42:48 +0100 Subject: [PATCH 014/325] Updated ks to 26.1.0. new branch --- package.json | 11 +- schema/access.ts | 27 ++- schema/content.ts | 34 ++- yarn.lock | 585 +++++++++++++++++++++------------------------- 4 files changed, 312 insertions(+), 345 deletions(-) diff --git a/package.json b/package.json index bcf319bd..65305306 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "1.0.0", "private": true, "scripts": { + "clean": "rm -rf node_modules yarn.lock .keystone .next", "postinstall": "keystone-next postinstall", "site:dev": "next dev -p 8000", "site:build": "next build", @@ -14,10 +15,12 @@ "format": "prettier --write \"**/*.ts\"" }, "dependencies": { - "@keystone-next/auth": "33.0.0", - "@keystone-next/document-renderer": "^4.0.0", - "@keystone-next/fields-document": "^10.0.0", - "@keystone-next/keystone": "^26.0.1", + "@keystone-next/auth": "34.0.0", + "@keystone-next/document-renderer": "^4.0.1", + "@keystone-next/fields-document": "^11.0.0", + "@keystone-next/keystone": "^26.1.0", + "@keystone-next/session-store-redis": "6.0.0", + "@prisma/client": "^3.2.1", "classnames": "^2.3.1", "graphql": "^15.6.1", "next": "^11.1.2", diff --git a/schema/access.ts b/schema/access.ts index d9b89bad..2f51a743 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -23,6 +23,13 @@ export type SessionFrame = { operation: string } +export const IsBuildEnvir = ({ session }: ItemContext) : boolean => +{ + if (session === undefined) + return false + return true +} + export type ItemContext = { item: any } & SessionContext; export const isSignedIn = ({ session }: SessionContext) => { @@ -43,7 +50,7 @@ export const rules = { console.log("Typeof session: " + typeof(session)) return !!session?.data.role as MaybePromise; }, - operationCanReadContentList: ({item}: ItemContext) => { + operationCanManageContentList: ({item}: ItemContext) => { console.log("rules.operationCanReadContentList"); if (!permissions.canManageContent(item)) return false; @@ -59,10 +66,7 @@ export const rules = { return true; }, - filterCanReadContentList: ({ session }: SessionContext) => { - console.log("rules.filterCanReadContentList"); - return {true: {equals: true}} - }, + canManageUser: ( { item, session }: ItemContext ) => { if (!permissions.canManageUsers({ session })) return false; if (session?.itemId !== item?.id) return false; @@ -76,6 +80,17 @@ export const rules = { return false; }, filterCanManageUserList: ({item,session}: ItemContext) => { - return {true: {equals: true}} + return {canManageUsers: {equals: true}} } }; + +export const OperationCanManageContentList = ({ session, context, listKey, operation } : SessionFrame) => + rules.operationCanManageContentList(session) +export const FilterCanManageContentList = ({ session, context, listKey, operation } : SessionFrame) => +({ session, context, listKey, operation } : SessionFrame) => { + + console.log("Computed canManageContent( session ) " + IsBuildEnvir(session) || !!permissions?.canManageContent( session ) ) + if (IsBuildEnvir(session) || !!permissions?.canManageContent( session ) ) + return {status: {in: ['published','draft','archive']}}; + return {status: {in: ['published']}} +} \ No newline at end of file diff --git a/schema/content.ts b/schema/content.ts index 365bfeb7..fb1d2380 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -2,16 +2,9 @@ import { relationship, select, text, timestamp } from '@keystone-next/keystone/f import { document } from '@keystone-next/fields-document'; import { list } from '@keystone-next/keystone'; -import { permissions, rules, SessionFrame, ItemContext } from './access'; +import { permissions, rules, SessionFrame, ItemContext, OperationCanManageContentList, FilterCanManageContentList } from './access'; import { componentBlocks } from '../schema/fields/content/components'; -export const contentListAccess = { - filter: { - create: ({ session, context, listKey, operation } : SessionFrame) => permissions.canManageContent(session), - update: ({ session, context, listKey, operation } : SessionFrame) => permissions.canManageContent(session), - delete: ({ session, context, listKey, operation } : SessionFrame) => permissions.canManageContent(session), - } -}; export const contentUIConfig = { hideCreate: (session: any) => !permissions.canManageContent(session), @@ -22,6 +15,16 @@ export const contentUIConfig = { }, }; +export const contentListAccess = +{ + operation: { + create: OperationCanManageContentList, + update: OperationCanManageContentList, + delete: OperationCanManageContentList + } +} + + export const Label = list({ access: contentListAccess, ui: contentUIConfig, @@ -52,21 +55,16 @@ function defaultTimestamp() { return new Date().toISOString(); } + export const Post = list({ access: { operation: { - create: ({ session, context, listKey, operation } : SessionFrame) => permissions.canManageContent(session), - update: ({ session, context, listKey, operation } : SessionFrame) => permissions.canManageContent(session), - delete: ({ session, context, listKey, operation } : SessionFrame) => permissions.canManageContent(session), - + create: OperationCanManageContentList, + update: OperationCanManageContentList, + delete: OperationCanManageContentList }, filter: { - query: ({ session, context, listKey, operation } : SessionFrame) => { - console.log("permissions?.canManageContent( session ) " + permissions?.canManageContent( session )) - if (!!permissions?.canManageContent( session ) ) - return {status: {in: ['published','draft','archive']}}; - return {status: {in: ['published']}} - } + query: FilterCanManageContentList }}, ui: contentUIConfig, fields: { diff --git a/yarn.lock b/yarn.lock index e002ced9..8079ed08 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -"@apollo/client@^3.1.3", "@apollo/client@^3.4.15": +"@apollo/client@^3.1.3", "@apollo/client@^3.4.16": version "3.4.16" resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.4.16.tgz#67090d5655aa843fa64d26f1913315e384a5fa0f" integrity sha512-iF4zEYwvebkri0BZQyv8zfavPfVEafsK0wkOofa6eC2yZu50J18uTutKtC174rjHZ2eyxZ8tV7NvAPKRT+OtZw== @@ -147,7 +147,7 @@ dependencies: "@babel/types" "^7.15.4" -"@babel/helper-module-transforms@^7.15.4", "@babel/helper-module-transforms@^7.15.8": +"@babel/helper-module-transforms@^7.15.8": version "7.15.8" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz#d8c0e75a87a52e374a8f25f855174786a09498b2" integrity sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg== @@ -225,7 +225,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.15.4", "@babel/parser@^7.15.8": +"@babel/parser@^7.15.4", "@babel/parser@^7.15.8": version "7.15.8" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== @@ -237,16 +237,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@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== - dependencies: - "@babel/helper-module-transforms" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.15.4" - babel-plugin-dynamic-import-node "^2.3.3" - "@babel/runtime-corejs3@^7.10.2": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz#403139af262b9a6e8f9ba04a6fdcebf8de692bf1" @@ -262,7 +252,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.3", "@babel/runtime@^7.15.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== @@ -301,7 +291,7 @@ "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" -"@babel/types@^7.0.0", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.3.0": +"@babel/types@^7.15.4", "@babel/types@^7.15.6": 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== @@ -348,7 +338,7 @@ "@emotion/weak-memoize" "^0.2.5" hoist-non-react-statics "^3.3.1" -"@emotion/serialize@^1.0.0", "@emotion/serialize@^1.0.2": +"@emotion/serialize@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.2.tgz#77cb21a0571c9f68eb66087754a65fa97bfcd965" integrity sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A== @@ -510,45 +500,45 @@ resolved "https://registry.yarnpkg.com/@josephg/resolvable/-/resolvable-1.0.1.tgz#69bc4db754d79e1a2f17a650d3466e038d94a5eb" integrity sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg== -"@keystone-next/auth@33.0.0": - version "33.0.0" - resolved "https://registry.yarnpkg.com/@keystone-next/auth/-/auth-33.0.0.tgz#d09a5e38ebd6f87b0a05747ec2e259cb9127ad1b" - integrity sha512-u/rTowJfihp80p0vI4bq6QbtWIV4w++o78iUsxTYVVoHE/7oof1ekA67cfsS1BBx/X2zddyLp+7X/vWGyZMppw== +"@keystone-next/auth@34.0.0": + version "34.0.0" + resolved "https://registry.yarnpkg.com/@keystone-next/auth/-/auth-34.0.0.tgz#06728888c269c1fa7487e7659f9a3b79fc6b3cc6" + integrity sha512-TPMAutYvVUrx14+/dOZLy+IKvtGtdor15s36tJaWKWe494ILH8PWoKv/82RFMFO0eBBzihJ3VVtzM7BiSL6Tog== dependencies: "@babel/runtime" "^7.15.4" "@graphql-tools/schema" "^8.2.0" - "@keystone-ui/button" "^5.0.1" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/fields" "^5.0.0" - "@keystone-ui/notice" "^4.1.0" + "@keystone-ui/button" "^5.0.2" + "@keystone-ui/core" "^3.2.1" + "@keystone-ui/fields" "^5.0.1" + "@keystone-ui/notice" "^4.1.1" cross-fetch "^3.1.4" fast-deep-equal "^3.1.3" - graphql "^15.6.0" + graphql "^15.6.1" -"@keystone-next/document-renderer@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@keystone-next/document-renderer/-/document-renderer-4.0.0.tgz#f34b18643743c23256535f57949ec843ef9d5dc9" - integrity sha512-0KrkpGE2XwhrL8iugW4tXL6/WjEmtBtIgm7NN7VUvSdIZN/AMuy57AeOdBMeiux1Z7RalNeF+JyaW5KoHukADQ== +"@keystone-next/document-renderer@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@keystone-next/document-renderer/-/document-renderer-4.0.1.tgz#d1ab67489028afe642b207d3b91213916693b19a" + integrity sha512-Q8gkAVJnvLlDeGZ7G5gKeaU86ns/csLt+Sa/AieWIRY4MBU7vrkh2Sfv320i7V/lI0yJr48KJrGLipmN/Ea0wQ== -"@keystone-next/fields-document@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@keystone-next/fields-document/-/fields-document-10.0.0.tgz#3541f9d47f39005951a0948ee714097adb64998d" - integrity sha512-19Q4CODYTBonNhhgll+Nz6x8RGcMn8rTwgA6j9qJZuQTRscBGU+gRMVZNotN8xUlT+gtNgA/7vi5pT6bAx82Rw== +"@keystone-next/fields-document@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@keystone-next/fields-document/-/fields-document-11.0.0.tgz#14f1f4b2b746492c59eca9626062e9107f57abdb" + integrity sha512-RzjBnHNDhKKs03vdl6N44ifYnLLB7cB0RjkN0Ufp33LM2ELSNgeFuXzAiGY+WsccIhFMQNOkfq0n1UuUfZ1TgQ== dependencies: "@babel/runtime" "^7.15.4" "@braintree/sanitize-url" "^5.0.2" "@emotion/weak-memoize" "^0.2.5" - "@keystone-ui/button" "^5.0.1" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/fields" "^5.0.0" - "@keystone-ui/icons" "^4.0.1" - "@keystone-ui/popover" "^4.0.4" - "@keystone-ui/tooltip" "^4.0.2" - "@types/react" "^17.0.24" + "@keystone-ui/button" "^5.0.2" + "@keystone-ui/core" "^3.2.1" + "@keystone-ui/fields" "^5.0.1" + "@keystone-ui/icons" "^4.0.2" + "@keystone-ui/popover" "^4.0.5" + "@keystone-ui/tooltip" "^4.0.3" + "@types/react" "^17.0.27" apollo-server-errors "^3.1.0" apply-ref "^1.0.0" fp-ts "^2.11.4" - graphql "^15.6.0" + graphql "^15.6.1" io-ts "^2.2.16" io-ts-excess "^1.0.1" is-hotkey "^0.2.0" @@ -565,40 +555,38 @@ slate-history "^0.60.4" slate-react "^0.60.4" -"@keystone-next/keystone@^26.0.1": - version "26.0.1" - resolved "https://registry.yarnpkg.com/@keystone-next/keystone/-/keystone-26.0.1.tgz#2cb51c1a23fe1fcd5c8f3b457181aca58d14a029" - integrity sha512-ypZkwzPmaj0b+P7Gkm2UAFj6qMi+qClbW1dgAYAxsL15J+e1boTN55VotKWVm1X3m9hThkomTrU66lgWKyrnrg== +"@keystone-next/keystone@^26.1.0": + version "26.1.0" + resolved "https://registry.yarnpkg.com/@keystone-next/keystone/-/keystone-26.1.0.tgz#d1a66303286ea496564566c761751720a1867e24" + integrity sha512-mdk0QH6L/68yLwbR0GH3UBJxnHQV1jKH9ruiS+pzbxNH+EOrhm+oPlOF/eq8bqTiSPUJp7xlh3YSHhk+3EgF0Q== dependencies: - "@apollo/client" "^3.4.15" + "@apollo/client" "^3.4.16" "@babel/core" "^7.15.5" - "@babel/plugin-transform-modules-commonjs" "^7.15.4" "@babel/runtime" "^7.15.4" "@emotion/hash" "^0.8.0" "@emotion/weak-memoize" "^0.2.5" "@graphql-tools/schema" "^8.2.0" "@graphql-ts/schema" "0.3.1" "@hapi/iron" "^6.0.0" - "@keystone-ui/button" "^5.0.1" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/fields" "^5.0.0" - "@keystone-ui/icons" "^4.0.1" - "@keystone-ui/loading" "^4.0.1" - "@keystone-ui/modals" "^4.0.1" - "@keystone-ui/notice" "^4.1.0" - "@keystone-ui/options" "^4.0.3" - "@keystone-ui/pill" "^5.0.1" - "@keystone-ui/popover" "^4.0.4" - "@keystone-ui/segmented-control" "^5.0.0" - "@keystone-ui/toast" "^4.0.3" - "@keystone-ui/tooltip" "^4.0.2" + "@keystone-ui/button" "^5.0.2" + "@keystone-ui/core" "^3.2.1" + "@keystone-ui/fields" "^5.0.1" + "@keystone-ui/icons" "^4.0.2" + "@keystone-ui/loading" "^4.0.2" + "@keystone-ui/modals" "^4.0.2" + "@keystone-ui/notice" "^4.1.1" + "@keystone-ui/options" "^4.0.4" + "@keystone-ui/pill" "^5.0.2" + "@keystone-ui/popover" "^4.0.5" + "@keystone-ui/segmented-control" "^5.0.1" + "@keystone-ui/toast" "^4.0.4" + "@keystone-ui/tooltip" "^4.0.3" "@preconstruct/next" "^3.0.0" - "@prisma/client" "3.1.1" - "@prisma/migrate" "3.1.1" - "@prisma/sdk" "3.1.1" + "@prisma/client" "3.2.0" + "@prisma/migrate" "3.2.0" + "@prisma/sdk" "3.2.0" "@sindresorhus/slugify" "^1.1.2" "@types/apollo-upload-client" "14.1.0" - "@types/babel__core" "^7.1.16" "@types/bcryptjs" "^2.4.2" "@types/cookie" "^0.4.1" "@types/express" "^4.17.13" @@ -610,7 +598,7 @@ "@types/pluralize" "^0.0.29" "@types/prettier" "^2.4.1" "@types/prompts" "^2.0.14" - "@types/react" "^17.0.24" + "@types/react" "^17.0.27" "@types/source-map-support" "^0.5.4" "@types/supertest" "^2.0.11" "@types/uid-safe" "^2.1.2" @@ -628,7 +616,7 @@ copy-to-clipboard "^3.3.1" cors "^2.8.5" cuid "^2.1.8" - date-fns "^2.24.0" + date-fns "^2.25.0" decimal.js "10.3.1" dumb-passwords "^0.2.1" execa "^5.1.1" @@ -638,7 +626,7 @@ filenamify "^4.3.0" form-data "4.0.0" fs-extra "^10.0.0" - graphql "^15.6.0" + graphql "^15.6.1" graphql-type-json "^0.3.2" graphql-upload "^12.0.0" image-size "^1.0.0" @@ -655,7 +643,7 @@ pirates "^4.0.1" pluralize "^8.0.0" prettier "^2.4.1" - prisma "3.1.1" + prisma "3.2.0" prompts "^2.4.1" react "^17.0.2" react-dom "^17.0.2" @@ -665,141 +653,149 @@ uid-safe "^2.1.5" uuid "^8.3.2" -"@keystone-ui/button@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@keystone-ui/button/-/button-5.0.1.tgz#0a8dec20f8a27abd8f941783ab0e9db0011dc5c3" - integrity sha512-+ScnOXpODywC083y+qkP/UaMgHT5aWakM+Pp1d8ynviGG7HimW7oUst2kTHVPqS2BpbI+ER7801QGO1Kx2lavw== +"@keystone-next/session-store-redis@6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@keystone-next/session-store-redis/-/session-store-redis-6.0.0.tgz#c5b41a9189dc01e424ddd471c4db98e395688d4f" + integrity sha512-Y5uNCY6iEEmDixPKc7NoZ84erqn2SPB4Nt2MO8KUThjzH4+uf7VaCoAXEtBslaCIfjkVw+LmNE9/yNQO7zHwTw== + dependencies: + "@babel/runtime" "^7.15.4" + "@types/redis" "^2.8.32" + +"@keystone-ui/button@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@keystone-ui/button/-/button-5.0.2.tgz#04efbb5330d0453b8f094dd6f3cd3f997be14f8d" + integrity sha512-WujbOCGiXZrIwR6HtSyMmqvJ7LHo/ed5nPFcNc3fgVTdiM0G/T1J7onln+xaxLj5JPvJX6kGUgEXH7Vzlnip6g== dependencies: - "@babel/runtime" "^7.15.3" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/icons" "^4.0.1" - "@keystone-ui/loading" "^4.0.1" + "@babel/runtime" "^7.15.4" + "@keystone-ui/core" "^3.2.1" + "@keystone-ui/icons" "^4.0.2" + "@keystone-ui/loading" "^4.0.2" react "^17.0.2" -"@keystone-ui/core@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@keystone-ui/core/-/core-3.2.0.tgz#9fe51b74865746d02f67b68c8fca7be9fb82b9fe" - integrity sha512-uoj19+bZowDV7yBJJzrbkylzsRJDqBdctEA0gd/pY9N5lEiB5vOWmj1MHv9isXHuRmZ0N5aloncZzwrq+EI1aw== +"@keystone-ui/core@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@keystone-ui/core/-/core-3.2.1.tgz#4d4268b7ae2de3ea22d9a1f67c75380c36c1233b" + integrity sha512-e7efKWyY60CnfLPfI3HgQjpYIMYa46TLztqkUBIVm+/qnGEhHQqgJtNh8FWyzSoPSm7ftSiLTKNhuTpeIKIjGQ== dependencies: - "@babel/runtime" "^7.15.3" + "@babel/runtime" "^7.15.4" "@emotion/react" "^11.4.1" "@types/facepaint" "^1.2.2" facepaint "^1.2.1" -"@keystone-ui/fields@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@keystone-ui/fields/-/fields-5.0.0.tgz#58c69a75c40c28a380b0a7412895ac63ec69c148" - integrity sha512-+mIsgfuKwejFnUNvqoQ+c2/69HSPtzeTNszRZXYXGmYFcDGhUsslQijJn/hq6HPldPsq2VnL/r9AP6/HBJkUWw== +"@keystone-ui/fields@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@keystone-ui/fields/-/fields-5.0.1.tgz#62a3796f913593708cce4d8b61e06b582fd359b0" + integrity sha512-LaWa/145MjCq996RcWN+u+MlXj6CPTRnLBBZxxUisjCE+tz+Nfw/ZnhGM2j1mRS+b8vicve3j/GseUXpg/paGw== dependencies: "@babel/runtime" "^7.15.4" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/icons" "^4.0.1" - "@keystone-ui/popover" "^4.0.4" - "@types/react-select" "^4.0.18" - date-fns "^2.24.0" + "@keystone-ui/core" "^3.2.1" + "@keystone-ui/icons" "^4.0.2" + "@keystone-ui/popover" "^4.0.5" + "@types/react-select" "^5.0.0" + date-fns "^2.25.0" react "^17.0.2" react-day-picker "npm:react-day-picker@^7.4.8" react-focus-lock "^2.5.2" - react-select "^5.0.0" + react-select "^5.1.0" -"@keystone-ui/icons@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@keystone-ui/icons/-/icons-4.0.1.tgz#ece7c6557cbc866cd69916bc743701d2aafa1b09" - integrity sha512-OzTk9rwB7AqyagtYeNleU/Lut6jVdekmh1FDb8RAAE+Qd+Lde0nfswYiwnNW0w+BsNA9WyTAG/4Ps11e3QJD0A== +"@keystone-ui/icons@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@keystone-ui/icons/-/icons-4.0.2.tgz#dae69849c88beec63c97443958a092d4448d1fac" + integrity sha512-bRa5Cv4iSi6Fd3d6ToqyI3wj8YhT4dXpyqtaX0Zkywde+UgyU20MzXViteK1vkzyV/69Wp8yoeIfcE3PZSzsFQ== dependencies: - "@babel/runtime" "^7.15.3" - "@keystone-ui/core" "^3.2.0" + "@babel/runtime" "^7.15.4" + "@keystone-ui/core" "^3.2.1" -"@keystone-ui/loading@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@keystone-ui/loading/-/loading-4.0.1.tgz#bf43102bfd63166d6835942dca67fe27af6ca68f" - integrity sha512-ruM2OYbUWpI/PrrM2fh5b/LwLJp7ULAT3Q5vJmXM5obvtTJJW3dwWPqqWqNc3iFn0VqjzN5KMb2xi9aG6cwPAg== +"@keystone-ui/loading@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@keystone-ui/loading/-/loading-4.0.2.tgz#af30201fe462faab77e9f9007fbbd54af1488714" + integrity sha512-9U1IqL2RL63NSZI9EqhOli6gapSqrlTAXgMolADYeyt9HR981BRVBUC+X6KlCeeYu4rmYkr6vhdCZSMeI70clA== dependencies: - "@babel/runtime" "^7.15.3" - "@keystone-ui/core" "^3.2.0" + "@babel/runtime" "^7.15.4" + "@keystone-ui/core" "^3.2.1" react "^17.0.2" -"@keystone-ui/modals@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@keystone-ui/modals/-/modals-4.0.1.tgz#4f42939e632cc4e49c3aef2b97beed4b68f9fbb5" - integrity sha512-nbRD9lZosU+KjRXZmI1A9QxjE3GZqeQpWgMqbu3RAsXqBMmPip9NdPSUbqQCAG4In9V31zvaLqCPxrj2x8McIQ== +"@keystone-ui/modals@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@keystone-ui/modals/-/modals-4.0.2.tgz#33145cafc8e228ffffdf586c354fcef033e7981b" + integrity sha512-WtEpz0/wg5VQH3pvBigmSkwWpPl1ThL9jmzWkU7qAmswevdVlixAGW/Ksu7ibS8jYWasndPohI2iyYHmweqR7w== dependencies: - "@babel/runtime" "^7.15.3" - "@keystone-ui/button" "^5.0.1" - "@keystone-ui/core" "^3.2.0" + "@babel/runtime" "^7.15.4" + "@keystone-ui/button" "^5.0.2" + "@keystone-ui/core" "^3.2.1" react "^17.0.2" react-focus-lock "^2.5.2" react-remove-scroll "^2.4.3" react-transition-group "^4.4.2" -"@keystone-ui/notice@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@keystone-ui/notice/-/notice-4.1.0.tgz#5a10b44bc5e62af6e15cc6a630aca66b1c8f5703" - integrity sha512-LqPXF4rJpbFoSW7nvu/ZTAlDjQuB0Y38ZNV6k4pQ9E5AP10YYewB+5oKLVtiMWsh8yMYD3qJ9otzo+wht0mHwQ== +"@keystone-ui/notice@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@keystone-ui/notice/-/notice-4.1.1.tgz#e2ec4c32ba3c6a2beaa04b52ef9c105a05aa842e" + integrity sha512-eluaip2eAuol4CXd49Ra+p9jz97Xs68U3rqndT24kBXms42EBig4nOIR4nzDy0TTZwAXsrbALelbXuSF2spc4A== dependencies: "@babel/runtime" "^7.15.4" - "@keystone-ui/button" "^5.0.1" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/icons" "^4.0.1" + "@keystone-ui/button" "^5.0.2" + "@keystone-ui/core" "^3.2.1" + "@keystone-ui/icons" "^4.0.2" react "^17.0.2" -"@keystone-ui/options@^4.0.3": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@keystone-ui/options/-/options-4.0.3.tgz#7e66c6ca388b1c6111c6a219fd2375b8bbeb181a" - integrity sha512-Nz8Uqoslksgqy6tcm9cAt2PzH2EmkCjxa4GBr1hAE4CgpZXUjXo+g6Y26NyjF/yUl+jU8KNkDuGHtzFVMopPuw== +"@keystone-ui/options@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@keystone-ui/options/-/options-4.0.4.tgz#64bc5415ca323baae92eea1ba22ae39871ce5bfa" + integrity sha512-JSpqPH5zQZ3l7je3PRO6c/rCiwwVEn3o659T0DIkOCcVh1tRp/xM4CvKV4qhlEi3xG/dAcszvpeCTY4mZSQyog== dependencies: "@babel/runtime" "^7.15.4" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/fields" "^5.0.0" - "@keystone-ui/icons" "^4.0.1" - "@types/react-select" "^4.0.18" - react-select "^5.0.0" + "@keystone-ui/core" "^3.2.1" + "@keystone-ui/fields" "^5.0.1" + "@keystone-ui/icons" "^4.0.2" + "@types/react-select" "^5.0.0" + react-select "^5.1.0" -"@keystone-ui/pill@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@keystone-ui/pill/-/pill-5.0.1.tgz#4ec20adb331114ce60d594730eb9681172906891" - integrity sha512-6rYEgfar9yPTo8cCN7Qkor9B59AOV2Vedkps1sGYtjrbEE3d5IotjNOX13x6KrPt/butTF7Qympz0wrhCrWmVA== +"@keystone-ui/pill@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@keystone-ui/pill/-/pill-5.0.2.tgz#21bc4657efb7b9b8b648e984a54630eddd0a4305" + integrity sha512-fgkGChqGXOk1mPg8Sody4yqwgN+3OlV9Zi889QywS0LEFpx/POj77psuZDxknq6b4u6FClNd8PyoQn4nzEnG4Q== dependencies: - "@babel/runtime" "^7.15.3" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/icons" "^4.0.1" + "@babel/runtime" "^7.15.4" + "@keystone-ui/core" "^3.2.1" + "@keystone-ui/icons" "^4.0.2" -"@keystone-ui/popover@^4.0.3", "@keystone-ui/popover@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@keystone-ui/popover/-/popover-4.0.4.tgz#73c7ec2e2a6f049d374412833a1e3b245829c4f2" - integrity sha512-3wTBjuVEqf6QDEXNSByS97ndmMu9UrrDLLr63N5oNTOHCZtl8FuYVBe3KrTpbm/ZnyyygTC7qXr5ncxpOJIdEw== +"@keystone-ui/popover@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@keystone-ui/popover/-/popover-4.0.5.tgz#ccb17f8db183cf9136a5b461cd31de5b8f1f6bb9" + integrity sha512-DtIXw6eUBy0JJLkuCti4q4c5iAppMiYwrRYdRLWPCpatDl6BlJAMPJyVN4GDrAbmIxiIkk1qwGFXjlfOfUYLCg== dependencies: "@babel/runtime" "^7.15.4" - "@keystone-ui/core" "^3.2.0" - "@popperjs/core" "^2.10.1" + "@keystone-ui/core" "^3.2.1" + "@popperjs/core" "^2.10.2" focus-trap "^6.7.1" react-popper "^2.2.5" -"@keystone-ui/segmented-control@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@keystone-ui/segmented-control/-/segmented-control-5.0.0.tgz#525108d8935f0cd52aa1fd93ceb7fd6aebc23129" - integrity sha512-RImgv2HrlALL5SpnksQ5XuLI1iCxwOq94wgCMvTvQTL8TcIvhDdyT2tXuChPRCilc2nSTIGAcESdh4etZXo2Ig== +"@keystone-ui/segmented-control@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@keystone-ui/segmented-control/-/segmented-control-5.0.1.tgz#6c279352e54ae10ede978f9aabc771b1b840a451" + integrity sha512-BJUj3BF0aTM1UEiSltzht+ut/sgWyjwcVmyi1pKGHppOdXy2DHaxmDMl/2CdwuauNTQ1dn+5HwxO5phplxzRWQ== dependencies: "@babel/runtime" "^7.15.4" - "@keystone-ui/core" "^3.2.0" + "@keystone-ui/core" "^3.2.1" -"@keystone-ui/toast@^4.0.3": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@keystone-ui/toast/-/toast-4.0.3.tgz#4989b0d57855174b644c3cfcc77e5b188ed2b708" - integrity sha512-W3swOk2JoQ652+cULErDT4BtFUPOvTUDaBovTVgEomwnTojDKNhdekZa9HjRMwasq2yUW518/oxcGwkd71AlNw== +"@keystone-ui/toast@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@keystone-ui/toast/-/toast-4.0.4.tgz#2c09936ec8735bbc6908457527aa8546092969e1" + integrity sha512-/CuF0TQzSxUY98ZkIv9X4LZvq8cQAY/hj13cCLNX3PCXd27EvA3413s/K9A67ouHHqtk/w2XjC6c4l5E2mZsZg== dependencies: - "@babel/runtime" "^7.15.3" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/icons" "^4.0.1" + "@babel/runtime" "^7.15.4" + "@keystone-ui/core" "^3.2.1" + "@keystone-ui/icons" "^4.0.2" -"@keystone-ui/tooltip@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@keystone-ui/tooltip/-/tooltip-4.0.2.tgz#32aa010af70f72334aadb8d6a28e67eaaf50b3b9" - integrity sha512-I4GMyIomFAB0S0AHYkr9UoS+Q2UF5zlVaxGKeTJ+5u9fUUhHfktIE/OgW/wpmGjNPeVPg0cWZiik2gfAsoQe0A== +"@keystone-ui/tooltip@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@keystone-ui/tooltip/-/tooltip-4.0.3.tgz#da6bf3e316b72134201534f890e3e8643a960bbf" + integrity sha512-gkjpFfMPcH9zYIRLtkY/F4KKoDvYEQV++kGAP5vsIzAHtrYMCBaZsyEAd9b+SPhDGGIIzeYEaxS5KwYwTfuUzw== dependencies: - "@babel/runtime" "^7.15.3" - "@keystone-ui/core" "^3.2.0" - "@keystone-ui/popover" "^4.0.3" + "@babel/runtime" "^7.15.4" + "@keystone-ui/core" "^3.2.1" + "@keystone-ui/popover" "^4.0.5" apply-ref "^1.0.0" "@napi-rs/triples@^1.0.3": @@ -894,7 +890,7 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@popperjs/core@^2.10.1": +"@popperjs/core@^2.10.2": version "2.10.2" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.10.2.tgz#0798c03351f0dea1a5a4cabddf26a55a7cbee590" integrity sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ== @@ -904,21 +900,19 @@ resolved "https://registry.yarnpkg.com/@preconstruct/next/-/next-3.0.0.tgz#71781cbaecd011f43e456a149817094a43e4755f" integrity sha512-G90cyJX9w4Zr3Bt/j2fURgDhsJb5+agqf4YUgrvDe3Dyvbbssy9a6d0tzLH0ehfa2Osxw/EEhQb+W4X+v/x06A== -"@prisma/client@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@prisma/client/-/client-3.1.1.tgz#f4012631528049c22d12b212846dcf503db33cfe" - integrity sha512-8ud8vVFMIg37yrkZ4wPpjKoMxFbCL0Pesq5eyLnag/s0LTKsVEN7ZBIQq9JzWW+AUqOzGKXr2Jt4Sl8xdGI99w== +"@prisma/client@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-3.2.0.tgz#6aa79b2945ca7553d5a4c14bbe0067d9f975e061" + integrity sha512-YCS/N3DZWoaKXhyS8dHwgUvT/NKXvlLbB5fsy0FvYC305JgNtMLjNbxsx0HjIcNw82MEhP7zWEXNvOLpOgGCUg== dependencies: - "@prisma/engines-version" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + "@prisma/engines-version" "3.2.0-34.afdab2f10860244038c4e32458134112852d4dad" -"@prisma/debug@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-3.0.2.tgz#a99ae8dfa075f4e58a25666d609deb900820c5be" - integrity sha512-D2/LghEqphW6h9ycT8nfdEw2rzT0LXmikBy2101aYcY28vS01rHTVIUOiz/DDaltlqY1qBat3F5vgM+6GwIqbw== +"@prisma/client@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-3.2.1.tgz#b0c60b4c42ec5b701a271380780c70de55bc3311" + integrity sha512-nakt9YoDFD4cgTkRTSVbzG40AKmmbVEtXE3csVqBdDXsm0/L4PQdtbtzILNzq28xv8HH8oHgFKWnsItM23mSDw== dependencies: - "@types/debug" "4.1.7" - debug "4.3.2" - ms "2.1.3" + "@prisma/engines-version" "3.2.1-1.b71d8cb16c4ddc7e3e9821f42fd09b0f82d7934c" "@prisma/debug@3.1.1": version "3.1.1" @@ -929,15 +923,24 @@ debug "4.3.2" ms "2.1.3" -"@prisma/engine-core@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@prisma/engine-core/-/engine-core-3.1.1.tgz#1e32b4089f47d4fd31e8591408fa93dfb299d451" - integrity sha512-zq34wWm797ILXCkYdpJjZqSBXizUffgX5WIsY1Su8RBArap9r9IoO2XMt412vADbBe9+LH86vJPBg92YEaf96g== +"@prisma/debug@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-3.2.0.tgz#aa7d8f2f588ac089d5e7b0f2b612056ddefc5251" + integrity sha512-QcGbt0f4qCeWYVWWk41F+bFnt6gqw8Wqr3vWZ/vAVjUI1MCFpIuzHUV4veIlriopA0kvFe0aQj5P+Ihg507Ijg== dependencies: - "@prisma/debug" "3.1.1" - "@prisma/engines" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - "@prisma/generator-helper" "3.1.1" - "@prisma/get-platform" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + "@types/debug" "4.1.7" + debug "4.3.2" + ms "2.1.3" + +"@prisma/engine-core@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@prisma/engine-core/-/engine-core-3.2.0.tgz#fb56094d68b7e8ac5462c785467009f4447d1ccb" + integrity sha512-9hycOUENZViktveYdxPVTPXpBspvzRLYBM1Llmk4aig1tWnZC57ZGxlUMk6uKX9iDwtNDNjYkssX5AqhYUi4kg== + dependencies: + "@prisma/debug" "3.2.0" + "@prisma/engines" "3.2.0-34.afdab2f10860244038c4e32458134112852d4dad" + "@prisma/generator-helper" "3.2.0" + "@prisma/get-platform" "3.2.0-34.afdab2f10860244038c4e32458134112852d4dad" chalk "4.1.2" execa "5.1.1" get-stream "6.0.1" @@ -947,28 +950,33 @@ terminal-link "2.1.1" undici "3.3.6" -"@prisma/engines-version@3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f": - version "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f.tgz#f9908eb7808f2a546634398063942eaecb2474ef" - integrity sha512-EuEMKLuwIcBO7uInZQHeG1yaywcfl32Tq8TDf5tgLvblk+ka70sej7S67lh3BV5gXMLTc3GdthSHPfDqZEK5uA== +"@prisma/engines-version@3.2.0-34.afdab2f10860244038c4e32458134112852d4dad": + version "3.2.0-34.afdab2f10860244038c4e32458134112852d4dad" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-3.2.0-34.afdab2f10860244038c4e32458134112852d4dad.tgz#bd63ad4bbc32935ec43e93cb59220495893c844d" + integrity sha512-zYzFOmFvk5YzShqm6DuK7ULtjbJQpebAeD3gcpPfPjx6Uf9pug3bxeswp8/3sk2KKVUeKPUQg5p3TZLskyBNjA== + +"@prisma/engines-version@3.2.1-1.b71d8cb16c4ddc7e3e9821f42fd09b0f82d7934c": + version "3.2.1-1.b71d8cb16c4ddc7e3e9821f42fd09b0f82d7934c" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-3.2.1-1.b71d8cb16c4ddc7e3e9821f42fd09b0f82d7934c.tgz#63032b40ee09f56ec423eb47617c26de125ffb1e" + integrity sha512-O4dHSbqfX7yAjFMawIEzv6wefv3LRMDK4J20Y70NvE3otbE3CnChlmghkCvMsQ1CGF1QuGlrqfw20aI2JfZcaw== -"@prisma/engines@3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f": - version "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f.tgz#7b45708e6a42523dc9bc2214e5c62781f608dc3a" - integrity sha512-6NEp0VlLho3hVtIvj2P4h0e19AYqQSXtFGts8gSIXDnV+l5pRFZaDMfGo2RiLMR0Kfrs8c3ZYxYX0sWmVL0tWw== +"@prisma/engines@3.2.0-34.afdab2f10860244038c4e32458134112852d4dad": + version "3.2.0-34.afdab2f10860244038c4e32458134112852d4dad" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-3.2.0-34.afdab2f10860244038c4e32458134112852d4dad.tgz#d8e6ceaddae105f0c882ac9113873f8f1e89d64a" + integrity sha512-MiZORXXsGORXTF9RqqKIlN/2ohkaxAWTsS7qxDJTy5ThTYLrXSmzxTSohM4qN/AI616B+o5WV7XTBhjlPKSufg== -"@prisma/fetch-engine@3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f": - version "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f.tgz#957143646d9a046361c45dc34ac3f3932b328192" - integrity sha512-ufywCOjqel/eNzR+yA4U7/RlbcztxFs0UfwbLRgqqNAaWR8hOk9TiTWyzgoxg+gh3nTEaBvh+GYt+n1YU98Wwg== +"@prisma/fetch-engine@3.2.0-34.afdab2f10860244038c4e32458134112852d4dad": + version "3.2.0-34.afdab2f10860244038c4e32458134112852d4dad" + resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-3.2.0-34.afdab2f10860244038c4e32458134112852d4dad.tgz#39bac395e8f9e48d8a639b309939a85182d22c06" + integrity sha512-D2gMiXNNAmzCVkV7TRKCHZajuO8O0GrzIUgly9W/u7I7E55pJXN42m3qi/aqC8/3oNKWypvTmLkDppApJ/IOkA== dependencies: - "@prisma/debug" "3.0.2" - "@prisma/get-platform" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + "@prisma/debug" "3.1.1" + "@prisma/get-platform" "3.2.0-34.afdab2f10860244038c4e32458134112852d4dad" chalk "^4.0.0" execa "^5.0.0" find-cache-dir "^3.3.1" hasha "^5.2.0" - http-proxy-agent "^4.0.1" + http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" make-dir "^3.0.2" node-fetch "^2.6.0" @@ -980,30 +988,30 @@ temp-dir "^2.0.0" tempy "^1.0.0" -"@prisma/generator-helper@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@prisma/generator-helper/-/generator-helper-3.1.1.tgz#d81c2945894d365b5d4dcd890487b8ca9a556a52" - integrity sha512-Jke+zZrUE0v1gqaQ4fyMDzDk9yj7W8qMtyyPJjFWyprQNf4zMTffLmYsIrYVCULYt6C47u2AwXbQGyESlSFgJw== +"@prisma/generator-helper@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@prisma/generator-helper/-/generator-helper-3.2.0.tgz#f2899f69db5932153d48ae2979b3227d06ed3db8" + integrity sha512-jjHmG8+AE4715QVLvkr41ZIfGS8vKBqcn8lu6qaIJvD/V+AEgq4R3FZB2w/q7Vz9tp0CsdUI81UE1EcC5QpSbw== dependencies: - "@prisma/debug" "3.1.1" + "@prisma/debug" "3.2.0" "@types/cross-spawn" "6.0.2" chalk "4.1.2" cross-spawn "7.0.3" -"@prisma/get-platform@3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f": - version "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f.tgz#d9499dc9af9032c92f773bb510aefbc7534e76d0" - integrity sha512-m5hsHxC7UmGbqDCEe6EFYDdSjZbxcY/r2Rp53sCy5U2Km6vMBzT/p5SYAH59An0p07WUbhB1R7x7Km11lkUA0w== +"@prisma/get-platform@3.2.0-34.afdab2f10860244038c4e32458134112852d4dad": + version "3.2.0-34.afdab2f10860244038c4e32458134112852d4dad" + resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-3.2.0-34.afdab2f10860244038c4e32458134112852d4dad.tgz#8a03634c4bb3129db7ef2c62f48e651a8a61b399" + integrity sha512-Vnr6BBi6DO5gll3mbqMohyqc6KtoHmlup07jExDjPqwoIIdJ5M56+UXHsoI7WjV6q+pgOiCrhM+Zz7ieutC9Dg== dependencies: - "@prisma/debug" "3.0.2" + "@prisma/debug" "3.1.1" -"@prisma/migrate@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@prisma/migrate/-/migrate-3.1.1.tgz#464930ce048cc449c7da733dd074d2b1a08ea3c9" - integrity sha512-eZfWfyEn3/NZjN0YKu2IHaOtXdVj5rF94WpSfJuawHwS7aNQ9kZM8XBi+9r8DfhguwXyIAJcOT9fKMOt/HP+ew== +"@prisma/migrate@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@prisma/migrate/-/migrate-3.2.0.tgz#ce1ba2d8507afd930ec63b25ae66ce905bc5b426" + integrity sha512-xkYLu3aPfwJPAQ1S6jTVG2+FJZsB6ud+dZiR/Iz/g1iBlkq8ycsTq59nuxew5mJTnXFlG5mda/mGyclSSFIfXg== dependencies: - "@prisma/debug" "3.1.1" - "@prisma/get-platform" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + "@prisma/debug" "3.2.0" + "@prisma/get-platform" "3.2.0-34.afdab2f10860244038c4e32458134112852d4dad" "@sindresorhus/slugify" "1.1.2" execa "5.1.1" global-dirs "3.0.0" @@ -1015,20 +1023,20 @@ pkg-up "3.1.0" prompts "2.4.1" resolve-pkg "2.0.0" - strip-ansi "6.0.0" + strip-ansi "6.0.1" strip-indent "3.0.0" -"@prisma/sdk@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@prisma/sdk/-/sdk-3.1.1.tgz#4795e1c44ce40e589a47558813fca5a81c05b0e6" - integrity sha512-rzQ4Gsvre6chTm3dV32lKdmvt7XQ3pitIXWvimZx66KhAzy3YSasjx+CmjsLhqIDT8ftT7mpOICJbCcY4HIrGA== - dependencies: - "@prisma/debug" "3.1.1" - "@prisma/engine-core" "3.1.1" - "@prisma/engines" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - "@prisma/fetch-engine" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - "@prisma/generator-helper" "3.1.1" - "@prisma/get-platform" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" +"@prisma/sdk@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@prisma/sdk/-/sdk-3.2.0.tgz#0237b0b4df3b8164fe983feb4a5c69f5c443bf28" + integrity sha512-FOsOiQKo0UhByu+WTGIcJfy3RYbxyRDxt1lV+I8rvzaZQsKMuD+ZBlZkONhQ7sgZAJKmT9BLYpHFF0S0EU4tBg== + dependencies: + "@prisma/debug" "3.2.0" + "@prisma/engine-core" "3.2.0" + "@prisma/engines" "3.2.0-34.afdab2f10860244038c4e32458134112852d4dad" + "@prisma/fetch-engine" "3.2.0-34.afdab2f10860244038c4e32458134112852d4dad" + "@prisma/generator-helper" "3.2.0" + "@prisma/get-platform" "3.2.0-34.afdab2f10860244038c4e32458134112852d4dad" "@timsuchanek/copy" "1.4.5" archiver "4.0.2" arg "5.0.1" @@ -1043,14 +1051,14 @@ has-yarn "2.1.0" is-ci "3.0.0" make-dir "3.1.0" - node-fetch "2.6.2" + node-fetch "2.6.5" p-map "4.0.0" read-pkg-up "7.0.1" resolve "1.20.0" rimraf "3.0.2" shell-quote "1.7.2" - string-width "4.2.2" - strip-ansi "6.0.0" + string-width "4.2.3" + strip-ansi "6.0.1" strip-indent "3.0.0" tar "6.1.11" temp-dir "2.0.0" @@ -1155,10 +1163,10 @@ resolved "https://registry.yarnpkg.com/@timsuchanek/sleep-promise/-/sleep-promise-8.0.1.tgz#81c0754b345138a519b51c2059771eb5f9b97818" integrity sha512-cxHYbrXfnCWsklydIHSw5GCMHUPqpJ/enxWSyVHNOgNe61sit/+aOXTTI+VOdWkvVaJsI2vsB9N4+YDNITawOQ== -"@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== +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== "@types/accepts@*", "@types/accepts@^1.3.5": version "1.3.5" @@ -1176,39 +1184,6 @@ "@types/extract-files" "*" graphql "^15.3.0" -"@types/babel__core@^7.1.16": - version "7.1.16" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702" - integrity sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" - integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" - integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== - dependencies: - "@babel/types" "^7.3.0" - "@types/bcryptjs@^2.4.2": version "2.4.2" resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.2.tgz#e3530eac9dd136bfdfb0e43df2c4c5ce1f77dfae" @@ -1481,31 +1456,21 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/react-dom@*": - version "17.0.9" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.9.tgz#441a981da9d7be117042e1a6fd3dac4b30f55add" - integrity sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg== - dependencies: - "@types/react" "*" - -"@types/react-select@^4.0.18": - version "4.0.18" - resolved "https://registry.yarnpkg.com/@types/react-select/-/react-select-4.0.18.tgz#f907f406411afa862217a9d86c54a301367a35c1" - integrity sha512-uCPRMPshd96BwHuT7oCrFduiv5d6km3VwmtW7rVl9g4XetS3VoJ9nZo540LiwtQgaFcW96POwaxQDZDAyYaepg== +"@types/react-select@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/react-select/-/react-select-5.0.1.tgz#04fc85edd34a72675a0ab56ad4c30428aab0e444" + integrity sha512-h5Im0AP0dr4AVeHtrcvQrLV+gmPa7SA0AGdxl2jOhtwiE6KgXBFSogWw8az32/nusE6AQHlCOHQWjP1S/+oMWA== dependencies: - "@emotion/serialize" "^1.0.0" - "@types/react" "*" - "@types/react-dom" "*" - "@types/react-transition-group" "*" + react-select "*" -"@types/react-transition-group@*", "@types/react-transition-group@^4.4.0": +"@types/react-transition-group@^4.4.0": version "4.4.3" resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.3.tgz#b0994da0a7023d67dbb4a8910a62112bc00d5688" integrity sha512-fUx5muOWSYP8Bw2BUQ9M9RK9+W1XBK/7FLJ8PTQpnpTEkn0ccyMffyEQvan4C3h53gHdx7KE5Qrxi/LnUGQtdg== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@17.0.27", "@types/react@^17.0.24": +"@types/react@*", "@types/react@17.0.27", "@types/react@^17.0.27": version "17.0.27" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.27.tgz#6498ed9b3ad117e818deb5525fa1946c09f2e0e6" integrity sha512-zgiJwtsggVGtr53MndV7jfiUESTqrbxOcBvwfe6KS/9bzaVPCTDieTWnFNecVNx6EAaapg5xsLLWFfHHR437AA== @@ -1514,6 +1479,13 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/redis@^2.8.32": + version "2.8.32" + resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.32.tgz#1d3430219afbee10f8cfa389dad2571a05ecfb11" + integrity sha512-7jkMKxcGq9p242exlbsVzuJb57KqHRhNl4dHoQu2Y5v9bCAbtIXXH0R3HleSQW4CTOqpHIYUW3t6tpUj4BVQ+w== + dependencies: + "@types/node" "*" + "@types/retry@^0.12.0": version "0.12.1" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" @@ -2068,13 +2040,6 @@ axobject-query@^2.2.0: resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -2810,7 +2775,7 @@ data-uri-to-buffer@3.0.1: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== -date-fns@^2.24.0: +date-fns@^2.25.0: version "2.25.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.25.0.tgz#8c5c8f1d958be3809a9a03f4b742eba894fc5680" integrity sha512-ovYRFnTrbGPD4nqaEqescPEv1mNwvt+UTqI3Ay9SzNtey9NZnYu6E2qCcBBgJ6/2VF1zGGygpyTDITqpQQ5e+w== @@ -3850,7 +3815,7 @@ graphql-upload@^12.0.0: isobject "^4.0.0" object-path "^0.11.5" -graphql@^15.3.0, graphql@^15.6.0, graphql@^15.6.1: +graphql@^15.3.0, graphql@^15.6.1: version "15.6.1" resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.6.1.tgz#9125bdf057553525da251e19e96dab3d3855ddfc" integrity sha512-3i5lu0z6dRvJ48QP9kFxBkJ7h4Kso7PS8eahyTFz5Jm6CvQfLtNIE8LX9N6JLnXTuwR+sIYnXzaWp6anOg0QQw== @@ -4020,12 +3985,12 @@ http-errors@^1.8.0: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== dependencies: - "@tootallnate/once" "1" + "@tootallnate/once" "2" agent-base "6" debug "4" @@ -5146,12 +5111,7 @@ node-fetch@2.6.1: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-fetch@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.2.tgz#986996818b73785e47b1965cc34eb093a1d464d0" - integrity sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA== - -node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.5: +node-fetch@2.6.5, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.5: version "2.6.5" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.5.tgz#42735537d7f080a7e5f78b6c549b7146be1742fd" integrity sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ== @@ -5274,7 +5234,7 @@ object-path@^0.11.5: resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.8.tgz#ed002c02bbdd0070b78a27455e8ae01fc14d4742" integrity sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA== -object.assign@^4.1.0, object.assign@^4.1.2: +object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== @@ -5727,12 +5687,12 @@ prettysize@^2.0.0: resolved "https://registry.yarnpkg.com/prettysize/-/prettysize-2.0.0.tgz#902c02480d865d9cc0813011c9feb4fa02ce6996" integrity sha512-VVtxR7sOh0VsG8o06Ttq5TrI1aiZKmC+ClSn4eBPaNf4SHr5lzbYW+kYGX3HocBL/MfpVrRfFZ9V3vCbLaiplg== -prisma@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/prisma/-/prisma-3.1.1.tgz#4c13c35dd3a58af9134008c8ed0fdc21a632802c" - integrity sha512-+eZtWIL6hnOKUOvqq9WLBzSw2d/EbTmOx1Td1LI8/0XE40ctXMLG2N1p6NK5/+yivGaoNJ9PDpPsPL9lO4nJrQ== +prisma@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-3.2.0.tgz#d4247114f1e4e4c67b9c70381c9aea4434882a38" + integrity sha512-o8+DH0RD5DbP8QTZej2dsY64yvjOwOG3TWOlJyoCHQ+8DH9m4tzxo38j6IF/PqpN4PmAGPpHuNi/nssG1cvYlQ== dependencies: - "@prisma/engines" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + "@prisma/engines" "3.2.0-34.afdab2f10860244038c4e32458134112852d4dad" process-nextick-args@~2.0.0: version "2.0.1" @@ -6005,7 +5965,7 @@ react-remove-scroll@^2.4.3: use-callback-ref "^1.2.3" use-sidecar "^1.0.1" -react-select@^5.0.0: +react-select@*, react-select@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.1.0.tgz#ac384c8e25ba6f03126026192b2bdad0f53fbf50" integrity sha512-SkEBD1AYsSXrIdNj5HBt7+Ehe+jxdiB448J0atJqR6lE3l/GcFlRf4JYB3NlHe/02jrW4AnIQLo1t0IqWrxXOw== @@ -6583,16 +6543,7 @@ string-hash@1.1.3: resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= -string-width@4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@4.2.3, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 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== @@ -6652,7 +6603,7 @@ strip-ansi@6.0.0: dependencies: ansi-regex "^5.0.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== From 2d35634ddfb2073cd3e7160ed3f3fc14c8b324d5 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Mon, 11 Oct 2021 19:54:47 +0100 Subject: [PATCH 015/325] Color working in safe mode --- package.json | 3 ++- schema/access.ts | 54 +++++++++++++++++++++++++++++++++++++---------- schema/content.ts | 2 +- yarn.lock | 5 +++++ 4 files changed, 51 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 65305306..41c4769f 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "clean": "rm -rf node_modules yarn.lock .keystone .next", - "postinstall": "keystone-next postinstall", + "postinstall": "keystone-next postinstall && yarn next telemetry disable", "site:dev": "next dev -p 8000", "site:build": "next build", "site:start": "next start -p 8000", @@ -22,6 +22,7 @@ "@keystone-next/session-store-redis": "6.0.0", "@prisma/client": "^3.2.1", "classnames": "^2.3.1", + "colors": "^1.4.0", "graphql": "^15.6.1", "next": "^11.1.2", "node-fetch": "^2.6.1", diff --git a/schema/access.ts b/schema/access.ts index 2f51a743..8fc469e8 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -1,5 +1,7 @@ - import {KeystoneContext} from '.keystone/types' + +const { withKeystone } = require("@keystone-next/keystone/next"); + declare type MaybePromise = Promise | T; export type SessionContext = { @@ -23,14 +25,43 @@ export type SessionFrame = { operation: string } -export const IsBuildEnvir = ({ session }: ItemContext) : boolean => +export type ItemContext = { item: any } & SessionContext; + +const unit = {} +const rmap_va = (...props: any) => (f: any) => { + props.forEach((element: any )=> { + f(element) + }); +} + +let colors = require('colors/safe'); + +const warn = (...obj: any) => + rmap_va(obj) + ((x : any) => + console.log(colors.yellow(x.toString()))) + + +const xwarn = (...obj: any) => unit + + +export const IsBuildEnvir = (frame: SessionFrame) : boolean => { - if (session === undefined) - return false - return true + if (frame.session === undefined) + { + let localWarn = (...msgs: any) => warn ("Access::IsBuildEnvir: Undefined session:",...msgs) + + + localWarn("authentication breach:", frame) + localWarn("Assuming next build event is an SSG or ISG event.") + localWarn("Blessing assumed next build authorisation breach permissisons for super user queries.") + //localWarn("withKeysone code", withKeystone) + return true + } + return false } -export type ItemContext = { item: any } & SessionContext; + export const isSignedIn = ({ session }: SessionContext) => { return !!session; @@ -86,11 +117,12 @@ export const rules = { export const OperationCanManageContentList = ({ session, context, listKey, operation } : SessionFrame) => rules.operationCanManageContentList(session) -export const FilterCanManageContentList = ({ session, context, listKey, operation } : SessionFrame) => -({ session, context, listKey, operation } : SessionFrame) => { - console.log("Computed canManageContent( session ) " + IsBuildEnvir(session) || !!permissions?.canManageContent( session ) ) - if (IsBuildEnvir(session) || !!permissions?.canManageContent( session ) ) - return {status: {in: ['published','draft','archive']}}; +export const EVERYTHING = {status: {in: ['published','draft','archive']}} + +export const FilterCanManageContentList = (frame: SessionFrame) => { + if (IsBuildEnvir(frame)) return EVERYTHING + if (!!permissions?.canManageContent( frame.session ) ) + return EVERYTHING return {status: {in: ['published']}} } \ No newline at end of file diff --git a/schema/content.ts b/schema/content.ts index fb1d2380..c76d272d 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -64,7 +64,7 @@ export const Post = list({ delete: OperationCanManageContentList }, filter: { - query: FilterCanManageContentList + query: (frame: SessionFrame) => FilterCanManageContentList(frame) }}, ui: contentUIConfig, fields: { diff --git a/yarn.lock b/yarn.lock index 8079ed08..a77452d7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2493,6 +2493,11 @@ colorette@^1.2.2: 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== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" From d982fd34094b8205fa7e3e8876fff088b27f9709 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 01:12:47 +0100 Subject: [PATCH 016/325] Deductive build state detection. Production build working for SSG and ISR. Admin UI Authz: WIP. --- schema/access.ts | 59 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/schema/access.ts b/schema/access.ts index 8fc469e8..ec9f42ef 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -1,6 +1,5 @@ import {KeystoneContext} from '.keystone/types' -const { withKeystone } = require("@keystone-next/keystone/next"); declare type MaybePromise = Promise | T; @@ -27,6 +26,7 @@ export type SessionFrame = { export type ItemContext = { item: any } & SessionContext; + const unit = {} const rmap_va = (...props: any) => (f: any) => { props.forEach((element: any )=> { @@ -36,25 +36,43 @@ const rmap_va = (...props: any) => (f: any) => { let colors = require('colors/safe'); + +const success = (...obj: any) => + rmap_va(obj) + ((x : any) => + console.log(colors.green(x.toString()))) + + const warn = (...obj: any) => rmap_va(obj) ((x : any) => console.log(colors.yellow(x.toString()))) +const report_security_incident = (...obj: any) => + rmap_va(obj) + ((x : any) => + console.log(colors.red(x.toString()))) const xwarn = (...obj: any) => unit -export const IsBuildEnvir = (frame: SessionFrame) : boolean => +export const isBuildEnvir = (frame: SessionFrame) : boolean => { if (frame.session === undefined) { - let localWarn = (...msgs: any) => warn ("Access::IsBuildEnvir: Undefined session:",...msgs) - - - localWarn("authentication breach:", frame) - localWarn("Assuming next build event is an SSG or ISG event.") - localWarn("Blessing assumed next build authorisation breach permissisons for super user queries.") + //const headers = frame.context.req?.headers; + //const host = headers ? headers['x-forwarded-host'] || headers['host'] : null; + //const url = headers?.referer ? new URL(headers.referer) : undefined; + + warn("access::isBuildEnvir: authentication breach:") + //warn( headers) + //warn(host) + //warn(url) + + warn("undefined frame.session") + warn("Assuming an SSG or ISG build event.") + warn("Blessing assumed next build authentication breach authorisation for super user queries.") + warn("") //localWarn("withKeysone code", withKeystone) return true } @@ -62,7 +80,6 @@ export const IsBuildEnvir = (frame: SessionFrame) : boolean => } - export const isSignedIn = ({ session }: SessionContext) => { return !!session; }; @@ -82,7 +99,8 @@ export const rules = { return !!session?.data.role as MaybePromise; }, operationCanManageContentList: ({item}: ItemContext) => { - console.log("rules.operationCanReadContentList"); + warn("rules.operationCanReadContentList"); + warn(item) if (!permissions.canManageContent(item)) return false; return true; @@ -115,14 +133,23 @@ export const rules = { } }; -export const OperationCanManageContentList = ({ session, context, listKey, operation } : SessionFrame) => +export const OperationCanManageContentList = ({ session } : SessionFrame) => rules.operationCanManageContentList(session) -export const EVERYTHING = {status: {in: ['published','draft','archive']}} +export const EVERY_POST_STATUS = {status: {in: ['published','draft','archive']}} +export const UNIT_POST_STATUS = {status: {in: []}} +export const PUBLISHED_POST_STATUS = {status: {in: ['published']}} export const FilterCanManageContentList = (frame: SessionFrame) => { - if (IsBuildEnvir(frame)) return EVERYTHING - if (!!permissions?.canManageContent( frame.session ) ) - return EVERYTHING - return {status: {in: ['published']}} + if (frame === undefined) + { + report_security_incident("Minor security breach: undefined frame: query downgraded to public.") + //Give no information away that they have been noticed + return PUBLISHED_POST_STATUS + + } + if (isBuildEnvir(frame) || !!permissions?.canManageContent( frame.session ) ) + return EVERY_POST_STATUS + + return PUBLISHED_POST_STATUS } \ No newline at end of file From 2eea13579c6b9da65289c77539b0b175770e9957 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 03:18:37 +0100 Subject: [PATCH 017/325] $m} --- .github/workflows/latest.yml | 49 +++++++++++++++++++++++ .gitignore | 2 + migrations/20211010080123_y/migration.sql | 2 + package.json | 3 ++ 4 files changed, 56 insertions(+) create mode 100644 .github/workflows/latest.yml create mode 100644 migrations/20211010080123_y/migration.sql diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml new file mode 100644 index 00000000..7ef814f6 --- /dev/null +++ b/.github/workflows/latest.yml @@ -0,0 +1,49 @@ +# This is a basic workflow to help you get started with Actions + +name: CI + +# Controls when the workflow will run +on: + # Triggers the workflow on push or pull request events but only for the main branch + push: + branches: [ latest ] + pull_request: + branches: [ latest ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + build: + # The type of runner that the job will run on + runs-on: fedora:latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + + # Runs a single command using the runners shell + - name: Run a one-line script + run: echo "Unit testing:" + + # Runs a set of commands using the runners shell + - name: Run a multi-line script + run: | + set -euo pipefail + appname="prisma_day_2021" + echo "Build unseeded production server: $appname" + dnf reset nodejs + dnf module install nodejs:14/development + dnf install postgresql yes + cd $GITHUB_WORKSPACE + DATABASE_URL="postgres://postgres:changeme@localhost/$appname" + yes | yarn + yarn dev & + sleep 3 + yarn site:build + echo "Build unseeded $appname:latest production succeded" + + # Deploy: diff --git a/.gitignore b/.gitignore index c458a73b..8355967b 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,5 @@ yarn-error.log* app.db migrations/migration_lock.toml + +!.github/* \ No newline at end of file diff --git a/migrations/20211010080123_y/migration.sql b/migrations/20211010080123_y/migration.sql new file mode 100644 index 00000000..0b600a78 --- /dev/null +++ b/migrations/20211010080123_y/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "User" ALTER COLUMN "password" DROP NOT NULL; diff --git a/package.json b/package.json index 41c4769f..78d92945 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,9 @@ "private": true, "scripts": { "clean": "rm -rf node_modules yarn.lock .keystone .next", + "add": "git add -u * ||:; git add * ||:", + "commit": "git commit -a -m \"$m\"}", + "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable", "site:dev": "next dev -p 8000", "site:build": "next build", From ce2d832848116acae142a9e82038b6120337af22 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 03:52:13 +0100 Subject: [PATCH 018/325] '$npm_config_m'} --- README.md | 9 +++++++++ package.json | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 10614e13..3ff8de41 100644 --- a/README.md +++ b/README.md @@ -63,3 +63,12 @@ utils.js ## License Copyright (c) 2021 Thinkmill Labs Pty Ltd. Licensed under the MIT License. + +Latest branch: + +CI: Github actions in testing. +Production build status: Deductive filtering correctly allows SSG and ISG. +Authorization: WIP. Strong typing keystone frame types. + + +Additions (c) 2021 Fourcube Ltd. Licensed under the MIT License. diff --git a/package.json b/package.json index 78d92945..37ba2f39 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "clean": "rm -rf node_modules yarn.lock .keystone .next", "add": "git add -u * ||:; git add * ||:", - "commit": "git commit -a -m \"$m\"}", + "commit": "git commit -a -m \"'$npm_config_m'\"}", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable", "site:dev": "next dev -p 8000", From 43bad278afbfa0e662d91476e29c8b85ef06e221 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 03:58:02 +0100 Subject: [PATCH 019/325] ${npm_config_m}} npm arg forwarding for npm run commit --m ... --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 37ba2f39..ea61aebe 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "clean": "rm -rf node_modules yarn.lock .keystone .next", "add": "git add -u * ||:; git add * ||:", - "commit": "git commit -a -m \"'$npm_config_m'\"}", + "commit": "git commit -a -m \"${npm_config_m}\"}", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable", "site:dev": "next dev -p 8000", From b1bb957a18f99289fe275af7463e9e951224179a Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 03:58:32 +0100 Subject: [PATCH 020/325] '${npm_config_m}'} npm arg forwarding for npm run commit --m ... --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ea61aebe..e0dd0f41 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "clean": "rm -rf node_modules yarn.lock .keystone .next", "add": "git add -u * ||:; git add * ||:", - "commit": "git commit -a -m \"${npm_config_m}\"}", + "commit": "git commit -a -m \"'${npm_config_m}'\"}", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable", "site:dev": "next dev -p 8000", From d889d886fd11a631dda06e781737b9f0b3b33312 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 04:19:43 +0100 Subject: [PATCH 021/325] process.env.mesg} --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e0dd0f41..131e046d 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,8 @@ "private": true, "scripts": { "clean": "rm -rf node_modules yarn.lock .keystone .next", - "add": "git add -u * ||:; git add * ||:", - "commit": "git commit -a -m \"'${npm_config_m}'\"}", + "gitadd": "git add -u * ||:; git add * ||:", + "commit": "git commit -a -m \"process.env.mesg\"}", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable", "site:dev": "next dev -p 8000", From ae586a61afb68634c53c0310215fc6a0058283c0 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 04:20:05 +0100 Subject: [PATCH 022/325] process.env.mesg --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 131e046d..2b2de50a 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "clean": "rm -rf node_modules yarn.lock .keystone .next", "gitadd": "git add -u * ||:; git add * ||:", - "commit": "git commit -a -m \"process.env.mesg\"}", + "commit": "git commit -a -m \"process.env.mesg\"", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable", "site:dev": "next dev -p 8000", From 729c56b5f9c33de52ab699093b6de7b1d7b27319 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 04:20:21 +0100 Subject: [PATCH 023/325] 'process.env.mesg' --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2b2de50a..e9663886 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "clean": "rm -rf node_modules yarn.lock .keystone .next", "gitadd": "git add -u * ||:; git add * ||:", - "commit": "git commit -a -m \"process.env.mesg\"", + "commit": "git commit -a -m \"'process.env.mesg'\"", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable", "site:dev": "next dev -p 8000", From eefe8f5e9aef468ab42e4feb4b317abb0e1af2c1 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 04:22:10 +0100 Subject: [PATCH 024/325] process.env.mesg --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e9663886..4d13dd3a 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "clean": "rm -rf node_modules yarn.lock .keystone .next", "gitadd": "git add -u * ||:; git add * ||:", - "commit": "git commit -a -m \"'process.env.mesg'\"", + "commit": "git commit -a -m 'process.env.mesg'\"", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable", "site:dev": "next dev -p 8000", From 1d3584e1ecdbe9101d1250fcdbd89e5f3fb9fe17 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 04:24:03 +0100 Subject: [PATCH 025/325] $mesg --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4d13dd3a..7fd04951 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "clean": "rm -rf node_modules yarn.lock .keystone .next", "gitadd": "git add -u * ||:; git add * ||:", - "commit": "git commit -a -m 'process.env.mesg'\"", + "commit": "git commit -a -m '$mesg'\"", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable", "site:dev": "next dev -p 8000", From fa03e38f5769cf4bdb55fed17833752349f857ae Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 04:24:19 +0100 Subject: [PATCH 026/325] $mesg --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7fd04951..2b275065 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "clean": "rm -rf node_modules yarn.lock .keystone .next", "gitadd": "git add -u * ||:; git add * ||:", - "commit": "git commit -a -m '$mesg'\"", + "commit": "git commit -a -m $mesg\"", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable", "site:dev": "next dev -p 8000", From bff166f355bdee5762c618f9e8cc4aa5234b77ad Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 04:24:34 +0100 Subject: [PATCH 027/325] $mesg --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2b275065..44a86989 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "clean": "rm -rf node_modules yarn.lock .keystone .next", "gitadd": "git add -u * ||:; git add * ||:", - "commit": "git commit -a -m $mesg\"", + "commit": "git commit -a -m $mesg", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable", "site:dev": "next dev -p 8000", From 128f1981116149b9b39248c948c09530a33aa2ee Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 04:25:07 +0100 Subject: [PATCH 028/325] $mesg --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 44a86989..6ebec630 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "clean": "rm -rf node_modules yarn.lock .keystone .next", "gitadd": "git add -u * ||:; git add * ||:", - "commit": "git commit -a -m $mesg", + "commit": "git commit -a -m ${mesg}", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable", "site:dev": "next dev -p 8000", From d724932afc6f19594fe0265db081beb6fea9cf94 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 04:37:13 +0100 Subject: [PATCH 029/325] $mesg --- package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package.json b/package.json index 6ebec630..b84b6ebc 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,10 @@ "version": "1.0.0", "private": true, "scripts": { + "test_args":"node echo", "clean": "rm -rf node_modules yarn.lock .keystone .next", "gitadd": "git add -u * ||:; git add * ||:", + "echo": "echo $*", "commit": "git commit -a -m ${mesg}", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable", From eccf4d9d86118cc0fe93eb640a2cb632603a44d1 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 04:38:02 +0100 Subject: [PATCH 030/325] $mesg --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b84b6ebc..eb5610a6 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "test_args":"node echo", "clean": "rm -rf node_modules yarn.lock .keystone .next", "gitadd": "git add -u * ||:; git add * ||:", - "echo": "echo $*", + "echo": "echo '$*'", "commit": "git commit -a -m ${mesg}", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable", From ee6fb24dcb268219739158492b8a1152edc0626d Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 04:40:19 +0100 Subject: [PATCH 031/325] yarn continuation commit --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index eb5610a6..e5b3e6e7 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,8 @@ "test_args":"node echo", "clean": "rm -rf node_modules yarn.lock .keystone .next", "gitadd": "git add -u * ||:; git add * ||:", - "echo": "echo '$*'", - "commit": "git commit -a -m ${mesg}", + "echo": "echo ", + "commit": "git commit -a -m ", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable", "site:dev": "next dev -p 8000", From 185b2a3a0a34310eeefd668d683f062452432c72 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 04:58:24 +0100 Subject: [PATCH 032/325] git add/commit --- package.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index e5b3e6e7..ccfd91e7 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,8 @@ "scripts": { "test_args":"node echo", "clean": "rm -rf node_modules yarn.lock .keystone .next", - "gitadd": "git add -u * ||:; git add * ||:", - "echo": "echo ", - "commit": "git commit -a -m ", + "gitadd": "git add -u * ||: && git add * ||:", + "commit": "yarn gitadd && git commit -a -m ", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable", "site:dev": "next dev -p 8000", From a6c41403144939bf798a62e1ea10dab3cb55daa5 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 05:33:50 +0100 Subject: [PATCH 033/325] Release notes (on front page.) --- README.md | 48 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3ff8de41..de46a08b 100644 --- a/README.md +++ b/README.md @@ -60,15 +60,53 @@ tailwind.config.js utils.js ``` -## License -Copyright (c) 2021 Thinkmill Labs Pty Ltd. Licensed under the MIT License. Latest branch: -CI: Github actions in testing. -Production build status: Deductive filtering correctly allows SSG and ISG. +CI: Github actions in testing. Unseeded build. +``` +yarn commit "message" ... adds files and commits. +yarn push ... (auto push to origin latest) +``` +Known Issues: + Authorization: WIP. Strong typing keystone frame types. +``` +yarn gitadd: +``` + Almost files are added, but latest.yaml didn't get auto added, even though !.github/ is in .gitignore + +Test code in access has to find a new home. + +Literal constants. + +How to code where: true/false in gql without touching keystone core code. + +Extend WhereInput to be WhereInput | true | false ... is yet to be tested as a patch to core. Can this work as a local patch? To be investigated ... + +Production build status: + +Deductive filtering correctly identifies browswer based localhost traffic in testing, allowing next build super user access to the keystone, allowing for S/ISG tunneling. + +Pre production testing release status: Use as a production server in the current state is considered risky. Authorization is incomplete, but is overly tight. Expect missing functionality. + +No proof exists that the correct firewalling of queries is correct, but it has passed preliminary security tests. Additional context information needs to be correctly decoded so the query firewall has the KeystoneContext correct. + +Additional functionality from upstream main: +Polls fully working. +Production build: + next lint + tailwind purge + telemetry disable + CI scripts: WIP + + +All testing/patches/security audits are welcome. Feel free to contribute to documenting the industry best practises for using keyst<3ne CMS. + +## License + +Copyright (c) 2021 Thinkmill Labs Pty Ltd. Licensed under the MIT License. -Additions (c) 2021 Fourcube Ltd. Licensed under the MIT License. +Modifications: Copyright (c) 2021 Fourcube Ltd. Licensed under the MIT License. From e231ab13803f29302feccea2709953f9ce25f9df Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 05:38:02 +0100 Subject: [PATCH 034/325] Release notes (on front page.)2 --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index de46a08b..f5a48132 100644 --- a/README.md +++ b/README.md @@ -87,23 +87,25 @@ How to code where: true/false in gql without touching keystone core code. Extend WhereInput to be WhereInput | true | false ... is yet to be tested as a patch to core. Can this work as a local patch? To be investigated ... Production build status: - +``` Deductive filtering correctly identifies browswer based localhost traffic in testing, allowing next build super user access to the keystone, allowing for S/ISG tunneling. Pre production testing release status: Use as a production server in the current state is considered risky. Authorization is incomplete, but is overly tight. Expect missing functionality. No proof exists that the correct firewalling of queries is correct, but it has passed preliminary security tests. Additional context information needs to be correctly decoded so the query firewall has the KeystoneContext correct. +``` Additional functionality from upstream main: +``` Polls fully working. Production build: next lint tailwind purge telemetry disable CI scripts: WIP +``` - -All testing/patches/security audits are welcome. Feel free to contribute to documenting the industry best practises for using keyst<3ne CMS. +All testing/patches/security audits are welcome. Feel free to contribute to documenting the industry best practises for using keystone CMS. ## License From 267afaad268b92e5df3012bea144a563fe5a69b9 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 05:40:07 +0100 Subject: [PATCH 035/325] Prettier commit --- keystone.ts | 104 +++++----- next-env.d.ts | 12 +- package.json | 2 +- schema.ts | 26 +-- schema/access.ts | 301 ++++++++++++++--------------- schema/content.ts | 289 ++++++++++++++------------- schema/fields/githubRepos/field.ts | 180 ++++++++--------- schema/mutations.ts | 115 ++++++----- schema/polls.ts | 202 +++++++++---------- schema/users.ts | 297 ++++++++++++++-------------- 10 files changed, 771 insertions(+), 757 deletions(-) diff --git a/keystone.ts b/keystone.ts index 5963d12c..c9627282 100644 --- a/keystone.ts +++ b/keystone.ts @@ -1,52 +1,52 @@ -import { config } from '@keystone-next/keystone'; -import { statelessSessions } from '@keystone-next/keystone/session'; -import { createAuth } from '@keystone-next/auth'; - -import { lists, extendGraphqlSchema } from './schema'; -import { rules } from './schema/access'; - -const dbUrl = - process.env.DATABASE_URL || - `postgres://${process.env.USER}@localhost/prisma-day-workshop`; - -const sessionSecret = - process.env.SESSION_SECERT || - 'iLqbHhm7qwiBNc8KgL4NQ8tD8fFVhNhNqZ2nRdprgnKNjgJHgvitWx6DPoZJpYHa'; - -const auth = createAuth({ - identityField: 'email', - secretField: 'password', - listKey: 'User', - sessionData: `id name role { - canManageContent - canManageUsers - }`, - initFirstItem: { - fields: ['name', 'email', 'password'], - itemData: { - role: { - create: { - name: 'Super User', - canManageContent: true, - canManageUsers: true, - }, - }, - }, - }, -}); - -export default auth.withAuth( - config({ - db: { - url: dbUrl, - provider: 'postgresql', - useMigrations: true, - }, - ui: { isAccessAllowed: rules.canUseAdminUI }, - lists, - session: statelessSessions({ - secret: sessionSecret, - }), - extendGraphqlSchema, - }) -); +import { config } from '@keystone-next/keystone'; +import { statelessSessions } from '@keystone-next/keystone/session'; +import { createAuth } from '@keystone-next/auth'; + +import { lists, extendGraphqlSchema } from './schema'; +import { rules } from './schema/access'; + +const dbUrl = + process.env.DATABASE_URL || + `postgres://${process.env.USER}@localhost/prisma-day-workshop`; + +const sessionSecret = + process.env.SESSION_SECERT || + 'iLqbHhm7qwiBNc8KgL4NQ8tD8fFVhNhNqZ2nRdprgnKNjgJHgvitWx6DPoZJpYHa'; + +const auth = createAuth({ + identityField: 'email', + secretField: 'password', + listKey: 'User', + sessionData: `id name role { + canManageContent + canManageUsers + }`, + initFirstItem: { + fields: ['name', 'email', 'password'], + itemData: { + role: { + create: { + name: 'Super User', + canManageContent: true, + canManageUsers: true, + }, + }, + }, + }, +}); + +export default auth.withAuth( + config({ + db: { + url: dbUrl, + provider: 'postgresql', + useMigrations: true, + }, + ui: { isAccessAllowed: rules.canUseAdminUI }, + lists, + session: statelessSessions({ + secret: sessionSecret, + }), + extendGraphqlSchema, + }) +); diff --git a/next-env.d.ts b/next-env.d.ts index 534a39ea..9bc3dd46 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,6 +1,6 @@ -/// -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +/// +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/package.json b/package.json index ccfd91e7..86f3af68 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "test_args":"node echo", "clean": "rm -rf node_modules yarn.lock .keystone .next", - "gitadd": "git add -u * ||: && git add * ||:", + "gitadd": "yarn format && git add -u * ||: && git add * ||:", "commit": "yarn gitadd && git commit -a -m ", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable", diff --git a/schema.ts b/schema.ts index 07667ed5..502f4a81 100644 --- a/schema.ts +++ b/schema.ts @@ -1,13 +1,13 @@ -import { Poll, PollAnswer } from './schema/polls'; -import { User, Role } from './schema/users'; -import { Post, Label } from './schema/content'; -export { extendGraphqlSchema } from './schema/mutations'; - -export const lists = { - Post, - Label, - Poll, - PollAnswer, - User, - Role, -}; +import { Poll, PollAnswer } from './schema/polls'; +import { User, Role } from './schema/users'; +import { Post, Label } from './schema/content'; +export { extendGraphqlSchema } from './schema/mutations'; + +export const lists = { + Post, + Label, + Poll, + PollAnswer, + User, + Role, +}; diff --git a/schema/access.ts b/schema/access.ts index ec9f42ef..d6b84372 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -1,155 +1,146 @@ -import {KeystoneContext} from '.keystone/types' - - -declare type MaybePromise = Promise | T; - -export type SessionContext = { - session?: { - data: { - name: string; - role: { - canManageContent: boolean; - canManageUsers: boolean; - }; - }; - itemId: string; - listKey: string; - }; -}; - -export type SessionFrame = { - session: ItemContext, - context: SessionContext, - listKey: string, - operation: string -} - -export type ItemContext = { item: any } & SessionContext; - - -const unit = {} -const rmap_va = (...props: any) => (f: any) => { - props.forEach((element: any )=> { - f(element) - }); -} - -let colors = require('colors/safe'); - - -const success = (...obj: any) => - rmap_va(obj) - ((x : any) => - console.log(colors.green(x.toString()))) - - -const warn = (...obj: any) => - rmap_va(obj) - ((x : any) => - console.log(colors.yellow(x.toString()))) - -const report_security_incident = (...obj: any) => - rmap_va(obj) - ((x : any) => - console.log(colors.red(x.toString()))) - -const xwarn = (...obj: any) => unit - - -export const isBuildEnvir = (frame: SessionFrame) : boolean => -{ - if (frame.session === undefined) - { - //const headers = frame.context.req?.headers; - //const host = headers ? headers['x-forwarded-host'] || headers['host'] : null; - //const url = headers?.referer ? new URL(headers.referer) : undefined; - - warn("access::isBuildEnvir: authentication breach:") - //warn( headers) - //warn(host) - //warn(url) - - warn("undefined frame.session") - warn("Assuming an SSG or ISG build event.") - warn("Blessing assumed next build authentication breach authorisation for super user queries.") - warn("") - //localWarn("withKeysone code", withKeystone) - return true - } - return false -} - - -export const isSignedIn = ({ session }: SessionContext) => { - return !!session; -}; - -export const permissions = { - canManageContent: ({ session }: SessionContext) => { - return !!session?.data?.role?.canManageContent; - }, - canManageUsers: ({ session }: SessionContext) => { - return !!session?.data?.role?.canManageUsers; - }, -}; - -export const rules = { - canUseAdminUI: ( { session }: SessionContext ) => { - console.log("Typeof session: " + typeof(session)) - return !!session?.data.role as MaybePromise; - }, - operationCanManageContentList: ({item}: ItemContext) => { - warn("rules.operationCanReadContentList"); - warn(item) - if (!permissions.canManageContent(item)) return false; - - return true; - }, - filterCanReadContent: () => { - console.log("rules.filterCanReadContent"); - return {status: {equals: 'published'}} - }, - canReadContentList: ({item}: ItemContext) => { - console.log("rules.canReadContentList"); - if (!permissions.canManageContent(item)) return false; - - return true; - }, - - canManageUser: ( { item, session }: ItemContext ) => { - if (!permissions.canManageUsers({ session })) return false; - if (session?.itemId !== item?.id) return false; - return true; - }, - operationCanManageUserList: ({ session }: SessionContext) => { - if (!isSignedIn({ session })) - return false; - if (permissions.canManageUsers({ session })) return true; - - return false; - }, - filterCanManageUserList: ({item,session}: ItemContext) => { - return {canManageUsers: {equals: true}} - } -}; - -export const OperationCanManageContentList = ({ session } : SessionFrame) => - rules.operationCanManageContentList(session) - -export const EVERY_POST_STATUS = {status: {in: ['published','draft','archive']}} -export const UNIT_POST_STATUS = {status: {in: []}} -export const PUBLISHED_POST_STATUS = {status: {in: ['published']}} - -export const FilterCanManageContentList = (frame: SessionFrame) => { - if (frame === undefined) - { - report_security_incident("Minor security breach: undefined frame: query downgraded to public.") - //Give no information away that they have been noticed - return PUBLISHED_POST_STATUS - - } - if (isBuildEnvir(frame) || !!permissions?.canManageContent( frame.session ) ) - return EVERY_POST_STATUS - - return PUBLISHED_POST_STATUS -} \ No newline at end of file +import { KeystoneContext } from '.keystone/types'; + +declare type MaybePromise = Promise | T; + +export type SessionContext = { + session?: { + data: { + name: string; + role: { + canManageContent: boolean; + canManageUsers: boolean; + }; + }; + itemId: string; + listKey: string; + }; +}; + +export type SessionFrame = { + session: ItemContext; + context: SessionContext; + listKey: string; + operation: string; +}; + +export type ItemContext = { item: any } & SessionContext; + +const unit = {}; +const rmap_va = + (...props: any) => + (f: any) => { + props.forEach((element: any) => { + f(element); + }); + }; + +let colors = require('colors/safe'); + +const success = (...obj: any) => + rmap_va(obj)((x: any) => console.log(colors.green(x.toString()))); + +const warn = (...obj: any) => + rmap_va(obj)((x: any) => console.log(colors.yellow(x.toString()))); + +const report_security_incident = (...obj: any) => + rmap_va(obj)((x: any) => console.log(colors.red(x.toString()))); + +const xwarn = (...obj: any) => unit; + +export const isBuildEnvir = (frame: SessionFrame): boolean => { + if (frame.session === undefined) { + //const headers = frame.context.req?.headers; + //const host = headers ? headers['x-forwarded-host'] || headers['host'] : null; + //const url = headers?.referer ? new URL(headers.referer) : undefined; + + warn('access::isBuildEnvir: authentication breach:'); + //warn( headers) + //warn(host) + //warn(url) + + warn('undefined frame.session'); + warn('Assuming an SSG or ISG build event.'); + warn( + 'Blessing assumed next build authentication breach authorisation for super user queries.' + ); + warn(''); + //localWarn("withKeysone code", withKeystone) + return true; + } + return false; +}; + +export const isSignedIn = ({ session }: SessionContext) => { + return !!session; +}; + +export const permissions = { + canManageContent: ({ session }: SessionContext) => { + return !!session?.data?.role?.canManageContent; + }, + canManageUsers: ({ session }: SessionContext) => { + return !!session?.data?.role?.canManageUsers; + }, +}; + +export const rules = { + canUseAdminUI: ({ session }: SessionContext) => { + console.log('Typeof session: ' + typeof session); + return !!session?.data.role as MaybePromise; + }, + operationCanManageContentList: ({ item }: ItemContext) => { + warn('rules.operationCanReadContentList'); + warn(item); + if (!permissions.canManageContent(item)) return false; + + return true; + }, + filterCanReadContent: () => { + console.log('rules.filterCanReadContent'); + return { status: { equals: 'published' } }; + }, + canReadContentList: ({ item }: ItemContext) => { + console.log('rules.canReadContentList'); + if (!permissions.canManageContent(item)) return false; + + return true; + }, + + canManageUser: ({ item, session }: ItemContext) => { + if (!permissions.canManageUsers({ session })) return false; + if (session?.itemId !== item?.id) return false; + return true; + }, + operationCanManageUserList: ({ session }: SessionContext) => { + if (!isSignedIn({ session })) return false; + if (permissions.canManageUsers({ session })) return true; + + return false; + }, + filterCanManageUserList: ({ item, session }: ItemContext) => { + return { canManageUsers: { equals: true } }; + }, +}; + +export const OperationCanManageContentList = ({ session }: SessionFrame) => + rules.operationCanManageContentList(session); + +export const EVERY_POST_STATUS = { + status: { in: ['published', 'draft', 'archive'] }, +}; +export const UNIT_POST_STATUS = { status: { in: [] } }; +export const PUBLISHED_POST_STATUS = { status: { in: ['published'] } }; + +export const FilterCanManageContentList = (frame: SessionFrame) => { + if (frame === undefined) { + report_security_incident( + 'Minor security breach: undefined frame: query downgraded to public.' + ); + //Give no information away that they have been noticed + return PUBLISHED_POST_STATUS; + } + if (isBuildEnvir(frame) || !!permissions?.canManageContent(frame.session)) + return EVERY_POST_STATUS; + + return PUBLISHED_POST_STATUS; +}; diff --git a/schema/content.ts b/schema/content.ts index c76d272d..e443b670 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -1,139 +1,150 @@ -import { relationship, select, text, timestamp } from '@keystone-next/keystone/fields'; -import { document } from '@keystone-next/fields-document'; -import { list } from '@keystone-next/keystone'; - -import { permissions, rules, SessionFrame, ItemContext, OperationCanManageContentList, FilterCanManageContentList } from './access'; -import { componentBlocks } from '../schema/fields/content/components'; - - -export const contentUIConfig = { - hideCreate: (session: any) => !permissions.canManageContent(session), - hideDelete: (session: any) => !permissions.canManageContent(session), - itemView: { - defaultFieldMode: (session: ItemContext) => - permissions.canManageContent(session) ? 'edit' : 'read', - }, -}; - -export const contentListAccess = -{ - operation: { - create: OperationCanManageContentList, - update: OperationCanManageContentList, - delete: OperationCanManageContentList - } -} - - -export const Label = list({ - access: contentListAccess, - ui: contentUIConfig, - fields: { - name: text(), - posts: relationship({ - ref: 'Post.labels', - many: true, - ui: { - displayMode: 'count', - }, - }), - }, -}); - -function defaultSlug({ context, inputData }: any) { - const date = new Date(); - return `${inputData?.title - ?.trim() - ?.toLowerCase() - ?.replace(/[^\w ]+/g, '') - ?.replace(/ +/g, '-') ?? '' - }-${date?.getFullYear() ?? ''}${date?.getMonth() + 1 ?? ''}${date?.getDate() ?? '' - }`; -} - -function defaultTimestamp() { - return new Date().toISOString(); -} - - -export const Post = list({ - access: { - operation: { - create: OperationCanManageContentList, - update: OperationCanManageContentList, - delete: OperationCanManageContentList - }, - filter: { - query: (frame: SessionFrame) => FilterCanManageContentList(frame) - }}, - ui: contentUIConfig, - fields: { - title: text(), - slug: text({ - ui: { createView: { fieldMode: 'hidden' } }, - isIndexed: 'unique', - hooks: { - resolveInput: ({ operation, resolvedData, inputData, context }) => { - if (operation === 'create' && !inputData.slug) { - return defaultSlug({ context, inputData }); - } - return resolvedData.slug; - } - } - }), - status: select({ - options: [ - { label: 'Draft', value: 'draft' }, - { label: 'Published', value: 'published' }, - { label: 'Archived', value: 'archived' }, - ], - defaultValue: 'draft', - ui: { displayMode: 'segmented-control' }, - }), - publishedDate: timestamp({ - hooks: { - resolveInput: ({ inputData, operation, resolvedData }) => { - if (operation === 'create' && !inputData.slug) { - return defaultTimestamp(); - } - return resolvedData.slug; - } - } - }), - author: relationship({ ref: 'User.authoredPosts' }), - labels: relationship({ ref: 'Label.posts', many: true }), - intro: document({ - formatting: { - inlineMarks: true, - blockTypes: true, - listTypes: true, - softBreaks: true, - }, - links: true, - }), - content: document({ - formatting: true, - links: true, - dividers: true, - relationships: { - poll: { - listKey: 'Poll', - kind: 'prop', - selection: ` - id - label - answers { - id - label - voteCount - } - userAnswer { - id - }`, - }, - }, - componentBlocks, - ui: { views: require.resolve('./fields/content/components') }, - }), - }, -}); +import { + relationship, + select, + text, + timestamp, +} from '@keystone-next/keystone/fields'; +import { document } from '@keystone-next/fields-document'; +import { list } from '@keystone-next/keystone'; + +import { + permissions, + rules, + SessionFrame, + ItemContext, + OperationCanManageContentList, + FilterCanManageContentList, +} from './access'; +import { componentBlocks } from '../schema/fields/content/components'; + +export const contentUIConfig = { + hideCreate: (session: any) => !permissions.canManageContent(session), + hideDelete: (session: any) => !permissions.canManageContent(session), + itemView: { + defaultFieldMode: (session: ItemContext) => + permissions.canManageContent(session) ? 'edit' : 'read', + }, +}; + +export const contentListAccess = { + operation: { + create: OperationCanManageContentList, + update: OperationCanManageContentList, + delete: OperationCanManageContentList, + }, +}; + +export const Label = list({ + access: contentListAccess, + ui: contentUIConfig, + fields: { + name: text(), + posts: relationship({ + ref: 'Post.labels', + many: true, + ui: { + displayMode: 'count', + }, + }), + }, +}); + +function defaultSlug({ context, inputData }: any) { + const date = new Date(); + return `${ + inputData?.title + ?.trim() + ?.toLowerCase() + ?.replace(/[^\w ]+/g, '') + ?.replace(/ +/g, '-') ?? '' + }-${date?.getFullYear() ?? ''}${date?.getMonth() + 1 ?? ''}${ + date?.getDate() ?? '' + }`; +} + +function defaultTimestamp() { + return new Date().toISOString(); +} + +export const Post = list({ + access: { + operation: { + create: OperationCanManageContentList, + update: OperationCanManageContentList, + delete: OperationCanManageContentList, + }, + filter: { + query: (frame: SessionFrame) => FilterCanManageContentList(frame), + }, + }, + ui: contentUIConfig, + fields: { + title: text(), + slug: text({ + ui: { createView: { fieldMode: 'hidden' } }, + isIndexed: 'unique', + hooks: { + resolveInput: ({ operation, resolvedData, inputData, context }) => { + if (operation === 'create' && !inputData.slug) { + return defaultSlug({ context, inputData }); + } + return resolvedData.slug; + }, + }, + }), + status: select({ + options: [ + { label: 'Draft', value: 'draft' }, + { label: 'Published', value: 'published' }, + { label: 'Archived', value: 'archived' }, + ], + defaultValue: 'draft', + ui: { displayMode: 'segmented-control' }, + }), + publishedDate: timestamp({ + hooks: { + resolveInput: ({ inputData, operation, resolvedData }) => { + if (operation === 'create' && !inputData.slug) { + return defaultTimestamp(); + } + return resolvedData.slug; + }, + }, + }), + author: relationship({ ref: 'User.authoredPosts' }), + labels: relationship({ ref: 'Label.posts', many: true }), + intro: document({ + formatting: { + inlineMarks: true, + blockTypes: true, + listTypes: true, + softBreaks: true, + }, + links: true, + }), + content: document({ + formatting: true, + links: true, + dividers: true, + relationships: { + poll: { + listKey: 'Poll', + kind: 'prop', + selection: ` + id + label + answers { + id + label + voteCount + } + userAnswer { + id + }`, + }, + }, + componentBlocks, + ui: { views: require.resolve('./fields/content/components') }, + }), + }, +}); diff --git a/schema/fields/githubRepos/field.ts b/schema/fields/githubRepos/field.ts index d93e10c3..fec8d4b5 100644 --- a/schema/fields/githubRepos/field.ts +++ b/schema/fields/githubRepos/field.ts @@ -1,90 +1,90 @@ -// Note: without a personal github access token in your env, the server will be rate limited to 60 requests per hour -// https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token - -import { graphql } from '@keystone-next/keystone'; -import fetch from 'node-fetch'; - -type GitubRepoData = { - id: number; - name: string; - full_name: string; - html_url: string; - description: string; - created_at: string; - updated_at: string; - pushed_at: string; - homepage: string; - size: number; - stargazers_count: number; - watchers_count: number; - language: string; - forks_count: number; -}; - -export const GitHubRepo = graphql.object()({ - name: 'GitHubRepo', - fields: { - id: graphql.field({ type: graphql.Int }), - name: graphql.field({ type: graphql.String }), - fullName: graphql.field({ - type: graphql.String, - resolve: val => val.full_name, - }), - htmlUrl: graphql.field({ - type: graphql.String, - resolve: val => val.html_url, - }), - description: graphql.field({ type: graphql.String }), - createdAt: graphql.field({ - type: graphql.String, - resolve: val => val.created_at, - }), - updatedAt: graphql.field({ - type: graphql.String, - resolve: val => val.updated_at, - }), - pushedAt: graphql.field({ - type: graphql.String, - resolve: val => val.pushed_at, - }), - homepage: graphql.field({ type: graphql.String }), - size: graphql.field({ type: graphql.Int }), - stargazersCount: graphql.field({ - type: graphql.Int, - resolve: val => val.stargazers_count, - }), - watchersCount: graphql.field({ - type: graphql.Int, - resolve: val => val.watchers_count, - }), - language: graphql.field({ type: graphql.String }), - forksCount: graphql.field({ - type: graphql.Int, - resolve: val => val.forks_count, - }), - }, -}); - -export async function githubReposResolver(item: any) { - if (!item.githubUsername) return []; - try { - const token = process.env.GITHUB_AUTH_TOKEN; - const options = token - ? { headers: { Authorization: `token ${token}` } } - : undefined; - const result = await fetch( - `https://api.github.com/users/${item.githubUsername}/repos?type=public&per_page=100`, - options - ); - const allRepos = await result.json(); - return allRepos - .filter( - (repo: any) => - !(repo.fork || repo.private || repo.disabled || repo.private) - ) - .sort((a: any, b: any) => b.stargazers_count - a.stargazers_count); - } catch (err) { - console.error(err); - return []; - } -} +// Note: without a personal github access token in your env, the server will be rate limited to 60 requests per hour +// https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token + +import { graphql } from '@keystone-next/keystone'; +import fetch from 'node-fetch'; + +type GitubRepoData = { + id: number; + name: string; + full_name: string; + html_url: string; + description: string; + created_at: string; + updated_at: string; + pushed_at: string; + homepage: string; + size: number; + stargazers_count: number; + watchers_count: number; + language: string; + forks_count: number; +}; + +export const GitHubRepo = graphql.object()({ + name: 'GitHubRepo', + fields: { + id: graphql.field({ type: graphql.Int }), + name: graphql.field({ type: graphql.String }), + fullName: graphql.field({ + type: graphql.String, + resolve: val => val.full_name, + }), + htmlUrl: graphql.field({ + type: graphql.String, + resolve: val => val.html_url, + }), + description: graphql.field({ type: graphql.String }), + createdAt: graphql.field({ + type: graphql.String, + resolve: val => val.created_at, + }), + updatedAt: graphql.field({ + type: graphql.String, + resolve: val => val.updated_at, + }), + pushedAt: graphql.field({ + type: graphql.String, + resolve: val => val.pushed_at, + }), + homepage: graphql.field({ type: graphql.String }), + size: graphql.field({ type: graphql.Int }), + stargazersCount: graphql.field({ + type: graphql.Int, + resolve: val => val.stargazers_count, + }), + watchersCount: graphql.field({ + type: graphql.Int, + resolve: val => val.watchers_count, + }), + language: graphql.field({ type: graphql.String }), + forksCount: graphql.field({ + type: graphql.Int, + resolve: val => val.forks_count, + }), + }, +}); + +export async function githubReposResolver(item: any) { + if (!item.githubUsername) return []; + try { + const token = process.env.GITHUB_AUTH_TOKEN; + const options = token + ? { headers: { Authorization: `token ${token}` } } + : undefined; + const result = await fetch( + `https://api.github.com/users/${item.githubUsername}/repos?type=public&per_page=100`, + options + ); + const allRepos = await result.json(); + return allRepos + .filter( + (repo: any) => + !(repo.fork || repo.private || repo.disabled || repo.private) + ) + .sort((a: any, b: any) => b.stargazers_count - a.stargazers_count); + } catch (err) { + console.error(err); + return []; + } +} diff --git a/schema/mutations.ts b/schema/mutations.ts index 423d9d17..360849f4 100644 --- a/schema/mutations.ts +++ b/schema/mutations.ts @@ -1,58 +1,57 @@ -import { graphQLSchemaExtension } from '@keystone-next/keystone'; -import { KeystoneContext, PollWhereInput } from '.keystone/types'; - -const gql = ([content]: TemplateStringsArray) => content; - -async function clearVote( - _context: KeystoneContext, - pollFilter: PollWhereInput -) { - const context = _context.sudo(); - if (!context.session) { - throw new Error('You must be signed in to vote'); - } - - const answers = await context.db.PollAnswer.findMany({ - where: { - - answeredByUsers: { some: { id: {equals: context.session.itemId}} }, - }, - }); - - if (answers.length) { - await context.db.PollAnswer.updateMany({ - data: answers.map((answer: any) => ({ - where: { id: answer.id }, - data: { - answeredByUsers: { set: [] }, - }, - })), - }); - } -} - -export const extendGraphqlSchema = graphQLSchemaExtension({ - typeDefs: gql` - type Mutation { - voteForPoll(answerId: ID!): Boolean - clearVoteForPoll(pollId: ID!): Boolean - } - `, - resolvers: { - Mutation: { - async clearVoteForPoll(rootVal, { pollId }, context) { - await clearVote(context as KeystoneContext, { id: pollId }); - }, - async voteForPoll(rootVal, { answerId }, _context) { - const context = _context.sudo() as KeystoneContext; - clearVote(context, { answers: { some: { id: { equals: answerId }} } }); - await context.db.PollAnswer.updateOne({ - where: { id: answerId }, - data: { - answeredByUsers: { connect: { id: context.session.itemId } }, - }, - }); - }, - }, - }, -}); +import { graphQLSchemaExtension } from '@keystone-next/keystone'; +import { KeystoneContext, PollWhereInput } from '.keystone/types'; + +const gql = ([content]: TemplateStringsArray) => content; + +async function clearVote( + _context: KeystoneContext, + pollFilter: PollWhereInput +) { + const context = _context.sudo(); + if (!context.session) { + throw new Error('You must be signed in to vote'); + } + + const answers = await context.db.PollAnswer.findMany({ + where: { + answeredByUsers: { some: { id: { equals: context.session.itemId } } }, + }, + }); + + if (answers.length) { + await context.db.PollAnswer.updateMany({ + data: answers.map((answer: any) => ({ + where: { id: answer.id }, + data: { + answeredByUsers: { set: [] }, + }, + })), + }); + } +} + +export const extendGraphqlSchema = graphQLSchemaExtension({ + typeDefs: gql` + type Mutation { + voteForPoll(answerId: ID!): Boolean + clearVoteForPoll(pollId: ID!): Boolean + } + `, + resolvers: { + Mutation: { + async clearVoteForPoll(rootVal, { pollId }, context) { + await clearVote(context as KeystoneContext, { id: pollId }); + }, + async voteForPoll(rootVal, { answerId }, _context) { + const context = _context.sudo() as KeystoneContext; + clearVote(context, { answers: { some: { id: { equals: answerId } } } }); + await context.db.PollAnswer.updateOne({ + where: { id: answerId }, + data: { + answeredByUsers: { connect: { id: context.session.itemId } }, + }, + }); + }, + }, + }, +}); diff --git a/schema/polls.ts b/schema/polls.ts index d5c1b9b3..4b7aab62 100644 --- a/schema/polls.ts +++ b/schema/polls.ts @@ -1,97 +1,105 @@ -import { relationship, text, virtual } from '@keystone-next/keystone/fields'; -import { graphql, list } from '@keystone-next/keystone'; -import { KeystoneListsAPI, KeystoneDbAPI } from '.keystone/types'; - -import { isSignedIn, permissions } from './access'; -import { contentListAccess, contentUIConfig } from './content'; - -export const Poll = list({ - access: contentListAccess, - ui: contentUIConfig, - fields: { - label: text(), - answers: relationship({ - ref: 'PollAnswer.poll', - isFilterable: true, - many: true, - ui: { - displayMode: 'cards', - cardFields: ['label', 'voteCount'], - inlineCreate: { - fields: ['label'], - }, - inlineEdit: { - fields: ['label'], - }, - removeMode: 'disconnect', - inlineConnect: true, - }, - }), - responsesCount: virtual({ - field: graphql.field({ - type: graphql.Int, - resolve(poll, args, context) { - const lists = context.query as KeystoneListsAPI; - return lists.User.count({ - where: { - pollAnswers: { some: { poll: { id: { equals: poll.id.toString() } } } }, - }, - }); - }, - }), - }), - userAnswer: virtual({ - field: lists => - graphql.field({ - type: lists.PollAnswer.types.output, - async resolve(poll, args, context) { - if (!isSignedIn(context)) return null; - const lists = context.db as KeystoneDbAPI; - const pollAnswers = await lists.PollAnswer.findMany({ - where: { - poll: { id: { equals: poll.id.toString() } }, - answeredByUsers: { some: { id: { equals: context.session.itemId } } }, - }, - }); - return pollAnswers[0]; - }, - }), - ui: { query: '{ id label }' }, - }), - }, -}); - -export const PollAnswer = list({ - access: contentListAccess, - ui: contentUIConfig, - fields: { - label: text(), - poll: relationship({isFilterable: true, ref: 'Poll.answers' }), - voteCount: virtual({ - field: graphql.field({ - type: graphql.Int, - resolve(pollAnswer, args, context) { - const lists = context.query as KeystoneListsAPI; - - return lists.User.count({ - where: { pollAnswers: { some: { id: { equals: pollAnswer.id.toString() } } } }, - }); - }, - }), - ui: { - itemView: { fieldMode: 'hidden' }, - }, - }), - answeredByUsers: relationship({ - ref: 'User.pollAnswers', - isFilterable: true, - many: true, - access: { read: permissions.canManageContent }, - ui: { - displayMode: 'count', - createView: { fieldMode: 'hidden' }, - listView: { fieldMode: 'hidden' }, - }, - }), - }, -}); +import { relationship, text, virtual } from '@keystone-next/keystone/fields'; +import { graphql, list } from '@keystone-next/keystone'; +import { KeystoneListsAPI, KeystoneDbAPI } from '.keystone/types'; + +import { isSignedIn, permissions } from './access'; +import { contentListAccess, contentUIConfig } from './content'; + +export const Poll = list({ + access: contentListAccess, + ui: contentUIConfig, + fields: { + label: text(), + answers: relationship({ + ref: 'PollAnswer.poll', + isFilterable: true, + many: true, + ui: { + displayMode: 'cards', + cardFields: ['label', 'voteCount'], + inlineCreate: { + fields: ['label'], + }, + inlineEdit: { + fields: ['label'], + }, + removeMode: 'disconnect', + inlineConnect: true, + }, + }), + responsesCount: virtual({ + field: graphql.field({ + type: graphql.Int, + resolve(poll, args, context) { + const lists = context.query as KeystoneListsAPI; + return lists.User.count({ + where: { + pollAnswers: { + some: { poll: { id: { equals: poll.id.toString() } } }, + }, + }, + }); + }, + }), + }), + userAnswer: virtual({ + field: lists => + graphql.field({ + type: lists.PollAnswer.types.output, + async resolve(poll, args, context) { + if (!isSignedIn(context)) return null; + const lists = context.db as KeystoneDbAPI; + const pollAnswers = await lists.PollAnswer.findMany({ + where: { + poll: { id: { equals: poll.id.toString() } }, + answeredByUsers: { + some: { id: { equals: context.session.itemId } }, + }, + }, + }); + return pollAnswers[0]; + }, + }), + ui: { query: '{ id label }' }, + }), + }, +}); + +export const PollAnswer = list({ + access: contentListAccess, + ui: contentUIConfig, + fields: { + label: text(), + poll: relationship({ isFilterable: true, ref: 'Poll.answers' }), + voteCount: virtual({ + field: graphql.field({ + type: graphql.Int, + resolve(pollAnswer, args, context) { + const lists = context.query as KeystoneListsAPI; + + return lists.User.count({ + where: { + pollAnswers: { + some: { id: { equals: pollAnswer.id.toString() } }, + }, + }, + }); + }, + }), + ui: { + itemView: { fieldMode: 'hidden' }, + }, + }), + answeredByUsers: relationship({ + ref: 'User.pollAnswers', + isFilterable: true, + many: true, + access: { read: permissions.canManageContent }, + ui: { + displayMode: 'count', + createView: { fieldMode: 'hidden' }, + listView: { fieldMode: 'hidden' }, + }, + }), + }, +}); diff --git a/schema/users.ts b/schema/users.ts index a5f3f8d0..e7b46f33 100644 --- a/schema/users.ts +++ b/schema/users.ts @@ -1,146 +1,151 @@ -import { - checkbox, - password, - relationship, - text, - virtual, -} from '@keystone-next/keystone/fields'; - -import {graphql} from '@keystone-next/keystone'; -import { list } from '@keystone-next/keystone'; - -import { permissions, rules, SessionContext, SessionFrame, ItemContext} from './access'; -import { GitHubRepo, githubReposResolver } from './fields/githubRepos/field'; - - - - - -const fieldModes = { - editSelfOrRead: ({ session, item }: any) => - permissions.canManageUsers({ session }) || session.itemId === item.id - ? 'edit' - : 'read', - editSelfOrHidden: ({ session, item }: any) => - permissions.canManageUsers({ session }) || session.itemId === item.id - ? 'edit' - : 'hidden', -}; - -export const User = list({ - access: { - operation: { - create: ({ session, context, listKey, operation } : SessionFrame) => true, - query: ({ session, context, listKey, operation } : SessionFrame) => true, - update: ({ session, context, listKey, operation } : SessionFrame) => rules.operationCanManageUserList(session), - delete: ({ session, context, listKey, operation } : SessionFrame) => rules.operationCanManageUserList(session), - }, - filter: { - //update: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList(session), - //delete: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList(session) - } - - }, - - ui: { - hideCreate: (session: SessionContext) => !permissions.canManageUsers(session), - hideDelete: (session: SessionContext) => !permissions.canManageUsers(session), - itemView: { - defaultFieldMode: (context: SessionContext) => - permissions.canManageUsers(context) ? 'edit' : 'hidden', - }, - listView: { - defaultFieldMode: (context: SessionContext) => - permissions.canManageUsers(context) ? 'read' : 'hidden', - }, - }, - fields: { - name: text({ - ui: { - itemView: { fieldMode: fieldModes.editSelfOrRead }, - }, - }), - email: text({ - isIndexed: 'unique', - isFilterable: true, - access: { - read: ({ session, context, listKey, operation } : SessionFrame) => rules.canManageUser(session), - }, - ui: { - itemView: { fieldMode: fieldModes.editSelfOrHidden }, - }, - }), - password: password({ - ui: { - itemView: { fieldMode: fieldModes.editSelfOrHidden }, - }, - }), - role: relationship({ - ref: 'Role.users', - access: permissions.canManageUsers, - }), - githubUsername: text({ - isFilterable: true, - label: 'GitHub Username', - ui: { - itemView: { fieldMode: fieldModes.editSelfOrRead }, - }, - }), - githubRepos: virtual({ - field: graphql.field({ - type: graphql.nonNull(graphql.list(GitHubRepo)), - resolve: githubReposResolver, - }), - ui: { - views: require.resolve('./fields/githubRepos/components'), - createView: { fieldMode: 'hidden' }, - listView: { fieldMode: 'hidden' }, - itemView: { fieldMode: 'read' }, - query: - '{ name htmlUrl description homepage stargazersCount }' - }, - }), - authoredPosts: relationship({ - ref: 'Post.author', - isFilterable: true, - many: true, - ui: { - createView: { fieldMode: 'hidden' }, - }, - }), - pollAnswers: relationship({ - ref: 'PollAnswer.answeredByUsers', - isFilterable: true, - many: true, - access: permissions.canManageUsers, - ui: { - hideCreate: true, - createView: { fieldMode: 'hidden' }, - }, - }), - }, -}); - -export const Role = list({ - - - fields: { - name: text(), - canManageContent: checkbox({ defaultValue: false }), - canManageUsers: checkbox({ defaultValue: false }), - users: relationship({ ref: 'User.role', many: true }) - }, - - access: { - operation: { - query: ({ session, context, listKey, operation } : SessionFrame) => rules.operationCanManageUserList(session), - update: ({ session, context, listKey, operation } : SessionFrame) => rules.operationCanManageUserList(session), - delete: ({ session, context, listKey, operation } : SessionFrame) => rules.operationCanManageUserList(session), - } - }, - //permissions.canManageUsers, - ui: { - isHidden: (session) => !permissions.canManageUsers(session), - }, - -}); +import { + checkbox, + password, + relationship, + text, + virtual, +} from '@keystone-next/keystone/fields'; + +import { graphql } from '@keystone-next/keystone'; +import { list } from '@keystone-next/keystone'; + +import { + permissions, + rules, + SessionContext, + SessionFrame, + ItemContext, +} from './access'; +import { GitHubRepo, githubReposResolver } from './fields/githubRepos/field'; + +const fieldModes = { + editSelfOrRead: ({ session, item }: any) => + permissions.canManageUsers({ session }) || session.itemId === item.id + ? 'edit' + : 'read', + editSelfOrHidden: ({ session, item }: any) => + permissions.canManageUsers({ session }) || session.itemId === item.id + ? 'edit' + : 'hidden', +}; + +export const User = list({ + access: { + operation: { + create: ({ session, context, listKey, operation }: SessionFrame) => true, + query: ({ session, context, listKey, operation }: SessionFrame) => true, + update: ({ session, context, listKey, operation }: SessionFrame) => + rules.operationCanManageUserList(session), + delete: ({ session, context, listKey, operation }: SessionFrame) => + rules.operationCanManageUserList(session), + }, + filter: { + //update: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList(session), + //delete: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList(session) + }, + }, + + ui: { + hideCreate: (session: SessionContext) => + !permissions.canManageUsers(session), + hideDelete: (session: SessionContext) => + !permissions.canManageUsers(session), + itemView: { + defaultFieldMode: (context: SessionContext) => + permissions.canManageUsers(context) ? 'edit' : 'hidden', + }, + listView: { + defaultFieldMode: (context: SessionContext) => + permissions.canManageUsers(context) ? 'read' : 'hidden', + }, + }, + fields: { + name: text({ + ui: { + itemView: { fieldMode: fieldModes.editSelfOrRead }, + }, + }), + email: text({ + isIndexed: 'unique', + isFilterable: true, + access: { + read: ({ session, context, listKey, operation }: SessionFrame) => + rules.canManageUser(session), + }, + ui: { + itemView: { fieldMode: fieldModes.editSelfOrHidden }, + }, + }), + password: password({ + ui: { + itemView: { fieldMode: fieldModes.editSelfOrHidden }, + }, + }), + role: relationship({ + ref: 'Role.users', + access: permissions.canManageUsers, + }), + githubUsername: text({ + isFilterable: true, + label: 'GitHub Username', + ui: { + itemView: { fieldMode: fieldModes.editSelfOrRead }, + }, + }), + githubRepos: virtual({ + field: graphql.field({ + type: graphql.nonNull(graphql.list(GitHubRepo)), + resolve: githubReposResolver, + }), + ui: { + views: require.resolve('./fields/githubRepos/components'), + createView: { fieldMode: 'hidden' }, + listView: { fieldMode: 'hidden' }, + itemView: { fieldMode: 'read' }, + query: '{ name htmlUrl description homepage stargazersCount }', + }, + }), + authoredPosts: relationship({ + ref: 'Post.author', + isFilterable: true, + many: true, + ui: { + createView: { fieldMode: 'hidden' }, + }, + }), + pollAnswers: relationship({ + ref: 'PollAnswer.answeredByUsers', + isFilterable: true, + many: true, + access: permissions.canManageUsers, + ui: { + hideCreate: true, + createView: { fieldMode: 'hidden' }, + }, + }), + }, +}); + +export const Role = list({ + fields: { + name: text(), + canManageContent: checkbox({ defaultValue: false }), + canManageUsers: checkbox({ defaultValue: false }), + users: relationship({ ref: 'User.role', many: true }), + }, + + access: { + operation: { + query: ({ session, context, listKey, operation }: SessionFrame) => + rules.operationCanManageUserList(session), + update: ({ session, context, listKey, operation }: SessionFrame) => + rules.operationCanManageUserList(session), + delete: ({ session, context, listKey, operation }: SessionFrame) => + rules.operationCanManageUserList(session), + }, + }, + //permissions.canManageUsers, + ui: { + isHidden: session => !permissions.canManageUsers(session), + }, +}); From 9c28580a697e0bf7e5e95ce3cea6e4ded4d6b194 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 05:43:55 +0100 Subject: [PATCH 036/325] Front page markdown --- README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f5a48132..babef437 100644 --- a/README.md +++ b/README.md @@ -88,11 +88,15 @@ Extend WhereInput to be WhereInput | true | false ... is yet to be tested as a p Production build status: ``` -Deductive filtering correctly identifies browswer based localhost traffic in testing, allowing next build super user access to the keystone, allowing for S/ISG tunneling. +Deductive filtering correctly identifies browswer based localhost traffic in testing. Next build super user authorization to keystone, allowing for S/ISG tunneling. -Pre production testing release status: Use as a production server in the current state is considered risky. Authorization is incomplete, but is overly tight. Expect missing functionality. +Pre production testing release status: + Admin UI Authorization is incomplete, but overly tight. + Expect missing functionality. -No proof exists that the correct firewalling of queries is correct, but it has passed preliminary security tests. Additional context information needs to be correctly decoded so the query firewall has the KeystoneContext correct. +No proof exists that the correct firewalling of queries is correct. +It has passed preliminary security tests. +Additional KeystoneContext information needs to be correctly decoded ``` Additional functionality from upstream main: @@ -103,6 +107,7 @@ Production build: tailwind purge telemetry disable CI scripts: WIP + Prettier applied in gitadd. ``` All testing/patches/security audits are welcome. Feel free to contribute to documenting the industry best practises for using keystone CMS. From 51e89840c290275ce87fa4c34c539fefe32a68ea Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 05:44:41 +0100 Subject: [PATCH 037/325] Front page markdown 2 --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index babef437..be8d6e3f 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,9 @@ Extend WhereInput to be WhereInput | true | false ... is yet to be tested as a p Production build status: ``` -Deductive filtering correctly identifies browswer based localhost traffic in testing. Next build super user authorization to keystone, allowing for S/ISG tunneling. +Deductive filtering correctly identifies browswer based localhost traffic in testing. + +Next build super user authorization to keystone, allowing for S/ISG tunneling. Pre production testing release status: Admin UI Authorization is incomplete, but overly tight. From e0ce44a94dab2c90851d4f6d871a84872ff0f61f Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 05:51:41 +0100 Subject: [PATCH 038/325] Tidied up commits --- .github/workflows/latest.yml | 2 +- .gitignore | 1 - migrations/20211008010740_upgrade_to_keystone_26/migration.sql | 1 + 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 7ef814f6..aeedef9f 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -30,7 +30,7 @@ jobs: run: echo "Unit testing:" # Runs a set of commands using the runners shell - - name: Run a multi-line script + - name: Install monorepo and give it a spin run: | set -euo pipefail appname="prisma_day_2021" diff --git a/.gitignore b/.gitignore index 8355967b..f8ad2027 100644 --- a/.gitignore +++ b/.gitignore @@ -20,7 +20,6 @@ build/ *.pem # debug -npm-debug.log* yarn-debug.log* yarn-error.log* diff --git a/migrations/20211008010740_upgrade_to_keystone_26/migration.sql b/migrations/20211008010740_upgrade_to_keystone_26/migration.sql index 572c0430..cf73db1c 100644 --- a/migrations/20211008010740_upgrade_to_keystone_26/migration.sql +++ b/migrations/20211008010740_upgrade_to_keystone_26/migration.sql @@ -71,3 +71,4 @@ ALTER INDEX "User.email_unique" RENAME TO "User_email_key"; -- RenameIndex ALTER INDEX "User.role_index" RENAME TO "User_role_idx"; + From 62adbff7ad1072225a610cf3474be4615a7d8430 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 06:07:35 +0100 Subject: [PATCH 039/325] github greeting.yml --- .github/workflows/greetings.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/workflows/greetings.yml diff --git a/.github/workflows/greetings.yml b/.github/workflows/greetings.yml new file mode 100644 index 00000000..6752ca77 --- /dev/null +++ b/.github/workflows/greetings.yml @@ -0,0 +1,16 @@ +name: Greetings + +on: [pull_request, issues] + +jobs: + greeting: + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - uses: actions/first-interaction@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + issue-message: 'Hello @${{ github.actor }} , thank you for submitting an issue.' + pr-message: 'Hello @${{ github.actor }} , thank you submitting a pull request.' \ No newline at end of file From edf5b846e04bbf6a0bccd8d534d5d86682c7edbe Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 06:08:40 +0100 Subject: [PATCH 040/325] gitadd corrected --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 86f3af68..d2ace36c 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "test_args":"node echo", "clean": "rm -rf node_modules yarn.lock .keystone .next", - "gitadd": "yarn format && git add -u * ||: && git add * ||:", + "gitadd": "yarn format && git add . ||:", "commit": "yarn gitadd && git commit -a -m ", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable", From e00face846d3d34145ab135127e546c7a4009d7a Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 06:12:08 +0100 Subject: [PATCH 041/325] Removed solved bug from readme --- README.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/README.md b/README.md index be8d6e3f..c8c0b28b 100644 --- a/README.md +++ b/README.md @@ -73,14 +73,9 @@ Known Issues: Authorization: WIP. Strong typing keystone frame types. -``` -yarn gitadd: -``` - Almost files are added, but latest.yaml didn't get auto added, even though !.github/ is in .gitignore - Test code in access has to find a new home. -Literal constants. +Refactor literals. How to code where: true/false in gql without touching keystone core code. From 31e405f74f146d6eb8ba1f67b768af2aca319f07 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 06:23:38 +0100 Subject: [PATCH 042/325] Readme --- README.md | 8 +++++--- package.json | 1 - 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c8c0b28b..6e628875 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,9 @@ utils.js -Latest branch: +## About the latest branch: + +This branch is dedicated to creating a solid foundation for a production build to extend keystone CMS from. CI: Github actions in testing. Unseeded build. ``` @@ -93,7 +95,7 @@ Pre production testing release status: No proof exists that the correct firewalling of queries is correct. It has passed preliminary security tests. -Additional KeystoneContext information needs to be correctly decoded +Additional KeystoneContext information needs to be correctly decoded. ``` Additional functionality from upstream main: @@ -107,7 +109,7 @@ Production build: Prettier applied in gitadd. ``` -All testing/patches/security audits are welcome. Feel free to contribute to documenting the industry best practises for using keystone CMS. +All testing/patches/security audits are welcome. Feel free to contribute to documenting the industry best practises for using keystone CMS combined with the powerhouse front end nextjs. ## License diff --git a/package.json b/package.json index d2ace36c..64486fcb 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,6 @@ "version": "1.0.0", "private": true, "scripts": { - "test_args":"node echo", "clean": "rm -rf node_modules yarn.lock .keystone .next", "gitadd": "yarn format && git add . ||:", "commit": "yarn gitadd && git commit -a -m ", From dfe4e4b21e4a24ec56aa6bd55943b89273e00376 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 08:03:02 +0100 Subject: [PATCH 043/325] Fixed versionitis in migrations --- .../20210715105930_init_db/migration.sql | 240 +++++++++--------- .../migration.sql | 1 - migrations/20211010080123_y/migration.sql | 4 +- migrations/migration_lock.toml | 4 +- 4 files changed, 124 insertions(+), 125 deletions(-) diff --git a/migrations/20210715105930_init_db/migration.sql b/migrations/20210715105930_init_db/migration.sql index 21e18f74..c3309d61 100644 --- a/migrations/20210715105930_init_db/migration.sql +++ b/migrations/20210715105930_init_db/migration.sql @@ -1,120 +1,120 @@ --- CreateTable -CREATE TABLE "Post" ( - "id" TEXT NOT NULL, - "title" TEXT, - "slug" TEXT, - "status" TEXT, - "publishedDate" TIMESTAMP(3), - "author" TEXT, - "intro" JSONB, - "content" JSONB, - - PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Label" ( - "id" TEXT NOT NULL, - "name" TEXT, - - PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Poll" ( - "id" TEXT NOT NULL, - "label" TEXT, - - PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "PollAnswer" ( - "id" TEXT NOT NULL, - "label" TEXT, - "poll" TEXT, - - PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "User" ( - "id" TEXT NOT NULL, - "name" TEXT, - "email" TEXT, - "password" TEXT, - "role" TEXT, - "githubUsername" TEXT, - - PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Role" ( - "id" TEXT NOT NULL, - "name" TEXT, - "canManageContent" BOOLEAN, - "canManageUsers" BOOLEAN, - - PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "_Label_posts_Post_labels" ( - "A" TEXT NOT NULL, - "B" TEXT NOT NULL -); - --- CreateTable -CREATE TABLE "_PollAnswer_answeredByUsers_User_pollAnswers" ( - "A" TEXT NOT NULL, - "B" TEXT NOT NULL -); - --- CreateIndex -CREATE UNIQUE INDEX "Post.slug_unique" ON "Post"("slug"); - --- CreateIndex -CREATE INDEX "Post.author_index" ON "Post"("author"); - --- CreateIndex -CREATE INDEX "PollAnswer.poll_index" ON "PollAnswer"("poll"); - --- CreateIndex -CREATE UNIQUE INDEX "User.email_unique" ON "User"("email"); - --- CreateIndex -CREATE INDEX "User.role_index" ON "User"("role"); - --- CreateIndex -CREATE UNIQUE INDEX "_Label_posts_Post_labels_AB_unique" ON "_Label_posts_Post_labels"("A", "B"); - --- CreateIndex -CREATE INDEX "_Label_posts_Post_labels_B_index" ON "_Label_posts_Post_labels"("B"); - --- CreateIndex -CREATE UNIQUE INDEX "_PollAnswer_answeredByUsers_User_pollAnswers_AB_unique" ON "_PollAnswer_answeredByUsers_User_pollAnswers"("A", "B"); - --- CreateIndex -CREATE INDEX "_PollAnswer_answeredByUsers_User_pollAnswers_B_index" ON "_PollAnswer_answeredByUsers_User_pollAnswers"("B"); - --- AddForeignKey -ALTER TABLE "Post" ADD FOREIGN KEY ("author") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "PollAnswer" ADD FOREIGN KEY ("poll") REFERENCES "Poll"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "User" ADD FOREIGN KEY ("role") REFERENCES "Role"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_Label_posts_Post_labels" ADD FOREIGN KEY ("A") REFERENCES "Label"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_Label_posts_Post_labels" ADD FOREIGN KEY ("B") REFERENCES "Post"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_PollAnswer_answeredByUsers_User_pollAnswers" ADD FOREIGN KEY ("A") REFERENCES "PollAnswer"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_PollAnswer_answeredByUsers_User_pollAnswers" ADD FOREIGN KEY ("B") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; +-- CreateTable +CREATE TABLE "Post" ( + "id" TEXT NOT NULL, + "title" TEXT, + "slug" TEXT, + "status" TEXT, + "publishedDate" TIMESTAMP(3), + "author" TEXT, + "intro" JSONB, + "content" JSONB, + + PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Label" ( + "id" TEXT NOT NULL, + "name" TEXT, + + PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Poll" ( + "id" TEXT NOT NULL, + "label" TEXT, + + PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PollAnswer" ( + "id" TEXT NOT NULL, + "label" TEXT, + "poll" TEXT, + + PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "User" ( + "id" TEXT NOT NULL, + "name" TEXT, + "email" TEXT, + "password" TEXT, + "role" TEXT, + "githubUsername" TEXT, + + PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Role" ( + "id" TEXT NOT NULL, + "name" TEXT, + "canManageContent" BOOLEAN, + "canManageUsers" BOOLEAN, + + PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "_Label_posts_Post_labels" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL +); + +-- CreateTable +CREATE TABLE "_PollAnswer_answeredByUsers_User_pollAnswers" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "Post.slug_unique" ON "Post"("slug"); + +-- CreateIndex +CREATE INDEX "Post.author_index" ON "Post"("author"); + +-- CreateIndex +CREATE INDEX "PollAnswer.poll_index" ON "PollAnswer"("poll"); + +-- CreateIndex +CREATE UNIQUE INDEX "User.email_unique" ON "User"("email"); + +-- CreateIndex +CREATE INDEX "User.role_index" ON "User"("role"); + +-- CreateIndex +CREATE UNIQUE INDEX "_Label_posts_Post_labels_AB_unique" ON "_Label_posts_Post_labels"("A", "B"); + +-- CreateIndex +CREATE INDEX "_Label_posts_Post_labels_B_index" ON "_Label_posts_Post_labels"("B"); + +-- CreateIndex +CREATE UNIQUE INDEX "_PollAnswer_answeredByUsers_User_pollAnswers_AB_unique" ON "_PollAnswer_answeredByUsers_User_pollAnswers"("A", "B"); + +-- CreateIndex +CREATE INDEX "_PollAnswer_answeredByUsers_User_pollAnswers_B_index" ON "_PollAnswer_answeredByUsers_User_pollAnswers"("B"); + +-- AddForeignKey +ALTER TABLE "Post" ADD FOREIGN KEY ("author") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PollAnswer" ADD FOREIGN KEY ("poll") REFERENCES "Poll"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "User" ADD FOREIGN KEY ("role") REFERENCES "Role"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_Label_posts_Post_labels" ADD FOREIGN KEY ("A") REFERENCES "Label"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_Label_posts_Post_labels" ADD FOREIGN KEY ("B") REFERENCES "Post"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_PollAnswer_answeredByUsers_User_pollAnswers" ADD FOREIGN KEY ("A") REFERENCES "PollAnswer"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_PollAnswer_answeredByUsers_User_pollAnswers" ADD FOREIGN KEY ("B") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/migrations/20211008010740_upgrade_to_keystone_26/migration.sql b/migrations/20211008010740_upgrade_to_keystone_26/migration.sql index cf73db1c..572c0430 100644 --- a/migrations/20211008010740_upgrade_to_keystone_26/migration.sql +++ b/migrations/20211008010740_upgrade_to_keystone_26/migration.sql @@ -71,4 +71,3 @@ ALTER INDEX "User.email_unique" RENAME TO "User_email_key"; -- RenameIndex ALTER INDEX "User.role_index" RENAME TO "User_role_idx"; - diff --git a/migrations/20211010080123_y/migration.sql b/migrations/20211010080123_y/migration.sql index 0b600a78..ae3069f7 100644 --- a/migrations/20211010080123_y/migration.sql +++ b/migrations/20211010080123_y/migration.sql @@ -1,2 +1,2 @@ --- AlterTable -ALTER TABLE "User" ALTER COLUMN "password" DROP NOT NULL; +-- AlterTable +ALTER TABLE "User" ALTER COLUMN "password" DROP NOT NULL; diff --git a/migrations/migration_lock.toml b/migrations/migration_lock.toml index fbffa92c..6bf90154 100644 --- a/migrations/migration_lock.toml +++ b/migrations/migration_lock.toml @@ -1,3 +1,3 @@ -# Please do not edit this file manually -# It should be added in your version-control system (i.e. Git) +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) provider = "postgresql" \ No newline at end of file From 1eadadab1d60e83f8dc46c95b8e23a749a23e7b4 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 08:38:46 +0100 Subject: [PATCH 044/325] 26.1.1 hotfix --- README.md | 2 +- package.json | 2 +- schema/access.ts | 8 +++++--- yarn.lock | 8 ++++---- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6e628875..12890178 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ Production build status: ``` Deductive filtering correctly identifies browswer based localhost traffic in testing. -Next build super user authorization to keystone, allowing for S/ISG tunneling. +Next build super user authorization to keystone, allowing for SSR/SSG/ISR tunneling. Pre production testing release status: Admin UI Authorization is incomplete, but overly tight. diff --git a/package.json b/package.json index 64486fcb..1649b46c 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "@keystone-next/auth": "34.0.0", "@keystone-next/document-renderer": "^4.0.1", "@keystone-next/fields-document": "^11.0.0", - "@keystone-next/keystone": "^26.1.0", + "@keystone-next/keystone": "^26.1.1", "@keystone-next/session-store-redis": "6.0.0", "@prisma/client": "^3.2.1", "classnames": "^2.3.1", diff --git a/schema/access.ts b/schema/access.ts index d6b84372..925a21f6 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -61,7 +61,7 @@ export const isBuildEnvir = (frame: SessionFrame): boolean => { warn('undefined frame.session'); warn('Assuming an SSG or ISG build event.'); warn( - 'Blessing assumed next build authentication breach authorisation for super user queries.' + 'Assumed next build authentication breach: Blessing next build with super user queries.' ); warn(''); //localWarn("withKeysone code", withKeystone) @@ -139,8 +139,10 @@ export const FilterCanManageContentList = (frame: SessionFrame) => { //Give no information away that they have been noticed return PUBLISHED_POST_STATUS; } - if (isBuildEnvir(frame) || !!permissions?.canManageContent(frame.session)) + if (isBuildEnvir(frame) || !!permissions?.canManageContent(frame.session)) { + success('Blessed super user access'); return EVERY_POST_STATUS; - + } + success('Client receives only published posts'); return PUBLISHED_POST_STATUS; }; diff --git a/yarn.lock b/yarn.lock index a77452d7..18573634 100644 --- a/yarn.lock +++ b/yarn.lock @@ -555,10 +555,10 @@ slate-history "^0.60.4" slate-react "^0.60.4" -"@keystone-next/keystone@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@keystone-next/keystone/-/keystone-26.1.0.tgz#d1a66303286ea496564566c761751720a1867e24" - integrity sha512-mdk0QH6L/68yLwbR0GH3UBJxnHQV1jKH9ruiS+pzbxNH+EOrhm+oPlOF/eq8bqTiSPUJp7xlh3YSHhk+3EgF0Q== +"@keystone-next/keystone@^26.1.1": + version "26.1.1" + resolved "https://registry.yarnpkg.com/@keystone-next/keystone/-/keystone-26.1.1.tgz#561b927c6818499121b8d4ad30fc30b474dae515" + integrity sha512-vKB3R3cSiem4cin+kR5A99ng1YuUm/ih+hVnE0B1QjjN6vhPBpdeINMQVnhsSxVBqmodggF1Vjc8nyDVkLF1Bw== dependencies: "@apollo/client" "^3.4.16" "@babel/core" "^7.15.5" From 0558d2c4759420160798530f3de185fbbb2af4c4 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 09:04:01 +0100 Subject: [PATCH 045/325] yarn next lint in workflow --- .github/workflows/latest.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index aeedef9f..434cb10c 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -41,7 +41,8 @@ jobs: cd $GITHUB_WORKSPACE DATABASE_URL="postgres://postgres:changeme@localhost/$appname" yes | yarn - yarn dev & + yarn dev & + yarn next lint sleep 3 yarn site:build echo "Build unseeded $appname:latest production succeded" From 3c11f80819a252f7b72a7bae6bab41c74b154683 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 19:28:25 +0100 Subject: [PATCH 046/325] DRY: yarn next lint in postinstall. Security stocktaking/musings. --- .github/workflows/latest.yml | 3 +- package.json | 2 +- schema/access.ts | 83 +++++++++++++++++++++++++++++++----- 3 files changed, 75 insertions(+), 13 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 434cb10c..dff76149 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -41,8 +41,7 @@ jobs: cd $GITHUB_WORKSPACE DATABASE_URL="postgres://postgres:changeme@localhost/$appname" yes | yarn - yarn dev & - yarn next lint + yarn dev & sleep 3 yarn site:build echo "Build unseeded $appname:latest production succeded" diff --git a/package.json b/package.json index 1649b46c..6d6b7445 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "gitadd": "yarn format && git add . ||:", "commit": "yarn gitadd && git commit -a -m ", "push": "git push origin latest", - "postinstall": "keystone-next postinstall && yarn next telemetry disable", + "postinstall": "keystone-next postinstall && yarn next telemetry disable && yarn next lint", "site:dev": "next dev -p 8000", "site:build": "next build", "site:start": "next start -p 8000", diff --git a/schema/access.ts b/schema/access.ts index 925a21f6..6fde1e3d 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -58,12 +58,16 @@ export const isBuildEnvir = (frame: SessionFrame): boolean => { //warn(host) //warn(url) - warn('undefined frame.session'); - warn('Assuming an SSG or ISG build event.'); + warn('undefined frame.session:'); + warn('Assuming a next build event:'); warn( - 'Assumed next build authentication breach: Blessing next build with super user queries.' + 'Assumed next build authentication breach: Will bless next build with super user queries:' + ); + //Massive security hole to be fixed with a shared secret. + + warn( + 'Blessed super user access to next build: (without API token: Do not deploy yet.)' ); - warn(''); //localWarn("withKeysone code", withKeystone) return true; } @@ -85,11 +89,11 @@ export const permissions = { export const rules = { canUseAdminUI: ({ session }: SessionContext) => { - console.log('Typeof session: ' + typeof session); + //console.log('Typeof session: ' + typeof session); return !!session?.data.role as MaybePromise; }, operationCanManageContentList: ({ item }: ItemContext) => { - warn('rules.operationCanReadContentList'); + warn('rules.operationCanReadContentList:'); warn(item); if (!permissions.canManageContent(item)) return false; @@ -134,13 +138,72 @@ export const PUBLISHED_POST_STATUS = { status: { in: ['published'] } }; export const FilterCanManageContentList = (frame: SessionFrame) => { if (frame === undefined) { report_security_incident( - 'Minor security breach: undefined frame: query downgraded to public.' + 'Minor security breach: potential auth bug. undefined frame: query downgraded to public.' ); - //Give no information away that they have been noticed return PUBLISHED_POST_STATUS; + //Give no information away that they have been noticed, but if there's no frame + //it's hard to imagine where the reply is going to go ... if exec ever gets here, it's close + //to a fatal error. What is the best thing to do here? Nothing? throw? + + //The front line security audit: Initial musings: + + //SSG has the best security profile, and appears completely safe to use SSG for a cdn deployed site without auth. + + //However well local code is audited for security, there is a known can of worms in apollo. It will exit(1) + //at a moments notice, taking ks down with it. The upshot is gql must be considered a soft target, + //and this single, vulnerable endpoint is suitably firewalled, potentially using REST, which + //has a far improved security model. + + // So: safest is when gql is restriced to being a tool for the offline + // build process only, and a convenient one at that. If it is deployed online, great care has to be taken + // to protect it from badly formed queries, and restrict it's input grammar. It's not clear this is any easier to write than + // a well defined REST api. + + // A mitigating factor here is the use of isFilterable on individual fields. When first porting Jeds app, it seemed like an inconvenience, + // but now, it is seen as providing critical security, restricting queries to a vulnerable apollo. + + // !!! This is so important for a production server than does use gql only, that it might be worth + // issuing a warning when a list is defaulted to isFilterable on all fields. Warnings like this can + // be so useful to the correct setup of a dev kit. Also a warning if a field is in a where clause, but not filterable ... can same poor front end developers hours. + // The more info an error can do to help a dev chase its location, the better. When logs get multiplexed by multiple threads, knowing what corresponds to what can waste time. + // Keystone is such a happy app that a warning really gets noticed ;) + + // There are alternatives: + // jQuery to avoid layers of gql inefficiences, and workers. + // Also, REST can start hard, C++ calling core pgsql. From the keystone perspective, it's just another target language for an ast, + // derived from the same schema, but in pgsql C++ (hardest, in every way), + // my own fav for prototyping, bash pg cli (v easy: a surprisingly few lines of code, and handy for CI. Also extraordinarily versatile. Can handof via socat, epoll, anything). + // The ts schema is still the sole source of truth in this model. Nothing much changes in ks, because it is suitably agnostic. + + // Furthermore, gql is not ideally suited to live usage, due to the n+1 problem, and difficuly cacheing a single endpoint. + // Gql doesn't play nicely with reverse proxies, but REST does. Fashion is cyclical! + // But for prototyping apis, the playground auto documentation, and SSG/ISR ... it's a massive time saver. + + // There is some convergence in langauge: + // ts and C++ read very similarly nowadays. As long as everything is done in term of the lambda calculus, it all works out. + + // Unfortunately C++ coroutines are dreadfully thought out. My guess is the committe did not understand the issues https://bartoszmilewski.com/2011/07/11/monads-in-c/ + // raised. Fortunately, I have successfully developed some workarounds for these issue. ;) + + //The AdminUI is considered a fairly soft target, mainly from DoS. But it's easy to harden to the public, using an ssh pki tunnel for access, bringing the auth + //to industry best practise, but remaining vulnerable to authorized bad actors, who we have to keep as far away from the gql endpoint as possible. + + //All this is of relevant here, because this is the last line of defense! + + //In testing, bad username password combinations were reporting auth failure + //immediately. A delay of a few seconds has an improved security model. + } + //Needs shared secret, set in bash, imported via process.env, usage tested in the CI workflow, which act as the base spec for a container to run keystone/next in. + if (isBuildEnvir(frame)) { + success(''); + return EVERY_POST_STATUS; } - if (isBuildEnvir(frame) || !!permissions?.canManageContent(frame.session)) { - success('Blessed super user access'); + //The perms check is only running client side. Review: check the authorization props are checked + //server side to. + if (!!permissions?.canManageContent(frame.session)) { + success('Blessed super user access to the known content manager:'); + success(frame?.context?.session?.data?.name); + success(''); return EVERY_POST_STATUS; } success('Client receives only published posts'); From 16f84334f2317e9dd539a5109098849e9c9ad717 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 19:52:18 +0100 Subject: [PATCH 047/325] RYS: correctly parsing SessionFrame for role info. DRY: wip --- schema/access.ts | 6 ++++-- schema/users.ts | 7 ++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/schema/access.ts b/schema/access.ts index 6fde1e3d..48f034ab 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -200,12 +200,14 @@ export const FilterCanManageContentList = (frame: SessionFrame) => { } //The perms check is only running client side. Review: check the authorization props are checked //server side to. - if (!!permissions?.canManageContent(frame.session)) { + if (!!frame.context.session?.data?.role?.canManageContent) { success('Blessed super user access to the known content manager:'); success(frame?.context?.session?.data?.name); success(''); return EVERY_POST_STATUS; } - success('Client receives only published posts'); + success('Client receives only published posts:'); + success(frame.context?.session?.data?.name); + success(frame.context.session?.data?.role?.canManageContent); return PUBLISHED_POST_STATUS; }; diff --git a/schema/users.ts b/schema/users.ts index e7b46f33..f20684fe 100644 --- a/schema/users.ts +++ b/schema/users.ts @@ -84,6 +84,7 @@ export const User = list({ role: relationship({ ref: 'Role.users', access: permissions.canManageUsers, + isFilterable: true, }), githubUsername: text({ isFilterable: true, @@ -129,9 +130,9 @@ export const User = list({ export const Role = list({ fields: { name: text(), - canManageContent: checkbox({ defaultValue: false }), - canManageUsers: checkbox({ defaultValue: false }), - users: relationship({ ref: 'User.role', many: true }), + canManageContent: checkbox({ defaultValue: false, isFilterable: true }), + canManageUsers: checkbox({ defaultValue: false, isFilterable: true }), + users: relationship({ ref: 'User.role', many: true, isFilterable: true }), }, access: { From 982a7b91c833e82b207498cf650633d5295d3845 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 19:59:56 +0100 Subject: [PATCH 048/325] Updated README --- README.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 12890178..6929ffce 100644 --- a/README.md +++ b/README.md @@ -90,12 +90,16 @@ Deductive filtering correctly identifies browswer based localhost traffic in tes Next build super user authorization to keystone, allowing for SSR/SSG/ISR tunneling. Pre production testing release status: - Admin UI Authorization is incomplete, but overly tight. + Admin UI Authorization has passed preliminary testing. + User roles AdminUI still to be unlocked. Expect missing functionality. -No proof exists that the correct firewalling of queries is correct. -It has passed preliminary security tests. -Additional KeystoneContext information needs to be correctly decoded. +The current implementation of build process api's is a hack. A shout out to Jed for explaining the keystone way. WIP. +It has passed only the most preliminary of security tests, determining localhost web from build, i.e. a proof of concept. + +Additional KeystoneContext auth information and a shared API key, set in via process .env: + needs to be correctly handed down in the headers to the last line of defense, access: filter. + ``` Additional functionality from upstream main: From afdcb10d72e2f754d289573486c9e590bd408887 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 20:11:52 +0100 Subject: [PATCH 049/325] Workflow CI/Install notes --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 6929ffce..480b0819 100644 --- a/README.md +++ b/README.md @@ -113,6 +113,18 @@ Production build: Prettier applied in gitadd. ``` +## How to install the latest branch + +The definitive install instructions, assuming fedora, bar seeding, are in the workflow file: + + https://github.com/qfunq/prisma-day-2021-workshop/blob/latest/.github/workflows/latest.yml + +Install it like this and you know you will get the latest CI build. + +Seeding and post seeding CI unit tests: WIP. This is a high priority if anyone wants to take it on. +I have some scripts that can boot the process, but they are bash/pqsql, not quite the keystone way, but they are tried, tested, lightweight and effective. + + All testing/patches/security audits are welcome. Feel free to contribute to documenting the industry best practises for using keystone CMS combined with the powerhouse front end nextjs. ## License From 8f8ddccd34318875fddf9719f84ca6479153572a Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Tue, 12 Oct 2021 21:51:55 +0100 Subject: [PATCH 050/325] DRY (too much) permission based authz ready for testing. --- README.md | 5 +-- keystone.ts | 4 +-- schema/access.ts | 78 +++++++++++++++++------------------------------ schema/content.ts | 22 +++++++------ schema/users.ts | 50 +++++++++++++++--------------- 5 files changed, 71 insertions(+), 88 deletions(-) diff --git a/README.md b/README.md index 480b0819..30135ecd 100644 --- a/README.md +++ b/README.md @@ -88,11 +88,12 @@ Production build status: Deductive filtering correctly identifies browswer based localhost traffic in testing. Next build super user authorization to keystone, allowing for SSR/SSG/ISR tunneling. + USE CASE: TESTING BUILD FUNCTIONALITY ONLY. Pre production testing release status: Admin UI Authorization has passed preliminary testing. - User roles AdminUI still to be unlocked. - Expect missing functionality. + DRY permissions. Rules deprecation. Some tidying up stil to be done. + Ready for exhaustive testing. The current implementation of build process api's is a hack. A shout out to Jed for explaining the keystone way. WIP. It has passed only the most preliminary of security tests, determining localhost web from build, i.e. a proof of concept. diff --git a/keystone.ts b/keystone.ts index c9627282..e8cf76bc 100644 --- a/keystone.ts +++ b/keystone.ts @@ -3,7 +3,7 @@ import { statelessSessions } from '@keystone-next/keystone/session'; import { createAuth } from '@keystone-next/auth'; import { lists, extendGraphqlSchema } from './schema'; -import { rules } from './schema/access'; +import { permissions } from './schema/access'; const dbUrl = process.env.DATABASE_URL || @@ -42,7 +42,7 @@ export default auth.withAuth( provider: 'postgresql', useMigrations: true, }, - ui: { isAccessAllowed: rules.canUseAdminUI }, + ui: { isAccessAllowed: permissions.canUseAdminUI }, lists, session: statelessSessions({ secret: sessionSecret, diff --git a/schema/access.ts b/schema/access.ts index 48f034ab..b9d52695 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -36,17 +36,25 @@ const rmap_va = let colors = require('colors/safe'); +// Fix Me: Test code: Needs another home. +//This is one place where any means it! The intent was object dumping code, down to +//every leaf. A testground for DRY logging in ts. +// Closures are good for logging, localising to particular files/functions/lines ... the issues of this short segment quickly shows why. +// I have some multicol markup for logging, it bash though, so replaces console.log. +// A markup standard for shell would be useful. + +const log = (s: string) => console.log(s); + const success = (...obj: any) => - rmap_va(obj)((x: any) => console.log(colors.green(x.toString()))); + rmap_va(obj)((x: any) => log(colors.green(x.toString()))); const warn = (...obj: any) => - rmap_va(obj)((x: any) => console.log(colors.yellow(x.toString()))); + rmap_va(obj)((x: any) => log(colors.yellow(x.toString()))); const report_security_incident = (...obj: any) => - rmap_va(obj)((x: any) => console.log(colors.red(x.toString()))); - -const xwarn = (...obj: any) => unit; + rmap_va(obj)((x: any) => log(colors.red(x.toString()))); +//FIXME: Needs API key. export const isBuildEnvir = (frame: SessionFrame): boolean => { if (frame.session === undefined) { //const headers = frame.context.req?.headers; @@ -78,56 +86,25 @@ export const isSignedIn = ({ session }: SessionContext) => { return !!session; }; +//!! and ?. everywhere to protect from undefined. ts picks this up unless any is used. export const permissions = { - canManageContent: ({ session }: SessionContext) => { + canUseAdminUI: ({ session }: SessionContext): boolean => + !!session?.data?.role, + canManageContent: (frame: SessionFrame): boolean => + !!frame?.context?.session?.data?.role?.canManageContent, + canManageUsers: (frame: SessionFrame): boolean => + !!frame?.context?.session?.data?.role?.canManageUsers, + + canManageContentSession: ({ session }: SessionContext): boolean => { return !!session?.data?.role?.canManageContent; }, - canManageUsers: ({ session }: SessionContext) => { + canManageUsersSession: ({ session }: SessionContext): boolean => { return !!session?.data?.role?.canManageUsers; }, }; -export const rules = { - canUseAdminUI: ({ session }: SessionContext) => { - //console.log('Typeof session: ' + typeof session); - return !!session?.data.role as MaybePromise; - }, - operationCanManageContentList: ({ item }: ItemContext) => { - warn('rules.operationCanReadContentList:'); - warn(item); - if (!permissions.canManageContent(item)) return false; - - return true; - }, - filterCanReadContent: () => { - console.log('rules.filterCanReadContent'); - return { status: { equals: 'published' } }; - }, - canReadContentList: ({ item }: ItemContext) => { - console.log('rules.canReadContentList'); - if (!permissions.canManageContent(item)) return false; - - return true; - }, - - canManageUser: ({ item, session }: ItemContext) => { - if (!permissions.canManageUsers({ session })) return false; - if (session?.itemId !== item?.id) return false; - return true; - }, - operationCanManageUserList: ({ session }: SessionContext) => { - if (!isSignedIn({ session })) return false; - if (permissions.canManageUsers({ session })) return true; - - return false; - }, - filterCanManageUserList: ({ item, session }: ItemContext) => { - return { canManageUsers: { equals: true } }; - }, -}; - -export const OperationCanManageContentList = ({ session }: SessionFrame) => - rules.operationCanManageContentList(session); +export const operationCanManageContentList = (frame: SessionFrame) => + permissions.canManageContent(frame); export const EVERY_POST_STATUS = { status: { in: ['published', 'draft', 'archive'] }, @@ -206,8 +183,9 @@ export const FilterCanManageContentList = (frame: SessionFrame) => { success(''); return EVERY_POST_STATUS; } + success('Client receives only published posts:'); - success(frame.context?.session?.data?.name); - success(frame.context.session?.data?.role?.canManageContent); + success(frame?.context?.session?.data?.name); + //success(frame.context.session?.data?.role?.canManageContent); return PUBLISHED_POST_STATUS; }; diff --git a/schema/content.ts b/schema/content.ts index e443b670..c73e7f99 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -9,28 +9,32 @@ import { list } from '@keystone-next/keystone'; import { permissions, - rules, SessionFrame, ItemContext, - OperationCanManageContentList, + operationCanManageContentList, FilterCanManageContentList, } from './access'; import { componentBlocks } from '../schema/fields/content/components'; +//FIXME: +// These anys are causing issues. What is the strong type? +// The deduced type from permissions api is SessionFrame, but that doesn't work ... +// MaybeSessionFunction has something to do with the ts error. + export const contentUIConfig = { hideCreate: (session: any) => !permissions.canManageContent(session), hideDelete: (session: any) => !permissions.canManageContent(session), itemView: { defaultFieldMode: (session: ItemContext) => - permissions.canManageContent(session) ? 'edit' : 'read', + permissions.canManageContentSession(session) ? 'edit' : 'read', }, }; export const contentListAccess = { operation: { - create: OperationCanManageContentList, - update: OperationCanManageContentList, - delete: OperationCanManageContentList, + create: operationCanManageContentList, + update: operationCanManageContentList, + delete: operationCanManageContentList, }, }; @@ -69,9 +73,9 @@ function defaultTimestamp() { export const Post = list({ access: { operation: { - create: OperationCanManageContentList, - update: OperationCanManageContentList, - delete: OperationCanManageContentList, + create: operationCanManageContentList, + update: operationCanManageContentList, + delete: operationCanManageContentList, }, filter: { query: (frame: SessionFrame) => FilterCanManageContentList(frame), diff --git a/schema/users.ts b/schema/users.ts index f20684fe..2612b0c1 100644 --- a/schema/users.ts +++ b/schema/users.ts @@ -11,20 +11,26 @@ import { list } from '@keystone-next/keystone'; import { permissions, - rules, SessionContext, SessionFrame, ItemContext, } from './access'; import { GitHubRepo, githubReposResolver } from './fields/githubRepos/field'; +// Removed an any, revealed an extra ? was required ! any = js ;) any is to be avoid like the plague unless trying to type compose ;) +// strong type for any type. +// That generic "cant assign to Maybe..." error seems be trying to say "There's an any, which is potentially undefined, but is not triggering a type error" +// On that not, I counted occurence of ": any" in the repo. 5902 results in 793 files :-O. Not good, since each hides a potential bug that is hiding +// from ts, like occured here. const fieldModes = { - editSelfOrRead: ({ session, item }: any) => - permissions.canManageUsers({ session }) || session.itemId === item.id + editSelfOrRead: ({ session, item }: ItemContext) => + permissions.canManageUsersSession({ session }) || + session?.itemId === item.id ? 'edit' : 'read', - editSelfOrHidden: ({ session, item }: any) => - permissions.canManageUsers({ session }) || session.itemId === item.id + editSelfOrHidden: ({ session, item }: ItemContext) => + permissions.canManageUsersSession({ session }) || + session?.itemId === item.id ? 'edit' : 'hidden', }; @@ -32,31 +38,29 @@ const fieldModes = { export const User = list({ access: { operation: { - create: ({ session, context, listKey, operation }: SessionFrame) => true, - query: ({ session, context, listKey, operation }: SessionFrame) => true, - update: ({ session, context, listKey, operation }: SessionFrame) => - rules.operationCanManageUserList(session), - delete: ({ session, context, listKey, operation }: SessionFrame) => - rules.operationCanManageUserList(session), + create: (frame: SessionFrame) => true, + query: (frame: SessionFrame) => true, + update: (frame: SessionFrame) => permissions.canManageUsers(frame), + delete: (frame: SessionFrame) => permissions.canManageUsers(frame), }, filter: { - //update: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList(session), + update: (frame: SessionFrame) => permissions.canManageUsers(frame), //delete: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList(session) }, }, ui: { hideCreate: (session: SessionContext) => - !permissions.canManageUsers(session), + !permissions.canManageUsersSession(session), hideDelete: (session: SessionContext) => - !permissions.canManageUsers(session), + !permissions.canManageUsersSession(session), itemView: { defaultFieldMode: (context: SessionContext) => - permissions.canManageUsers(context) ? 'edit' : 'hidden', + permissions.canManageUsersSession(context) ? 'edit' : 'hidden', }, listView: { defaultFieldMode: (context: SessionContext) => - permissions.canManageUsers(context) ? 'read' : 'hidden', + permissions.canManageUsersSession(context) ? 'read' : 'hidden', }, }, fields: { @@ -69,8 +73,7 @@ export const User = list({ isIndexed: 'unique', isFilterable: true, access: { - read: ({ session, context, listKey, operation }: SessionFrame) => - rules.canManageUser(session), + read: (frame: SessionFrame) => permissions.canManageUsers(frame), }, ui: { itemView: { fieldMode: fieldModes.editSelfOrHidden }, @@ -137,16 +140,13 @@ export const Role = list({ access: { operation: { - query: ({ session, context, listKey, operation }: SessionFrame) => - rules.operationCanManageUserList(session), - update: ({ session, context, listKey, operation }: SessionFrame) => - rules.operationCanManageUserList(session), - delete: ({ session, context, listKey, operation }: SessionFrame) => - rules.operationCanManageUserList(session), + query: (frame: SessionFrame) => permissions.canManageUsers(frame), + update: (frame: SessionFrame) => permissions.canManageUsers(frame), + delete: (frame: SessionFrame) => permissions.canManageUsers(frame), }, }, //permissions.canManageUsers, ui: { - isHidden: session => !permissions.canManageUsers(session), + isHidden: session => !permissions.canManageUsersSession(session), }, }); From 3ab654dc812c8be34e3e41cb2926d6756a5ffe83 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Wed, 13 Oct 2021 00:41:09 +0100 Subject: [PATCH 051/325] Injected X-API-KEY, ready for authz decoding. --- .github/workflows/latest.yml | 1 + keystone.ts | 4 ++++ next.config.js | 2 +- schema/access.ts | 3 +++ utils.ts | 7 ++++++- 5 files changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index dff76149..ae6e0c06 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -40,6 +40,7 @@ jobs: dnf install postgresql yes cd $GITHUB_WORKSPACE DATABASE_URL="postgres://postgres:changeme@localhost/$appname" + KEYSTONE_NEXTJS_BUILD_API_KEY="definitely_change_me2_make_a_non_postgres_user2" yes | yarn yarn dev & sleep 3 diff --git a/keystone.ts b/keystone.ts index e8cf76bc..d15df1a8 100644 --- a/keystone.ts +++ b/keystone.ts @@ -13,6 +13,10 @@ const sessionSecret = process.env.SESSION_SECERT || 'iLqbHhm7qwiBNc8KgL4NQ8tD8fFVhNhNqZ2nRdprgnKNjgJHgvitWx6DPoZJpYHa'; +export const keystoneNextjsBuildApiKey = + process.env.KEYSTONE_NEXTJS_BUILD_API_KEY || + 'utils.ts:_keystoneNextjsBuildApiKey_says_change_me_!!!!!!!_im_just_for_testing'; + const auth = createAuth({ identityField: 'email', secretField: 'password', diff --git a/next.config.js b/next.config.js index 30ca75e2..56ae75cf 100644 --- a/next.config.js +++ b/next.config.js @@ -6,5 +6,5 @@ module.exports = { destination: 'http://localhost:3000/api/graphql', }, ]; - }, + } }; diff --git a/schema/access.ts b/schema/access.ts index b9d52695..f5ae7871 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -1,4 +1,6 @@ import { KeystoneContext } from '.keystone/types'; +import { useAuth } from '../components/auth'; +import { keystoneNextjsBuildApiKey } from '../keystone'; declare type MaybePromise = Promise | T; @@ -56,6 +58,7 @@ const report_security_incident = (...obj: any) => //FIXME: Needs API key. export const isBuildEnvir = (frame: SessionFrame): boolean => { + const auth = useAuth(); if (frame.session === undefined) { //const headers = frame.context.req?.headers; //const host = headers ? headers['x-forwarded-host'] || headers['host'] : null; diff --git a/utils.ts b/utils.ts index db6a2494..ee3772f7 100644 --- a/utils.ts +++ b/utils.ts @@ -1,3 +1,5 @@ +import { keystoneNextjsBuildApiKey } from './keystone'; + export const gql = ([content]: TemplateStringsArray) => content; export async function fetchGraphQL( @@ -7,7 +9,10 @@ export async function fetchGraphQL( return fetch('http://localhost:3000/api/graphql', { method: 'POST', body: JSON.stringify({ query, variables }), - headers: { 'Content-Type': 'application/json' }, + headers: { + 'Content-Type': 'application/json', + 'x-api-key': keystoneNextjsBuildApiKey, + }, }) .then(x => x.json()) .then(({ data, errors }) => { From b5a4036c592615eab5f12e169145a9bc68a64806 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Wed, 13 Oct 2021 04:54:26 +0100 Subject: [PATCH 052/325] Monadic logging. Prototype api key warnings. Logging and base algebra. new home is utils --- README.md | 2 + keystone.ts | 2 +- pages/index.tsx | 4 +- pages/post/[slug].tsx | 6 +-- schema/access.ts | 86 +++++++++++++++++++++++++------------- schema/content.ts | 8 +++- utils.ts | 97 ++++++++++++++++++++++++++++++++++++++++++- 7 files changed, 166 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 30135ecd..a0d98881 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,8 @@ Deductive filtering correctly identifies browswer based localhost traffic in tes Next build super user authorization to keystone, allowing for SSR/SSG/ISR tunneling. USE CASE: TESTING BUILD FUNCTIONALITY ONLY. +Api key connected to workflow. Injected into provably correct location, in utils.ts. + Pre production testing release status: Admin UI Authorization has passed preliminary testing. DRY permissions. Rules deprecation. Some tidying up stil to be done. diff --git a/keystone.ts b/keystone.ts index d15df1a8..6541490d 100644 --- a/keystone.ts +++ b/keystone.ts @@ -15,7 +15,7 @@ const sessionSecret = export const keystoneNextjsBuildApiKey = process.env.KEYSTONE_NEXTJS_BUILD_API_KEY || - 'utils.ts:_keystoneNextjsBuildApiKey_says_change_me_!!!!!!!_im_just_for_testing'; + 'utils.ts:_keystoneNextjsBuildApiKey_says_change_me_!!!!!!!_im_just_for_testing_purposes'; const auth = createAuth({ identityField: 'email', diff --git a/pages/index.tsx b/pages/index.tsx index 6df6b3ed..26e20d18 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import { GetStaticPropsContext } from 'next'; -import { fetchGraphQL, gql } from '../utils'; +import { fetchGraphQL_inject_api_key, gql } from '../utils'; import { DocumentRenderer } from '../schema/fields/content/renderers'; import { Container } from '../components/ui/layout'; @@ -64,7 +64,7 @@ export default function Home({ posts }: { posts: Post[] }) { } export async function getStaticProps({ params }: GetStaticPropsContext) { - const data = await fetchGraphQL( + const data = await fetchGraphQL_inject_api_key( gql` query { posts( diff --git a/pages/post/[slug].tsx b/pages/post/[slug].tsx index 79a472c1..37bc36d1 100644 --- a/pages/post/[slug].tsx +++ b/pages/post/[slug].tsx @@ -1,7 +1,7 @@ import { GetStaticPathsResult, GetStaticPropsContext } from 'next'; import React from 'react'; -import { fetchGraphQL, gql } from '../../utils'; +import { fetchGraphQL_inject_api_key, gql } from '../../utils'; import { DocumentRenderer } from '../../schema/fields/content/renderers'; import { Container, HomeLink } from '../../components/ui/layout'; @@ -28,7 +28,7 @@ export default function Post({ post }: { post: any }) { } export async function getStaticPaths(): Promise { - const data = await fetchGraphQL( + const data = await fetchGraphQL_inject_api_key( gql` query { posts { @@ -44,7 +44,7 @@ export async function getStaticPaths(): Promise { } export async function getStaticProps({ params }: GetStaticPropsContext) { - const data = await fetchGraphQL( + const data = await fetchGraphQL_inject_api_key( gql` query ($slug: String!) { post(where: { slug: $slug }) { diff --git a/schema/access.ts b/schema/access.ts index f5ae7871..3dcf899b 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -2,7 +2,46 @@ import { KeystoneContext } from '.keystone/types'; import { useAuth } from '../components/auth'; import { keystoneNextjsBuildApiKey } from '../keystone'; -declare type MaybePromise = Promise | T; +import { + success, + warn, + report_security_incident, + report_error, +} from '../utils'; + +/* +export default config({ + lists: { + ListKey: list({ + access: { + item: { + create: ({ session, context, listKey, operation, inputData }) => true, + update: ({ session, context, listKey, operation, inputData, item }) => true, + delete: ({ session, context, listKey, operation, item }) => true, + } + }, + }), + }, +}); +``` + +?> Item-level access control is not available for `query` operations. +Applying access control after fetching items would lead to inconsistent pagination behaviour and incorrect `count` results. + +### Function Arguments + +List-level access control functions are passed a collection of arguments which can be used to determine whether the operation is allowed. + +| Argument | Description | +| ----------- | ------------------------------------------------------------------------------------------------------------- | +| `session` | The current session object. See the [Sessions API](./session) for details. | +| `context` | The [`KeystoneContext`](./context) object of the originating GraphQL operation. | +| `listKey` | The key of the list being operated on. | +| `operation` | The operation being performed (`'query'`, `'create'`, `'update'`, `'delete'`). | +| `inputData` | For `create` and `update` operations, this is the value of `data` passed into the mutation. (Item level only) | +| `item` | The existing item being updated/deleted in `update` and `delete` operations. (Item level only) | + +*/ export type SessionContext = { session?: { @@ -25,40 +64,21 @@ export type SessionFrame = { operation: string; }; -export type ItemContext = { item: any } & SessionContext; - -const unit = {}; -const rmap_va = - (...props: any) => - (f: any) => { - props.forEach((element: any) => { - f(element); - }); - }; - -let colors = require('colors/safe'); - -// Fix Me: Test code: Needs another home. -//This is one place where any means it! The intent was object dumping code, down to -//every leaf. A testground for DRY logging in ts. -// Closures are good for logging, localising to particular files/functions/lines ... the issues of this short segment quickly shows why. -// I have some multicol markup for logging, it bash though, so replaces console.log. -// A markup standard for shell would be useful. - -const log = (s: string) => console.log(s); - -const success = (...obj: any) => - rmap_va(obj)((x: any) => log(colors.green(x.toString()))); +export type KeystoneFrame = { + session: SessionContext; + context: KeystoneContext; + listKey: string; + operation: string; +}; -const warn = (...obj: any) => - rmap_va(obj)((x: any) => log(colors.yellow(x.toString()))); +export type KeystoneInputFrame = KeystoneFrame & { inputData: any }; +export type KeystoneInputItemFrame = KeystoneInputFrame & { item: any }; +export type KeystoneDeleteItemFrame = KeystoneFrame & { item: any }; -const report_security_incident = (...obj: any) => - rmap_va(obj)((x: any) => log(colors.red(x.toString()))); +export type ItemContext = { item: any } & SessionContext; //FIXME: Needs API key. export const isBuildEnvir = (frame: SessionFrame): boolean => { - const auth = useAuth(); if (frame.session === undefined) { //const headers = frame.context.req?.headers; //const host = headers ? headers['x-forwarded-host'] || headers['host'] : null; @@ -104,6 +124,8 @@ export const permissions = { canManageUsersSession: ({ session }: SessionContext): boolean => { return !!session?.data?.role?.canManageUsers; }, + canManageContentItem: (item: ItemContext): boolean => + !!item?.session?.data?.role?.canManageContent, }; export const operationCanManageContentList = (frame: SessionFrame) => @@ -172,6 +194,10 @@ export const FilterCanManageContentList = (frame: SessionFrame) => { //In testing, bad username password combinations were reporting auth failure //immediately. A delay of a few seconds has an improved security model. + + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Core Issues located: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // auth/src/index.ts and related files in keystone core are triggering some "any" issues. Strong typing is (strongly) recommended. + // e.g. const pageMiddleware: AdminUIConfig['pageMiddleware'] = async ({ context, isValidSession }) } //Needs shared secret, set in bash, imported via process.env, usage tested in the CI workflow, which act as the base spec for a container to run keystone/next in. if (isBuildEnvir(frame)) { diff --git a/schema/content.ts b/schema/content.ts index c73e7f99..366772c7 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -13,6 +13,10 @@ import { ItemContext, operationCanManageContentList, FilterCanManageContentList, + KeystoneInputFrame, + KeystoneInputItemFrame, + KeystoneDeleteItemFrame, + KeystoneFrame, } from './access'; import { componentBlocks } from '../schema/fields/content/components'; @@ -22,8 +26,8 @@ import { componentBlocks } from '../schema/fields/content/components'; // MaybeSessionFunction has something to do with the ts error. export const contentUIConfig = { - hideCreate: (session: any) => !permissions.canManageContent(session), - hideDelete: (session: any) => !permissions.canManageContent(session), + hideCreate: (session: any) => !permissions.canManageContentItem(session), + hideDelete: (session: any) => !permissions.canManageContentItem(session), itemView: { defaultFieldMode: (session: ItemContext) => permissions.canManageContentSession(session) ? 'edit' : 'read', diff --git a/utils.ts b/utils.ts index ee3772f7..2c2b6479 100644 --- a/utils.ts +++ b/utils.ts @@ -1,11 +1,106 @@ import { keystoneNextjsBuildApiKey } from './keystone'; +//Useful for monadic typing. WIP +const unit = {}; + +//Logical combinators +const ftrue = (a: any) => (b: any) => (c: any) => a(c); +const ffalse = (a: any) => (b: any) => b; +const fkeep = (a: any) => a; +const fcompose = (a: any) => (b: any) => (c: any) => a(b(c)); + +//Abstract away this very useful primitive into functional land +const funIf = (val: any) => (!!val ? ftrue : ffalse); +const keepIf = (val: any) => (!!val ? fkeep : ffalse); + +// WIP: monadic functions set a challange for typing in ts. For the moment any will have to do to get things moving +// FIXME: Strongly type me please! Basically its a string or a monad applied to a string, with the terminating string used to terminate props +// and additional input to the render function to abstract away the names. +// FIXME: Parameterise the type so that it becomes a general purpose monadic compiler. +// Note: Applicative anys are typesafe. + +const pure_string_monad = + (termPredicate: any) => + (termString: any) => + (transferFun: any) => + (renderFun: any) => + (state: string) => + (next_delta: string): any => + next_delta === termString + ? renderFun(termString)(state) + : pure_string_monad(termPredicate)(termString)(transferFun)(renderFun)( + transferFun(state)(next_delta) + ); + +const cmpString = (termString: string) => (next_delta: string) => + next_delta === termString; +const spaceJoinStrings = (a: string) => (b: string) => a + ' ' + b; + +const renderTailwind = (cname: string) => (tailwindCompositeStyle: string) => + cname + '=' + tailwindCompositeStyle; +const renderState = (cname: string) => (state: string) => state; +const renderLog = (cname: string) => (tailwindCompositeStyle: string) => + console.log(tailwindCompositeStyle); + +const tailwindMonad = + pure_string_monad(cmpString)('class')(spaceJoinStrings)(renderTailwind); + +//Specialise for each file +const emitLog = 'emitLog'; +const logMonadClos = (fileName: string) => + pure_string_monad(cmpString)(emitLog)(spaceJoinStrings)(renderLog); + +const utilsLog = logMonadClos('utils'); + +// The above is a fully featured monadic tailwind compiler :) + +//Very bad code, has to go soon. Monadic replacement. +const rmap_va = + (...props: any) => + (f: any) => { + props.forEach((element: any) => { + f(element); + }); + }; + +let colors = require('colors/safe'); + +// Fix Me: Test code: Needs another home. +//This is one place where any means it! The intent was object dumping code, down to +//every leaf. A testground for DRY logging in ts. +// Closures are good for logging, localising to particular files/functions/lines ... the issues of this short segment quickly shows why. +// I have some multicol markup for logging, it bash though, so replaces console.log. +// A markup standard for shell would be useful. + +const log = (s: string) => console.log(s); + +export const success = (...obj: any) => + rmap_va(obj)((x: any) => log(colors.green(x.toString()))); + +export const warn = (...obj: any) => + rmap_va(obj)((x: any) => log(colors.yellow(x.toString()))); + +export const report_security_incident = (...obj: any) => + rmap_va(obj)((x: any) => log(colors.red(x.toString()))); + +export const report_error = (...obj: any) => + rmap_va(obj)((x: any) => log(colors.red(x.toString()))); + export const gql = ([content]: TemplateStringsArray) => content; -export async function fetchGraphQL( +//Testing the new logging api. +export const localWarning = (a: string) => utilsLog(colors.yellow(a)); +export const localError = (a: string) => utilsLog(colors.red(a)); +export const localSuccess = (a: string) => utilsLog(colors.green(a)); + +export async function fetchGraphQL_inject_api_key( query: string, variables?: Record ) { + funIf(keystoneNextjsBuildApiKey.includes('keystone'))( + localWarning('utils: prototype api key: ' + keystoneNextjsBuildApiKey) + )(localSuccess('Next build triggered: Api key injected.'))(emitLog); + return fetch('http://localhost:3000/api/graphql', { method: 'POST', body: JSON.stringify({ query, variables }), From 03349beeca42edfe34dd27aadf31a13fe7eca2ad Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Wed, 13 Oct 2021 05:52:33 +0100 Subject: [PATCH 053/325] Monadic logging. Prototype api key warnings. Logging and base algebra. new home is utils --- utils.ts | 122 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 63 insertions(+), 59 deletions(-) diff --git a/utils.ts b/utils.ts index 2c2b6479..ecd89ec3 100644 --- a/utils.ts +++ b/utils.ts @@ -1,9 +1,39 @@ import { keystoneNextjsBuildApiKey } from './keystone'; +// Fix Me: Test code: Needs another home. +//This is one place where any means it! The intent was object dumping code, down to +//every leaf. A testground for DRY logging in ts. +// Closures are good for logging, localising to particular files/functions/lines ... the issues of this short segment quickly shows why. +// I have some multicol markup for logging, it bash though, so replaces console.log. +// A markup standard for shell would be useful. + +const log = (s: string) => console.log(s); +//Very bad code, has to go soon. Monadic replacement. +const rmap_va = + (...props: any) => + (f: any) => { + props.forEach((element: any) => { + f(element); + }); + }; + +let colors = require('colors/safe'); +export const success = (...obj: any) => + rmap_va(obj)((x: any) => log(colors.green(x.toString()))); + +export const warn = (...obj: any) => + rmap_va(obj)((x: any) => log(colors.yellow(x.toString()))); + +export const report_security_incident = (...obj: any) => + rmap_va(obj)((x: any) => log(colors.red(x.toString()))); + +export const report_error = (...obj: any) => + rmap_va(obj)((x: any) => log(colors.red(x.toString()))); + //Useful for monadic typing. WIP const unit = {}; -//Logical combinators +//Logical combinators: applicative, so type save. const ftrue = (a: any) => (b: any) => (c: any) => a(c); const ffalse = (a: any) => (b: any) => b; const fkeep = (a: any) => a; @@ -17,89 +47,63 @@ const keepIf = (val: any) => (!!val ? fkeep : ffalse); // FIXME: Strongly type me please! Basically its a string or a monad applied to a string, with the terminating string used to terminate props // and additional input to the render function to abstract away the names. // FIXME: Parameterise the type so that it becomes a general purpose monadic compiler. -// Note: Applicative anys are typesafe. - +// Note: Applicative anys are typesafe +// Very quickly, thanks to Church et al, all core ts operators have been abstracted into a functional algebra, forcing the use of primitives that are known to work in adverse situations. +// This lower the burnen of proof on security audits, since the code now has monadic/monoid structure, which is uniform to code in. const pure_string_monad = (termPredicate: any) => (termString: any) => (transferFun: any) => (renderFun: any) => (state: string) => - (next_delta: string): any => - next_delta === termString - ? renderFun(termString)(state) - : pure_string_monad(termPredicate)(termString)(transferFun)(renderFun)( - transferFun(state)(next_delta) - ); + (next_delta: string) => + termPredicate(next_delta)(termString)(renderFun(termString)(state))( + pure_string_monad(termPredicate)(termString)(transferFun)(renderFun)( + transferFun(state)(next_delta) + ) + ); + +const fcmpString = (termString: string) => (next_delta: string) => + funIf(next_delta === termString); -const cmpString = (termString: string) => (next_delta: string) => - next_delta === termString; const spaceJoinStrings = (a: string) => (b: string) => a + ' ' + b; const renderTailwind = (cname: string) => (tailwindCompositeStyle: string) => cname + '=' + tailwindCompositeStyle; -const renderState = (cname: string) => (state: string) => state; -const renderLog = (cname: string) => (tailwindCompositeStyle: string) => - console.log(tailwindCompositeStyle); - -const tailwindMonad = - pure_string_monad(cmpString)('class')(spaceJoinStrings)(renderTailwind); - -//Specialise for each file -const emitLog = 'emitLog'; -const logMonadClos = (fileName: string) => - pure_string_monad(cmpString)(emitLog)(spaceJoinStrings)(renderLog); -const utilsLog = logMonadClos('utils'); - -// The above is a fully featured monadic tailwind compiler :) - -//Very bad code, has to go soon. Monadic replacement. -const rmap_va = - (...props: any) => - (f: any) => { - props.forEach((element: any) => { - f(element); - }); - }; - -let colors = require('colors/safe'); - -// Fix Me: Test code: Needs another home. -//This is one place where any means it! The intent was object dumping code, down to -//every leaf. A testground for DRY logging in ts. -// Closures are good for logging, localising to particular files/functions/lines ... the issues of this short segment quickly shows why. -// I have some multicol markup for logging, it bash though, so replaces console.log. -// A markup standard for shell would be useful. +const renderState = (cname: string) => (state: string) => state; -const log = (s: string) => console.log(s); +export const renderLog = (cname: string) => (logLine: string) => + console.log(logLine); -export const success = (...obj: any) => - rmap_va(obj)((x: any) => log(colors.green(x.toString()))); +export const tailwindMonad = + pure_string_monad(fcmpString)('class')(spaceJoinStrings)(renderTailwind); -export const warn = (...obj: any) => - rmap_va(obj)((x: any) => log(colors.yellow(x.toString()))); +//Specialise for a file +export const logMonadClos = (fileName: string) => + pure_string_monad(fcmpString)(emitLog)(spaceJoinStrings)(renderLog); -export const report_security_incident = (...obj: any) => - rmap_va(obj)((x: any) => log(colors.red(x.toString()))); +export const successCol = colors.green; +export const warningCol = colors.yellow; +export const errorCol = colors.red; -export const report_error = (...obj: any) => - rmap_va(obj)((x: any) => log(colors.red(x.toString()))); +//Testing the new logging api. +const emitLog = 'emitLog'; +const utilsLog = logMonadClos('utils'); +const utilsWarning = (a: string) => utilsLog(warningCol(a)); +const utilsError = (a: string) => utilsLog(errorCol(a)); +const utilsSuccess = (a: string) => utilsLog(successCol(a)); +// The above is a fully featured monadic tailwind compiler :) export const gql = ([content]: TemplateStringsArray) => content; -//Testing the new logging api. -export const localWarning = (a: string) => utilsLog(colors.yellow(a)); -export const localError = (a: string) => utilsLog(colors.red(a)); -export const localSuccess = (a: string) => utilsLog(colors.green(a)); - export async function fetchGraphQL_inject_api_key( query: string, variables?: Record ) { funIf(keystoneNextjsBuildApiKey.includes('keystone'))( - localWarning('utils: prototype api key: ' + keystoneNextjsBuildApiKey) - )(localSuccess('Next build triggered: Api key injected.'))(emitLog); + utilsWarning('utils: prototype api key: ' + keystoneNextjsBuildApiKey) + )(utilsSuccess('Next build triggered: Api key injected.'))(emitLog); return fetch('http://localhost:3000/api/graphql', { method: 'POST', From 86debd8d5b7db59ca1570f3b48ede99f7dd93466 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Wed, 13 Oct 2021 06:32:25 +0100 Subject: [PATCH 054/325] Pre: api key decode --- README.md | 9 ++++++++- schema/access.ts | 10 ++++++++++ utils.ts | 2 +- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a0d98881..2c76b4b5 100644 --- a/README.md +++ b/README.md @@ -90,15 +90,22 @@ Deductive filtering correctly identifies browswer based localhost traffic in tes Next build super user authorization to keystone, allowing for SSR/SSG/ISR tunneling. USE CASE: TESTING BUILD FUNCTIONALITY ONLY. -Api key connected to workflow. Injected into provably correct location, in utils.ts. +Api key connected to workflow. Injected into a better location, in utils.ts. +Self descriptive localised logging: Nonclemanture: Pure functional, but with caveats: + Trying to find optimal mix of pure functional code and useful ts semantics. Pre production testing release status: Admin UI Authorization has passed preliminary testing. DRY permissions. Rules deprecation. Some tidying up stil to be done. Ready for exhaustive testing. +Issues: Code can siliently fail in the ?. chain. +The ?. construction is convenient, but not suitable for production logging, error trapping. +To be replaced with a maybe sytle monad. + The current implementation of build process api's is a hack. A shout out to Jed for explaining the keystone way. WIP. It has passed only the most preliminary of security tests, determining localhost web from build, i.e. a proof of concept. +Now to get it all linked up ... one last push! Additional KeystoneContext auth information and a shared API key, set in via process .env: needs to be correctly handed down in the headers to the last line of defense, access: filter. diff --git a/schema/access.ts b/schema/access.ts index 3dcf899b..fdaa8d0c 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -7,8 +7,18 @@ import { warn, report_security_incident, report_error, + logMonadClos, + successCol, + warningCol, + errorCol, + emitLog, } from '../utils'; +const localLog = logMonadClos('access'); +const localWarning = (a: string) => localLog(warningCol(a)); +const localError = (a: string) => localLog(errorCol(a)); +const localSuccess = (a: string) => localLog(successCol(a)); + /* export default config({ lists: { diff --git a/utils.ts b/utils.ts index ecd89ec3..2b47cd4f 100644 --- a/utils.ts +++ b/utils.ts @@ -88,7 +88,7 @@ export const warningCol = colors.yellow; export const errorCol = colors.red; //Testing the new logging api. -const emitLog = 'emitLog'; +export const emitLog = 'emitLog'; const utilsLog = logMonadClos('utils'); const utilsWarning = (a: string) => utilsLog(warningCol(a)); const utilsError = (a: string) => utilsLog(errorCol(a)); From bff6c399c172919068ba25c0891170f407a81f0f Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Wed, 13 Oct 2021 06:37:01 +0100 Subject: [PATCH 055/325] Rollback: build error --- schema/access.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/schema/access.ts b/schema/access.ts index fdaa8d0c..90474cdd 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -14,11 +14,6 @@ import { emitLog, } from '../utils'; -const localLog = logMonadClos('access'); -const localWarning = (a: string) => localLog(warningCol(a)); -const localError = (a: string) => localLog(errorCol(a)); -const localSuccess = (a: string) => localLog(successCol(a)); - /* export default config({ lists: { From 62e3257a1a965b29c2c476b48007fd4e9381e88d Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Wed, 13 Oct 2021 08:57:09 +0100 Subject: [PATCH 056/325] Known Issues:Next build api key tunnel working. --- README.md | 48 +++++++++++++++-------------- schema/access.ts | 77 +++++++++++++++++++++++++++++------------------ schema/content.ts | 7 ++--- schema/users.ts | 2 +- utils.ts | 33 ++++++++++++-------- 5 files changed, 96 insertions(+), 71 deletions(-) diff --git a/README.md b/README.md index 2c76b4b5..66600155 100644 --- a/README.md +++ b/README.md @@ -71,47 +71,49 @@ CI: Github actions in testing. Unseeded build. yarn commit "message" ... adds files and commits. yarn push ... (auto push to origin latest) ``` -Known Issues: -Authorization: WIP. Strong typing keystone frame types. -Test code in access has to find a new home. +✅ Authorization: Strong typing keystone frame types (bar one C++ style typecast) -Refactor literals. +✅ Test code in access has a new temporary home in utils. -How to code where: true/false in gql without touching keystone core code. -Extend WhereInput to be WhereInput | true | false ... is yet to be tested as a patch to core. Can this work as a local patch? To be investigated ... -Production build status: +Production build status: ✅ Pre release: Testing. + ``` -Deductive filtering correctly identifies browswer based localhost traffic in testing. +✅ Next build super user authorization to keystone, allowing for SSR/SSG/ISR tunneling. + A shout out to Jed for explaining the keystone way. -Next build super user authorization to keystone, allowing for SSR/SSG/ISR tunneling. - USE CASE: TESTING BUILD FUNCTIONALITY ONLY. +✅ Next build api key: tested and working -Api key connected to workflow. Injected into a better location, in utils.ts. -Self descriptive localised logging: Nonclemanture: Pure functional, but with caveats: - Trying to find optimal mix of pure functional code and useful ts semantics. +✅ Api key connected to workflow. -Pre production testing release status: - Admin UI Authorization has passed preliminary testing. - DRY permissions. Rules deprecation. Some tidying up stil to be done. - Ready for exhaustive testing. +✅ Pre production testing release status: +✅ Admin UI Authorization has passed preliminary testing. -Issues: Code can siliently fail in the ?. chain. +✅ Ready for exhaustive testing. Bug reports welcome! +``` + +``` +Known Issues: +Refactor literals. + +Code can siliently fail in a ?. chain. The ?. construction is convenient, but not suitable for production logging, error trapping. To be replaced with a maybe sytle monad. -The current implementation of build process api's is a hack. A shout out to Jed for explaining the keystone way. WIP. -It has passed only the most preliminary of security tests, determining localhost web from build, i.e. a proof of concept. -Now to get it all linked up ... one last push! +How to code where: true/false in gql without touching keystone core code. -Additional KeystoneContext auth information and a shared API key, set in via process .env: - needs to be correctly handed down in the headers to the last line of defense, access: filter. +Extend WhereInput to be WhereInput | true | false ... is yet to be tested as a patch to core. Can this work as a local patch? To be investigated ... +Self descriptive localised logging: Nonclemanture: Pure functional, but with caveats: + Trying to find optimal mix of pure functional code and useful ts semantics. + DRY permissions. Some tidying up stil to be done. WIP ``` + + Additional functionality from upstream main: ``` Polls fully working. diff --git a/schema/access.ts b/schema/access.ts index 90474cdd..d35333b4 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -1,5 +1,8 @@ import { KeystoneContext } from '.keystone/types'; -import { useAuth } from '../components/auth'; +import { + BaseGeneratedListTypes, + ListFilterAccessControl, +} from '@keystone-next/keystone/types'; import { keystoneNextjsBuildApiKey } from '../keystone'; import { @@ -62,50 +65,66 @@ export type SessionContext = { }; }; -export type SessionFrame = { - session: ItemContext; - context: SessionContext; +declare type BaseAccessArgs = { + session: any; listKey: string; - operation: string; + context: KeystoneContext; }; -export type KeystoneFrame = { - session: SessionContext; - context: KeystoneContext; +export type SessionFrame = { + session: ItemContext; + context: SessionContext; listKey: string; operation: string; }; -export type KeystoneInputFrame = KeystoneFrame & { inputData: any }; -export type KeystoneInputItemFrame = KeystoneInputFrame & { item: any }; -export type KeystoneDeleteItemFrame = KeystoneFrame & { item: any }; +export type xSessionFrame = BaseAccessArgs & { operation: string }; + +export type FilterQueryFrame = ListFilterAccessControl< + 'query', + BaseGeneratedListTypes +>; +export type FilterUpdateFrame = ListFilterAccessControl< + 'update', + BaseGeneratedListTypes +>; +export type FilterDeleteFrame = ListFilterAccessControl< + 'delete', + BaseGeneratedListTypes +>; + +export type FilterFrame = + | FilterQueryFrame + | FilterUpdateFrame + | FilterDeleteFrame; export type ItemContext = { item: any } & SessionContext; //FIXME: Needs API key. export const isBuildEnvir = (frame: SessionFrame): boolean => { - if (frame.session === undefined) { + if (frame?.session === undefined) { //const headers = frame.context.req?.headers; //const host = headers ? headers['x-forwarded-host'] || headers['host'] : null; //const url = headers?.referer ? new URL(headers.referer) : undefined; - warn('access::isBuildEnvir: authentication breach:'); - //warn( headers) - //warn(host) - //warn(url) - - warn('undefined frame.session:'); - warn('Assuming a next build event:'); - warn( - 'Assumed next build authentication breach: Will bless next build with super user queries:' - ); - //Massive security hole to be fixed with a shared secret. - - warn( - 'Blessed super user access to next build: (without API token: Do not deploy yet.)' - ); - //localWarn("withKeysone code", withKeystone) - return true; + let kontext = frame?.context as KeystoneContext; + let recvApiKey = kontext?.req?.headers['x-api-key']; + + if (recvApiKey === keystoneNextjsBuildApiKey) { + if (recvApiKey.includes('keystone')) { + warn('access: prototype api key: ' + recvApiKey); + } + success( + 'access::isBuildEnvir: next build: api key matches: granting super user query access.' + ); + return true; + } else { + warn('access::isBuildEnvir: authentication breach:'); + success( + 'access::isBuildEnvir: no additional authorisation granted to breach.' + ); + return false; + } } return false; }; diff --git a/schema/content.ts b/schema/content.ts index 366772c7..f5280e33 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -9,14 +9,11 @@ import { list } from '@keystone-next/keystone'; import { permissions, - SessionFrame, ItemContext, operationCanManageContentList, FilterCanManageContentList, - KeystoneInputFrame, - KeystoneInputItemFrame, - KeystoneDeleteItemFrame, - KeystoneFrame, + FilterQueryFrame, + SessionFrame, } from './access'; import { componentBlocks } from '../schema/fields/content/components'; diff --git a/schema/users.ts b/schema/users.ts index 2612b0c1..ad73dd61 100644 --- a/schema/users.ts +++ b/schema/users.ts @@ -12,8 +12,8 @@ import { list } from '@keystone-next/keystone'; import { permissions, SessionContext, - SessionFrame, ItemContext, + SessionFrame, } from './access'; import { GitHubRepo, githubReposResolver } from './fields/githubRepos/field'; diff --git a/utils.ts b/utils.ts index 2b47cd4f..c78bab97 100644 --- a/utils.ts +++ b/utils.ts @@ -31,17 +31,17 @@ export const report_error = (...obj: any) => rmap_va(obj)((x: any) => log(colors.red(x.toString()))); //Useful for monadic typing. WIP -const unit = {}; +export const unit = {}; //Logical combinators: applicative, so type save. -const ftrue = (a: any) => (b: any) => (c: any) => a(c); -const ffalse = (a: any) => (b: any) => b; -const fkeep = (a: any) => a; -const fcompose = (a: any) => (b: any) => (c: any) => a(b(c)); +export const ftrue = (a: any) => (b: any) => (c: any) => a(c); +export const ffalse = (a: any) => (b: any) => b; +export const fkeep = (a: any) => a; +export const fcompose = (a: any) => (b: any) => (c: any) => a(b(c)); //Abstract away this very useful primitive into functional land -const funIf = (val: any) => (!!val ? ftrue : ffalse); -const keepIf = (val: any) => (!!val ? fkeep : ffalse); +export const funIf = (val: any) => (!!val ? ftrue : ffalse); +export const keepIf = (val: any) => (!!val ? fkeep : ffalse); // WIP: monadic functions set a challange for typing in ts. For the moment any will have to do to get things moving // FIXME: Strongly type me please! Basically its a string or a monad applied to a string, with the terminating string used to terminate props @@ -50,7 +50,7 @@ const keepIf = (val: any) => (!!val ? fkeep : ffalse); // Note: Applicative anys are typesafe // Very quickly, thanks to Church et al, all core ts operators have been abstracted into a functional algebra, forcing the use of primitives that are known to work in adverse situations. // This lower the burnen of proof on security audits, since the code now has monadic/monoid structure, which is uniform to code in. -const pure_string_monad = +export const pure_string_monad = (termPredicate: any) => (termString: any) => (transferFun: any) => @@ -63,15 +63,16 @@ const pure_string_monad = ) ); -const fcmpString = (termString: string) => (next_delta: string) => +export const fcmpString = (termString: string) => (next_delta: string) => funIf(next_delta === termString); -const spaceJoinStrings = (a: string) => (b: string) => a + ' ' + b; +export const spaceJoinStrings = (a: string) => (b: string) => a + ' ' + b; -const renderTailwind = (cname: string) => (tailwindCompositeStyle: string) => - cname + '=' + tailwindCompositeStyle; +export const renderTailwind = + (cname: string) => (tailwindCompositeStyle: string) => + cname + '=' + tailwindCompositeStyle; -const renderState = (cname: string) => (state: string) => state; +export const renderState = (cname: string) => (state: string) => state; export const renderLog = (cname: string) => (logLine: string) => console.log(logLine); @@ -89,12 +90,18 @@ export const errorCol = colors.red; //Testing the new logging api. export const emitLog = 'emitLog'; + const utilsLog = logMonadClos('utils'); const utilsWarning = (a: string) => utilsLog(warningCol(a)); const utilsError = (a: string) => utilsLog(errorCol(a)); const utilsSuccess = (a: string) => utilsLog(successCol(a)); // The above is a fully featured monadic tailwind compiler :) +const accessLog = logMonadClos('access'); +const accessWarning = (a: string) => accessLog(warningCol(a)); +const accessError = (a: string) => accessLog(errorCol(a)); +const accessSuccess = (a: string) => accessLog(successCol(a)); + export const gql = ([content]: TemplateStringsArray) => content; export async function fetchGraphQL_inject_api_key( From 004d35b2edfa5770192e0ca5db1b0588459b1408 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Wed, 13 Oct 2021 09:00:34 +0100 Subject: [PATCH 057/325] Next build API key authorization tested and working. --- schema/content.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/schema/content.ts b/schema/content.ts index f5280e33..33b4d59d 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -12,7 +12,6 @@ import { ItemContext, operationCanManageContentList, FilterCanManageContentList, - FilterQueryFrame, SessionFrame, } from './access'; import { componentBlocks } from '../schema/fields/content/components'; From 68459ef2af43c336c550b70d7627d3ec9902febe Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Wed, 13 Oct 2021 23:09:34 +0100 Subject: [PATCH 058/325] Refactor logging. --- README.md | 49 +++++++++++++++-- schema/access.ts | 6 --- utils.ts | 134 +++++++++++++++++------------------------------ 3 files changed, 92 insertions(+), 97 deletions(-) diff --git a/README.md b/README.md index 66600155..a173d52b 100644 --- a/README.md +++ b/README.md @@ -95,6 +95,48 @@ Production build status: ✅ Pre release: Testing. ✅ Ready for exhaustive testing. Bug reports welcome! ``` +## Security audit +Status: Preliminary. +✅ More informative logging, suitable for deployment. + Code coverage: partial + +Low level ts/js security audit: Research and development has established many bugs hide in the rampantly polymorphic `any` type. + +This dangerous construct is used in upstream auth. Roughly 50% of these situations reveals an unhandled case, hidden from lint. + +Currently developing a reader friendly notation for the rather awkward ts functional notation, to try to find ways to eliminte `any`. The most readable so far appears to be: + +export const fcompose = (a: (maps: B) => A) => (b: (maps: C) => B) => (c: C) => + a(b(c)); + +and for cartestian products: + +transferFun: (maps: T) => (cross: T) => T + +obviously we would much rather write: + +transferFun: T => T => T, + +but its a bit odd to, at least the ts reads a bit like the indended + + transferFun: maps T cross T to T, + +just the brackets are all in the wrong place. + +The issue is we have to name variables for types which are not instantiated, and naming things is hard. + +Using this convention, a free grammar is pinned down, in which the two new constructs make sense, and the rather clunky type specifications almost become readable, a bit like what tailwind does to css. cross is preferred to x: or X:. At first these looked good, then they didn't. x and X are heavily overused names. + +When reviewing code, it can be hard to tell these dummy parameter names from important ones. That's the real point of this comment. + +The other problem is that (a: T) is not the same as (a: any). The templated class can't echo undefined types, but `any` can! Another point is that as soon as `any` is used, the code becomes ... javascript. No more needs to be said. My mission against `any` is more than fully justified. However, some functional code doesn't seem to work properly without the total polymorphism `any` allows, and some ts functional code looks fine, ... but bizarrely doesn't work in all contexts. It might have to do with the inner depths of js module linkage. The places audits have to go! + +There is also a dodgy C++ style cast, right where it's not needed ... TBC. + +Is it my imagination, or does C++ `auto` work better than `any`? What we really need is `auto` in ts, to avoid unecessary templating. + +With these caveats in mind, enjoy. + ``` Known Issues: Refactor literals. @@ -107,9 +149,6 @@ How to code where: true/false in gql without touching keystone core code. Extend WhereInput to be WhereInput | true | false ... is yet to be tested as a patch to core. Can this work as a local patch? To be investigated ... -Self descriptive localised logging: Nonclemanture: Pure functional, but with caveats: - Trying to find optimal mix of pure functional code and useful ts semantics. - DRY permissions. Some tidying up stil to be done. WIP ``` @@ -118,10 +157,12 @@ Additional functionality from upstream main: ``` Polls fully working. Production build: + Detailed logging: WIP next lint tailwind purge telemetry disable - CI scripts: WIP + x-api-key for next build events + CI scripts: WIP: Seeding Prettier applied in gitadd. ``` diff --git a/schema/access.ts b/schema/access.ts index d35333b4..b03657f1 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -10,11 +10,6 @@ import { warn, report_security_incident, report_error, - logMonadClos, - successCol, - warningCol, - errorCol, - emitLog, } from '../utils'; /* @@ -233,7 +228,6 @@ export const FilterCanManageContentList = (frame: SessionFrame) => { if (!!frame.context.session?.data?.role?.canManageContent) { success('Blessed super user access to the known content manager:'); success(frame?.context?.session?.data?.name); - success(''); return EVERY_POST_STATUS; } diff --git a/utils.ts b/utils.ts index c78bab97..01226e25 100644 --- a/utils.ts +++ b/utils.ts @@ -1,4 +1,5 @@ import { keystoneNextjsBuildApiKey } from './keystone'; +let colors = require('colors/safe'); // Fix Me: Test code: Needs another home. //This is one place where any means it! The intent was object dumping code, down to @@ -7,100 +8,57 @@ import { keystoneNextjsBuildApiKey } from './keystone'; // I have some multicol markup for logging, it bash though, so replaces console.log. // A markup standard for shell would be useful. -const log = (s: string) => console.log(s); -//Very bad code, has to go soon. Monadic replacement. -const rmap_va = - (...props: any) => - (f: any) => { - props.forEach((element: any) => { - f(element); - }); - }; +//const log = (s: string) => console.log(s); +//Reverse mapping for var args, rest parameters ... handy but slightly disfunctional, forEach is not strongly typed. + +export const successCol = colors.green; +export const warningCol = colors.yellow; +export const errorCol = colors.red; + +const logContextInfo = (msg: string) => { + const e = new Error(); + const errmsg = 'Unknown line and file!!'; + const sep = ': '; + if (!e.stack) return errmsg; + + const regex = /\((.*):(\d+):(\d+)\)$/; + const match = regex.exec(e?.stack?.split('\n')[2]); + const info = match + ? Date() + sep + match[1] + sep + match[2] + sep + match[3] + : errmsg; + + console.log(info + sep + msg); +}; + +export const log = { + warning: (a: any) => logContextInfo(warningCol(a.toString())), + error: (a: any) => logContextInfo(errorCol(a.toString())), + success: (a: any) => logContextInfo(successCol(a.toString())), +}; + +//Right monadic action on vargs. +const ract_va = + (...props: Tprops[]) => + (f: (maps: Tprops) => void) => + props.forEach((x: Tprops) => f(x)); -let colors = require('colors/safe'); export const success = (...obj: any) => - rmap_va(obj)((x: any) => log(colors.green(x.toString()))); + ract_va(obj)((x: any) => log.success(x)); -export const warn = (...obj: any) => - rmap_va(obj)((x: any) => log(colors.yellow(x.toString()))); +export const warn = (...obj: any) => ract_va(obj)((x: any) => log.warning(x)); export const report_security_incident = (...obj: any) => - rmap_va(obj)((x: any) => log(colors.red(x.toString()))); + ract_va(obj)((x: any) => log.warning(x)); export const report_error = (...obj: any) => - rmap_va(obj)((x: any) => log(colors.red(x.toString()))); - -//Useful for monadic typing. WIP -export const unit = {}; - -//Logical combinators: applicative, so type save. -export const ftrue = (a: any) => (b: any) => (c: any) => a(c); -export const ffalse = (a: any) => (b: any) => b; -export const fkeep = (a: any) => a; -export const fcompose = (a: any) => (b: any) => (c: any) => a(b(c)); - -//Abstract away this very useful primitive into functional land -export const funIf = (val: any) => (!!val ? ftrue : ffalse); -export const keepIf = (val: any) => (!!val ? fkeep : ffalse); - -// WIP: monadic functions set a challange for typing in ts. For the moment any will have to do to get things moving -// FIXME: Strongly type me please! Basically its a string or a monad applied to a string, with the terminating string used to terminate props -// and additional input to the render function to abstract away the names. -// FIXME: Parameterise the type so that it becomes a general purpose monadic compiler. -// Note: Applicative anys are typesafe -// Very quickly, thanks to Church et al, all core ts operators have been abstracted into a functional algebra, forcing the use of primitives that are known to work in adverse situations. -// This lower the burnen of proof on security audits, since the code now has monadic/monoid structure, which is uniform to code in. -export const pure_string_monad = - (termPredicate: any) => - (termString: any) => - (transferFun: any) => - (renderFun: any) => - (state: string) => - (next_delta: string) => - termPredicate(next_delta)(termString)(renderFun(termString)(state))( - pure_string_monad(termPredicate)(termString)(transferFun)(renderFun)( - transferFun(state)(next_delta) - ) - ); - -export const fcmpString = (termString: string) => (next_delta: string) => - funIf(next_delta === termString); - -export const spaceJoinStrings = (a: string) => (b: string) => a + ' ' + b; - -export const renderTailwind = - (cname: string) => (tailwindCompositeStyle: string) => - cname + '=' + tailwindCompositeStyle; - -export const renderState = (cname: string) => (state: string) => state; - -export const renderLog = (cname: string) => (logLine: string) => - console.log(logLine); - -export const tailwindMonad = - pure_string_monad(fcmpString)('class')(spaceJoinStrings)(renderTailwind); - -//Specialise for a file -export const logMonadClos = (fileName: string) => - pure_string_monad(fcmpString)(emitLog)(spaceJoinStrings)(renderLog); - -export const successCol = colors.green; -export const warningCol = colors.yellow; -export const errorCol = colors.red; + ract_va(obj)((x: any) => log.error(x)); //Testing the new logging api. -export const emitLog = 'emitLog'; - -const utilsLog = logMonadClos('utils'); -const utilsWarning = (a: string) => utilsLog(warningCol(a)); -const utilsError = (a: string) => utilsLog(errorCol(a)); -const utilsSuccess = (a: string) => utilsLog(successCol(a)); -// The above is a fully featured monadic tailwind compiler :) +export const endLog = 'endLog'; -const accessLog = logMonadClos('access'); -const accessWarning = (a: string) => accessLog(warningCol(a)); -const accessError = (a: string) => accessLog(errorCol(a)); -const accessSuccess = (a: string) => accessLog(successCol(a)); +const utilsWarning = (a: string) => logContextInfo(warningCol(a)); +const utilsError = (a: string) => logContextInfo(errorCol(a)); +const utilsSuccess = (a: string) => logContextInfo(successCol(a)); export const gql = ([content]: TemplateStringsArray) => content; @@ -108,9 +66,11 @@ export async function fetchGraphQL_inject_api_key( query: string, variables?: Record ) { - funIf(keystoneNextjsBuildApiKey.includes('keystone'))( - utilsWarning('utils: prototype api key: ' + keystoneNextjsBuildApiKey) - )(utilsSuccess('Next build triggered: Api key injected.'))(emitLog); + keystoneNextjsBuildApiKey.includes('keystone') + ? utilsWarning('Prototype api key: ' + keystoneNextjsBuildApiKey) + : utilsSuccess( + 'Next build triggered: Api key injected into x-api-key headers.' + ); return fetch('http://localhost:3000/api/graphql', { method: 'POST', From fb49da72dc679eaf803aa4b0b75b151714e9ba29 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Wed, 13 Oct 2021 23:12:50 +0100 Subject: [PATCH 059/325] Refactored logging. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a173d52b..bd6f6b0f 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,8 @@ Production build status: ✅ Pre release: Testing. ## Security audit Status: Preliminary. -✅ More informative logging, suitable for deployment. + +More informative logging, suitable for deployment. Code coverage: partial Low level ts/js security audit: Research and development has established many bugs hide in the rampantly polymorphic `any` type. From 9af9f516373072b9e9a5120f5ae5294ab5684cbf Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Wed, 13 Oct 2021 23:32:53 +0100 Subject: [PATCH 060/325] README --- README.md | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index bd6f6b0f..9809c953 100644 --- a/README.md +++ b/README.md @@ -96,47 +96,60 @@ Production build status: ✅ Pre release: Testing. ``` ## Security audit -Status: Preliminary. +Status: `Preliminary`. More informative logging, suitable for deployment. - Code coverage: partial + `Code coverage: partial` +`any` issues: Low level ts/js security audit: Research and development has established many bugs hide in the rampantly polymorphic `any` type. -This dangerous construct is used in upstream auth. Roughly 50% of these situations reveals an unhandled case, hidden from lint. +This `dangerous construct` is used in upstream auth. Roughly + +``` +50% of these situations reveals an unhandled case, hidden from lint. +``` Currently developing a reader friendly notation for the rather awkward ts functional notation, to try to find ways to eliminte `any`. The most readable so far appears to be: -export const fcompose = (a: (maps: B) => A) => (b: (maps: C) => B) => (c: C) => - a(b(c)); +`export const fcompose = (a: (maps: B) => A) => (b: (maps: C) => B) => (c: C) => + a(b(c))` and for cartestian products: -transferFun: (maps: T) => (cross: T) => T + `transferFun: (maps: T) => (cross: T) => T` -obviously we would much rather write: +obviously we would rather write: -transferFun: T => T => T, + `transferFun: T => T => T,` -but its a bit odd to, at least the ts reads a bit like the indended +but its a bit odd to, at least the ts reads a bit like the intended, - transferFun: maps T cross T to T, + `transferFun: maps T cross T to T,` -just the brackets are all in the wrong place. +just all the brackets are in the wrong place for the eye to flow smoothly over it. -The issue is we have to name variables for types which are not instantiated, and naming things is hard. +The issue here is we have to name variables for types which are `not instantiated`, and `naming things is hard`. -Using this convention, a free grammar is pinned down, in which the two new constructs make sense, and the rather clunky type specifications almost become readable, a bit like what tailwind does to css. cross is preferred to x: or X:. At first these looked good, then they didn't. x and X are heavily overused names. +Using this convention, a free grammar is pinned down, in which the two new constructs make sense, and the rather clunky type specifications almost become readable, a bit like what tailwind does to css. cross is preferred for short defintions, opposed to x: or X:. At first these both looked excellent options, then they didn't. x is heavily overused. So of the two X looks better, but is in caps, I vote it runner up, and perhaps optimal for long type definitions. X in maths means the same thing, as does cross. + +But when printed, the shorter + `transferFun: (maps: T) => (X: T) => T` + +doesn't seem to read as well as + `transferFun: (maps: T) => (cross: T) => T` When reviewing code, it can be hard to tell these dummy parameter names from important ones. That's the real point of this comment. -The other problem is that (a: T) is not the same as (a: any). The templated class can't echo undefined types, but `any` can! Another point is that as soon as `any` is used, the code becomes ... javascript. No more needs to be said. My mission against `any` is more than fully justified. However, some functional code doesn't seem to work properly without the total polymorphism `any` allows, and some ts functional code looks fine, ... but bizarrely doesn't work in all contexts. It might have to do with the inner depths of js module linkage. The places audits have to go! +The other problem is that (a: T) is not the same as (a: any). The templated class can't echo undefined types, but `any` can! Another point is that as soon as `any` is used, the code becomes ... javascript. No more needs to be said. My mission against `any` is more than fully justified. + +However, some functional code doesn't seem to work properly without the total polymorphism `any` allows, and some ts functional code looks fine, ... but bizarrely doesn't work in all contexts. It might have to do with the inner depths of js module linkage. The places audits have to go ... -There is also a dodgy C++ style cast, right where it's not needed ... TBC. +There is also a `dodgy C++ style cast`, right where it's not needed ... `TBC`. Is it my imagination, or does C++ `auto` work better than `any`? What we really need is `auto` in ts, to avoid unecessary templating. -With these caveats in mind, enjoy. +With these caveats in mind, enjoy, and be fully aware it is in a `testing` phase. ``` Known Issues: From d40eb26b6c2dd2090113ac5984539e97a4e66df5 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Wed, 13 Oct 2021 23:36:41 +0100 Subject: [PATCH 061/325] CI: commit: yarn site:build && ... --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6d6b7445..e43cf941 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "clean": "rm -rf node_modules yarn.lock .keystone .next", "gitadd": "yarn format && git add . ||:", - "commit": "yarn gitadd && git commit -a -m ", + "commit": "yarn site:build && yarn gitadd && git commit -a -m ", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable && yarn next lint", "site:dev": "next dev -p 8000", From cd2aeeb37107f0a58f6bb3b5fd22fa7155833267 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Thu, 14 Oct 2021 03:34:47 +0100 Subject: [PATCH 062/325] build error: Cannot access 'operationCanManageContentList' before initialization --- next-env.d.ts | 12 ++-- schema/access.ts | 136 ++++++++++++++++------------------------------ schema/content.ts | 13 ++++- utils.ts | 2 +- 4 files changed, 63 insertions(+), 100 deletions(-) diff --git a/next-env.d.ts b/next-env.d.ts index 9bc3dd46..534a39ea 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,6 +1,6 @@ -/// -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +/// +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/schema/access.ts b/schema/access.ts index b03657f1..185053a5 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -1,8 +1,5 @@ import { KeystoneContext } from '.keystone/types'; -import { - BaseGeneratedListTypes, - ListFilterAccessControl, -} from '@keystone-next/keystone/types'; + import { keystoneNextjsBuildApiKey } from '../keystone'; import { @@ -12,39 +9,11 @@ import { report_error, } from '../utils'; -/* -export default config({ - lists: { - ListKey: list({ - access: { - item: { - create: ({ session, context, listKey, operation, inputData }) => true, - update: ({ session, context, listKey, operation, inputData, item }) => true, - delete: ({ session, context, listKey, operation, item }) => true, - } - }, - }), - }, -}); -``` - -?> Item-level access control is not available for `query` operations. -Applying access control after fetching items would lead to inconsistent pagination behaviour and incorrect `count` results. - -### Function Arguments - -List-level access control functions are passed a collection of arguments which can be used to determine whether the operation is allowed. - -| Argument | Description | -| ----------- | ------------------------------------------------------------------------------------------------------------- | -| `session` | The current session object. See the [Sessions API](./session) for details. | -| `context` | The [`KeystoneContext`](./context) object of the originating GraphQL operation. | -| `listKey` | The key of the list being operated on. | -| `operation` | The operation being performed (`'query'`, `'create'`, `'update'`, `'delete'`). | -| `inputData` | For `create` and `update` operations, this is the value of `data` passed into the mutation. (Item level only) | -| `item` | The existing item being updated/deleted in `update` and `delete` operations. (Item level only) | - -*/ +import { + PUBLISHED, + DRAFT, + ARCHIVED +} from './content' export type SessionContext = { session?: { @@ -60,11 +29,6 @@ export type SessionContext = { }; }; -declare type BaseAccessArgs = { - session: any; - listKey: string; - context: KeystoneContext; -}; export type SessionFrame = { session: ItemContext; @@ -73,35 +37,16 @@ export type SessionFrame = { operation: string; }; -export type xSessionFrame = BaseAccessArgs & { operation: string }; - -export type FilterQueryFrame = ListFilterAccessControl< - 'query', - BaseGeneratedListTypes ->; -export type FilterUpdateFrame = ListFilterAccessControl< - 'update', - BaseGeneratedListTypes ->; -export type FilterDeleteFrame = ListFilterAccessControl< - 'delete', - BaseGeneratedListTypes ->; - -export type FilterFrame = - | FilterQueryFrame - | FilterUpdateFrame - | FilterDeleteFrame; export type ItemContext = { item: any } & SessionContext; //FIXME: Needs API key. export const isBuildEnvir = (frame: SessionFrame): boolean => { if (frame?.session === undefined) { - //const headers = frame.context.req?.headers; - //const host = headers ? headers['x-forwarded-host'] || headers['host'] : null; - //const url = headers?.referer ? new URL(headers.referer) : undefined; + // It's a bit confusing as to why this dodgy cast is needed. It took ages to get api keys working because of the + // obscuriy of the workaround. + // The top level query prefers SessionFrame, and does not build against KeystoneFrame (same, bar KeystoneContext for context) let kontext = frame?.context as KeystoneContext; let recvApiKey = kontext?.req?.headers['x-api-key']; @@ -129,6 +74,7 @@ export const isSignedIn = ({ session }: SessionContext) => { }; //!! and ?. everywhere to protect from undefined. ts picks this up unless any is used. +//They can't easy be expressed in terms of the more elementary functions either. undefined issues. export const permissions = { canUseAdminUI: ({ session }: SessionContext): boolean => !!session?.data?.role, @@ -139,22 +85,30 @@ export const permissions = { canManageContentSession: ({ session }: SessionContext): boolean => { return !!session?.data?.role?.canManageContent; - }, + }, + canManageContentItem: (item: ItemContext): boolean => + !!item?.session?.data?.role?.canManageContent, + + canManageUsersSession: ({ session }: SessionContext): boolean => { return !!session?.data?.role?.canManageUsers; }, - canManageContentItem: (item: ItemContext): boolean => - !!item?.session?.data?.role?.canManageContent, + }; export const operationCanManageContentList = (frame: SessionFrame) => permissions.canManageContent(frame); +//This is the fastest workaround I could find for not being able to return (where:) true (all records), or false (for no records). + + + export const EVERY_POST_STATUS = { - status: { in: ['published', 'draft', 'archive'] }, + status: { in: [PUBLISHED, DRAFT, ARCHIVED] }, }; -export const UNIT_POST_STATUS = { status: { in: [] } }; -export const PUBLISHED_POST_STATUS = { status: { in: ['published'] } }; + +//export const UNIT_POST_STATUS = { status: { in: [] } }; +export const PUBLISHED_POST_STATUS = { status: { in: [PUBLISHED] } }; export const FilterCanManageContentList = (frame: SessionFrame) => { if (frame === undefined) { @@ -166,6 +120,27 @@ export const FilterCanManageContentList = (frame: SessionFrame) => { //it's hard to imagine where the reply is going to go ... if exec ever gets here, it's close //to a fatal error. What is the best thing to do here? Nothing? throw? + + } + //Needs shared secret, set in bash, imported via process.env, usage tested in the CI workflow, which act as the base spec for a container to run keystone/next in. + if (isBuildEnvir(frame)) { + return EVERY_POST_STATUS; + } + //The perms check is only running client side. Review: check the authorization props are checked + //server side to. + if (!!frame.context.session?.data?.role?.canManageContent) { + success('Blessed super user access to the known content manager:'); + success(frame?.context?.session?.data?.name); + return EVERY_POST_STATUS; + } + + success('Client receives only published posts:'); + success(frame?.context?.session?.data?.name); + //success(frame.context.session?.data?.role?.canManageContent); + return PUBLISHED_POST_STATUS; +}; + + //The front line security audit: Initial musings: //SSG has the best security profile, and appears completely safe to use SSG for a cdn deployed site without auth. @@ -216,23 +191,4 @@ export const FilterCanManageContentList = (frame: SessionFrame) => { // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Core Issues located: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // auth/src/index.ts and related files in keystone core are triggering some "any" issues. Strong typing is (strongly) recommended. - // e.g. const pageMiddleware: AdminUIConfig['pageMiddleware'] = async ({ context, isValidSession }) - } - //Needs shared secret, set in bash, imported via process.env, usage tested in the CI workflow, which act as the base spec for a container to run keystone/next in. - if (isBuildEnvir(frame)) { - success(''); - return EVERY_POST_STATUS; - } - //The perms check is only running client side. Review: check the authorization props are checked - //server side to. - if (!!frame.context.session?.data?.role?.canManageContent) { - success('Blessed super user access to the known content manager:'); - success(frame?.context?.session?.data?.name); - return EVERY_POST_STATUS; - } - - success('Client receives only published posts:'); - success(frame?.context?.session?.data?.name); - //success(frame.context.session?.data?.role?.canManageContent); - return PUBLISHED_POST_STATUS; -}; + // e.g. const pageMiddleware: AdminUIConfig['pageMiddleware'] = async ({ context, isValidSession }) \ No newline at end of file diff --git a/schema/content.ts b/schema/content.ts index 33b4d59d..dad023c7 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -13,9 +13,16 @@ import { operationCanManageContentList, FilterCanManageContentList, SessionFrame, + } from './access'; import { componentBlocks } from '../schema/fields/content/components'; + +export const PUBLISHED = 'published' +export const DRAFT = 'draft' +export const ARCHIVED = 'archive' + + //FIXME: // These anys are causing issues. What is the strong type? // The deduced type from permissions api is SessionFrame, but that doesn't work ... @@ -98,9 +105,9 @@ export const Post = list({ }), status: select({ options: [ - { label: 'Draft', value: 'draft' }, - { label: 'Published', value: 'published' }, - { label: 'Archived', value: 'archived' }, + { label: 'Draft', value: DRAFT }, + { label: 'Published', value: PUBLISHED }, + { label: 'Archived', value: ARCHIVED }, ], defaultValue: 'draft', ui: { displayMode: 'segmented-control' }, diff --git a/utils.ts b/utils.ts index 01226e25..cef9c512 100644 --- a/utils.ts +++ b/utils.ts @@ -69,7 +69,7 @@ export async function fetchGraphQL_inject_api_key( keystoneNextjsBuildApiKey.includes('keystone') ? utilsWarning('Prototype api key: ' + keystoneNextjsBuildApiKey) : utilsSuccess( - 'Next build triggered: Api key injected into x-api-key headers.' + 'Next build: x-api-key: set' ); return fetch('http://localhost:3000/api/graphql', { From c0d3ba605242a182f2c32e4a2afea4ba8694cdfe Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Thu, 14 Oct 2021 03:41:36 +0100 Subject: [PATCH 063/325] build error: Cannot access 'operationCanManageContentList' before initialization --- schema/content.ts | 8 ++++---- utils.ts | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/schema/content.ts b/schema/content.ts index dad023c7..8e62ad71 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -13,14 +13,14 @@ import { operationCanManageContentList, FilterCanManageContentList, SessionFrame, - + PUBLISHED, + DRAFT, + ARCHIVED } from './access'; import { componentBlocks } from '../schema/fields/content/components'; -export const PUBLISHED = 'published' -export const DRAFT = 'draft' -export const ARCHIVED = 'archive' + //FIXME: diff --git a/utils.ts b/utils.ts index cef9c512..13fdf6f7 100644 --- a/utils.ts +++ b/utils.ts @@ -53,8 +53,7 @@ export const report_security_incident = (...obj: any) => export const report_error = (...obj: any) => ract_va(obj)((x: any) => log.error(x)); -//Testing the new logging api. -export const endLog = 'endLog'; + const utilsWarning = (a: string) => logContextInfo(warningCol(a)); const utilsError = (a: string) => logContextInfo(errorCol(a)); @@ -83,6 +82,7 @@ export async function fetchGraphQL_inject_api_key( .then(x => x.json()) .then(({ data, errors }) => { if (errors) { + utilsError("About to throw: ") throw new Error( `GraphQL errors occurred:\n${errors .map((x: any) => x.message) From e82e69ecb5f3113159fd71112328b6b13f9e7f59 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Thu, 14 Oct 2021 04:42:04 +0100 Subject: [PATCH 064/325] Redundant code removed --- next-env.d.ts | 12 +++--- schema/access.ts | 98 +++++++++++++++++++++-------------------------- schema/content.ts | 6 +-- utils.ts | 8 +--- 4 files changed, 52 insertions(+), 72 deletions(-) diff --git a/next-env.d.ts b/next-env.d.ts index 534a39ea..9bc3dd46 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,6 +1,6 @@ -/// -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +/// +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/schema/access.ts b/schema/access.ts index 185053a5..e108f495 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -9,11 +9,9 @@ import { report_error, } from '../utils'; -import { - PUBLISHED, - DRAFT, - ARCHIVED -} from './content' +export const PUBLISHED = 'published'; +export const DRAFT = 'draft'; +export const ARCHIVED = 'archive'; export type SessionContext = { session?: { @@ -29,7 +27,6 @@ export type SessionContext = { }; }; - export type SessionFrame = { session: ItemContext; context: SessionContext; @@ -37,15 +34,13 @@ export type SessionFrame = { operation: string; }; - export type ItemContext = { item: any } & SessionContext; //FIXME: Needs API key. export const isBuildEnvir = (frame: SessionFrame): boolean => { if (frame?.session === undefined) { - // It's a bit confusing as to why this dodgy cast is needed. It took ages to get api keys working because of the - // obscuriy of the workaround. + // obscuriy of the workaround. // The top level query prefers SessionFrame, and does not build against KeystoneFrame (same, bar KeystoneContext for context) let kontext = frame?.context as KeystoneContext; let recvApiKey = kontext?.req?.headers['x-api-key']; @@ -85,15 +80,13 @@ export const permissions = { canManageContentSession: ({ session }: SessionContext): boolean => { return !!session?.data?.role?.canManageContent; - }, + }, canManageContentItem: (item: ItemContext): boolean => !!item?.session?.data?.role?.canManageContent, - canManageUsersSession: ({ session }: SessionContext): boolean => { return !!session?.data?.role?.canManageUsers; }, - }; export const operationCanManageContentList = (frame: SessionFrame) => @@ -101,8 +94,6 @@ export const operationCanManageContentList = (frame: SessionFrame) => //This is the fastest workaround I could find for not being able to return (where:) true (all records), or false (for no records). - - export const EVERY_POST_STATUS = { status: { in: [PUBLISHED, DRAFT, ARCHIVED] }, }; @@ -119,8 +110,6 @@ export const FilterCanManageContentList = (frame: SessionFrame) => { //Give no information away that they have been noticed, but if there's no frame //it's hard to imagine where the reply is going to go ... if exec ever gets here, it's close //to a fatal error. What is the best thing to do here? Nothing? throw? - - } //Needs shared secret, set in bash, imported via process.env, usage tested in the CI workflow, which act as the base spec for a container to run keystone/next in. if (isBuildEnvir(frame)) { @@ -140,55 +129,54 @@ export const FilterCanManageContentList = (frame: SessionFrame) => { return PUBLISHED_POST_STATUS; }; +//The front line security audit: Initial musings: - //The front line security audit: Initial musings: - - //SSG has the best security profile, and appears completely safe to use SSG for a cdn deployed site without auth. +//SSG has the best security profile, and appears completely safe to use SSG for a cdn deployed site without auth. - //However well local code is audited for security, there is a known can of worms in apollo. It will exit(1) - //at a moments notice, taking ks down with it. The upshot is gql must be considered a soft target, - //and this single, vulnerable endpoint is suitably firewalled, potentially using REST, which - //has a far improved security model. +//However well local code is audited for security, there is a known can of worms in apollo. It will exit(1) +//at a moments notice, taking ks down with it. The upshot is gql must be considered a soft target, +//and this single, vulnerable endpoint is suitably firewalled, potentially using REST, which +//has a far improved security model. - // So: safest is when gql is restriced to being a tool for the offline - // build process only, and a convenient one at that. If it is deployed online, great care has to be taken - // to protect it from badly formed queries, and restrict it's input grammar. It's not clear this is any easier to write than - // a well defined REST api. +// So: safest is when gql is restriced to being a tool for the offline +// build process only, and a convenient one at that. If it is deployed online, great care has to be taken +// to protect it from badly formed queries, and restrict it's input grammar. It's not clear this is any easier to write than +// a well defined REST api. - // A mitigating factor here is the use of isFilterable on individual fields. When first porting Jeds app, it seemed like an inconvenience, - // but now, it is seen as providing critical security, restricting queries to a vulnerable apollo. +// A mitigating factor here is the use of isFilterable on individual fields. When first porting Jeds app, it seemed like an inconvenience, +// but now, it is seen as providing critical security, restricting queries to a vulnerable apollo. - // !!! This is so important for a production server than does use gql only, that it might be worth - // issuing a warning when a list is defaulted to isFilterable on all fields. Warnings like this can - // be so useful to the correct setup of a dev kit. Also a warning if a field is in a where clause, but not filterable ... can same poor front end developers hours. - // The more info an error can do to help a dev chase its location, the better. When logs get multiplexed by multiple threads, knowing what corresponds to what can waste time. - // Keystone is such a happy app that a warning really gets noticed ;) +// !!! This is so important for a production server than does use gql only, that it might be worth +// issuing a warning when a list is defaulted to isFilterable on all fields. Warnings like this can +// be so useful to the correct setup of a dev kit. Also a warning if a field is in a where clause, but not filterable ... can same poor front end developers hours. +// The more info an error can do to help a dev chase its location, the better. When logs get multiplexed by multiple threads, knowing what corresponds to what can waste time. +// Keystone is such a happy app that a warning really gets noticed ;) - // There are alternatives: - // jQuery to avoid layers of gql inefficiences, and workers. - // Also, REST can start hard, C++ calling core pgsql. From the keystone perspective, it's just another target language for an ast, - // derived from the same schema, but in pgsql C++ (hardest, in every way), - // my own fav for prototyping, bash pg cli (v easy: a surprisingly few lines of code, and handy for CI. Also extraordinarily versatile. Can handof via socat, epoll, anything). - // The ts schema is still the sole source of truth in this model. Nothing much changes in ks, because it is suitably agnostic. +// There are alternatives: +// jQuery to avoid layers of gql inefficiences, and workers. +// Also, REST can start hard, C++ calling core pgsql. From the keystone perspective, it's just another target language for an ast, +// derived from the same schema, but in pgsql C++ (hardest, in every way), +// my own fav for prototyping, bash pg cli (v easy: a surprisingly few lines of code, and handy for CI. Also extraordinarily versatile. Can handof via socat, epoll, anything). +// The ts schema is still the sole source of truth in this model. Nothing much changes in ks, because it is suitably agnostic. - // Furthermore, gql is not ideally suited to live usage, due to the n+1 problem, and difficuly cacheing a single endpoint. - // Gql doesn't play nicely with reverse proxies, but REST does. Fashion is cyclical! - // But for prototyping apis, the playground auto documentation, and SSG/ISR ... it's a massive time saver. +// Furthermore, gql is not ideally suited to live usage, due to the n+1 problem, and difficuly cacheing a single endpoint. +// Gql doesn't play nicely with reverse proxies, but REST does. Fashion is cyclical! +// But for prototyping apis, the playground auto documentation, and SSG/ISR ... it's a massive time saver. - // There is some convergence in langauge: - // ts and C++ read very similarly nowadays. As long as everything is done in term of the lambda calculus, it all works out. +// There is some convergence in langauge: +// ts and C++ read very similarly nowadays. As long as everything is done in term of the lambda calculus, it all works out. - // Unfortunately C++ coroutines are dreadfully thought out. My guess is the committe did not understand the issues https://bartoszmilewski.com/2011/07/11/monads-in-c/ - // raised. Fortunately, I have successfully developed some workarounds for these issue. ;) +// Unfortunately C++ coroutines are dreadfully thought out. My guess is the committe did not understand the issues https://bartoszmilewski.com/2011/07/11/monads-in-c/ +// raised. Fortunately, I have successfully developed some workarounds for these issue. ;) - //The AdminUI is considered a fairly soft target, mainly from DoS. But it's easy to harden to the public, using an ssh pki tunnel for access, bringing the auth - //to industry best practise, but remaining vulnerable to authorized bad actors, who we have to keep as far away from the gql endpoint as possible. +//The AdminUI is considered a fairly soft target, mainly from DoS. But it's easy to harden to the public, using an ssh pki tunnel for access, bringing the auth +//to industry best practise, but remaining vulnerable to authorized bad actors, who we have to keep as far away from the gql endpoint as possible. - //All this is of relevant here, because this is the last line of defense! +//All this is of relevant here, because this is the last line of defense! - //In testing, bad username password combinations were reporting auth failure - //immediately. A delay of a few seconds has an improved security model. +//In testing, bad username password combinations were reporting auth failure +//immediately. A delay of a few seconds has an improved security model. - // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Core Issues located: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // auth/src/index.ts and related files in keystone core are triggering some "any" issues. Strong typing is (strongly) recommended. - // e.g. const pageMiddleware: AdminUIConfig['pageMiddleware'] = async ({ context, isValidSession }) \ No newline at end of file +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Core Issues located: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// auth/src/index.ts and related files in keystone core are triggering some "any" issues. Strong typing is (strongly) recommended. +// e.g. const pageMiddleware: AdminUIConfig['pageMiddleware'] = async ({ context, isValidSession }) diff --git a/schema/content.ts b/schema/content.ts index 8e62ad71..2385d413 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -15,14 +15,10 @@ import { SessionFrame, PUBLISHED, DRAFT, - ARCHIVED + ARCHIVED, } from './access'; import { componentBlocks } from '../schema/fields/content/components'; - - - - //FIXME: // These anys are causing issues. What is the strong type? // The deduced type from permissions api is SessionFrame, but that doesn't work ... diff --git a/utils.ts b/utils.ts index 13fdf6f7..ca7cb40f 100644 --- a/utils.ts +++ b/utils.ts @@ -53,8 +53,6 @@ export const report_security_incident = (...obj: any) => export const report_error = (...obj: any) => ract_va(obj)((x: any) => log.error(x)); - - const utilsWarning = (a: string) => logContextInfo(warningCol(a)); const utilsError = (a: string) => logContextInfo(errorCol(a)); const utilsSuccess = (a: string) => logContextInfo(successCol(a)); @@ -67,9 +65,7 @@ export async function fetchGraphQL_inject_api_key( ) { keystoneNextjsBuildApiKey.includes('keystone') ? utilsWarning('Prototype api key: ' + keystoneNextjsBuildApiKey) - : utilsSuccess( - 'Next build: x-api-key: set' - ); + : utilsSuccess('Next build: x-api-key: set'); return fetch('http://localhost:3000/api/graphql', { method: 'POST', @@ -82,7 +78,7 @@ export async function fetchGraphQL_inject_api_key( .then(x => x.json()) .then(({ data, errors }) => { if (errors) { - utilsError("About to throw: ") + utilsError('About to throw: '); throw new Error( `GraphQL errors occurred:\n${errors .map((x: any) => x.message) From ce5158c3812874151ce0d32229277aebd9161e7f Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Thu, 14 Oct 2021 19:05:24 +0100 Subject: [PATCH 065/325] Redundant code removed --- README.md | 46 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 9809c953..fcfdc6b4 100644 --- a/README.md +++ b/README.md @@ -72,16 +72,17 @@ yarn commit "message" ... adds files and commits. yarn push ... (auto push to origin latest) ``` +## Status report ✅ Authorization: Strong typing keystone frame types (bar one C++ style typecast) ✅ Test code in access has a new temporary home in utils. +Production build status: -Production build status: ✅ Pre release: Testing. +✅ Pre release: Testing: Builds and decodes static x-api-key. -``` ✅ Next build super user authorization to keystone, allowing for SSR/SSG/ISR tunneling. A shout out to Jed for explaining the keystone way. @@ -94,12 +95,16 @@ Production build status: ✅ Pre release: Testing. ✅ Ready for exhaustive testing. Bug reports welcome! ``` +More informative logging, suitable for deployment. + `Code coverage: partial` + ## Security audit Status: `Preliminary`. -More informative logging, suitable for deployment. - `Code coverage: partial` +## TL;DR +`(a: T)` is a type safe replacement for `(a: any)`, because we need to trap the awkward `undefined` cases at build time. + `any` issues: Low level ts/js security audit: Research and development has established many bugs hide in the rampantly polymorphic `any` type. @@ -115,6 +120,11 @@ Currently developing a reader friendly notation for the rather awkward ts functi `export const fcompose = (a: (maps: B) => A) => (b: (maps: C) => B) => (c: C) => a(b(c))` +and in second place, + +`export const fcompose = (a: (X: B) => A) => (b: (maps: C) => B) => (c: C) => + a(b(c))` + and for cartestian products: `transferFun: (maps: T) => (cross: T) => T` @@ -127,11 +137,11 @@ but its a bit odd to, at least the ts reads a bit like the intended, `transferFun: maps T cross T to T,` -just all the brackets are in the wrong place for the eye to flow smoothly over it. +just all the brackets are in the wrong place for the eye to flow smoothly over it, and the one place we want a new dummy variable, `to`, `ts` forces `=>`. I'd prefer the Haskell style notation to read -The issue here is we have to name variables for types which are `not instantiated`, and `naming things is hard`. + `transferFun: T => T to T,` -Using this convention, a free grammar is pinned down, in which the two new constructs make sense, and the rather clunky type specifications almost become readable, a bit like what tailwind does to css. cross is preferred for short defintions, opposed to x: or X:. At first these both looked excellent options, then they didn't. x is heavily overused. So of the two X looks better, but is in caps, I vote it runner up, and perhaps optimal for long type definitions. X in maths means the same thing, as does cross. +since `=>` is somewhat overused. The return type is special in comparisson to intermediary closure parameters. But when printed, the shorter `transferFun: (maps: T) => (X: T) => T` @@ -139,17 +149,33 @@ But when printed, the shorter doesn't seem to read as well as `transferFun: (maps: T) => (cross: T) => T` +The issue here is we have to name variables for types which are `not instantiated`, and `naming things is hard`. + + + +Using this convention, a free grammar is pinned down, in which the two new constructs make sense, and the rather clunky type specifications almost become readable, a bit like what tailwind does to css. `cross:` is preferred for short defintions, opposed to `x:` or `X:`. At first these both looked excellent options, then they didn't. `x` is heavily overused. So of the two `X` looks better, but is in caps, so I vote it runner up, but perhaps optimal for long type definitions. `X` in maths means roughly the same thing, as does `cross`, but `cross` is far less likely to be mistaken for a real variable. This is subtle because we are talking about a morphism between the Cartesian product embedded in the closure algebra, and a perhaps a different model of the product i.e. `(a,b)`, or a purely functional list api. + +Also cross will match fewer searches when greping though code. + + When reviewing code, it can be hard to tell these dummy parameter names from important ones. That's the real point of this comment. -The other problem is that (a: T) is not the same as (a: any). The templated class can't echo undefined types, but `any` can! Another point is that as soon as `any` is used, the code becomes ... javascript. No more needs to be said. My mission against `any` is more than fully justified. +`(a: T)` is not the same as `(a: any)`. The templated class can't echo undefined types, but `any` can! This is seen as a `very good thing`. + +`(a: T)` is a type safe replacement for any, because we need to trap the awkward `undefined` cases at build time. Then the type inferrence become far more similar to `C++`, which works well until it hits recursive types (with the unfortunate side effect of nerfing monads/coroutines). + + +Another point is that as soon as `any` is used, the code becomes ... javascript. No more needs to be said. My mission against `any` is more than fully justified, and I'm not alone: + +https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes-func.html However, some functional code doesn't seem to work properly without the total polymorphism `any` allows, and some ts functional code looks fine, ... but bizarrely doesn't work in all contexts. It might have to do with the inner depths of js module linkage. The places audits have to go ... There is also a `dodgy C++ style cast`, right where it's not needed ... `TBC`. -Is it my imagination, or does C++ `auto` work better than `any`? What we really need is `auto` in ts, to avoid unecessary templating. -With these caveats in mind, enjoy, and be fully aware it is in a `testing` phase. + +With these caveats in mind, enjoy, and be fully aware this release is in a `testing` phase. ``` Known Issues: From 0de73e2822cd416b540271e7b3a1101ffa92ab0f Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Thu, 14 Oct 2021 19:08:25 +0100 Subject: [PATCH 066/325] Pushed an any in auth one level lower. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fcfdc6b4..2ac003ae 100644 --- a/README.md +++ b/README.md @@ -144,7 +144,7 @@ just all the brackets are in the wrong place for the eye to flow smoothly over i since `=>` is somewhat overused. The return type is special in comparisson to intermediary closure parameters. But when printed, the shorter - `transferFun: (maps: T) => (X: T) => T` + `transferFun: (maps: T) => (X: T) => T,` doesn't seem to read as well as `transferFun: (maps: T) => (cross: T) => T` From 2a5d6100ff41304e2853c9b0e2a5a1ff62e7bf4d Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Thu, 14 Oct 2021 23:36:20 +0100 Subject: [PATCH 067/325] Rejigged logging. Crash bug voting when not logged in. Additional access logic required --- README.md | 3 ++ components/auth.tsx | 10 +++- pages/index.tsx | 8 ++- schema/access.ts | 2 + schema/mutations.ts | 3 +- utils.ts | 119 ++++++++++++++++++++++++++++++++------------ wrap_any.tsx | 25 ++++++++++ 7 files changed, 135 insertions(+), 35 deletions(-) create mode 100644 wrap_any.tsx diff --git a/README.md b/README.md index 2ac003ae..ae0d10f0 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,9 @@ yarn commit "message" ... adds files and commits. yarn push ... (auto push to origin latest) ``` +## Known crash bugs +Vote when not logged in: WIP + ## Status report ✅ Authorization: Strong typing keystone frame types (bar one C++ style typecast) diff --git a/components/auth.tsx b/components/auth.tsx index a03c0f76..c4f59aea 100644 --- a/components/auth.tsx +++ b/components/auth.tsx @@ -7,7 +7,11 @@ import { ReactNode, } from 'react'; -import { gql, useQuery, useMutation } from 'urql'; +import { gql, useQuery, useMutation, OperationResult} from 'urql'; + +//Security audit: +//Pushed an `any` one depth lower into urql. +export type AuthenticationResponse = OperationResult export type SignInArgs = { email: string; password: string }; export type SignInResult = @@ -70,11 +74,13 @@ export const AuthProvider = ({ children }: { children: ReactNode }) => { } `); + + const signIn = async ({ email, password, }: SignInArgs): Promise => { - const result: any = await authenticate( + const result: AuthenticationResponse = await authenticate( { email, password }, mutationContext ); diff --git a/pages/index.tsx b/pages/index.tsx index 26e20d18..fc3e97df 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -9,13 +9,19 @@ import { Link } from '../components/ui/link'; import { H1 } from '../components/ui/typography'; import { useAuth } from '../components/auth'; +import { DocumentType } from '../wrap_any' + + + + + type Post = { id: string; slug: string; title: string; publishedDate: string; intro: { - document: any; + document: DocumentType; }; author: { name: string; diff --git a/schema/access.ts b/schema/access.ts index e108f495..79448de0 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -2,6 +2,8 @@ import { KeystoneContext } from '.keystone/types'; import { keystoneNextjsBuildApiKey } from '../keystone'; +import { ItemType } from '../wrap_any'; + import { success, warn, diff --git a/schema/mutations.ts b/schema/mutations.ts index 360849f4..f7d9b22b 100644 --- a/schema/mutations.ts +++ b/schema/mutations.ts @@ -3,13 +3,14 @@ import { KeystoneContext, PollWhereInput } from '.keystone/types'; const gql = ([content]: TemplateStringsArray) => content; +//Removed throw, which was crashing keystone async function clearVote( _context: KeystoneContext, pollFilter: PollWhereInput ) { const context = _context.sudo(); if (!context.session) { - throw new Error('You must be signed in to vote'); + new Error('You must be signed in to vote'); } const answers = await context.db.PollAnswer.findMany({ diff --git a/utils.ts b/utils.ts index ca7cb40f..7d51d295 100644 --- a/utils.ts +++ b/utils.ts @@ -1,8 +1,9 @@ import { keystoneNextjsBuildApiKey } from './keystone'; -let colors = require('colors/safe'); +import { TestingHardenedAny } from './wrap_any'; +import colors from 'colors/safe'; // Fix Me: Test code: Needs another home. -//This is one place where any means it! The intent was object dumping code, down to +// Logging is one place where TestingHardenedAny needs it! The intent was object dumping code, down to //every leaf. A testground for DRY logging in ts. // Closures are good for logging, localising to particular files/functions/lines ... the issues of this short segment quickly shows why. // I have some multicol markup for logging, it bash though, so replaces console.log. @@ -15,25 +16,78 @@ export const successCol = colors.green; export const warningCol = colors.yellow; export const errorCol = colors.red; -const logContextInfo = (msg: string) => { - const e = new Error(); - const errmsg = 'Unknown line and file!!'; - const sep = ': '; - if (!e.stack) return errmsg; +export type Tunit = void; +export type ThunkProc = () => Tunit; + +interface CleanError { + name: string; + message: string; + stack: string; +} + +export type LogEventRenderer = (maps: CleanError) => string; + +export type ColFun = (maps: string) => string; + +export const sep = ': '; + +export const baseErrorMsg = 'utils: logContextInfoGen::' + sep; +export const undefinedVariableMsg = + baseErrorMsg + 'Attempted to log an undefined variable.' + sep; +export const unknownLineAndFileMsg = + baseErrorMsg + 'Unknown line and file' + sep; +export const cantOpenErrorMsg = + baseErrorMsg + 'Cant access stack info from Error()' + sep; + +export const fileLineRenderer = (e: CleanError) => { const regex = /\((.*):(\d+):(\d+)\)$/; - const match = regex.exec(e?.stack?.split('\n')[2]); - const info = match - ? Date() + sep + match[1] + sep + match[2] + sep + match[3] - : errmsg; + const match = regex.exec(e.stack); - console.log(info + sep + msg); + return match + ? match[1] + sep + match[2] + sep + match[3] + : unknownLineAndFileMsg + sep + e.stack; }; +export const stackRenderer = (e: CleanError) => e.stack; + +export const simpleLogger = (msg: string) => console.log(Date() + sep + msg); + +export const logContextInfoGen = + (msgRenderer: LogEventRenderer) => + (col: ColFun) => + (toBeLogged: TestingHardenedAny): Tunit => { + if (toBeLogged === undefined) + return logContextInfoGen(stackRenderer)(warningCol)(undefinedVariableMsg); + + var cleanMessage: string; + + if (typeof toBeLogged === 'string') { + cleanMessage = col(toBeLogged); + } else { + // Strip anything else down to its source code, so we know what is being sent to us. + // and print it plain, nothing is worse than red source code ... + cleanMessage = toBeLogged.toString(); + } + const e = new Error(); + if (!e.stack) + return simpleLogger(errorCol(cantOpenErrorMsg) + cleanMessage); + const ce = e as CleanError; + + const info = msgRenderer(ce); + + simpleLogger(info + sep + cleanMessage); + }; + +const logContextInfo = + (col: ColFun) => + (a: TestingHardenedAny): void => + logContextInfoGen(fileLineRenderer)(col)(a); + export const log = { - warning: (a: any) => logContextInfo(warningCol(a.toString())), - error: (a: any) => logContextInfo(errorCol(a.toString())), - success: (a: any) => logContextInfo(successCol(a.toString())), + warning: (a: TestingHardenedAny) => logContextInfo(warningCol)(a), + error: (a: TestingHardenedAny) => logContextInfo(errorCol)(a.toString()), + success: (a: TestingHardenedAny) => logContextInfo(successCol)(a), }; //Right monadic action on vargs. @@ -42,30 +96,30 @@ const ract_va = (f: (maps: Tprops) => void) => props.forEach((x: Tprops) => f(x)); -export const success = (...obj: any) => - ract_va(obj)((x: any) => log.success(x)); - -export const warn = (...obj: any) => ract_va(obj)((x: any) => log.warning(x)); +export const success = (...obj: TestingHardenedAny) => + ract_va(obj)((x: TestingHardenedAny) => log.success(x)); -export const report_security_incident = (...obj: any) => - ract_va(obj)((x: any) => log.warning(x)); +export const warn = (...obj: TestingHardenedAny) => + ract_va(obj)((x: TestingHardenedAny) => log.warning(x)); -export const report_error = (...obj: any) => - ract_va(obj)((x: any) => log.error(x)); +export const report_security_incident = (...obj: TestingHardenedAny) => + ract_va(obj)((x: TestingHardenedAny) => log.warning(x)); -const utilsWarning = (a: string) => logContextInfo(warningCol(a)); -const utilsError = (a: string) => logContextInfo(errorCol(a)); -const utilsSuccess = (a: string) => logContextInfo(successCol(a)); +export const report_error = (...obj: TestingHardenedAny) => + ract_va(obj)((x: TestingHardenedAny) => log.error(x)); export const gql = ([content]: TemplateStringsArray) => content; export async function fetchGraphQL_inject_api_key( query: string, - variables?: Record + variables?: Record ) { + var x; + log.success(x); + keystoneNextjsBuildApiKey.includes('keystone') - ? utilsWarning('Prototype api key: ' + keystoneNextjsBuildApiKey) - : utilsSuccess('Next build: x-api-key: set'); + ? log.warning('Prototype api key: ' + keystoneNextjsBuildApiKey) + : log.success('Next build: x-api-key: set'); return fetch('http://localhost:3000/api/graphql', { method: 'POST', @@ -78,10 +132,13 @@ export async function fetchGraphQL_inject_api_key( .then(x => x.json()) .then(({ data, errors }) => { if (errors) { - utilsError('About to throw: '); + log.error( + 'Next build: did not recieve static site data: About to throw: ' + ); + //Is throwing the correct response? The db might be temporarily unavailble, and we have old pages to serve with. throw new Error( `GraphQL errors occurred:\n${errors - .map((x: any) => x.message) + .map((x: TestingHardenedAny) => x.message) .join('\n')}` ); } diff --git a/wrap_any.tsx b/wrap_any.tsx new file mode 100644 index 00000000..14b78bdd --- /dev/null +++ b/wrap_any.tsx @@ -0,0 +1,25 @@ +// Welcome to wrap_any: The aim is for this file to become empty! +// It's a place to admit temporary defeat in eliminating an `any` type, +// and clean the api a level higher by providing a concrete type. + + + +// This is really a JSX type, not sure how to define it yet. + +// To ensure we only match any once in this module +// And give any a properly descriptive type name +type WrappedRampantlyPolymorphic = any + +export type TestingHardenedAny = WrappedRampantlyPolymorphic + +export type HardenedAny = WrappedRampantlyPolymorphic + +export type RampantlyPolymorphic = WrappedRampantlyPolymorphic + +export type DocumentType = WrappedRampantlyPolymorphic + +export type ItemType = WrappedRampantlyPolymorphic + + + + From 1a01e9dce2163d9842dd927383044dd0420f3fdc Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 00:09:36 +0100 Subject: [PATCH 068/325] Deprecated old logging code. wrap_any ... the most important file of the lot! --- README.md | 6 ++++-- schema/access.ts | 25 ++++++++++--------------- utils.ts | 46 ++++++++++++++++------------------------------ 3 files changed, 30 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index ae0d10f0..7adfc67e 100644 --- a/README.md +++ b/README.md @@ -72,8 +72,10 @@ yarn commit "message" ... adds files and commits. yarn push ... (auto push to origin latest) ``` -## Known crash bugs -Vote when not logged in: WIP +## Known crash bug ... + +A stale session led to the app throwing when voting occured. More defensive coding is required in the access filtering to handle such cases. WIP. + ## Status report diff --git a/schema/access.ts b/schema/access.ts index 79448de0..6ecbeb7e 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -4,12 +4,7 @@ import { keystoneNextjsBuildApiKey } from '../keystone'; import { ItemType } from '../wrap_any'; -import { - success, - warn, - report_security_incident, - report_error, -} from '../utils'; +import { log } from '../utils'; export const PUBLISHED = 'published'; export const DRAFT = 'draft'; @@ -49,15 +44,15 @@ export const isBuildEnvir = (frame: SessionFrame): boolean => { if (recvApiKey === keystoneNextjsBuildApiKey) { if (recvApiKey.includes('keystone')) { - warn('access: prototype api key: ' + recvApiKey); + log.warning('access: prototype api key: ' + recvApiKey); } - success( + log.success( 'access::isBuildEnvir: next build: api key matches: granting super user query access.' ); return true; } else { - warn('access::isBuildEnvir: authentication breach:'); - success( + log.warning('access::isBuildEnvir: authentication breach:'); + log.success( 'access::isBuildEnvir: no additional authorisation granted to breach.' ); return false; @@ -105,7 +100,7 @@ export const PUBLISHED_POST_STATUS = { status: { in: [PUBLISHED] } }; export const FilterCanManageContentList = (frame: SessionFrame) => { if (frame === undefined) { - report_security_incident( + log.reportSecurityIncident( 'Minor security breach: potential auth bug. undefined frame: query downgraded to public.' ); return PUBLISHED_POST_STATUS; @@ -120,13 +115,13 @@ export const FilterCanManageContentList = (frame: SessionFrame) => { //The perms check is only running client side. Review: check the authorization props are checked //server side to. if (!!frame.context.session?.data?.role?.canManageContent) { - success('Blessed super user access to the known content manager:'); - success(frame?.context?.session?.data?.name); + log.success('Blessed super user access to the known content manager:'); + log.success(frame?.context?.session?.data?.name); return EVERY_POST_STATUS; } - success('Client receives only published posts:'); - success(frame?.context?.session?.data?.name); + log.success('Client receives only published posts:'); + log.success(frame?.context?.session?.data?.name); //success(frame.context.session?.data?.role?.canManageContent); return PUBLISHED_POST_STATUS; }; diff --git a/utils.ts b/utils.ts index 7d51d295..731431c2 100644 --- a/utils.ts +++ b/utils.ts @@ -1,9 +1,9 @@ import { keystoneNextjsBuildApiKey } from './keystone'; -import { TestingHardenedAny } from './wrap_any'; +import { HardenedAny, RampantlyPolymorphic } from './wrap_any'; import colors from 'colors/safe'; // Fix Me: Test code: Needs another home. -// Logging is one place where TestingHardenedAny needs it! The intent was object dumping code, down to +// Logging is one place where HardenedAny is needed! The intent was object dumping code, down to //every leaf. A testground for DRY logging in ts. // Closures are good for logging, localising to particular files/functions/lines ... the issues of this short segment quickly shows why. // I have some multicol markup for logging, it bash though, so replaces console.log. @@ -56,7 +56,7 @@ export const simpleLogger = (msg: string) => console.log(Date() + sep + msg); export const logContextInfoGen = (msgRenderer: LogEventRenderer) => (col: ColFun) => - (toBeLogged: TestingHardenedAny): Tunit => { + (toBeLogged: HardenedAny): Tunit => { if (toBeLogged === undefined) return logContextInfoGen(stackRenderer)(warningCol)(undefinedVariableMsg); @@ -81,41 +81,25 @@ export const logContextInfoGen = const logContextInfo = (col: ColFun) => - (a: TestingHardenedAny): void => + (a: HardenedAny): void => logContextInfoGen(fileLineRenderer)(col)(a); export const log = { - warning: (a: TestingHardenedAny) => logContextInfo(warningCol)(a), - error: (a: TestingHardenedAny) => logContextInfo(errorCol)(a.toString()), - success: (a: TestingHardenedAny) => logContextInfo(successCol)(a), + warning: (a: HardenedAny) => logContextInfo(warningCol)(a), + error: (a: HardenedAny) => logContextInfo(errorCol)(a), + success: (a: HardenedAny) => logContextInfo(successCol)(a), + reportSecurityIncident: (a: HardenedAny) => logContextInfo(errorCol)(a), }; -//Right monadic action on vargs. -const ract_va = - (...props: Tprops[]) => - (f: (maps: Tprops) => void) => - props.forEach((x: Tprops) => f(x)); - -export const success = (...obj: TestingHardenedAny) => - ract_va(obj)((x: TestingHardenedAny) => log.success(x)); - -export const warn = (...obj: TestingHardenedAny) => - ract_va(obj)((x: TestingHardenedAny) => log.warning(x)); - -export const report_security_incident = (...obj: TestingHardenedAny) => - ract_va(obj)((x: TestingHardenedAny) => log.warning(x)); - -export const report_error = (...obj: TestingHardenedAny) => - ract_va(obj)((x: TestingHardenedAny) => log.error(x)); - export const gql = ([content]: TemplateStringsArray) => content; export async function fetchGraphQL_inject_api_key( query: string, - variables?: Record + variables?: Record ) { - var x; - log.success(x); + //Intentionally create an undefined to test HardenedAny + //var x; + //log.success(x); keystoneNextjsBuildApiKey.includes('keystone') ? log.warning('Prototype api key: ' + keystoneNextjsBuildApiKey) @@ -133,14 +117,16 @@ export async function fetchGraphQL_inject_api_key( .then(({ data, errors }) => { if (errors) { log.error( - 'Next build: did not recieve static site data: About to throw: ' + 'Next build: did not recieve static site data: Attempting to stumble on. ' ); + /* //Is throwing the correct response? The db might be temporarily unavailble, and we have old pages to serve with. throw new Error( `GraphQL errors occurred:\n${errors - .map((x: TestingHardenedAny) => x.message) + .map((x: RampantlyPolymorphic) => x.message) .join('\n')}` ); + */ } return data; }); From 2467fd16f3bb13cceec8e3c30632b92faac64c43 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 01:35:18 +0100 Subject: [PATCH 069/325] Resiliance testing: first pass. Crash bug fixes --- README.md | 13 +++++++++++-- schema/mutations.ts | 5 ++++- utils.ts | 26 ++++++++++---------------- yarn.lock | 12 ++++++++++++ 4 files changed, 37 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 7adfc67e..f83924f4 100644 --- a/README.md +++ b/README.md @@ -72,9 +72,7 @@ yarn commit "message" ... adds files and commits. yarn push ... (auto push to origin latest) ``` -## Known crash bug ... -A stale session led to the app throwing when voting occured. More defensive coding is required in the access filtering to handle such cases. WIP. ## Status report @@ -103,6 +101,14 @@ Production build status: More informative logging, suitable for deployment. `Code coverage: partial` +## Resiliance testing + +✅ A stale session led to the app throwing when voting occured. + +Rejigged fetch command because some failure tracks were never been called. + +More defensive coding is required to check the are no more cases of this. + ## Security audit Status: `Preliminary`. @@ -182,6 +188,9 @@ There is also a `dodgy C++ style cast`, right where it's not needed ... `TBC`. With these caveats in mind, enjoy, and be fully aware this release is in a `testing` phase. + + + ``` Known Issues: Refactor literals. diff --git a/schema/mutations.ts b/schema/mutations.ts index f7d9b22b..c85fdf21 100644 --- a/schema/mutations.ts +++ b/schema/mutations.ts @@ -1,5 +1,6 @@ import { graphQLSchemaExtension } from '@keystone-next/keystone'; import { KeystoneContext, PollWhereInput } from '.keystone/types'; +import { log } from '../utils'; const gql = ([content]: TemplateStringsArray) => content; @@ -10,7 +11,9 @@ async function clearVote( ) { const context = _context.sudo(); if (!context.session) { - new Error('You must be signed in to vote'); + log.warning('You must be signed in to vote'); + //new Error('You must be signed in to vote'); + return; } const answers = await context.db.PollAnswer.findMany({ diff --git a/utils.ts b/utils.ts index 731431c2..9731765f 100644 --- a/utils.ts +++ b/utils.ts @@ -1,5 +1,6 @@ import { keystoneNextjsBuildApiKey } from './keystone'; import { HardenedAny, RampantlyPolymorphic } from './wrap_any'; + import colors from 'colors/safe'; // Fix Me: Test code: Needs another home. @@ -11,6 +12,7 @@ import colors from 'colors/safe'; //const log = (s: string) => console.log(s); //Reverse mapping for var args, rest parameters ... handy but slightly disfunctional, forEach is not strongly typed. +export const fix = (x: T) => x; export const successCol = colors.green; export const warningCol = colors.yellow; @@ -88,6 +90,7 @@ export const log = { warning: (a: HardenedAny) => logContextInfo(warningCol)(a), error: (a: HardenedAny) => logContextInfo(errorCol)(a), success: (a: HardenedAny) => logContextInfo(successCol)(a), + trace: (a: HardenedAny) => logContextInfoGen(stackRenderer)(fix)(a), reportSecurityIncident: (a: HardenedAny) => logContextInfo(errorCol)(a), }; @@ -103,7 +106,7 @@ export async function fetchGraphQL_inject_api_key( keystoneNextjsBuildApiKey.includes('keystone') ? log.warning('Prototype api key: ' + keystoneNextjsBuildApiKey) - : log.success('Next build: x-api-key: set'); + : log.success('Next build: x-api-key: tx'); return fetch('http://localhost:3000/api/graphql', { method: 'POST', @@ -114,20 +117,11 @@ export async function fetchGraphQL_inject_api_key( }, }) .then(x => x.json()) - .then(({ data, errors }) => { - if (errors) { - log.error( - 'Next build: did not recieve static site data: Attempting to stumble on. ' - ); - /* - //Is throwing the correct response? The db might be temporarily unavailble, and we have old pages to serve with. - throw new Error( - `GraphQL errors occurred:\n${errors - .map((x: RampantlyPolymorphic) => x.message) - .join('\n')}` - ); - */ - } + .then(({ data }) => { + log.success('Next build: json: rx'); return data; - }); + }) + .catch(msg => + log.error('Next build: did not recieve static site data: ' + sep + msg) + ); } diff --git a/yarn.lock b/yarn.lock index 18573634..cc6bcbe9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2035,6 +2035,13 @@ axe-core@^4.0.2: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.3.tgz#b55cd8e8ddf659fe89b064680e1c6a4dceab0325" integrity sha512-/lqqLAmuIPi79WYfRpy2i8z+x+vxU3zX2uAm0gs1q52qTuKwolOj1P8XbufpXcsydrpKx2yGn2wzAnxCMV86QA== +axios@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.23.0.tgz#b0fa5d0948a8d1d75e3d5635238b6c4625b05149" + integrity sha512-NmvAE4i0YAv5cKq8zlDoPd1VLKAqX5oLuZKs8xkJa4qi6RGn0uhCYFjWtHHC9EM/MwOwYWOs53W+V0aqEXq1sg== + dependencies: + follow-redirects "^1.14.4" + axobject-query@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" @@ -3585,6 +3592,11 @@ focus-trap@^6.7.1: dependencies: tabbable "^5.2.1" +follow-redirects@^1.14.4: + version "1.14.4" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" + integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== + foreach@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" From 540822cd491fd97a9b7ce4a8122ae388a8edbf6b Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 02:13:30 +0100 Subject: [PATCH 070/325] More anys refactored or moved to wrap_any --- schema/access.ts | 2 +- schema/content.ts | 10 +++++++--- schema/mutations.ts | 9 +++++++-- schema/users.ts | 2 +- wrap_any.tsx | 2 ++ 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/schema/access.ts b/schema/access.ts index 6ecbeb7e..10588ecd 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -31,7 +31,7 @@ export type SessionFrame = { operation: string; }; -export type ItemContext = { item: any } & SessionContext; +export type ItemContext = { item: ItemType } & SessionContext; //FIXME: Needs API key. export const isBuildEnvir = (frame: SessionFrame): boolean => { diff --git a/schema/content.ts b/schema/content.ts index 2385d413..a18f6b28 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -19,14 +19,18 @@ import { } from './access'; import { componentBlocks } from '../schema/fields/content/components'; +import { ItemSession, GraphQLInput } from '../wrap_any'; + //FIXME: // These anys are causing issues. What is the strong type? // The deduced type from permissions api is SessionFrame, but that doesn't work ... // MaybeSessionFunction has something to do with the ts error. export const contentUIConfig = { - hideCreate: (session: any) => !permissions.canManageContentItem(session), - hideDelete: (session: any) => !permissions.canManageContentItem(session), + hideCreate: (session: ItemSession) => + !permissions.canManageContentItem(session), + hideDelete: (session: ItemSession) => + !permissions.canManageContentItem(session), itemView: { defaultFieldMode: (session: ItemContext) => permissions.canManageContentSession(session) ? 'edit' : 'read', @@ -56,7 +60,7 @@ export const Label = list({ }, }); -function defaultSlug({ context, inputData }: any) { +function defaultSlug(inputData: GraphQLInput) { const date = new Date(); return `${ inputData?.title diff --git a/schema/mutations.ts b/schema/mutations.ts index c85fdf21..1a713eab 100644 --- a/schema/mutations.ts +++ b/schema/mutations.ts @@ -1,5 +1,10 @@ import { graphQLSchemaExtension } from '@keystone-next/keystone'; -import { KeystoneContext, PollWhereInput } from '.keystone/types'; +import { + KeystoneContext, + PollWhereInput, + PollWhereUniqueInput, +} from '.keystone/types'; +import { Poll, PollAnswer } from './polls'; import { log } from '../utils'; const gql = ([content]: TemplateStringsArray) => content; @@ -24,7 +29,7 @@ async function clearVote( if (answers.length) { await context.db.PollAnswer.updateMany({ - data: answers.map((answer: any) => ({ + data: answers.map((answer: PollWhereUniqueInput) => ({ where: { id: answer.id }, data: { answeredByUsers: { set: [] }, diff --git a/schema/users.ts b/schema/users.ts index ad73dd61..7a50c20b 100644 --- a/schema/users.ts +++ b/schema/users.ts @@ -20,7 +20,7 @@ import { GitHubRepo, githubReposResolver } from './fields/githubRepos/field'; // Removed an any, revealed an extra ? was required ! any = js ;) any is to be avoid like the plague unless trying to type compose ;) // strong type for any type. // That generic "cant assign to Maybe..." error seems be trying to say "There's an any, which is potentially undefined, but is not triggering a type error" -// On that not, I counted occurence of ": any" in the repo. 5902 results in 793 files :-O. Not good, since each hides a potential bug that is hiding +// On that not, I counted occurence of "any" in the repo. 5902 results in 793 files :-O. Not good, since each hides a potential bug that is hiding // from ts, like occured here. const fieldModes = { editSelfOrRead: ({ session, item }: ItemContext) => diff --git a/wrap_any.tsx b/wrap_any.tsx index 14b78bdd..f0c0a713 100644 --- a/wrap_any.tsx +++ b/wrap_any.tsx @@ -20,6 +20,8 @@ export type DocumentType = WrappedRampantlyPolymorphic export type ItemType = WrappedRampantlyPolymorphic +export type ItemSession = WrappedRampantlyPolymorphic +export type GraphQLInput = Record; From 6ccc584340eef2e34af4e39173eaaee59c900b82 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 02:37:55 +0100 Subject: [PATCH 071/325] Confirmed no throws in event handling. Annotated wrap_any --- wrap_any.tsx | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/wrap_any.tsx b/wrap_any.tsx index f0c0a713..84c1786e 100644 --- a/wrap_any.tsx +++ b/wrap_any.tsx @@ -1,27 +1,38 @@ -// Welcome to wrap_any: The aim is for this file to become empty! -// It's a place to admit temporary defeat in eliminating an `any` type, -// and clean the api a level higher by providing a concrete type. +// Welcome to wrap_any: The aim is for this file to become empty +// It's the place to admit temporary defeat in eliminating an `any` type, +// and clean the api at a level higher by providing concrete types -// This is really a JSX type, not sure how to define it yet. +// To ensure we only match any once in the top level of this app, +// and give any a descriptive type name +// This is the local alias for the dreaded `type` -// To ensure we only match any once in this module -// And give any a properly descriptive type name type WrappedRampantlyPolymorphic = any +//Any any is immediately assigned the status RampantlyPolymorphic, which matches exactly what it means +export type RampantlyPolymorphic = WrappedRampantlyPolymorphic +//Anything that really needs to be fully polymorphic has to earn the right +//Its first status is TestingHardenedAny export type TestingHardenedAny = WrappedRampantlyPolymorphic +//Then, once the code has been tested and fully working with undefined input, it can be promoted to export type HardenedAny = WrappedRampantlyPolymorphic -export type RampantlyPolymorphic = WrappedRampantlyPolymorphic + +// These are the problem functions +// The task is to strongly type them. Some require upstream modifications +// Others are just puzzling, and might have a local solution. + +// A JSX type? export type DocumentType = WrappedRampantlyPolymorphic +// These have taken hours of time to resolve, with no joy, and have found a temporary home here ... export type ItemType = WrappedRampantlyPolymorphic - export type ItemSession = WrappedRampantlyPolymorphic -export type GraphQLInput = Record; +//From deep down in the keystone types ... +export type GraphQLInput = Record; From 7359dab28cb3ba40bec452c6482b12b49466efc2 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 02:59:57 +0100 Subject: [PATCH 072/325] More SYMBOLIC_CONSTANTS --- schema/access.ts | 22 +++++++++++++--------- schema/content.ts | 7 +++++-- schema/mutations.ts | 7 +++---- schema/polls.ts | 8 ++++---- schema/users.ts | 30 ++++++++++++++---------------- 5 files changed, 39 insertions(+), 35 deletions(-) diff --git a/schema/access.ts b/schema/access.ts index 10588ecd..8bc02442 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -10,6 +10,19 @@ export const PUBLISHED = 'published'; export const DRAFT = 'draft'; export const ARCHIVED = 'archive'; +export const EDIT = 'edit'; +export const READ = 'read'; +export const HIDDEN = 'hidden'; + +//This is the fastest workaround I could find for not being able to return (where:) true (all records), or false (for no records). + +export const EVERY_POST_STATUS = { + status: { in: [PUBLISHED, DRAFT, ARCHIVED] }, +}; + +//export const UNIT_POST_STATUS = { status: { in: [] } }; +export const PUBLISHED_POST_STATUS = { status: { in: [PUBLISHED] } }; + export type SessionContext = { session?: { data: { @@ -89,15 +102,6 @@ export const permissions = { export const operationCanManageContentList = (frame: SessionFrame) => permissions.canManageContent(frame); -//This is the fastest workaround I could find for not being able to return (where:) true (all records), or false (for no records). - -export const EVERY_POST_STATUS = { - status: { in: [PUBLISHED, DRAFT, ARCHIVED] }, -}; - -//export const UNIT_POST_STATUS = { status: { in: [] } }; -export const PUBLISHED_POST_STATUS = { status: { in: [PUBLISHED] } }; - export const FilterCanManageContentList = (frame: SessionFrame) => { if (frame === undefined) { log.reportSecurityIncident( diff --git a/schema/content.ts b/schema/content.ts index a18f6b28..34173672 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -16,6 +16,9 @@ import { PUBLISHED, DRAFT, ARCHIVED, + EDIT, + READ, + HIDDEN, } from './access'; import { componentBlocks } from '../schema/fields/content/components'; @@ -33,7 +36,7 @@ export const contentUIConfig = { !permissions.canManageContentItem(session), itemView: { defaultFieldMode: (session: ItemContext) => - permissions.canManageContentSession(session) ? 'edit' : 'read', + permissions.canManageContentSession(session) ? EDIT : READ, }, }; @@ -92,7 +95,7 @@ export const Post = list({ fields: { title: text(), slug: text({ - ui: { createView: { fieldMode: 'hidden' } }, + ui: { createView: { fieldMode: HIDDEN } }, isIndexed: 'unique', hooks: { resolveInput: ({ operation, resolvedData, inputData, context }) => { diff --git a/schema/mutations.ts b/schema/mutations.ts index 1a713eab..d05ee85d 100644 --- a/schema/mutations.ts +++ b/schema/mutations.ts @@ -4,20 +4,19 @@ import { PollWhereInput, PollWhereUniqueInput, } from '.keystone/types'; -import { Poll, PollAnswer } from './polls'; + import { log } from '../utils'; const gql = ([content]: TemplateStringsArray) => content; -//Removed throw, which was crashing keystone async function clearVote( _context: KeystoneContext, pollFilter: PollWhereInput ) { const context = _context.sudo(); if (!context.session) { - log.warning('You must be signed in to vote'); - //new Error('You must be signed in to vote'); + //Removed throw, which was crashing keystone + log.warning('Stale context: you must be signed in to vote'); return; } diff --git a/schema/polls.ts b/schema/polls.ts index 4b7aab62..7e3dad35 100644 --- a/schema/polls.ts +++ b/schema/polls.ts @@ -2,7 +2,7 @@ import { relationship, text, virtual } from '@keystone-next/keystone/fields'; import { graphql, list } from '@keystone-next/keystone'; import { KeystoneListsAPI, KeystoneDbAPI } from '.keystone/types'; -import { isSignedIn, permissions } from './access'; +import { isSignedIn, permissions, HIDDEN } from './access'; import { contentListAccess, contentUIConfig } from './content'; export const Poll = list({ @@ -87,7 +87,7 @@ export const PollAnswer = list({ }, }), ui: { - itemView: { fieldMode: 'hidden' }, + itemView: { fieldMode: HIDDEN }, }, }), answeredByUsers: relationship({ @@ -97,8 +97,8 @@ export const PollAnswer = list({ access: { read: permissions.canManageContent }, ui: { displayMode: 'count', - createView: { fieldMode: 'hidden' }, - listView: { fieldMode: 'hidden' }, + createView: { fieldMode: HIDDEN }, + listView: { fieldMode: HIDDEN }, }, }), }, diff --git a/schema/users.ts b/schema/users.ts index 7a50c20b..406c3ec3 100644 --- a/schema/users.ts +++ b/schema/users.ts @@ -14,25 +14,23 @@ import { SessionContext, ItemContext, SessionFrame, + EDIT, + READ, + HIDDEN, } from './access'; import { GitHubRepo, githubReposResolver } from './fields/githubRepos/field'; -// Removed an any, revealed an extra ? was required ! any = js ;) any is to be avoid like the plague unless trying to type compose ;) -// strong type for any type. -// That generic "cant assign to Maybe..." error seems be trying to say "There's an any, which is potentially undefined, but is not triggering a type error" -// On that not, I counted occurence of "any" in the repo. 5902 results in 793 files :-O. Not good, since each hides a potential bug that is hiding -// from ts, like occured here. const fieldModes = { editSelfOrRead: ({ session, item }: ItemContext) => permissions.canManageUsersSession({ session }) || session?.itemId === item.id - ? 'edit' - : 'read', + ? EDIT + : READ, editSelfOrHidden: ({ session, item }: ItemContext) => permissions.canManageUsersSession({ session }) || session?.itemId === item.id - ? 'edit' - : 'hidden', + ? EDIT + : HIDDEN, }; export const User = list({ @@ -56,11 +54,11 @@ export const User = list({ !permissions.canManageUsersSession(session), itemView: { defaultFieldMode: (context: SessionContext) => - permissions.canManageUsersSession(context) ? 'edit' : 'hidden', + permissions.canManageUsersSession(context) ? EDIT : HIDDEN, }, listView: { defaultFieldMode: (context: SessionContext) => - permissions.canManageUsersSession(context) ? 'read' : 'hidden', + permissions.canManageUsersSession(context) ? READ : HIDDEN, }, }, fields: { @@ -103,9 +101,9 @@ export const User = list({ }), ui: { views: require.resolve('./fields/githubRepos/components'), - createView: { fieldMode: 'hidden' }, - listView: { fieldMode: 'hidden' }, - itemView: { fieldMode: 'read' }, + createView: { fieldMode: HIDDEN }, + listView: { fieldMode: HIDDEN }, + itemView: { fieldMode: READ }, query: '{ name htmlUrl description homepage stargazersCount }', }, }), @@ -114,7 +112,7 @@ export const User = list({ isFilterable: true, many: true, ui: { - createView: { fieldMode: 'hidden' }, + createView: { fieldMode: HIDDEN }, }, }), pollAnswers: relationship({ @@ -124,7 +122,7 @@ export const User = list({ access: permissions.canManageUsers, ui: { hideCreate: true, - createView: { fieldMode: 'hidden' }, + createView: { fieldMode: HIDDEN }, }, }), }, From 6484b0bb6e041d636e9e0b156e719c8dd9e3f34c Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 03:24:23 +0100 Subject: [PATCH 073/325] Updated readme --- README.md | 52 ++++++++++++++++++++---------------------------- schema/access.ts | 2 ++ 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index f83924f4..936d6257 100644 --- a/README.md +++ b/README.md @@ -66,48 +66,37 @@ utils.js This branch is dedicated to creating a solid foundation for a production build to extend keystone CMS from. -CI: Github actions in testing. Unseeded build. -``` -yarn commit "message" ... adds files and commits. -yarn push ... (auto push to origin latest) -``` - - - - -## Status report +CI: Github actions runner timed out. Local CI fully functional. Unseeded build. -✅ Authorization: Strong typing keystone frame types (bar one C++ style typecast) +`yarn commit "message"` fires of CI pipeline and only commits if unit tests passed. Requires yarn dev running without the main next front end, since yarn site:build is the primary unit test. -✅ Test code in access has a new temporary home in utils. +`yarn push` auto push to origin latest +`yarn commit "message" && yarn push` is what lands up being used. -Production build status: +## Production status report +✅ Pre release: Testing -✅ Pre release: Testing: Builds and decodes static x-api-key. +✅ More informative logging, suitable for deployment. +`✅ Logging: Code coverage: complete` -✅ Next build super user authorization to keystone, allowing for SSR/SSG/ISR tunneling. - A shout out to Jed for explaining the keystone way. +✅ Refactored literals. +✅ Authorization: Strong typing for keystone auth frame types +✅ Next build super user authorization to keystone, allowing SSR/SSG/ISR tunneling. + A shout out to Jed for explaining the keystone way. -✅ Next build api key: tested and working - -✅ Api key connected to workflow. - -✅ Pre production testing release status: -✅ Admin UI Authorization has passed preliminary testing. - -✅ Ready for exhaustive testing. Bug reports welcome! +Ready for exhaustive testing. Bug reports welcome! ``` -More informative logging, suitable for deployment. - `Code coverage: partial` + ## Resiliance testing -✅ A stale session led to the app throwing when voting occured. +✅ A stale session led to the app throwing when voting occured. Code fixed by a log.warning and return. -Rejigged fetch command because some failure tracks were never been called. +✅ Rejigged fetch command because some failure continuations were never been called. Tested and working. + Yields a clean model for managing the fetch continuations. -More defensive coding is required to check the are no more cases of this. +✅ Only throws were in polls and static data fetch. Both have been refactored. ## Security audit @@ -116,6 +105,9 @@ Status: `Preliminary`. ## TL;DR `(a: T)` is a type safe replacement for `(a: any)`, because we need to trap the awkward `undefined` cases at build time. +wrap_any.ts has the sole role of wrapping types that cant be deduced for some reason. It has proved to be a very +practical way of localising `any` issues. + `any` issues: Low level ts/js security audit: Research and development has established many bugs hide in the rampantly polymorphic `any` type. @@ -193,7 +185,7 @@ With these caveats in mind, enjoy, and be fully aware this release is in a `test ``` Known Issues: -Refactor literals. + Code can siliently fail in a ?. chain. The ?. construction is convenient, but not suitable for production logging, error trapping. diff --git a/schema/access.ts b/schema/access.ts index 8bc02442..cf21f50a 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -52,6 +52,8 @@ export const isBuildEnvir = (frame: SessionFrame): boolean => { // It's a bit confusing as to why this dodgy cast is needed. It took ages to get api keys working because of the // obscuriy of the workaround. // The top level query prefers SessionFrame, and does not build against KeystoneFrame (same, bar KeystoneContext for context) + // This does appear to be the right way to access the context, but why do we need to + // cast something as important as this? let kontext = frame?.context as KeystoneContext; let recvApiKey = kontext?.req?.headers['x-api-key']; From 028d3ee131c6a961567a2ebe4f1c6a844b81593c Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 04:22:55 +0100 Subject: [PATCH 074/325] github actions --- .github/workflows/latest.yml | 12 +++++++----- schema/content.ts | 1 + 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index ae6e0c06..e2925aa6 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -18,7 +18,7 @@ jobs: # This workflow contains a single job called "build" build: # The type of runner that the job will run on - runs-on: fedora:latest + runs-on: ubuntu-latest # Steps represent a sequence of tasks that will be executed as part of the job steps: @@ -35,12 +35,14 @@ jobs: set -euo pipefail appname="prisma_day_2021" echo "Build unseeded production server: $appname" - dnf reset nodejs - dnf module install nodejs:14/development - dnf install postgresql yes + cd ~ + curl -sL https://deb.nodesource.com/setup_14.x -o setup_14.sh + sudo ./setup_14.sh + sudo apt-get update + sudo apt install nodejs postgresql yes git cd $GITHUB_WORKSPACE DATABASE_URL="postgres://postgres:changeme@localhost/$appname" - KEYSTONE_NEXTJS_BUILD_API_KEY="definitely_change_me2_make_a_non_postgres_user2" + KEYSTONE_NEXTJS_BUILD_API_KEY="keystone_change_me2_make_a_non_postgres_user2" yes | yarn yarn dev & sleep 3 diff --git a/schema/content.ts b/schema/content.ts index 34173672..bd920308 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -54,6 +54,7 @@ export const Label = list({ fields: { name: text(), posts: relationship({ + isFilterable: true, ref: 'Post.labels', many: true, ui: { From 12be9bf4612db9ab5f53acbaae28bfe5fe5e874e Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 04:26:44 +0100 Subject: [PATCH 075/325] github actions : 2 --- .github/workflows/latest.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index e2925aa6..89b700e1 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -35,11 +35,12 @@ jobs: set -euo pipefail appname="prisma_day_2021" echo "Build unseeded production server: $appname" + sudo apt-get update + sudo apt install curl postgresql yes git cd ~ curl -sL https://deb.nodesource.com/setup_14.x -o setup_14.sh - sudo ./setup_14.sh - sudo apt-get update - sudo apt install nodejs postgresql yes git + sudo ./setup_14.sh + sudo apt install nodejs cd $GITHUB_WORKSPACE DATABASE_URL="postgres://postgres:changeme@localhost/$appname" KEYSTONE_NEXTJS_BUILD_API_KEY="keystone_change_me2_make_a_non_postgres_user2" From ac4510f1fc1f9245dff87f93d902ab7a2e7ed5cb Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 04:29:18 +0100 Subject: [PATCH 076/325] github actions : yes --- .github/workflows/latest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 89b700e1..cf4305d4 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -36,7 +36,7 @@ jobs: appname="prisma_day_2021" echo "Build unseeded production server: $appname" sudo apt-get update - sudo apt install curl postgresql yes git + sudo apt install curl postgresql git cd ~ curl -sL https://deb.nodesource.com/setup_14.x -o setup_14.sh sudo ./setup_14.sh From 2b18354571ee97633451e61017759cf22675239b Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 04:32:33 +0100 Subject: [PATCH 077/325] github actions : debugging --- .github/workflows/latest.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index cf4305d4..249fed19 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -39,6 +39,9 @@ jobs: sudo apt install curl postgresql git cd ~ curl -sL https://deb.nodesource.com/setup_14.x -o setup_14.sh + pwd + ls + chmod +x ./setup_14.sh sudo ./setup_14.sh sudo apt install nodejs cd $GITHUB_WORKSPACE From 86aa00ba5264a75aad5e747f3933d5842cfa36fd Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 04:35:11 +0100 Subject: [PATCH 078/325] github actions : no yes --- .github/workflows/latest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 249fed19..13140072 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -47,7 +47,7 @@ jobs: cd $GITHUB_WORKSPACE DATABASE_URL="postgres://postgres:changeme@localhost/$appname" KEYSTONE_NEXTJS_BUILD_API_KEY="keystone_change_me2_make_a_non_postgres_user2" - yes | yarn + yarn yarn dev & sleep 3 yarn site:build From 53faaa67be2ffa3b54ddbfd6b828624a9c973976 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 05:06:48 +0100 Subject: [PATCH 079/325] github actions : psql setup --- .github/workflows/latest.yml | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 13140072..b9a04259 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -33,23 +33,34 @@ jobs: - name: Install monorepo and give it a spin run: | set -euo pipefail - appname="prisma_day_2021" - echo "Build unseeded production server: $appname" + APPNAME="prisma_day_2021_latest" + POSTGRES_PASSWORD="changeme" + KEYSTONE_PGPASSWORD="changeme2" + KEYSTONE_DATABASE=$APPNAME + KEYSTONE_USERNAME="keystone_db_user" + KEYSTONE_NEXTJS_BUILD_API_KEY="keystone_change_me2_make_a_non_postgres_user2" + + DATABASE_URL="postgres://$KEYSTONE_USERNAME:$POSTGRES_PASSWORD@localhost/$KEYSTONE_DATABASE" + + echo "ubuntu dependent CI:" sudo apt-get update sudo apt install curl postgresql git cd ~ curl -sL https://deb.nodesource.com/setup_14.x -o setup_14.sh - pwd - ls chmod +x ./setup_14.sh sudo ./setup_14.sh sudo apt install nodejs cd $GITHUB_WORKSPACE - DATABASE_URL="postgres://postgres:changeme@localhost/$appname" - KEYSTONE_NEXTJS_BUILD_API_KEY="keystone_change_me2_make_a_non_postgres_user2" + + psql -X -U postgres -t -c "create user user_name with encrypted password '$KEYSTONE_PGPASSWORD';" + psql -X -U postgres -t -c "CREATE DATABASE $KEYSTONE_DATABASE;" + psql -X -U postgres -t -c "grant all privileges on database $KEYSTONE_DATABASE to $KEYSTONE_USERNAME;" + psql -X -U postgres -t -c "ALTER USER postgres PASSWORD '$POSTGRES_PASSWORD';" + yarn yarn dev & - sleep 3 + sleep 5 + echo "Building unseeded production server: $APPNAME" yarn site:build echo "Build unseeded $appname:latest production succeded" From 467ab1a395e7cfa944841da634ad26dbe7f4ba16 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 05:10:07 +0100 Subject: [PATCH 080/325] github actions : postgres not running? --- .github/workflows/latest.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index b9a04259..28f2d5f0 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -45,6 +45,8 @@ jobs: echo "ubuntu dependent CI:" sudo apt-get update sudo apt install curl postgresql git + systemctl start postgres.service + cd ~ curl -sL https://deb.nodesource.com/setup_14.x -o setup_14.sh chmod +x ./setup_14.sh From 9d6abb64f71e5e9571e348000bbd7e36b3893443 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 05:12:32 +0100 Subject: [PATCH 081/325] github actions : more sudos --- .github/workflows/latest.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 28f2d5f0..b965a5d0 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -45,8 +45,8 @@ jobs: echo "ubuntu dependent CI:" sudo apt-get update sudo apt install curl postgresql git - systemctl start postgres.service - + sudo systemctl start postgres.service + cd ~ curl -sL https://deb.nodesource.com/setup_14.x -o setup_14.sh chmod +x ./setup_14.sh @@ -54,10 +54,10 @@ jobs: sudo apt install nodejs cd $GITHUB_WORKSPACE - psql -X -U postgres -t -c "create user user_name with encrypted password '$KEYSTONE_PGPASSWORD';" - psql -X -U postgres -t -c "CREATE DATABASE $KEYSTONE_DATABASE;" - psql -X -U postgres -t -c "grant all privileges on database $KEYSTONE_DATABASE to $KEYSTONE_USERNAME;" - psql -X -U postgres -t -c "ALTER USER postgres PASSWORD '$POSTGRES_PASSWORD';" + sudo psql -X -U postgres -t -c "create user user_name with encrypted password '$KEYSTONE_PGPASSWORD';" + sudo psql -X -U postgres -t -c "CREATE DATABASE $KEYSTONE_DATABASE;" + sudo psql -X -U postgres -t -c "grant all privileges on database $KEYSTONE_DATABASE to $KEYSTONE_USERNAME;" + sudo psql -X -U postgres -t -c "ALTER USER postgres PASSWORD '$POSTGRES_PASSWORD';" yarn yarn dev & From c9f8006198cfbfd62822ddc2feea975ad4fb7bf3 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 05:15:58 +0100 Subject: [PATCH 082/325] github actions : pg_ctl --- .github/workflows/latest.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index b965a5d0..4c345c93 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -45,7 +45,8 @@ jobs: echo "ubuntu dependent CI:" sudo apt-get update sudo apt install curl postgresql git - sudo systemctl start postgres.service + + pg_ctl start cd ~ curl -sL https://deb.nodesource.com/setup_14.x -o setup_14.sh From 2618b9ad558b00426b4695273bd7cc9db862f853 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 05:18:05 +0100 Subject: [PATCH 083/325] github actions : sudo pg_ctl --- .github/workflows/latest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 4c345c93..910ba4c5 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -46,7 +46,7 @@ jobs: sudo apt-get update sudo apt install curl postgresql git - pg_ctl start + sudo pg_ctl start cd ~ curl -sL https://deb.nodesource.com/setup_14.x -o setup_14.sh From 24ee808763eae87e42eaaf29c024762df7d3591c Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 05:20:29 +0100 Subject: [PATCH 084/325] github actions : removed pg_ctl --- .github/workflows/latest.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 910ba4c5..b9a6072d 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -44,9 +44,7 @@ jobs: echo "ubuntu dependent CI:" sudo apt-get update - sudo apt install curl postgresql git - - sudo pg_ctl start + sudo apt install curl postgresql postgresql-contrib git cd ~ curl -sL https://deb.nodesource.com/setup_14.x -o setup_14.sh From 8336a709421a8475cdb9fe09f042bbb4d574b97a Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 05:24:25 +0100 Subject: [PATCH 085/325] github actions : sudo pg_ctlcluster 12 main start --- .github/workflows/latest.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index b9a6072d..2d6b2882 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -45,7 +45,9 @@ jobs: echo "ubuntu dependent CI:" sudo apt-get update sudo apt install curl postgresql postgresql-contrib git - + sudo pg_ctlcluster 12 main start + + cd ~ curl -sL https://deb.nodesource.com/setup_14.x -o setup_14.sh chmod +x ./setup_14.sh From 549b35dbcd63da726d752145f6f15a7c97c6e7b7 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 05:29:03 +0100 Subject: [PATCH 086/325] github actions : localhost db --- .github/workflows/latest.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 2d6b2882..ecb9ae1f 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -55,10 +55,10 @@ jobs: sudo apt install nodejs cd $GITHUB_WORKSPACE - sudo psql -X -U postgres -t -c "create user user_name with encrypted password '$KEYSTONE_PGPASSWORD';" - sudo psql -X -U postgres -t -c "CREATE DATABASE $KEYSTONE_DATABASE;" - sudo psql -X -U postgres -t -c "grant all privileges on database $KEYSTONE_DATABASE to $KEYSTONE_USERNAME;" - sudo psql -X -U postgres -t -c "ALTER USER postgres PASSWORD '$POSTGRES_PASSWORD';" + sudo psql -X -h localhost -U postgres -t -c "create user user_name with encrypted password '$KEYSTONE_PGPASSWORD';" + sudo psql -X -h localhost -U postgres -t -c "CREATE DATABASE $KEYSTONE_DATABASE;" + sudo psql -X -h localhost -U postgres -t -c "grant all privileges on database $KEYSTONE_DATABASE to $KEYSTONE_USERNAME;" + sudo psql -X -h localhost -U postgres -t -c "ALTER USER postgres PASSWORD '$POSTGRES_PASSWORD';" yarn yarn dev & From 5a4bf04e7db138ce0dcc26a11679bab381fc86eb Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 05:33:51 +0100 Subject: [PATCH 087/325] github actions : postgres still sleepy --- .github/workflows/latest.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index ecb9ae1f..2afd826a 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -44,10 +44,13 @@ jobs: echo "ubuntu dependent CI:" sudo apt-get update - sudo apt install curl postgresql postgresql-contrib git + sudo apt install curl postgresql git sudo pg_ctlcluster 12 main start + service postgresql start - + echo $(netstat -an | grep postgresql) + echo $(ps -ax | grep postgresql) + cd ~ curl -sL https://deb.nodesource.com/setup_14.x -o setup_14.sh chmod +x ./setup_14.sh From b607d54e7b693f8cf921fecf2196849369c287c2 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 05:35:11 +0100 Subject: [PATCH 088/325] CI : postgres ... --- .github/workflows/latest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 2afd826a..59ccd810 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -45,7 +45,7 @@ jobs: echo "ubuntu dependent CI:" sudo apt-get update sudo apt install curl postgresql git - sudo pg_ctlcluster 12 main start + service postgresql start echo $(netstat -an | grep postgresql) From e6a05970a658418e35d3afd790722dfe89d91558 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 05:36:29 +0100 Subject: [PATCH 089/325] CI : why ubuntu ... fedora pls --- .github/workflows/latest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 59ccd810..7a46b807 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -46,7 +46,7 @@ jobs: sudo apt-get update sudo apt install curl postgresql git - service postgresql start + sudo service postgresql start echo $(netstat -an | grep postgresql) echo $(ps -ax | grep postgresql) From b8d28a2c80950cb3452b992b6fe04558a28364a6 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 05:42:11 +0100 Subject: [PATCH 090/325] CI : why ubuntu? PGPASSWD=admin --- .github/workflows/latest.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 7a46b807..7548ed60 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -57,7 +57,9 @@ jobs: sudo ./setup_14.sh sudo apt install nodejs cd $GITHUB_WORKSPACE - + + export PGPASSWORD=admin + sudo psql -X -h localhost -U postgres -t -c "create user user_name with encrypted password '$KEYSTONE_PGPASSWORD';" sudo psql -X -h localhost -U postgres -t -c "CREATE DATABASE $KEYSTONE_DATABASE;" sudo psql -X -h localhost -U postgres -t -c "grant all privileges on database $KEYSTONE_DATABASE to $KEYSTONE_USERNAME;" From cfc01ecaf71202f0787544eff99e448e274edbd2 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 05:44:00 +0100 Subject: [PATCH 091/325] CI : why ubuntu???? PGPASSWD=admin --- .github/workflows/latest.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 7548ed60..0198a44f 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -58,12 +58,11 @@ jobs: sudo apt install nodejs cd $GITHUB_WORKSPACE - export PGPASSWORD=admin - sudo psql -X -h localhost -U postgres -t -c "create user user_name with encrypted password '$KEYSTONE_PGPASSWORD';" - sudo psql -X -h localhost -U postgres -t -c "CREATE DATABASE $KEYSTONE_DATABASE;" - sudo psql -X -h localhost -U postgres -t -c "grant all privileges on database $KEYSTONE_DATABASE to $KEYSTONE_USERNAME;" - sudo psql -X -h localhost -U postgres -t -c "ALTER USER postgres PASSWORD '$POSTGRES_PASSWORD';" + PGPASSWORD=admin psql -X -h localhost -U postgres -t -c "create user user_name with encrypted password '$KEYSTONE_PGPASSWORD';" + PGPASSWORD=admin psql -X -h localhost -U postgres -t -c "CREATE DATABASE $KEYSTONE_DATABASE;" + PGPASSWORD=admin psql -X -h localhost -U postgres -t -c "grant all privileges on database $KEYSTONE_DATABASE to $KEYSTONE_USERNAME;" + PGPASSWORD=admin psql -X -h localhost -U postgres -t -c "ALTER USER postgres PASSWORD '$POSTGRES_PASSWORD';" yarn yarn dev & From 325949affdb1ebd0e2e2be4582efb253ce2cce0f Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 05:50:40 +0100 Subject: [PATCH 092/325] CI : why ubuntu???? PG --- .github/workflows/latest.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 0198a44f..15bb69cc 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -58,11 +58,11 @@ jobs: sudo apt install nodejs cd $GITHUB_WORKSPACE - - PGPASSWORD=admin psql -X -h localhost -U postgres -t -c "create user user_name with encrypted password '$KEYSTONE_PGPASSWORD';" - PGPASSWORD=admin psql -X -h localhost -U postgres -t -c "CREATE DATABASE $KEYSTONE_DATABASE;" - PGPASSWORD=admin psql -X -h localhost -U postgres -t -c "grant all privileges on database $KEYSTONE_DATABASE to $KEYSTONE_USERNAME;" - PGPASSWORD=admin psql -X -h localhost -U postgres -t -c "ALTER USER postgres PASSWORD '$POSTGRES_PASSWORD';" + PG=sudo su - postgres psql -X -h localhost -U postgres -t -c + $PG "create user user_name with encrypted password '$KEYSTONE_PGPASSWORD';" + $PG "CREATE DATABASE $KEYSTONE_DATABASE;" + $PG "grant all privileges on database $KEYSTONE_DATABASE to $KEYSTONE_USERNAME;" + $PG "ALTER USER postgres PASSWORD '$POSTGRES_PASSWORD';" yarn yarn dev & From efa6d9830d3cd975be96ef45d8381ecdb4c4cb7c Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 05:55:28 +0100 Subject: [PATCH 093/325] CI : why ubuntu? x 10 --- .github/workflows/latest.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 15bb69cc..7579eb9d 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -58,11 +58,11 @@ jobs: sudo apt install nodejs cd $GITHUB_WORKSPACE - PG=sudo su - postgres psql -X -h localhost -U postgres -t -c - $PG "create user user_name with encrypted password '$KEYSTONE_PGPASSWORD';" - $PG "CREATE DATABASE $KEYSTONE_DATABASE;" - $PG "grant all privileges on database $KEYSTONE_DATABASE to $KEYSTONE_USERNAME;" - $PG "ALTER USER postgres PASSWORD '$POSTGRES_PASSWORD';" + PG() {su - postgres "psql -X -h localhost -U postgres -t -c \"$@\""} + PG "create user user_name with encrypted password '$KEYSTONE_PGPASSWORD';" + PG "CREATE DATABASE $KEYSTONE_DATABASE;" + PG "grant all privileges on database $KEYSTONE_DATABASE to $KEYSTONE_USERNAME;" + PG "ALTER USER postgres PASSWORD '$POSTGRES_PASSWORD';" yarn yarn dev & From c0ba759dfe92988a53360f8c2c87f2a81c42613f Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 05:57:13 +0100 Subject: [PATCH 094/325] CI : why ubuntu? x 11 --- .github/workflows/latest.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 7579eb9d..f5684120 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -58,7 +58,9 @@ jobs: sudo apt install nodejs cd $GITHUB_WORKSPACE - PG() {su - postgres "psql -X -h localhost -U postgres -t -c \"$@\""} + PG() { + su - postgres "psql -X -h localhost -U postgres -t -c \"$@\"" + } PG "create user user_name with encrypted password '$KEYSTONE_PGPASSWORD';" PG "CREATE DATABASE $KEYSTONE_DATABASE;" PG "grant all privileges on database $KEYSTONE_DATABASE to $KEYSTONE_USERNAME;" From fd175ff2ca81b7bf229398eb155f19c5eb84c347 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 05:58:52 +0100 Subject: [PATCH 095/325] CI : why ubuntu? sudo su - --- .github/workflows/latest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index f5684120..9b5fbf9f 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -59,7 +59,7 @@ jobs: cd $GITHUB_WORKSPACE PG() { - su - postgres "psql -X -h localhost -U postgres -t -c \"$@\"" + sudo su - postgres "psql -X -h localhost -U postgres -t -c \"$@\"" } PG "create user user_name with encrypted password '$KEYSTONE_PGPASSWORD';" PG "CREATE DATABASE $KEYSTONE_DATABASE;" From 50026ca253ecd6ec98c710f6b4ec251302e70e3c Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 06:32:56 +0100 Subject: [PATCH 096/325] CI : container code for pg and node --- .github/workflows/latest.yml | 65 ++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 9b5fbf9f..07f2596c 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -17,55 +17,54 @@ on: jobs: # This workflow contains a single job called "build" build: - # The type of runner that the job will run on +jobs: + postgres: runs-on: ubuntu-latest - - # Steps represent a sequence of tasks that will be executed as part of the job + container: node:14.18.1-bullseye + services: + postgres: + image: postgres:latest + env: + POSTGRES_DB: prisma_day_2021_latest + POSTGRES_PASSWORD: change_me_in_multiple_places + POSTGRES_PORT: 5432 + POSTGRES_USER: postgres_user + ports: + - 5432:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v2 - - # Runs a single command using the runners shell - - name: Run a one-line script - run: echo "Unit testing:" + - name: Install PostgreSQL client + run: | + apt-get update + apt-get install --yes postgresql-client + + - name: Query database + run: psql -h postgres -d prisma_day_2021_latest -U postgres_user -c 'SELECT 1;' + env: + PGPASSWORD: change_me_in_multiple_places - # Runs a set of commands using the runners shell - - name: Install monorepo and give it a spin + --name: Setup keystone run: | set -euo pipefail APPNAME="prisma_day_2021_latest" - POSTGRES_PASSWORD="changeme" + POSTGRES_PASSWORD="change_me_in_multiple_places" KEYSTONE_PGPASSWORD="changeme2" KEYSTONE_DATABASE=$APPNAME - KEYSTONE_USERNAME="keystone_db_user" + KEYSTONE_USERNAME="postgres_user" KEYSTONE_NEXTJS_BUILD_API_KEY="keystone_change_me2_make_a_non_postgres_user2" DATABASE_URL="postgres://$KEYSTONE_USERNAME:$POSTGRES_PASSWORD@localhost/$KEYSTONE_DATABASE" echo "ubuntu dependent CI:" sudo apt-get update - sudo apt install curl postgresql git - - sudo service postgresql start - - echo $(netstat -an | grep postgresql) - echo $(ps -ax | grep postgresql) + sudo apt install curl git - cd ~ - curl -sL https://deb.nodesource.com/setup_14.x -o setup_14.sh - chmod +x ./setup_14.sh - sudo ./setup_14.sh - sudo apt install nodejs + cd $GITHUB_WORKSPACE - - PG() { - sudo su - postgres "psql -X -h localhost -U postgres -t -c \"$@\"" - } - PG "create user user_name with encrypted password '$KEYSTONE_PGPASSWORD';" - PG "CREATE DATABASE $KEYSTONE_DATABASE;" - PG "grant all privileges on database $KEYSTONE_DATABASE to $KEYSTONE_USERNAME;" - PG "ALTER USER postgres PASSWORD '$POSTGRES_PASSWORD';" - yarn yarn dev & sleep 5 From 4a88d1904cfad008c2592294b84daeb70c2fe0e1 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 06:34:15 +0100 Subject: [PATCH 097/325] CI : fixing up yaml --- .github/workflows/latest.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 07f2596c..e5950e26 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -44,8 +44,7 @@ jobs: - name: Query database run: psql -h postgres -d prisma_day_2021_latest -U postgres_user -c 'SELECT 1;' - env: - PGPASSWORD: change_me_in_multiple_places + --name: Setup keystone run: | @@ -72,4 +71,7 @@ jobs: yarn site:build echo "Build unseeded $appname:latest production succeded" + env: + PGPASSWORD: change_me_in_multiple_places + # Deploy: From 75591b108715d269e3a4b2a6e4d6501e4710d2e4 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 06:36:11 +0100 Subject: [PATCH 098/325] CI : fixing up yaml: 2 --- .github/workflows/latest.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index e5950e26..d3df5e81 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -37,17 +37,13 @@ jobs: --health-timeout 5s --health-retries 5 steps: - - name: Install PostgreSQL client + - name: Setup keystone run: | apt-get update apt-get install --yes postgresql-client - - name: Query database - run: psql -h postgres -d prisma_day_2021_latest -U postgres_user -c 'SELECT 1;' + psql -h postgres -d prisma_day_2021_latest -U postgres_user -c 'SELECT 1;' - - --name: Setup keystone - run: | set -euo pipefail APPNAME="prisma_day_2021_latest" POSTGRES_PASSWORD="change_me_in_multiple_places" From 07f5afe212d90069636a634c03a514f024284ecf Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 06:39:23 +0100 Subject: [PATCH 099/325] CI : fixing up yaml: 3 --- .github/workflows/latest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index d3df5e81..26b7c186 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -17,7 +17,7 @@ on: jobs: # This workflow contains a single job called "build" build: -jobs: + postgres: runs-on: ubuntu-latest container: node:14.18.1-bullseye From 49822d615f086181d4ad2ee92db69ee3ea03312c Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 06:44:54 +0100 Subject: [PATCH 100/325] CI : fixing up yaml: 4 --- .github/workflows/latest.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 26b7c186..84cd9171 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -16,9 +16,7 @@ on: # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: # This workflow contains a single job called "build" - build: - - postgres: + prisma_day_2021: runs-on: ubuntu-latest container: node:14.18.1-bullseye services: @@ -39,6 +37,7 @@ jobs: steps: - name: Setup keystone run: | + uses: actions/checkout@v2 apt-get update apt-get install --yes postgresql-client From 65341d846c2da1b85dead6d9b5929ebcfcc915b5 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 06:47:55 +0100 Subject: [PATCH 101/325] CI : fixing up yaml: 5 --- .github/workflows/latest.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 84cd9171..4b712015 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -36,8 +36,9 @@ jobs: --health-retries 5 steps: - name: Setup keystone + uses: actions/checkout@v2 run: | - uses: actions/checkout@v2 + apt-get update apt-get install --yes postgresql-client From 9e1b2ac526bc39cff26f3a908c62e0d92f9cd334 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 06:51:41 +0100 Subject: [PATCH 102/325] CI : fixing up yaml: 6 --- .github/workflows/latest.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 4b712015..9b6ba87e 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -54,9 +54,6 @@ jobs: DATABASE_URL="postgres://$KEYSTONE_USERNAME:$POSTGRES_PASSWORD@localhost/$KEYSTONE_DATABASE" - echo "ubuntu dependent CI:" - sudo apt-get update - sudo apt install curl git cd $GITHUB_WORKSPACE From a3c7333a80a9108f69734bdb33d23f2c9ff666ed Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 07:10:42 +0100 Subject: [PATCH 103/325] CI : yaml hell: 7 --- .github/workflows/latest.yml | 3 ++- package.json | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 9b6ba87e..6b868fbf 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -35,8 +35,9 @@ jobs: --health-timeout 5s --health-retries 5 steps: - - name: Setup keystone + - name: Checkout application uses: actions/checkout@v2 + - name: Install application run: | apt-get update diff --git a/package.json b/package.json index e43cf941..88085010 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "clean": "rm -rf node_modules yarn.lock .keystone .next", "gitadd": "yarn format && git add . ||:", "commit": "yarn site:build && yarn gitadd && git commit -a -m ", + "fastcommit": "yarn gitadd && git commit -a -m ", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable && yarn next lint", "site:dev": "next dev -p 8000", From c64d15ddc56b90636810ba2b1ef9bba820588bb9 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 07:20:50 +0100 Subject: [PATCH 104/325] CI : yaml hell: 8 --- .github/workflows/latest.yml | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 6b868fbf..e87e7055 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-latest container: node:14.18.1-bullseye services: - postgres: + db: image: postgres:latest env: POSTGRES_DB: prisma_day_2021_latest @@ -43,20 +43,10 @@ jobs: apt-get update apt-get install --yes postgresql-client - psql -h postgres -d prisma_day_2021_latest -U postgres_user -c 'SELECT 1;' + psql -h postgres -d $APPNAME -U postgres_user -c 'SELECT 1; - set -euo pipefail - APPNAME="prisma_day_2021_latest" - POSTGRES_PASSWORD="change_me_in_multiple_places" - KEYSTONE_PGPASSWORD="changeme2" - KEYSTONE_DATABASE=$APPNAME - KEYSTONE_USERNAME="postgres_user" - KEYSTONE_NEXTJS_BUILD_API_KEY="keystone_change_me2_make_a_non_postgres_user2" + DATABASE_URL="postgres://$KEYSTONE_USERNAME:$PGPASSWORD@db/$APPNAME" - DATABASE_URL="postgres://$KEYSTONE_USERNAME:$POSTGRES_PASSWORD@localhost/$KEYSTONE_DATABASE" - - - cd $GITHUB_WORKSPACE yarn yarn dev & @@ -67,5 +57,7 @@ jobs: env: PGPASSWORD: change_me_in_multiple_places - + KEYSTONE_USERNAME: postgres_user + APPNAME: prisma_day_2021_latest + KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 # Deploy: From 689e3906fdad76934371aa75b8b17af94e6afe3f Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 07:30:13 +0100 Subject: [PATCH 105/325] CI : smaller runs, actions not echoing --- .github/workflows/latest.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index e87e7055..1ebfeab2 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -37,20 +37,19 @@ jobs: steps: - name: Checkout application uses: actions/checkout@v2 - - name: Install application + - name: Run yarn run: | - - apt-get update - apt-get install --yes postgresql-client - - psql -h postgres -d $APPNAME -U postgres_user -c 'SELECT 1; - + DATABASE_URL="postgres://$KEYSTONE_USERNAME:$PGPASSWORD@db/$APPNAME" cd $GITHUB_WORKSPACE yarn + -name: Start keystone + run: | yarn dev & - sleep 5 + sleep 5 + -name: Start next build + run: | echo "Building unseeded production server: $APPNAME" yarn site:build echo "Build unseeded $appname:latest production succeded" From db3e2e0c89b31d78cc2708d8a96d997ace50efdc Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 07:32:28 +0100 Subject: [PATCH 106/325] CI : smaller runs: 2 --- .github/workflows/latest.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 1ebfeab2..36c05d74 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -38,10 +38,8 @@ jobs: - name: Checkout application uses: actions/checkout@v2 - name: Run yarn - run: | - + run: | DATABASE_URL="postgres://$KEYSTONE_USERNAME:$PGPASSWORD@db/$APPNAME" - cd $GITHUB_WORKSPACE yarn -name: Start keystone @@ -52,7 +50,7 @@ jobs: run: | echo "Building unseeded production server: $APPNAME" yarn site:build - echo "Build unseeded $appname:latest production succeded" + echo "Build unseeded $APPNAME:latest production succeded" env: PGPASSWORD: change_me_in_multiple_places From c7fb6348a84f71a8383d195edc5063375594cf11 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 07:37:16 +0100 Subject: [PATCH 107/325] CI : smaller runs: 3 --- .github/workflows/latest.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 36c05d74..6fa6ae8e 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -41,13 +41,14 @@ jobs: run: | DATABASE_URL="postgres://$KEYSTONE_USERNAME:$PGPASSWORD@db/$APPNAME" cd $GITHUB_WORKSPACE - yarn - -name: Start keystone - run: | + yarn + - name: Start keystone + run: | + yarn dev & sleep 5 - -name: Start next build - run: | + - name: Start next build + run: | echo "Building unseeded production server: $APPNAME" yarn site:build echo "Build unseeded $APPNAME:latest production succeded" From f0bf72111657cff6b1ee52d0bbe55e136598415f Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 08:19:13 +0100 Subject: [PATCH 108/325] CI : rewrote dbUrl to be more CI friendly --- .github/workflows/latest.yml | 22 +++++++++++----------- keystone.ts | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 6fa6ae8e..da833688 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -20,13 +20,8 @@ jobs: runs-on: ubuntu-latest container: node:14.18.1-bullseye services: - db: + pg: image: postgres:latest - env: - POSTGRES_DB: prisma_day_2021_latest - POSTGRES_PASSWORD: change_me_in_multiple_places - POSTGRES_PORT: 5432 - POSTGRES_USER: postgres_user ports: - 5432:5432 options: >- @@ -34,17 +29,21 @@ jobs: --health-interval 10s --health-timeout 5s --health-retries 5 + env: + POSTGRES_DB: prisma_day_2021_latest + POSTGRES_PASSWORD: change_me_in_multiple_places + POSTGRES_PORT: 5432 + POSTGRES_USER: postgres_user + steps: - name: Checkout application uses: actions/checkout@v2 - name: Run yarn run: | - DATABASE_URL="postgres://$KEYSTONE_USERNAME:$PGPASSWORD@db/$APPNAME" cd $GITHUB_WORKSPACE yarn - name: Start keystone run: | - yarn dev & sleep 5 - name: Start next build @@ -54,8 +53,9 @@ jobs: echo "Build unseeded $APPNAME:latest production succeded" env: - PGPASSWORD: change_me_in_multiple_places - KEYSTONE_USERNAME: postgres_user - APPNAME: prisma_day_2021_latest + POSTGRES_PASSWORD: change_me_in_multiple_places + USER: postgres_user + POSTGRES_DB: prisma_day_2021_latest KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 + PG_HOST: pg # Deploy: diff --git a/keystone.ts b/keystone.ts index 6541490d..cd881670 100644 --- a/keystone.ts +++ b/keystone.ts @@ -6,8 +6,8 @@ import { lists, extendGraphqlSchema } from './schema'; import { permissions } from './schema/access'; const dbUrl = - process.env.DATABASE_URL || - `postgres://${process.env.USER}@localhost/prisma-day-workshop`; + `postgres://${process.env?.POSTGRES_USER}:${process.env?.POSTGRES_PASSWORD}@${process.env?.POSTGRES_HOST}/${process.env?.POSTGRES_DB}` || + '${process.env.DATABASE_URL}'; const sessionSecret = process.env.SESSION_SECERT || From ab6c5b62ec81d2f5fd014bc95e69cecb79674ebc Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 08:29:37 +0100 Subject: [PATCH 109/325] CI : logging db url --- .github/workflows/latest.yml | 6 +++--- keystone.ts | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index da833688..7db03b55 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -48,14 +48,14 @@ jobs: sleep 5 - name: Start next build run: | - echo "Building unseeded production server: $APPNAME" + echo "Building unseeded production server: $POSTGRES_DB" yarn site:build echo "Build unseeded $APPNAME:latest production succeded" env: POSTGRES_PASSWORD: change_me_in_multiple_places - USER: postgres_user + POSTGRES_USER: postgres_user POSTGRES_DB: prisma_day_2021_latest KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 - PG_HOST: pg + POSTGRES_HOST: pg # Deploy: diff --git a/keystone.ts b/keystone.ts index cd881670..e8dc9b7c 100644 --- a/keystone.ts +++ b/keystone.ts @@ -9,6 +9,8 @@ const dbUrl = `postgres://${process.env?.POSTGRES_USER}:${process.env?.POSTGRES_PASSWORD}@${process.env?.POSTGRES_HOST}/${process.env?.POSTGRES_DB}` || '${process.env.DATABASE_URL}'; +console.log(`Database url: ${dbUrl}`); + const sessionSecret = process.env.SESSION_SECERT || 'iLqbHhm7qwiBNc8KgL4NQ8tD8fFVhNhNqZ2nRdprgnKNjgJHgvitWx6DPoZJpYHa'; From 5f91d9a36d6441d7385c9492db9922f24eb28852 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 08:38:03 +0100 Subject: [PATCH 110/325] CI : env issues --- .github/workflows/latest.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 7db03b55..05bdaaba 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -39,7 +39,8 @@ jobs: - name: Checkout application uses: actions/checkout@v2 - name: Run yarn - run: | + run: | + echo $POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/$POSTGRES_DB cd $GITHUB_WORKSPACE yarn - name: Start keystone @@ -48,9 +49,9 @@ jobs: sleep 5 - name: Start next build run: | - echo "Building unseeded production server: $POSTGRES_DB" + echo "Building unseeded production server: $POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/$POSTGRES_DB" yarn site:build - echo "Build unseeded $APPNAME:latest production succeded" + echo "Build unseeded $POSTGRES_DB:latest production succeded" env: POSTGRES_PASSWORD: change_me_in_multiple_places From 45a54254c139df2bf51b399d1876764cdf70bb02 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 08:47:36 +0100 Subject: [PATCH 111/325] CI : dbUrl issue: testing --- .github/workflows/latest.yml | 4 +++- keystone.ts | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 05bdaaba..88714b43 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -40,8 +40,10 @@ jobs: uses: actions/checkout@v2 - name: Run yarn run: | - echo $POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/$POSTGRES_DB + DATABASE_URL=postgres://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/$POSTGRES_DB + echo $DATABASE_URL cd $GITHUB_WORKSPACE + ls -alt yarn - name: Start keystone run: | diff --git a/keystone.ts b/keystone.ts index e8dc9b7c..b57e4268 100644 --- a/keystone.ts +++ b/keystone.ts @@ -6,8 +6,8 @@ import { lists, extendGraphqlSchema } from './schema'; import { permissions } from './schema/access'; const dbUrl = - `postgres://${process.env?.POSTGRES_USER}:${process.env?.POSTGRES_PASSWORD}@${process.env?.POSTGRES_HOST}/${process.env?.POSTGRES_DB}` || - '${process.env.DATABASE_URL}'; + `${process.env.DATABASE_URL}` || + `postgres://${process.env?.POSTGRES_USER}:${process.env?.POSTGRES_PASSWORD}@${process.env?.POSTGRES_HOST}/${process.env?.POSTGRES_DB}`; console.log(`Database url: ${dbUrl}`); From 7349d4da1fea63b1f6e9d4e71869034f057ed5ef Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 08:51:26 +0100 Subject: [PATCH 112/325] CI : env getting corrupted --- .github/workflows/latest.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 88714b43..4563d207 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -40,8 +40,8 @@ jobs: uses: actions/checkout@v2 - name: Run yarn run: | - DATABASE_URL=postgres://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/$POSTGRES_DB - echo $DATABASE_URL + export DATABASE_URL="postgres://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/$POSTGRES_DB" + echo "$DATABASE_URL" cd $GITHUB_WORKSPACE ls -alt yarn From 69595cff27ffd7a867b48f09180a026f269d9565 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 08:54:07 +0100 Subject: [PATCH 113/325] CI : backslash? --- .github/workflows/latest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 4563d207..f0d984a2 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -40,7 +40,7 @@ jobs: uses: actions/checkout@v2 - name: Run yarn run: | - export DATABASE_URL="postgres://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/$POSTGRES_DB" + export DATABASE_URL=postgres://$POSTGRES_USER:$POSTGRES_PASSWORD\@$POSTGRES_HOST/$POSTGRES_DB echo "$DATABASE_URL" cd $GITHUB_WORKSPACE ls -alt From e963241b1c73574a033f25419fcd58dde8b49bfe Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 08:57:39 +0100 Subject: [PATCH 114/325] CI : echo? running out of ideas ;) --- .github/workflows/latest.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index f0d984a2..fe818bd9 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -39,9 +39,10 @@ jobs: - name: Checkout application uses: actions/checkout@v2 - name: Run yarn - run: | - export DATABASE_URL=postgres://$POSTGRES_USER:$POSTGRES_PASSWORD\@$POSTGRES_HOST/$POSTGRES_DB - echo "$DATABASE_URL" + run: | + echo "Installing unseeded production server: $POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/$POSTGRES_DB" + DATABASE_URL=$(echo postgres://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/$POSTGRES_DB) + echo $DATABASE_URL cd $GITHUB_WORKSPACE ls -alt yarn From 008ebbbc44386a54f125a1c4af61980e2fa73dec Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 09:01:35 +0100 Subject: [PATCH 115/325] CI : ... another go --- .github/workflows/latest.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index fe818bd9..c0daf90f 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -40,8 +40,8 @@ jobs: uses: actions/checkout@v2 - name: Run yarn run: | - echo "Installing unseeded production server: $POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/$POSTGRES_DB" - DATABASE_URL=$(echo postgres://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/$POSTGRES_DB) + echo "Installing unseeded production services: " + echo $DATABASE_URL cd $GITHUB_WORKSPACE ls -alt @@ -52,7 +52,7 @@ jobs: sleep 5 - name: Start next build run: | - echo "Building unseeded production server: $POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/$POSTGRES_DB" + echo "Building unseeded production server: " yarn site:build echo "Build unseeded $POSTGRES_DB:latest production succeded" @@ -61,5 +61,6 @@ jobs: POSTGRES_USER: postgres_user POSTGRES_DB: prisma_day_2021_latest KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 + DATABASE_URL: postgres://postgres_user:keystone_change_me2@pg/prisma_day_2021_latest POSTGRES_HOST: pg # Deploy: From c7e84f7f38bae7b7bb75864ff1b08a39f1467437 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 09:08:41 +0100 Subject: [PATCH 116/325] CI : ... another go 2 --- .github/workflows/latest.yml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index c0daf90f..0eb60bee 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -39,10 +39,7 @@ jobs: - name: Checkout application uses: actions/checkout@v2 - name: Run yarn - run: | - echo "Installing unseeded production services: " - - echo $DATABASE_URL + run: | cd $GITHUB_WORKSPACE ls -alt yarn @@ -50,6 +47,10 @@ jobs: run: | yarn dev & sleep 5 + env: + KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 + DATABASE_URL: postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest + - name: Start next build run: | echo "Building unseeded production server: " @@ -57,10 +58,10 @@ jobs: echo "Build unseeded $POSTGRES_DB:latest production succeded" env: - POSTGRES_PASSWORD: change_me_in_multiple_places - POSTGRES_USER: postgres_user - POSTGRES_DB: prisma_day_2021_latest KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 - DATABASE_URL: postgres://postgres_user:keystone_change_me2@pg/prisma_day_2021_latest - POSTGRES_HOST: pg + DATABASE_URL: postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest + + + + # Deploy: From ad50c79be473db2376ed16111800c122eec8073e Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 09:10:25 +0100 Subject: [PATCH 117/325] CI : ... another go 3 --- .github/workflows/latest.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 0eb60bee..4246c57a 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -42,7 +42,10 @@ jobs: run: | cd $GITHUB_WORKSPACE ls -alt - yarn + yarn + env: + DATABASE_URL: postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest + - name: Start keystone run: | yarn dev & From a1203196188c457a1563d5e297b8a1bf784d8d19 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 09:12:40 +0100 Subject: [PATCH 118/325] CI : ... another go 4 --- keystone.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/keystone.ts b/keystone.ts index b57e4268..d84d36d1 100644 --- a/keystone.ts +++ b/keystone.ts @@ -6,6 +6,7 @@ import { lists, extendGraphqlSchema } from './schema'; import { permissions } from './schema/access'; const dbUrl = + `postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest` || `${process.env.DATABASE_URL}` || `postgres://${process.env?.POSTGRES_USER}:${process.env?.POSTGRES_PASSWORD}@${process.env?.POSTGRES_HOST}/${process.env?.POSTGRES_DB}`; From 8654b628a8bb671df2d4183456dc4af3abd27526 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 09:19:46 +0100 Subject: [PATCH 119/325] CI: hard coded works: failing on undefined query (unseeded to be expected) --- .github/workflows/latest.yml | 6 +++--- keystone.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 4246c57a..da0411e3 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -44,7 +44,7 @@ jobs: ls -alt yarn env: - DATABASE_URL: postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest + DATABASE_URL: "postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest" - name: Start keystone run: | @@ -52,7 +52,7 @@ jobs: sleep 5 env: KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 - DATABASE_URL: postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest + DATABASE_URL: "postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest" - name: Start next build run: | @@ -62,7 +62,7 @@ jobs: env: KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 - DATABASE_URL: postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest + DATABASE_URL: "postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest" diff --git a/keystone.ts b/keystone.ts index d84d36d1..ffc5e183 100644 --- a/keystone.ts +++ b/keystone.ts @@ -6,7 +6,7 @@ import { lists, extendGraphqlSchema } from './schema'; import { permissions } from './schema/access'; const dbUrl = - `postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest` || + // `postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest` || `${process.env.DATABASE_URL}` || `postgres://${process.env?.POSTGRES_USER}:${process.env?.POSTGRES_PASSWORD}@${process.env?.POSTGRES_HOST}/${process.env?.POSTGRES_DB}`; From 896b9d364a9f300fbb567735b067a80f21fa348b Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 09:40:06 +0100 Subject: [PATCH 120/325] CI: more any bugs?! --- pages/post/[slug].tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pages/post/[slug].tsx b/pages/post/[slug].tsx index 37bc36d1..105695c0 100644 --- a/pages/post/[slug].tsx +++ b/pages/post/[slug].tsx @@ -8,6 +8,8 @@ import { Container, HomeLink } from '../../components/ui/layout'; import { Link } from '../../components/ui/link'; import { H1 } from '../../components/ui/typography'; +import { TestingHardenedAny } from '../../wrap_any' + export default function Post({ post }: { post: any }) { return ( @@ -38,7 +40,7 @@ export async function getStaticPaths(): Promise { ` ); return { - paths: data.posts.map((post: any) => ({ params: { slug: post.slug } })), + paths: data?.posts?.map((post: TestingHardenedAny) => ({ params: { slug: post?.slug } })), fallback: 'blocking', }; } @@ -62,5 +64,5 @@ export async function getStaticProps({ params }: GetStaticPropsContext) { `, { slug: params!.slug } ); - return { props: { post: data.post }, revalidate: 60 }; + return { props: { post: data?.post }, revalidate: 60 }; } From 71899d3f0ecab79a3590b85153b135b367d44455 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 10:00:37 +0100 Subject: [PATCH 121/325] CI: harnening anys from gql rx --- pages/index.tsx | 3 ++- pages/post/[slug].tsx | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pages/index.tsx b/pages/index.tsx index fc3e97df..edb53904 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -92,5 +92,6 @@ export async function getStaticProps({ params }: GetStaticPropsContext) { } ` ); - return { props: { posts: data.posts }, revalidate: 60 }; + const postsRx = data? data.posts : []; + return { props: { posts: postsRx }, revalidate: 60 }; } diff --git a/pages/post/[slug].tsx b/pages/post/[slug].tsx index 105695c0..e4a6347b 100644 --- a/pages/post/[slug].tsx +++ b/pages/post/[slug].tsx @@ -64,5 +64,5 @@ export async function getStaticProps({ params }: GetStaticPropsContext) { `, { slug: params!.slug } ); - return { props: { post: data?.post }, revalidate: 60 }; + return { props: { post: data!.post }, revalidate: 60 }; } From f462fbc52a67625714154aee76b0c8c5538f300d Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 10:02:06 +0100 Subject: [PATCH 122/325] CI: hardening anys from gql rx --- pages/post/[slug].tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pages/post/[slug].tsx b/pages/post/[slug].tsx index e4a6347b..2a192bfa 100644 --- a/pages/post/[slug].tsx +++ b/pages/post/[slug].tsx @@ -39,8 +39,12 @@ export async function getStaticPaths(): Promise { } ` ); + if (data === undefined) + return { paths: [].map((post: TestingHardenedAny) => ({ params: { slug: "" } })), + fallback: false,}; + return { - paths: data?.posts?.map((post: TestingHardenedAny) => ({ params: { slug: post?.slug } })), + paths: data!.posts!.map((post: TestingHardenedAny) => ({ params: { slug: post?.slug } })), fallback: 'blocking', }; } From 0b21b5ff8af3b382a0ae2ceba765592f126f0225 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 10:16:15 +0100 Subject: [PATCH 123/325] CI: markup --- .github/workflows/latest.yml | 2 +- README.md | 5 +++-- pages/post/[slug].tsx | 6 +++--- utils.ts | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index da0411e3..7401f904 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -58,7 +58,7 @@ jobs: run: | echo "Building unseeded production server: " yarn site:build - echo "Build unseeded $POSTGRES_DB:latest production succeded" + echo "✅ Build unseeded $POSTGRES_DB:latest production success" env: KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 diff --git a/README.md b/README.md index 936d6257..a9d3f004 100644 --- a/README.md +++ b/README.md @@ -62,11 +62,11 @@ utils.js -## About the latest branch: +## About the latest branch: ![workflow_badge](https://github.com/github/docs/actions/workflows/latest.yml/badge.svg) This branch is dedicated to creating a solid foundation for a production build to extend keystone CMS from. -CI: Github actions runner timed out. Local CI fully functional. Unseeded build. + `yarn commit "message"` fires of CI pipeline and only commits if unit tests passed. Requires yarn dev running without the main next front end, since yarn site:build is the primary unit test. @@ -75,6 +75,7 @@ CI: Github actions runner timed out. Local CI fully functional. Unseeded build. `yarn commit "message" && yarn push` is what lands up being used. ## Production status report +✅ CI: Github actions runner working in a test application. Unseeded build cases handled (any bugs fixed!) ✅ Pre release: Testing ✅ More informative logging, suitable for deployment. diff --git a/pages/post/[slug].tsx b/pages/post/[slug].tsx index 2a192bfa..7af887ea 100644 --- a/pages/post/[slug].tsx +++ b/pages/post/[slug].tsx @@ -8,7 +8,7 @@ import { Container, HomeLink } from '../../components/ui/layout'; import { Link } from '../../components/ui/link'; import { H1 } from '../../components/ui/typography'; -import { TestingHardenedAny } from '../../wrap_any' +import { HardenedAny } from '../../wrap_any' export default function Post({ post }: { post: any }) { return ( @@ -40,11 +40,11 @@ export async function getStaticPaths(): Promise { ` ); if (data === undefined) - return { paths: [].map((post: TestingHardenedAny) => ({ params: { slug: "" } })), + return { paths: [].map((post: HardenedAny) => ({ params: { slug: "" } })), fallback: false,}; return { - paths: data!.posts!.map((post: TestingHardenedAny) => ({ params: { slug: post?.slug } })), + paths: data!.posts!.map((post: HardenedAny) => ({ params: { slug: post?.slug } })), fallback: 'blocking', }; } diff --git a/utils.ts b/utils.ts index 9731765f..a533f444 100644 --- a/utils.ts +++ b/utils.ts @@ -1,5 +1,5 @@ import { keystoneNextjsBuildApiKey } from './keystone'; -import { HardenedAny, RampantlyPolymorphic } from './wrap_any'; +import { HardenedAny } from './wrap_any'; import colors from 'colors/safe'; From d743b2b077f6ebd81084fff52b571acc9ac3ccc3 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 10:18:29 +0100 Subject: [PATCH 124/325] CI: markup : 2 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a9d3f004..75a4be62 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ utils.js -## About the latest branch: ![workflow_badge](https://github.com/github/docs/actions/workflows/latest.yml/badge.svg) +## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) This branch is dedicated to creating a solid foundation for a production build to extend keystone CMS from. From ab70ba1ac40531b0b88604e0be594f7ee928aeac Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 13:48:36 +0100 Subject: [PATCH 125/325] Logging monad tested and working locally. --- .github/workflows/latest.yml | 7 +++ README.md | 22 ++++---- keystone.ts | 99 +++++++++++++++++++++++++++++++++- schema/access.ts | 24 ++++----- schema/mutations.ts | 2 +- utils.ts | 102 ++--------------------------------- 6 files changed, 134 insertions(+), 122 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 7401f904..8b74efb7 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -36,8 +36,15 @@ jobs: POSTGRES_USER: postgres_user steps: + - name: Dump github context + run: echo "$GITHUB_CONTEXT" + shell: bash + env: + GITHUB_CONTEXT: ${{ toJson(github) }} + - name: Checkout application uses: actions/checkout@v2 + - name: Run yarn run: | cd $GITHUB_WORKSPACE diff --git a/README.md b/README.md index 75a4be62..15a7d0c1 100644 --- a/README.md +++ b/README.md @@ -64,20 +64,20 @@ utils.js ## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) -This branch is dedicated to creating a solid foundation for a production build to extend keystone CMS from. +This branch is dedicated to creating a solid foundation for a production build to extend Keystone 6 CMS from. - - -`yarn commit "message"` fires of CI pipeline and only commits if unit tests passed. Requires yarn dev running without the main next front end, since yarn site:build is the primary unit test. +`yarn commit "message"` fires off the CI pipeline and only commits if unit tests are passed locally. Requires yarn dev running without the main next front end, since yarn site:build is the primary unit test. `yarn push` auto push to origin latest -`yarn commit "message" && yarn push` is what lands up being used. +`yarn commit "message" && yarn push` is what lands up being used most often. ## Production status report -✅ CI: Github actions runner working in a test application. Unseeded build cases handled (any bugs fixed!) +✅ CI: Github actions runner working in a test framework. Unseeded build cases handled (any bugs fixed!) ✅ Pre release: Testing +Full k8s spec: WIP. + ✅ More informative logging, suitable for deployment. `✅ Logging: Code coverage: complete` @@ -95,10 +95,12 @@ Ready for exhaustive testing. Bug reports welcome! ✅ A stale session led to the app throwing when voting occured. Code fixed by a log.warning and return. ✅ Rejigged fetch command because some failure continuations were never been called. Tested and working. - Yields a clean model for managing the fetch continuations. +✅ Yields a clean model for managing the fetch continuations. ✅ Only throws were in polls and static data fetch. Both have been refactored. +✅ Next builds even when there is no static data, i.e. an empty database. Requires precise +handling of `any`. ## Security audit Status: `Preliminary`. @@ -106,7 +108,7 @@ Status: `Preliminary`. ## TL;DR `(a: T)` is a type safe replacement for `(a: any)`, because we need to trap the awkward `undefined` cases at build time. -wrap_any.ts has the sole role of wrapping types that cant be deduced for some reason. It has proved to be a very +`wrap_any.ts` has the sole role of wrapping types that cant be deduced for some reason. It has proved to be a very practical way of localising `any` issues. @@ -116,10 +118,10 @@ Low level ts/js security audit: Research and development has established many bu This `dangerous construct` is used in upstream auth. Roughly ``` -50% of these situations reveals an unhandled case, hidden from lint. +Approximately 75% of these situations reveal an unhandled case, hidden from lint. ``` -Currently developing a reader friendly notation for the rather awkward ts functional notation, to try to find ways to eliminte `any`. The most readable so far appears to be: +Currently developing a reader friendly notation for the rather awkward `ts functional notation`, to try to find ways to eliminte `any`. The most readable so far appears to be: `export const fcompose = (a: (maps: B) => A) => (b: (maps: C) => B) => (c: C) => a(b(c))` diff --git a/keystone.ts b/keystone.ts index ffc5e183..9188e97f 100644 --- a/keystone.ts +++ b/keystone.ts @@ -1,3 +1,4 @@ +import { HardenedAny } from './wrap_any'; import { config } from '@keystone-next/keystone'; import { statelessSessions } from '@keystone-next/keystone/session'; import { createAuth } from '@keystone-next/auth'; @@ -5,12 +6,106 @@ import { createAuth } from '@keystone-next/auth'; import { lists, extendGraphqlSchema } from './schema'; import { permissions } from './schema/access'; +import colors from 'colors/safe'; + +// Fix Me: Test code: Needs another home. +// Logging is one place where HardenedAny is needed! The intent was object dumping code, down to +//every leaf. A testground for DRY logging in ts. +// Closures are good for logging, localising to particular files/functions/lines ... the issues of this short segment quickly shows why. +// I have some multicol markup for logging, it bash though, so replaces console.log. +// A markup standard for shell would be useful. + +//const log = (s: string) => console.log(s); +//Reverse mapping for var args, rest parameters ... handy but slightly disfunctional, forEach is not strongly typed. +export const fix = (x: T) => x; + +export const successCol = colors.green; +export const warningCol = colors.yellow; +export const errorCol = colors.red; + +interface CleanError { + name: string; + message: string; + stack: string; +} + +export type LogEventRenderer = (maps: CleanError) => string; + +export type ColFun = (maps: string) => string; + +export const sep = ': '; + +export const baseErrorMsg = 'utils: logContextInfoGen::' + sep; +export const undefinedVariableMsg = + baseErrorMsg + 'Attempted to log an undefined variable.' + sep; +export const unknownLineAndFileMsg = + baseErrorMsg + 'Unknown line and file' + sep; +export const cantOpenErrorMsg = + baseErrorMsg + 'Cant access stack info from Error()' + sep; + +export const fileLineRenderer = (e: CleanError) => { + const regex = /\((.*):(\d+):(\d+)\)$/; + const match = regex.exec(e.stack); + + return match + ? match[1] + sep + match[2] + sep + match[3] + : unknownLineAndFileMsg + sep + e.stack; +}; + +export const stackRenderer = (e: CleanError) => e.stack; + +export const simpleLogger = (msg: string) => console.log(Date() + sep + msg); + +export const logContextInfoGen = + (msgRenderer: LogEventRenderer) => + (col: ColFun) => + (toBeLogged: HardenedAny): HardenedAny => { + if (toBeLogged === undefined) + return logContextInfoGen(stackRenderer)(warningCol)(undefinedVariableMsg); + + var cleanMessage: string; + + if (typeof toBeLogged === 'string') { + cleanMessage = col(toBeLogged); + } else { + // Strip anything else down to its source code, so we know what is being sent to us. + // and print it plain, nothing is worse than red source code ... + cleanMessage = toBeLogged.toString(); + } + const e = new Error(); + if (!e.stack) { + simpleLogger(errorCol(cantOpenErrorMsg) + cleanMessage); + } else { + const ce = e as CleanError; + const info = msgRenderer(ce); + simpleLogger(info + sep + cleanMessage); + } + return logContextInfoGen(stackRenderer)(warningCol); + }; + +const logContextInfo = (col: ColFun) => (a: HardenedAny) => + logContextInfoGen(fileLineRenderer)(col)(a); + +export const log = { + sep: sep, + warning: (a: HardenedAny) => logContextInfo(warningCol)(a), + error: (a: HardenedAny) => logContextInfo(errorCol)(a), + success: (a: HardenedAny) => logContextInfo(successCol)(a), + trace: (a: HardenedAny) => logContextInfoGen(stackRenderer)(fix)(a), + info: (a: HardenedAny) => logContextInfo(fix)(a), + reportSecurityIncident: (a: HardenedAny) => logContextInfo(errorCol)(a), +}; + const dbUrl = - // `postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest` || `${process.env.DATABASE_URL}` || `postgres://${process.env?.POSTGRES_USER}:${process.env?.POSTGRES_PASSWORD}@${process.env?.POSTGRES_HOST}/${process.env?.POSTGRES_DB}`; -console.log(`Database url: ${dbUrl}`); +export const keyStoneHost = process.env?.KEYSTONE_HOST || 'localhost'; + +log.info(`Database url: ${dbUrl}`); +log.success(dbUrl); +log.info(`Keystone host`); +log.success(keyStoneHost); const sessionSecret = process.env.SESSION_SECERT || diff --git a/schema/access.ts b/schema/access.ts index cf21f50a..37908219 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -1,11 +1,8 @@ import { KeystoneContext } from '.keystone/types'; - -import { keystoneNextjsBuildApiKey } from '../keystone'; +import { keystoneNextjsBuildApiKey, log } from '../keystone'; import { ItemType } from '../wrap_any'; -import { log } from '../utils'; - export const PUBLISHED = 'published'; export const DRAFT = 'draft'; export const ARCHIVED = 'archive'; @@ -66,10 +63,11 @@ export const isBuildEnvir = (frame: SessionFrame): boolean => { ); return true; } else { - log.warning('access::isBuildEnvir: authentication breach:'); - log.success( - 'access::isBuildEnvir: no additional authorisation granted to breach.' - ); + log + .warning('access::isBuildEnvir: authentication breach:') + .success( + 'access::isBuildEnvir: no additional authorisation granted to breach.' + ); return false; } } @@ -121,13 +119,15 @@ export const FilterCanManageContentList = (frame: SessionFrame) => { //The perms check is only running client side. Review: check the authorization props are checked //server side to. if (!!frame.context.session?.data?.role?.canManageContent) { - log.success('Blessed super user access to the known content manager:'); - log.success(frame?.context?.session?.data?.name); + log + .success('Blessed super user access to the known content manager:') + .success(frame?.context?.session?.data?.name); return EVERY_POST_STATUS; } - log.success('Client receives only published posts:'); - log.success(frame?.context?.session?.data?.name); + log + .success('Client receives only published posts:') + .success(frame?.context?.session?.data?.name); //success(frame.context.session?.data?.role?.canManageContent); return PUBLISHED_POST_STATUS; }; diff --git a/schema/mutations.ts b/schema/mutations.ts index d05ee85d..da68e074 100644 --- a/schema/mutations.ts +++ b/schema/mutations.ts @@ -5,7 +5,7 @@ import { PollWhereUniqueInput, } from '.keystone/types'; -import { log } from '../utils'; +import { log } from '../keystone'; const gql = ([content]: TemplateStringsArray) => content; diff --git a/utils.ts b/utils.ts index a533f444..2ef57261 100644 --- a/utils.ts +++ b/utils.ts @@ -1,99 +1,5 @@ -import { keystoneNextjsBuildApiKey } from './keystone'; +import { keystoneNextjsBuildApiKey, keyStoneHost, log } from './keystone'; import { HardenedAny } from './wrap_any'; - -import colors from 'colors/safe'; - -// Fix Me: Test code: Needs another home. -// Logging is one place where HardenedAny is needed! The intent was object dumping code, down to -//every leaf. A testground for DRY logging in ts. -// Closures are good for logging, localising to particular files/functions/lines ... the issues of this short segment quickly shows why. -// I have some multicol markup for logging, it bash though, so replaces console.log. -// A markup standard for shell would be useful. - -//const log = (s: string) => console.log(s); -//Reverse mapping for var args, rest parameters ... handy but slightly disfunctional, forEach is not strongly typed. -export const fix = (x: T) => x; - -export const successCol = colors.green; -export const warningCol = colors.yellow; -export const errorCol = colors.red; - -export type Tunit = void; - -export type ThunkProc = () => Tunit; - -interface CleanError { - name: string; - message: string; - stack: string; -} - -export type LogEventRenderer = (maps: CleanError) => string; - -export type ColFun = (maps: string) => string; - -export const sep = ': '; - -export const baseErrorMsg = 'utils: logContextInfoGen::' + sep; -export const undefinedVariableMsg = - baseErrorMsg + 'Attempted to log an undefined variable.' + sep; -export const unknownLineAndFileMsg = - baseErrorMsg + 'Unknown line and file' + sep; -export const cantOpenErrorMsg = - baseErrorMsg + 'Cant access stack info from Error()' + sep; - -export const fileLineRenderer = (e: CleanError) => { - const regex = /\((.*):(\d+):(\d+)\)$/; - const match = regex.exec(e.stack); - - return match - ? match[1] + sep + match[2] + sep + match[3] - : unknownLineAndFileMsg + sep + e.stack; -}; - -export const stackRenderer = (e: CleanError) => e.stack; - -export const simpleLogger = (msg: string) => console.log(Date() + sep + msg); - -export const logContextInfoGen = - (msgRenderer: LogEventRenderer) => - (col: ColFun) => - (toBeLogged: HardenedAny): Tunit => { - if (toBeLogged === undefined) - return logContextInfoGen(stackRenderer)(warningCol)(undefinedVariableMsg); - - var cleanMessage: string; - - if (typeof toBeLogged === 'string') { - cleanMessage = col(toBeLogged); - } else { - // Strip anything else down to its source code, so we know what is being sent to us. - // and print it plain, nothing is worse than red source code ... - cleanMessage = toBeLogged.toString(); - } - const e = new Error(); - if (!e.stack) - return simpleLogger(errorCol(cantOpenErrorMsg) + cleanMessage); - const ce = e as CleanError; - - const info = msgRenderer(ce); - - simpleLogger(info + sep + cleanMessage); - }; - -const logContextInfo = - (col: ColFun) => - (a: HardenedAny): void => - logContextInfoGen(fileLineRenderer)(col)(a); - -export const log = { - warning: (a: HardenedAny) => logContextInfo(warningCol)(a), - error: (a: HardenedAny) => logContextInfo(errorCol)(a), - success: (a: HardenedAny) => logContextInfo(successCol)(a), - trace: (a: HardenedAny) => logContextInfoGen(stackRenderer)(fix)(a), - reportSecurityIncident: (a: HardenedAny) => logContextInfo(errorCol)(a), -}; - export const gql = ([content]: TemplateStringsArray) => content; export async function fetchGraphQL_inject_api_key( @@ -108,7 +14,7 @@ export async function fetchGraphQL_inject_api_key( ? log.warning('Prototype api key: ' + keystoneNextjsBuildApiKey) : log.success('Next build: x-api-key: tx'); - return fetch('http://localhost:3000/api/graphql', { + return fetch(`http://${keyStoneHost}:3000/api/graphql`, { method: 'POST', body: JSON.stringify({ query, variables }), headers: { @@ -122,6 +28,8 @@ export async function fetchGraphQL_inject_api_key( return data; }) .catch(msg => - log.error('Next build: did not recieve static site data: ' + sep + msg) + log.error( + 'Next build: did not recieve static site data: ' + log.sep + msg + ) ); } From e41fcb32df69fb309424014f06a0d174f90778fb Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 14:03:37 +0100 Subject: [PATCH 126/325] More defensive programming. --- .github/workflows/latest.yml | 6 ++++-- pages/post/[slug].tsx | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 8b74efb7..4e91b5c3 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -56,13 +56,15 @@ jobs: - name: Start keystone run: | yarn dev & - sleep 5 + env: KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 DATABASE_URL: "postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest" - name: Start next build - run: | + run: | + echo "Sleeping to give time for Keystone to kick in. WIP: full micro service yml + sleep 30 echo "Building unseeded production server: " yarn site:build echo "✅ Build unseeded $POSTGRES_DB:latest production success" diff --git a/pages/post/[slug].tsx b/pages/post/[slug].tsx index 7af887ea..22dee837 100644 --- a/pages/post/[slug].tsx +++ b/pages/post/[slug].tsx @@ -39,7 +39,7 @@ export async function getStaticPaths(): Promise { } ` ); - if (data === undefined) + if (data === undefined || data.posts === undefined) return { paths: [].map((post: HardenedAny) => ({ params: { slug: "" } })), fallback: false,}; From 5856f9b1fb76be5a07b35aade9a5f88488be6688 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 14:07:54 +0100 Subject: [PATCH 127/325] More defensive programming 2. --- .github/workflows/latest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 4e91b5c3..643e6817 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -67,7 +67,7 @@ jobs: sleep 30 echo "Building unseeded production server: " yarn site:build - echo "✅ Build unseeded $POSTGRES_DB:latest production success" + echo "Build unseeded $POSTGRES_DB:latest production success" env: KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 From e68c157141027fad7d45c35a944eb22d6b1d209d Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 14:19:31 +0100 Subject: [PATCH 128/325] Defensive programming 3. --- .github/workflows/latest.yml | 2 +- pages/index.tsx | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 643e6817..152b337d 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -67,7 +67,7 @@ jobs: sleep 30 echo "Building unseeded production server: " yarn site:build - echo "Build unseeded $POSTGRES_DB:latest production success" + echo "Build unseeded production success" env: KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 diff --git a/pages/index.tsx b/pages/index.tsx index edb53904..04b9d55e 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -45,7 +45,7 @@ export default function Home({ posts }: { posts: Post[] }) { )}
- {posts.map(post => { + {posts?.map(post => { const date = post.publishedDate ? new Date(post.publishedDate).toLocaleDateString() : null; @@ -92,6 +92,7 @@ export async function getStaticProps({ params }: GetStaticPropsContext) { } ` ); - const postsRx = data? data.posts : []; + const postsRx = data?.posts || null; + return { props: { posts: postsRx }, revalidate: 60 }; } From 88fd57f4eb29f533436a51e38a153993202a473e Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 14:23:09 +0100 Subject: [PATCH 129/325] Defensive programming 4 ... missing quote! --- .github/workflows/latest.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 152b337d..67c799eb 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -53,7 +53,7 @@ jobs: env: DATABASE_URL: "postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest" - - name: Start keystone + - name: Start keystone/Next run: | yarn dev & @@ -63,7 +63,7 @@ jobs: - name: Start next build run: | - echo "Sleeping to give time for Keystone to kick in. WIP: full micro service yml + echo "Sleeping to give time for Keystone to kick in. WIP: full micro service yml" sleep 30 echo "Building unseeded production server: " yarn site:build From d53ecbc25d8d5c84eb61074cb8c000e18ce4b1cc Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 14:31:58 +0100 Subject: [PATCH 130/325] Changed timeouts to make build a bit snappier --- .github/workflows/latest.yml | 6 +++--- README.md | 8 +++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 67c799eb..1ce2ec8c 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -64,11 +64,11 @@ jobs: - name: Start next build run: | echo "Sleeping to give time for Keystone to kick in. WIP: full micro service yml" - sleep 30 + sleep 5 echo "Building unseeded production server: " yarn site:build - echo "Build unseeded production success" - + echo "✅ Success: built unseeded production services" + sleep 25 env: KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 DATABASE_URL: "postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest" diff --git a/README.md b/README.md index 15a7d0c1..884376d7 100644 --- a/README.md +++ b/README.md @@ -92,15 +92,17 @@ Ready for exhaustive testing. Bug reports welcome! ## Resiliance testing -✅ A stale session led to the app throwing when voting occured. Code fixed by a log.warning and return. +✅ A stale session led to the app throwing when voting occured. +Code fixed by a log.warning and return. -✅ Rejigged fetch command because some failure continuations were never been called. Tested and working. -✅ Yields a clean model for managing the fetch continuations. +✅ Rejigged fetch command because some failure continuations were never been called. +Tested and working. ✅ Only throws were in polls and static data fetch. Both have been refactored. ✅ Next builds even when there is no static data, i.e. an empty database. Requires precise handling of `any`. +✅ More issues tracked down using the empty database technique. It triggers every `any`. ## Security audit Status: `Preliminary`. From 1090424f10fa96917fb2063b2c135bcfde90d26b Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 14:35:45 +0100 Subject: [PATCH 131/325] Fixed readme formatting --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 884376d7..d511222a 100644 --- a/README.md +++ b/README.md @@ -87,11 +87,11 @@ Full k8s spec: WIP. A shout out to Jed for explaining the keystone way. Ready for exhaustive testing. Bug reports welcome! -``` -## Resiliance testing +## Resiliance testing +``` ✅ A stale session led to the app throwing when voting occured. Code fixed by a log.warning and return. @@ -103,6 +103,7 @@ Tested and working. ✅ Next builds even when there is no static data, i.e. an empty database. Requires precise handling of `any`. ✅ More issues tracked down using the empty database technique. It triggers every `any`. +``` ## Security audit Status: `Preliminary`. @@ -117,7 +118,7 @@ practical way of localising `any` issues. `any` issues: Low level ts/js security audit: Research and development has established many bugs hide in the rampantly polymorphic `any` type. -This `dangerous construct` is used in upstream auth. Roughly +This `dangerous construct` is used in upstream auth. ``` Approximately 75% of these situations reveal an unhandled case, hidden from lint. @@ -192,7 +193,7 @@ With these caveats in mind, enjoy, and be fully aware this release is in a `test Known Issues: -Code can siliently fail in a ?. chain. +Code can siliently fail in a ?. chain. WIP The ?. construction is convenient, but not suitable for production logging, error trapping. To be replaced with a maybe sytle monad. From 3f165f2bb295e22e292c4a8db5ab9178cb5c5523 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 14:37:05 +0100 Subject: [PATCH 132/325] Fixed readme formatting 2 --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d511222a..29c2c9e2 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,7 @@ This branch is dedicated to creating a solid foundation for a production build t `yarn commit "message" && yarn push` is what lands up being used most often. ## Production status report +``` ✅ CI: Github actions runner working in a test framework. Unseeded build cases handled (any bugs fixed!) ✅ Pre release: Testing @@ -84,8 +85,9 @@ Full k8s spec: WIP. ✅ Refactored literals. ✅ Authorization: Strong typing for keystone auth frame types ✅ Next build super user authorization to keystone, allowing SSR/SSG/ISR tunneling. - A shout out to Jed for explaining the keystone way. +``` +A shout out to Jed for explaining the keystone way. Ready for exhaustive testing. Bug reports welcome! From a0aff77b68ab12f321d05c130989ec9da4926a0d Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 14:39:49 +0100 Subject: [PATCH 133/325] Fixed readme formatting 4 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 29c2c9e2..d5020a30 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ This branch is dedicated to creating a solid foundation for a production build t Full k8s spec: WIP. ✅ More informative logging, suitable for deployment. -`✅ Logging: Code coverage: complete` +✅ Logging: Code coverage: complete ✅ Refactored literals. ✅ Authorization: Strong typing for keystone auth frame types @@ -211,7 +211,7 @@ Additional functionality from upstream main: ``` Polls fully working. Production build: - Detailed logging: WIP + Detailed logging: next lint tailwind purge telemetry disable From 6715d636d3c783c2b250885aa4f5c6d61c4c877f Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 14:43:52 +0100 Subject: [PATCH 134/325] Testing release. --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d5020a30..bd8580b1 100644 --- a/README.md +++ b/README.md @@ -226,10 +226,12 @@ The definitive install instructions, assuming fedora, bar seeding, are in the wo https://github.com/qfunq/prisma-day-2021-workshop/blob/latest/.github/workflows/latest.yml -Install it like this and you know you will get the latest CI build. +Install it like this and you know you will get the latest CI build. ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) + +If for some reason, the latest CI build is failing (it happens!), find the last good build. Seeding and post seeding CI unit tests: WIP. This is a high priority if anyone wants to take it on. -I have some scripts that can boot the process, but they are bash/pqsql, not quite the keystone way, but they are tried, tested, lightweight and effective. +I have some scripts that can boot the process, but they are bash/pqsql, not quite the Keystone way, but they are tried, tested, lightweight and effective. All testing/patches/security audits are welcome. Feel free to contribute to documenting the industry best practises for using keystone CMS combined with the powerhouse front end nextjs. From f761c6707cb644b6292656a023d34dfd77b6c8ad Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 16:06:50 +0100 Subject: [PATCH 135/325] CCC style guide --- README.md | 37 +++++++++++++------- keystone.ts | 4 +-- wrap_any.tsx => wrap_any.ts | 70 +++++++++++++++++-------------------- 3 files changed, 59 insertions(+), 52 deletions(-) rename wrap_any.tsx => wrap_any.ts (69%) diff --git a/README.md b/README.md index bd8580b1..950425dd 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ Ready for exhaustive testing. Bug reports welcome! -## Resiliance testing +## Resiliance testing, unit testing ``` ✅ A stale session led to the app throwing when voting occured. Code fixed by a log.warning and return. @@ -104,18 +104,22 @@ Tested and working. ✅ Next builds even when there is no static data, i.e. an empty database. Requires precise handling of `any`. -✅ More issues tracked down using the empty database technique. It triggers every `any`. + +✅ Any issues tracked down using the empty database technique. It triggers every any bug, with a vengeance. + Strongly recommended as a unit testing technique. ``` ## Security audit Status: `Preliminary`. ## TL;DR -`(a: T)` is a type safe replacement for `(a: any)`, because we need to trap the awkward `undefined` cases at build time. +`(a: T)` is a type safe replacement for many cases of `(a: any)`, because we need to trap the awkward `undefined` cases at build time. + -`wrap_any.ts` has the sole role of wrapping types that cant be deduced for some reason. It has proved to be a very -practical way of localising `any` issues. +## any is shouting: I AM WRITTEN IN JAVASCRIPT ... listen to it, and recode it ASAP +`wrap_any.ts` is an ugly name for an ugly file. It might change to become even more noticable. It has the sole role of wrapping `any` subtypes that can't be deduced for some reason. It has proved to be a very +practical way of localising `any` issues. Give the usage a name, and fixed location, right under the peer review spot light. Have varying degree of `anyness`. Take a look at the file, it's a toxic dump of puzzles and types best avoided, and attempts to handle them at a distance. There are more radical approaches that I'm looking at, but they are alien. `any` issues: Low level ts/js security audit: Research and development has established many bugs hide in the rampantly polymorphic `any` type. @@ -126,25 +130,25 @@ This `dangerous construct` is used in upstream auth. Approximately 75% of these situations reveal an unhandled case, hidden from lint. ``` -Currently developing a reader friendly notation for the rather awkward `ts functional notation`, to try to find ways to eliminte `any`. The most readable so far appears to be: +Currently developing a reader friendly notation for the rather awkward `ts functional notation`, to try to find ways to eliminte `any`, in all bar recursive types (which are labelled as such, by an `any` subtype). The most readable so far appears to be: `export const fcompose = (a: (maps: B) => A) => (b: (maps: C) => B) => (c: C) => a(b(c))` and in second place, -`export const fcompose = (a: (X: B) => A) => (b: (maps: C) => B) => (c: C) => +`export const fcompose = (a: (X: B) => A) => (b: (X: C) => B) => (c: C) => a(b(c))` -and for cartestian products: +For cartestian products: `transferFun: (maps: T) => (cross: T) => T` -obviously we would rather write: +we would rather write: `transferFun: T => T => T,` -but its a bit odd to, at least the ts reads a bit like the intended, +but its a bit odd too, at least the ts reads a bit like the intended, `transferFun: maps T cross T to T,` @@ -152,7 +156,7 @@ just all the brackets are in the wrong place for the eye to flow smoothly over i `transferFun: T => T to T,` -since `=>` is somewhat overused. The return type is special in comparisson to intermediary closure parameters. +since `=>` is somewhat overused. Also, the return type is special in comparisson to intermediary closure parameters. But when printed, the shorter `transferFun: (maps: T) => (X: T) => T,` @@ -184,11 +188,20 @@ However, some functional code doesn't seem to work properly without the total po There is also a `dodgy C++ style cast`, right where it's not needed ... `TBC`. +The reason this is important is that `ts` offers us the `CCC` to programme in, (eliminating `any` completely), if we so desire. Then a programme can be proved to do exactly what it says it does, and this painfully pedantic style is fully justified. + +## On naming +The Native American naming/language model is used. Functions are verbs, and are named by what they do. + +Categorical morphisms are weaker, polymorphic aliases to these concrete names, and are `only to be used in generic code`. If writing specific code, it is recommended to use the specific name. +There nothing worse than grepping through 60 pages of `process` matches, all processing something completely different, (a C++ example, but we have all been there, try searching for `: any` in the top of a node project ... ). -With these caveats in mind, enjoy, and be fully aware this release is in a `testing` phase. +`then`, and `catch`, are heavily overused in all languages. IMHO, new apis need to avoid these keywords, but also supply categorical aliases, such as `bind`, `fmap`, `then`,`finally` if generic programming is required. +I'm fairly new to `ts`, and like it a lot, but without a formal style, it can become unmanagable. +With these caveats in mind, enjoy this latest release of @jeds prisma-day app, polished endlessly by @qfunq (it deserves it, Keystone 6 is the best CMS out there, Next, best in class, and same for prisma), and be fully aware this application is in a `testing` phase. ``` diff --git a/keystone.ts b/keystone.ts index 9188e97f..32c14bef 100644 --- a/keystone.ts +++ b/keystone.ts @@ -1,4 +1,4 @@ -import { HardenedAny } from './wrap_any'; +import { HardenedAny, RecursiveTypeAny } from './wrap_any'; import { config } from '@keystone-next/keystone'; import { statelessSessions } from '@keystone-next/keystone/session'; import { createAuth } from '@keystone-next/auth'; @@ -59,7 +59,7 @@ export const simpleLogger = (msg: string) => console.log(Date() + sep + msg); export const logContextInfoGen = (msgRenderer: LogEventRenderer) => (col: ColFun) => - (toBeLogged: HardenedAny): HardenedAny => { + (toBeLogged: HardenedAny): RecursiveTypeAny => { if (toBeLogged === undefined) return logContextInfoGen(stackRenderer)(warningCol)(undefinedVariableMsg); diff --git a/wrap_any.tsx b/wrap_any.ts similarity index 69% rename from wrap_any.tsx rename to wrap_any.ts index 84c1786e..23cbfea2 100644 --- a/wrap_any.tsx +++ b/wrap_any.ts @@ -1,38 +1,32 @@ -// Welcome to wrap_any: The aim is for this file to become empty -// It's the place to admit temporary defeat in eliminating an `any` type, -// and clean the api at a level higher by providing concrete types - - - -// To ensure we only match any once in the top level of this app, -// and give any a descriptive type name -// This is the local alias for the dreaded `type` - -type WrappedRampantlyPolymorphic = any -//Any any is immediately assigned the status RampantlyPolymorphic, which matches exactly what it means -export type RampantlyPolymorphic = WrappedRampantlyPolymorphic - -//Anything that really needs to be fully polymorphic has to earn the right -//Its first status is TestingHardenedAny -export type TestingHardenedAny = WrappedRampantlyPolymorphic - -//Then, once the code has been tested and fully working with undefined input, it can be promoted to -export type HardenedAny = WrappedRampantlyPolymorphic - - - -// These are the problem functions -// The task is to strongly type them. Some require upstream modifications -// Others are just puzzling, and might have a local solution. - -// A JSX type? -export type DocumentType = WrappedRampantlyPolymorphic - -// These have taken hours of time to resolve, with no joy, and have found a temporary home here ... -export type ItemType = WrappedRampantlyPolymorphic -export type ItemSession = WrappedRampantlyPolymorphic - -//From deep down in the keystone types ... -export type GraphQLInput = Record; - - +// Welcome to wrap_any: The aim is for this file to become empty +// It's the place to admit temporary defeat in eliminating an `any` type, +// and clean the api at a level higher by providing concrete types + +// To ensure we only match any once in the top level of this app, +// and give any a descriptive type name +// This is the local alias for the dreaded `type` + +type WrappedRampantlyPolymorphic = any; +//Any any is immediately assigned the status RampantlyPolymorphic, which matches exactly what it means +export type RampantlyPolymorphic = WrappedRampantlyPolymorphic; + +//Anything that really needs to be fully polymorphic has to earn the right +//Its first status is TestingHardenedAny +export type TestingHardenedAny = WrappedRampantlyPolymorphic; + +//Then, once the code has been tested and fully working with undefined input, it can be promoted to +export type HardenedAny = WrappedRampantlyPolymorphic; + +// These are the problem functions +// The task is to strongly type them. Some require upstream modifications +// Others are just puzzling, and might have a local solution. + +// A JSX type? +export type DocumentType = WrappedRampantlyPolymorphic; + +// These have taken hours of time to resolve, with no joy, and have found a temporary home here ... +export type ItemType = WrappedRampantlyPolymorphic; +export type ItemSession = WrappedRampantlyPolymorphic; + +//From deep down in the keystone types ... +export type GraphQLInput = Record; From 0b73d629d1348b5777b0051c698a9ce23ad65934 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 16:15:34 +0100 Subject: [PATCH 136/325] CCC style guide: 2 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 950425dd..58d69f1b 100644 --- a/README.md +++ b/README.md @@ -195,7 +195,7 @@ The Native American naming/language model is used. Functions are verbs, and are Categorical morphisms are weaker, polymorphic aliases to these concrete names, and are `only to be used in generic code`. If writing specific code, it is recommended to use the specific name. -There nothing worse than grepping through 60 pages of `process` matches, all processing something completely different, (a C++ example, but we have all been there, try searching for `: any` in the top of a node project ... ). +There nothing worse than greping through 60 pages of `process` matches, all processing something completely different, (a C++ example, but we have all been there, try searching for `: any` in the top of a node project ... ). `then`, and `catch`, are heavily overused in all languages. IMHO, new apis need to avoid these keywords, but also supply categorical aliases, such as `bind`, `fmap`, `then`,`finally` if generic programming is required. From fd17dcf1fa18a7232b04c09c0bc1bdc38d9cb9fd Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 16:17:16 +0100 Subject: [PATCH 137/325] RecursiveTypeAny --- wrap_any.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wrap_any.ts b/wrap_any.ts index 23cbfea2..654fde37 100644 --- a/wrap_any.ts +++ b/wrap_any.ts @@ -17,6 +17,9 @@ export type TestingHardenedAny = WrappedRampantlyPolymorphic; //Then, once the code has been tested and fully working with undefined input, it can be promoted to export type HardenedAny = WrappedRampantlyPolymorphic; +//These functions set a puzzle to, TBC ... +export type RecursiveTypeAny = WrappedRampantlyPolymorphic; + // These are the problem functions // The task is to strongly type them. Some require upstream modifications // Others are just puzzling, and might have a local solution. From 2ecf8f283a5c65f849dae5185d252bc6763e57fc Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 15 Oct 2021 17:59:39 +0100 Subject: [PATCH 138/325] xfastcommit: only for documentation! --- README.md | 8 +++++--- keystone.ts | 14 +++++++------- package.json | 2 +- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 58d69f1b..db3d0f45 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ utils.js This branch is dedicated to creating a solid foundation for a production build to extend Keystone 6 CMS from. -`yarn commit "message"` fires off the CI pipeline and only commits if unit tests are passed locally. Requires yarn dev running without the main next front end, since yarn site:build is the primary unit test. +`yarn commit "message"` fires off the CI pipeline and only commits if unit tests are passed locally. No longer requires yarn dev running without the main next front end, since yarn site:build is the primary unit test. "fastcommit" is considered dangerous, and needs some additional logic to be CI safe. Its been the cause of a few red crosses. For that reason, it is being prefixed by an `x`, so commands in the history buffer do not trigger it. `yarn push` auto push to origin latest @@ -118,7 +118,7 @@ Status: `Preliminary`. ## any is shouting: I AM WRITTEN IN JAVASCRIPT ... listen to it, and recode it ASAP -`wrap_any.ts` is an ugly name for an ugly file. It might change to become even more noticable. It has the sole role of wrapping `any` subtypes that can't be deduced for some reason. It has proved to be a very +`wrap_any.ts` is an ugly name for an ugly file. It might change names to become even more noticable. Its sole role is wrapping `any` subtypes that can't be deduced for some reason. It has proved to be a very practical way of localising `any` issues. Give the usage a name, and fixed location, right under the peer review spot light. Have varying degree of `anyness`. Take a look at the file, it's a toxic dump of puzzles and types best avoided, and attempts to handle them at a distance. There are more radical approaches that I'm looking at, but they are alien. `any` issues: @@ -229,7 +229,9 @@ Production build: tailwind purge telemetry disable x-api-key for next build events - CI scripts: WIP: Seeding + CI scripts: + Unseeded corner case working. + WIP: Seeding Prettier applied in gitadd. ``` diff --git a/keystone.ts b/keystone.ts index 32c14bef..64a4f9a6 100644 --- a/keystone.ts +++ b/keystone.ts @@ -8,17 +8,15 @@ import { permissions } from './schema/access'; import colors from 'colors/safe'; -// Fix Me: Test code: Needs another home. +// Fix Me: Logging needs another home again. It also needs to be right near the top of the dependencies, or linkage issues occur. +// Schema might be a good place? // Logging is one place where HardenedAny is needed! The intent was object dumping code, down to -//every leaf. A testground for DRY logging in ts. -// Closures are good for logging, localising to particular files/functions/lines ... the issues of this short segment quickly shows why. -// I have some multicol markup for logging, it bash though, so replaces console.log. -// A markup standard for shell would be useful. +// every leaf, in a hardened way. A testground for DRY logging in ts. +// Closures are good for logging, localising to particular files/functions/lines, and returning a continuation. -//const log = (s: string) => console.log(s); -//Reverse mapping for var args, rest parameters ... handy but slightly disfunctional, forEach is not strongly typed. export const fix = (x: T) => x; +//These are functions string => string export const successCol = colors.green; export const warningCol = colors.yellow; export const errorCol = colors.red; @@ -56,6 +54,8 @@ export const stackRenderer = (e: CleanError) => e.stack; export const simpleLogger = (msg: string) => console.log(Date() + sep + msg); +// This apparently simple operation, logging, has a fairly rich monadic structure. +// FIXME: TYPEME: return type. It seems to be a recursive union. export const logContextInfoGen = (msgRenderer: LogEventRenderer) => (col: ColFun) => diff --git a/package.json b/package.json index 88085010..09d999f6 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "clean": "rm -rf node_modules yarn.lock .keystone .next", "gitadd": "yarn format && git add . ||:", "commit": "yarn site:build && yarn gitadd && git commit -a -m ", - "fastcommit": "yarn gitadd && git commit -a -m ", + "xfastcommit": "yarn gitadd && git commit -a -m ", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable && yarn next lint", "site:dev": "next dev -p 8000", From b2c6f0c969927d19aa1addcd99f33e53537203c9 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 16 Oct 2021 16:39:43 +0100 Subject: [PATCH 139/325] Solved RecursiveTypeAny instance --- README.md | 6 +++-- keystone.ts | 65 ++++++++++++++++++++++++++++++++++++----------------- wrap_any.ts | 2 +- 3 files changed, 49 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index db3d0f45..45ca3695 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ This branch is dedicated to creating a solid foundation for a production build t ✅ CI: Github actions runner working in a test framework. Unseeded build cases handled (any bugs fixed!) ✅ Pre release: Testing -Full k8s spec: WIP. +Full k8s spec: WIP. Deferred because its an endless task. ✅ More informative logging, suitable for deployment. ✅ Logging: Code coverage: complete @@ -87,7 +87,7 @@ Full k8s spec: WIP. ✅ Next build super user authorization to keystone, allowing SSR/SSG/ISR tunneling. ``` -A shout out to Jed for explaining the keystone way. +A shout out to @Jed for explaining the keystone way. Ready for exhaustive testing. Bug reports welcome! @@ -204,6 +204,8 @@ I'm fairly new to `ts`, and like it a lot, but without a formal style, it can be With these caveats in mind, enjoy this latest release of @jeds prisma-day app, polished endlessly by @qfunq (it deserves it, Keystone 6 is the best CMS out there, Next, best in class, and same for prisma), and be fully aware this application is in a `testing` phase. + + ``` Known Issues: diff --git a/keystone.ts b/keystone.ts index 64a4f9a6..59b9712a 100644 --- a/keystone.ts +++ b/keystone.ts @@ -1,4 +1,4 @@ -import { HardenedAny, RecursiveTypeAny } from './wrap_any'; +import { HardenedAny } from './wrap_any'; import { config } from '@keystone-next/keystone'; import { statelessSessions } from '@keystone-next/keystone/session'; import { createAuth } from '@keystone-next/auth'; @@ -54,14 +54,18 @@ export const stackRenderer = (e: CleanError) => e.stack; export const simpleLogger = (msg: string) => console.log(Date() + sep + msg); +//export type MonadicType = (maps: T) => MonadicType // This apparently simple operation, logging, has a fairly rich monadic structure. // FIXME: TYPEME: return type. It seems to be a recursive union. export const logContextInfoGen = + (retObj: RetType) => (msgRenderer: LogEventRenderer) => (col: ColFun) => - (toBeLogged: HardenedAny): RecursiveTypeAny => { + (toBeLogged: HardenedAny): RetType => { if (toBeLogged === undefined) - return logContextInfoGen(stackRenderer)(warningCol)(undefinedVariableMsg); + return logContextInfoGen(retObj)(stackRenderer)(warningCol)( + undefinedVariableMsg + ); var cleanMessage: string; @@ -80,21 +84,36 @@ export const logContextInfoGen = const info = msgRenderer(ce); simpleLogger(info + sep + cleanMessage); } - return logContextInfoGen(stackRenderer)(warningCol); + return retObj; }; -const logContextInfo = (col: ColFun) => (a: HardenedAny) => - logContextInfoGen(fileLineRenderer)(col)(a); - -export const log = { - sep: sep, - warning: (a: HardenedAny) => logContextInfo(warningCol)(a), - error: (a: HardenedAny) => logContextInfo(errorCol)(a), - success: (a: HardenedAny) => logContextInfo(successCol)(a), - trace: (a: HardenedAny) => logContextInfoGen(stackRenderer)(fix)(a), - info: (a: HardenedAny) => logContextInfo(fix)(a), - reportSecurityIncident: (a: HardenedAny) => logContextInfo(errorCol)(a), -}; +const logContextInfo = + (retObj: RetType) => + (col: ColFun) => + (a: HardenedAny): RetType => + logContextInfoGen(retObj)(fileLineRenderer)(col)(a); + +export class logclos { + sep: string = sep; + warning(a: HardenedAny): this { + return logContextInfo(this)(warningCol)(a); + } + error(a: HardenedAny): this { + return logContextInfo(this)(errorCol)(a); + } + success(a: HardenedAny): this { + return logContextInfo(this)(successCol)(a); + } + trace(a: HardenedAny): this { + return logContextInfoGen(this)(stackRenderer)(fix)(a); + } + info(a: HardenedAny): this { + return logContextInfoGen(this)(fileLineRenderer)(fix)(a); + } + reportSecurityIncident(a: HardenedAny): this { + return logContextInfo(this)(errorCol)(a); + } +} const dbUrl = `${process.env.DATABASE_URL}` || @@ -102,10 +121,14 @@ const dbUrl = export const keyStoneHost = process.env?.KEYSTONE_HOST || 'localhost'; -log.info(`Database url: ${dbUrl}`); -log.success(dbUrl); -log.info(`Keystone host`); -log.success(keyStoneHost); +export const log = new logclos(); + +log + .info(`Database url: ${dbUrl}`) + + .success(dbUrl) + .info(`Keystone host`) + .success(keyStoneHost); const sessionSecret = process.env.SESSION_SECERT || @@ -113,7 +136,7 @@ const sessionSecret = export const keystoneNextjsBuildApiKey = process.env.KEYSTONE_NEXTJS_BUILD_API_KEY || - 'utils.ts:_keystoneNextjsBuildApiKey_says_change_me_!!!!!!!_im_just_for_testing_purposes'; + 'keystone.ts:_NextjsBuildApiKey_says_change_me_!!!!!!!_im_just_for_testing_purposes'; const auth = createAuth({ identityField: 'email', diff --git a/wrap_any.ts b/wrap_any.ts index 654fde37..edf03cd1 100644 --- a/wrap_any.ts +++ b/wrap_any.ts @@ -18,7 +18,7 @@ export type TestingHardenedAny = WrappedRampantlyPolymorphic; export type HardenedAny = WrappedRampantlyPolymorphic; //These functions set a puzzle to, TBC ... -export type RecursiveTypeAny = WrappedRampantlyPolymorphic; +// Solved // These are the problem functions // The task is to strongly type them. Some require upstream modifications From 68aafaa927c15f102cdd753ef38d4e6b96659228 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 16 Oct 2021 17:50:30 +0100 Subject: [PATCH 140/325] Refactor: Created utils folder. Hardened logging to take null --- keystone.tsx | 71 ++++++++++++++++++++++++++++ pages/index.tsx | 2 +- pages/post/[slug].tsx | 2 +- utils.ts => utils/fetchGraphQL.ts | 4 +- keystone.ts => utils/logging.ts | 77 +++---------------------------- 5 files changed, 82 insertions(+), 74 deletions(-) create mode 100644 keystone.tsx rename utils.ts => utils/fetchGraphQL.ts (88%) rename keystone.ts => utils/logging.ts (63%) diff --git a/keystone.tsx b/keystone.tsx new file mode 100644 index 00000000..85085b61 --- /dev/null +++ b/keystone.tsx @@ -0,0 +1,71 @@ +import { logclos } from './utils/logging' +import { config } from '@keystone-next/keystone'; +import { statelessSessions } from '@keystone-next/keystone/session'; +import { createAuth } from '@keystone-next/auth'; + +import { lists, extendGraphqlSchema } from './schema'; +import { permissions } from './schema/access'; + + +const dbUrl = + `${process.env.DATABASE_URL}` || + `postgres://${process.env?.POSTGRES_USER}:${process.env?.POSTGRES_PASSWORD}@${process.env?.POSTGRES_HOST}/${process.env?.POSTGRES_DB}`; + +export const keyStoneHost = process.env?.KEYSTONE_HOST || 'localhost'; + +export const log = new logclos(); + + +const sessionSecret = + process.env.SESSION_SECERT || + 'iLqbHhm7qwiBNc8KgL4NQ8tD8fFVhNhNqZ2nRdprgnKNjgJHgvitWx6DPoZJpYHa'; + +export const keystoneNextjsBuildApiKey = + process.env.KEYSTONE_NEXTJS_BUILD_API_KEY || + 'keystone.ts:_NextjsBuildApiKey_says_change_me_!!!!!!!_im_just_for_testing_purposes'; + +log + .info(null) + .info(`Database url: ${dbUrl}`) + + .success(dbUrl) + .info(`Keystone host`) + .success(keyStoneHost); + +const auth = createAuth({ + identityField: 'email', + secretField: 'password', + listKey: 'User', + sessionData: `id name role { + canManageContent + canManageUsers + }`, + initFirstItem: { + fields: ['name', 'email', 'password'], + itemData: { + role: { + create: { + name: 'Super User', + canManageContent: true, + canManageUsers: true, + }, + }, + }, + }, +}); + +export default auth.withAuth( + config({ + db: { + url: dbUrl, + provider: 'postgresql', + useMigrations: true, + }, + ui: { isAccessAllowed: permissions.canUseAdminUI }, + lists, + session: statelessSessions({ + secret: sessionSecret, + }), + extendGraphqlSchema, + }) +); diff --git a/pages/index.tsx b/pages/index.tsx index 04b9d55e..4029448a 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import { GetStaticPropsContext } from 'next'; -import { fetchGraphQL_inject_api_key, gql } from '../utils'; +import { fetchGraphQL_inject_api_key, gql } from '../utils/fetchGraphQL'; import { DocumentRenderer } from '../schema/fields/content/renderers'; import { Container } from '../components/ui/layout'; diff --git a/pages/post/[slug].tsx b/pages/post/[slug].tsx index 22dee837..400cdc18 100644 --- a/pages/post/[slug].tsx +++ b/pages/post/[slug].tsx @@ -1,7 +1,7 @@ import { GetStaticPathsResult, GetStaticPropsContext } from 'next'; import React from 'react'; -import { fetchGraphQL_inject_api_key, gql } from '../../utils'; +import { fetchGraphQL_inject_api_key, gql } from '../../utils/fetchGraphQL'; import { DocumentRenderer } from '../../schema/fields/content/renderers'; import { Container, HomeLink } from '../../components/ui/layout'; diff --git a/utils.ts b/utils/fetchGraphQL.ts similarity index 88% rename from utils.ts rename to utils/fetchGraphQL.ts index 2ef57261..eea33d2f 100644 --- a/utils.ts +++ b/utils/fetchGraphQL.ts @@ -1,5 +1,5 @@ -import { keystoneNextjsBuildApiKey, keyStoneHost, log } from './keystone'; -import { HardenedAny } from './wrap_any'; +import { keystoneNextjsBuildApiKey, keyStoneHost, log } from '../keystone'; +import { HardenedAny } from '../wrap_any'; export const gql = ([content]: TemplateStringsArray) => content; export async function fetchGraphQL_inject_api_key( diff --git a/keystone.ts b/utils/logging.ts similarity index 63% rename from keystone.ts rename to utils/logging.ts index 59b9712a..5f3931c8 100644 --- a/keystone.ts +++ b/utils/logging.ts @@ -1,15 +1,7 @@ -import { HardenedAny } from './wrap_any'; -import { config } from '@keystone-next/keystone'; -import { statelessSessions } from '@keystone-next/keystone/session'; -import { createAuth } from '@keystone-next/auth'; - -import { lists, extendGraphqlSchema } from './schema'; -import { permissions } from './schema/access'; +import { HardenedAny } from '../wrap_any'; import colors from 'colors/safe'; -// Fix Me: Logging needs another home again. It also needs to be right near the top of the dependencies, or linkage issues occur. -// Schema might be a good place? // Logging is one place where HardenedAny is needed! The intent was object dumping code, down to // every leaf, in a hardened way. A testground for DRY logging in ts. // Closures are good for logging, localising to particular files/functions/lines, and returning a continuation. @@ -36,6 +28,8 @@ export const sep = ': '; export const baseErrorMsg = 'utils: logContextInfoGen::' + sep; export const undefinedVariableMsg = baseErrorMsg + 'Attempted to log an undefined variable.' + sep; +export const nullVariableMsg = + baseErrorMsg + 'Attempted to log a null variable.' + sep; export const unknownLineAndFileMsg = baseErrorMsg + 'Unknown line and file' + sep; export const cantOpenErrorMsg = @@ -67,6 +61,10 @@ export const logContextInfoGen = undefinedVariableMsg ); + if (toBeLogged === null) + return logContextInfoGen(retObj)(stackRenderer)(warningCol)( + nullVariableMsg + ); var cleanMessage: string; if (typeof toBeLogged === 'string') { @@ -114,64 +112,3 @@ export class logclos { return logContextInfo(this)(errorCol)(a); } } - -const dbUrl = - `${process.env.DATABASE_URL}` || - `postgres://${process.env?.POSTGRES_USER}:${process.env?.POSTGRES_PASSWORD}@${process.env?.POSTGRES_HOST}/${process.env?.POSTGRES_DB}`; - -export const keyStoneHost = process.env?.KEYSTONE_HOST || 'localhost'; - -export const log = new logclos(); - -log - .info(`Database url: ${dbUrl}`) - - .success(dbUrl) - .info(`Keystone host`) - .success(keyStoneHost); - -const sessionSecret = - process.env.SESSION_SECERT || - 'iLqbHhm7qwiBNc8KgL4NQ8tD8fFVhNhNqZ2nRdprgnKNjgJHgvitWx6DPoZJpYHa'; - -export const keystoneNextjsBuildApiKey = - process.env.KEYSTONE_NEXTJS_BUILD_API_KEY || - 'keystone.ts:_NextjsBuildApiKey_says_change_me_!!!!!!!_im_just_for_testing_purposes'; - -const auth = createAuth({ - identityField: 'email', - secretField: 'password', - listKey: 'User', - sessionData: `id name role { - canManageContent - canManageUsers - }`, - initFirstItem: { - fields: ['name', 'email', 'password'], - itemData: { - role: { - create: { - name: 'Super User', - canManageContent: true, - canManageUsers: true, - }, - }, - }, - }, -}); - -export default auth.withAuth( - config({ - db: { - url: dbUrl, - provider: 'postgresql', - useMigrations: true, - }, - ui: { isAccessAllowed: permissions.canUseAdminUI }, - lists, - session: statelessSessions({ - secret: sessionSecret, - }), - extendGraphqlSchema, - }) -); From c22b9ad69755faec8bac4daa74fd18f110d90dd4 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 16 Oct 2021 17:58:24 +0100 Subject: [PATCH 141/325] Updated readme --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 45ca3695..b6cf0bfe 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ Full k8s spec: WIP. Deferred because its an endless task. ✅ Next build super user authorization to keystone, allowing SSR/SSG/ISR tunneling. ``` -A shout out to @Jed for explaining the keystone way. +A shout out to @jed for explaining the keystone way. Ready for exhaustive testing. Bug reports welcome! @@ -201,7 +201,8 @@ There nothing worse than greping through 60 pages of `process` matches, all proc I'm fairly new to `ts`, and like it a lot, but without a formal style, it can become unmanagable. -With these caveats in mind, enjoy this latest release of @jeds prisma-day app, polished endlessly by @qfunq (it deserves it, Keystone 6 is the best CMS out there, Next, best in class, and same for prisma), and be fully aware this application is in a `testing` phase. +With these caveats in mind, enjoy this latest release of @jeds prisma day workshop app, ported to Keystone 26, with useful contrib from @Guatam Singh, and polished endlessly by qfunq (it deserves it, Keystone 6 is the best CMS out there, Next, best in class, the same for prisma, and jeds code pulls it all together in a very useful way), and be fully aware, however solid it seems, this application is still in a `testing` phase. + From 7273875ed68bc675d5b1125b1f463b78a24ff295 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 16 Oct 2021 18:27:01 +0100 Subject: [PATCH 142/325] Monadic log succinctness. --- utils/logging.ts | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/utils/logging.ts b/utils/logging.ts index 5f3931c8..c10cd6f7 100644 --- a/utils/logging.ts +++ b/utils/logging.ts @@ -25,7 +25,7 @@ export type ColFun = (maps: string) => string; export const sep = ': '; -export const baseErrorMsg = 'utils: logContextInfoGen::' + sep; +export const baseErrorMsg = ''; export const undefinedVariableMsg = baseErrorMsg + 'Attempted to log an undefined variable.' + sep; export const nullVariableMsg = @@ -46,7 +46,9 @@ export const fileLineRenderer = (e: CleanError) => { export const stackRenderer = (e: CleanError) => e.stack; -export const simpleLogger = (msg: string) => console.log(Date() + sep + msg); +export type LoggerFun = (maps: string) => void; +export const simpleLogger = (msg: string) => console.log(msg); +export const dateLogger = (msg: string) => simpleLogger(Date() + sep + msg); //export type MonadicType = (maps: T) => MonadicType // This apparently simple operation, logging, has a fairly rich monadic structure. @@ -55,14 +57,15 @@ export const logContextInfoGen = (retObj: RetType) => (msgRenderer: LogEventRenderer) => (col: ColFun) => + (logger: LoggerFun) => (toBeLogged: HardenedAny): RetType => { if (toBeLogged === undefined) - return logContextInfoGen(retObj)(stackRenderer)(warningCol)( + return logContextInfoGen(retObj)(stackRenderer)(warningCol)(logger)( undefinedVariableMsg ); if (toBeLogged === null) - return logContextInfoGen(retObj)(stackRenderer)(warningCol)( + return logContextInfoGen(retObj)(stackRenderer)(warningCol)(logger)( nullVariableMsg ); var cleanMessage: string; @@ -76,11 +79,11 @@ export const logContextInfoGen = } const e = new Error(); if (!e.stack) { - simpleLogger(errorCol(cantOpenErrorMsg) + cleanMessage); + logger(errorCol(cantOpenErrorMsg) + cleanMessage); } else { const ce = e as CleanError; const info = msgRenderer(ce); - simpleLogger(info + sep + cleanMessage); + logger(info + sep + cleanMessage); } return retObj; }; @@ -88,27 +91,35 @@ export const logContextInfoGen = const logContextInfo = (retObj: RetType) => (col: ColFun) => + (logger: LoggerFun) => (a: HardenedAny): RetType => - logContextInfoGen(retObj)(fileLineRenderer)(col)(a); + logContextInfoGen(retObj)(fileLineRenderer)(col)(logger)(a); export class logclos { sep: string = sep; + depth: number = -1; + + logger() { + this.depth = this.depth++; + return this.depth ? simpleLogger : dateLogger; + } + warning(a: HardenedAny): this { - return logContextInfo(this)(warningCol)(a); + return logContextInfo(this)(warningCol)(this.logger())(a); } error(a: HardenedAny): this { - return logContextInfo(this)(errorCol)(a); + return logContextInfo(this)(errorCol)(this.logger())(a); } success(a: HardenedAny): this { - return logContextInfo(this)(successCol)(a); + return logContextInfo(this)(successCol)(this.logger())(a); } trace(a: HardenedAny): this { - return logContextInfoGen(this)(stackRenderer)(fix)(a); + return logContextInfoGen(this)(stackRenderer)(fix)(this.logger())(a); } info(a: HardenedAny): this { - return logContextInfoGen(this)(fileLineRenderer)(fix)(a); + return logContextInfoGen(this)(fileLineRenderer)(fix)(this.logger())(a); } reportSecurityIncident(a: HardenedAny): this { - return logContextInfo(this)(errorCol)(a); + return logContextInfo(this)(errorCol)(this.logger())(a); } } From c2b0922f6808b7a4df5e217d4861a6f0b0dd96e0 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 16 Oct 2021 19:43:07 +0100 Subject: [PATCH 143/325] Monadic log succinctness:2, defense: 5 --- keystone.tsx => keystone.ts | 10 ++++------ pages/post/[slug].tsx | 2 +- schema/access.ts | 12 ++++++------ schema/mutations.ts | 2 +- utils/clone.ts | 13 +++++++++++++ utils/fetchGraphQL.ts | 12 +++++------- utils/logging.ts | 13 +++++++------ 7 files changed, 37 insertions(+), 27 deletions(-) rename keystone.tsx => keystone.ts (93%) create mode 100644 utils/clone.ts diff --git a/keystone.tsx b/keystone.ts similarity index 93% rename from keystone.tsx rename to keystone.ts index 85085b61..f62ddbda 100644 --- a/keystone.tsx +++ b/keystone.ts @@ -1,4 +1,4 @@ -import { logclos } from './utils/logging' +import { logclos } from './utils/logging'; import { config } from '@keystone-next/keystone'; import { statelessSessions } from '@keystone-next/keystone/session'; import { createAuth } from '@keystone-next/auth'; @@ -6,15 +6,13 @@ import { createAuth } from '@keystone-next/auth'; import { lists, extendGraphqlSchema } from './schema'; import { permissions } from './schema/access'; - const dbUrl = `${process.env.DATABASE_URL}` || `postgres://${process.env?.POSTGRES_USER}:${process.env?.POSTGRES_PASSWORD}@${process.env?.POSTGRES_HOST}/${process.env?.POSTGRES_DB}`; export const keyStoneHost = process.env?.KEYSTONE_HOST || 'localhost'; -export const log = new logclos(); - +export const log = () => new logclos(); const sessionSecret = process.env.SESSION_SECERT || @@ -24,13 +22,13 @@ export const keystoneNextjsBuildApiKey = process.env.KEYSTONE_NEXTJS_BUILD_API_KEY || 'keystone.ts:_NextjsBuildApiKey_says_change_me_!!!!!!!_im_just_for_testing_purposes'; -log +log() .info(null) .info(`Database url: ${dbUrl}`) .success(dbUrl) .info(`Keystone host`) - .success(keyStoneHost); + .success(keyStoneHost); const auth = createAuth({ identityField: 'email', diff --git a/pages/post/[slug].tsx b/pages/post/[slug].tsx index 400cdc18..ae049d49 100644 --- a/pages/post/[slug].tsx +++ b/pages/post/[slug].tsx @@ -39,7 +39,7 @@ export async function getStaticPaths(): Promise { } ` ); - if (data === undefined || data.posts === undefined) + if (data === undefined || data.posts === undefined || data.posts === null) return { paths: [].map((post: HardenedAny) => ({ params: { slug: "" } })), fallback: false,}; diff --git a/schema/access.ts b/schema/access.ts index 37908219..69f864d1 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -56,14 +56,14 @@ export const isBuildEnvir = (frame: SessionFrame): boolean => { if (recvApiKey === keystoneNextjsBuildApiKey) { if (recvApiKey.includes('keystone')) { - log.warning('access: prototype api key: ' + recvApiKey); + log().warning('access: prototype api key: ' + recvApiKey); } - log.success( + log().success( 'access::isBuildEnvir: next build: api key matches: granting super user query access.' ); return true; } else { - log + log() .warning('access::isBuildEnvir: authentication breach:') .success( 'access::isBuildEnvir: no additional authorisation granted to breach.' @@ -104,7 +104,7 @@ export const operationCanManageContentList = (frame: SessionFrame) => export const FilterCanManageContentList = (frame: SessionFrame) => { if (frame === undefined) { - log.reportSecurityIncident( + log().reportSecurityIncident( 'Minor security breach: potential auth bug. undefined frame: query downgraded to public.' ); return PUBLISHED_POST_STATUS; @@ -119,13 +119,13 @@ export const FilterCanManageContentList = (frame: SessionFrame) => { //The perms check is only running client side. Review: check the authorization props are checked //server side to. if (!!frame.context.session?.data?.role?.canManageContent) { - log + log() .success('Blessed super user access to the known content manager:') .success(frame?.context?.session?.data?.name); return EVERY_POST_STATUS; } - log + log() .success('Client receives only published posts:') .success(frame?.context?.session?.data?.name); //success(frame.context.session?.data?.role?.canManageContent); diff --git a/schema/mutations.ts b/schema/mutations.ts index da68e074..9d8fa27c 100644 --- a/schema/mutations.ts +++ b/schema/mutations.ts @@ -16,7 +16,7 @@ async function clearVote( const context = _context.sudo(); if (!context.session) { //Removed throw, which was crashing keystone - log.warning('Stale context: you must be signed in to vote'); + log().warning('Stale context: you must be signed in to vote'); return; } diff --git a/utils/clone.ts b/utils/clone.ts new file mode 100644 index 00000000..9b54f5f7 --- /dev/null +++ b/utils/clone.ts @@ -0,0 +1,13 @@ +export const testShallowCopy = (obj: T): T => { + var copy: any; + + // Handle non object + if (undefined === obj || null === obj || 'object' != typeof obj) return obj; + + for (var attr in obj) { + copy[attr] = obj[attr]; + } + return copy as T; +}; + +export const shallowCopy = (obj: T): T => obj; diff --git a/utils/fetchGraphQL.ts b/utils/fetchGraphQL.ts index eea33d2f..848fce33 100644 --- a/utils/fetchGraphQL.ts +++ b/utils/fetchGraphQL.ts @@ -8,11 +8,11 @@ export async function fetchGraphQL_inject_api_key( ) { //Intentionally create an undefined to test HardenedAny //var x; - //log.success(x); + //log().success(x); keystoneNextjsBuildApiKey.includes('keystone') - ? log.warning('Prototype api key: ' + keystoneNextjsBuildApiKey) - : log.success('Next build: x-api-key: tx'); + ? log().warning('Prototype api key: ' + keystoneNextjsBuildApiKey) + : log().success('Next build: x-api-key: tx'); return fetch(`http://${keyStoneHost}:3000/api/graphql`, { method: 'POST', @@ -24,12 +24,10 @@ export async function fetchGraphQL_inject_api_key( }) .then(x => x.json()) .then(({ data }) => { - log.success('Next build: json: rx'); + log().success('Next build: json: rx'); return data; }) .catch(msg => - log.error( - 'Next build: did not recieve static site data: ' + log.sep + msg - ) + log().error('Next build: did not recieve static site data: ' + msg) ); } diff --git a/utils/logging.ts b/utils/logging.ts index c10cd6f7..680379b1 100644 --- a/utils/logging.ts +++ b/utils/logging.ts @@ -1,4 +1,5 @@ import { HardenedAny } from '../wrap_any'; +import { shallowCopy } from './clone'; import colors from 'colors/safe'; @@ -54,11 +55,11 @@ export const dateLogger = (msg: string) => simpleLogger(Date() + sep + msg); // This apparently simple operation, logging, has a fairly rich monadic structure. // FIXME: TYPEME: return type. It seems to be a recursive union. export const logContextInfoGen = - (retObj: RetType) => + (retObj: TretObj) => (msgRenderer: LogEventRenderer) => (col: ColFun) => (logger: LoggerFun) => - (toBeLogged: HardenedAny): RetType => { + (toBeLogged: HardenedAny): TretObj => { if (toBeLogged === undefined) return logContextInfoGen(retObj)(stackRenderer)(warningCol)(logger)( undefinedVariableMsg @@ -85,18 +86,18 @@ export const logContextInfoGen = const info = msgRenderer(ce); logger(info + sep + cleanMessage); } - return retObj; + + return shallowCopy(retObj); }; const logContextInfo = - (retObj: RetType) => + (retObj: TretObj) => (col: ColFun) => (logger: LoggerFun) => - (a: HardenedAny): RetType => + (a: HardenedAny): TretObj => logContextInfoGen(retObj)(fileLineRenderer)(col)(logger)(a); export class logclos { - sep: string = sep; depth: number = -1; logger() { From 1adfb7d89523c7e7ece26639732e9339f9f77cd5 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sun, 17 Oct 2021 01:05:34 +0100 Subject: [PATCH 144/325] Monadic log succinctness:3 fixed update closure --- keystone.ts | 2 -- utils/logging.ts | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/keystone.ts b/keystone.ts index f62ddbda..12536b6b 100644 --- a/keystone.ts +++ b/keystone.ts @@ -23,9 +23,7 @@ export const keystoneNextjsBuildApiKey = 'keystone.ts:_NextjsBuildApiKey_says_change_me_!!!!!!!_im_just_for_testing_purposes'; log() - .info(null) .info(`Database url: ${dbUrl}`) - .success(dbUrl) .info(`Keystone host`) .success(keyStoneHost); diff --git a/utils/logging.ts b/utils/logging.ts index 680379b1..f229d66f 100644 --- a/utils/logging.ts +++ b/utils/logging.ts @@ -101,7 +101,7 @@ export class logclos { depth: number = -1; logger() { - this.depth = this.depth++; + this.depth = this.depth + 1; return this.depth ? simpleLogger : dateLogger; } From fd743e7af812db1a95df083bc9d7e0c2bb78f3cf Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sun, 17 Oct 2021 01:21:14 +0100 Subject: [PATCH 145/325] Category notes CMC suits ts better than CCC --- keystone.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/keystone.ts b/keystone.ts index 12536b6b..7e8c95fb 100644 --- a/keystone.ts +++ b/keystone.ts @@ -12,8 +12,6 @@ const dbUrl = export const keyStoneHost = process.env?.KEYSTONE_HOST || 'localhost'; -export const log = () => new logclos(); - const sessionSecret = process.env.SESSION_SECERT || 'iLqbHhm7qwiBNc8KgL4NQ8tD8fFVhNhNqZ2nRdprgnKNjgJHgvitWx6DPoZJpYHa'; @@ -22,6 +20,14 @@ export const keystoneNextjsBuildApiKey = process.env.KEYSTONE_NEXTJS_BUILD_API_KEY || 'keystone.ts:_NextjsBuildApiKey_says_change_me_!!!!!!!_im_just_for_testing_purposes'; +// Unless I'm missing something, its tricky to clone typescript objects +// Fortunately theres a workaround for monad like objects, create a new one +// using a class factory, in this case, logclos. +// The resulting object is non-clonable, without entanglement, so is in the CMC, and not the CCC. +// Since objects are so hard to clone it ts, this is not a big issue, indeed, ts seems better suited to the CMC + +export const log = () => new logclos(); + log() .info(`Database url: ${dbUrl}`) .success(dbUrl) From caa4a8bd33a7415043399f2cd79f142e1ff74e47 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sun, 17 Oct 2021 01:51:41 +0100 Subject: [PATCH 146/325] Readme: CMC --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b6cf0bfe..b4067872 100644 --- a/README.md +++ b/README.md @@ -190,6 +190,15 @@ There is also a `dodgy C++ style cast`, right where it's not needed ... `TBC`. The reason this is important is that `ts` offers us the `CCC` to programme in, (eliminating `any` completely), if we so desire. Then a programme can be proved to do exactly what it says it does, and this painfully pedantic style is fully justified. +Research has demonstrated `ts` has issues expressing the `CCC`, but has fewer issues expressing the `CMC`, i.e. quantum categories. This is a slight +surprise, but now known, the `CMC` is used exculsively. This means all transformations of objects are monadic. This is because +`ts` is call by reference, and objects cant be cloned easily, instead they are `entangled` when referred to twice. So its best to +accept this, and make new objects using a class factory, to be modified by a monad (that that the object is trapped inside of), which cannot be cloned either. This is an efficient way to code closures, because passing the object pointer ensures only a minimum of copying environment is performed, at creation time. + +There are also positive benefits resulting from entanglement in the `CMC`, it can be used to model subscriptions. + + + ## On naming The Native American naming/language model is used. Functions are verbs, and are named by what they do. @@ -211,7 +220,7 @@ With these caveats in mind, enjoy this latest release of @jeds prisma day worksh Known Issues: -Code can siliently fail in a ?. chain. WIP +Code can siliently fail in a ?. chain. CURRENT WIP The ?. construction is convenient, but not suitable for production logging, error trapping. To be replaced with a maybe sytle monad. From 2866cf3179450d10f4bbe7ecf7872b0acdd01913 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sun, 17 Oct 2021 17:54:59 +0100 Subject: [PATCH 147/325] Input monad, messy WIP --- keystone.ts | 3 ++ utils/fetchGraphQL.ts | 10 +++-- utils/logging.ts | 2 + utils/recursive_const.ts | 85 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 utils/recursive_const.ts diff --git a/keystone.ts b/keystone.ts index 7e8c95fb..f5e2f4ba 100644 --- a/keystone.ts +++ b/keystone.ts @@ -5,6 +5,7 @@ import { createAuth } from '@keystone-next/auth'; import { lists, extendGraphqlSchema } from './schema'; import { permissions } from './schema/access'; +import { MaybeInputTests } from './utils/recursive_const'; const dbUrl = `${process.env.DATABASE_URL}` || @@ -28,6 +29,8 @@ export const keystoneNextjsBuildApiKey = export const log = () => new logclos(); +MaybeInputTests(); + log() .info(`Database url: ${dbUrl}`) .success(dbUrl) diff --git a/utils/fetchGraphQL.ts b/utils/fetchGraphQL.ts index 848fce33..3ee0d982 100644 --- a/utils/fetchGraphQL.ts +++ b/utils/fetchGraphQL.ts @@ -1,4 +1,5 @@ -import { keystoneNextjsBuildApiKey, keyStoneHost, log } from '../keystone'; +import { keystoneNextjsBuildApiKey, keyStoneHost } from '../keystone'; +import { log } from '../utils/logging'; import { HardenedAny } from '../wrap_any'; export const gql = ([content]: TemplateStringsArray) => content; @@ -27,7 +28,8 @@ export async function fetchGraphQL_inject_api_key( log().success('Next build: json: rx'); return data; }) - .catch(msg => - log().error('Next build: did not recieve static site data: ' + msg) - ); + .catch(msg => { + log().error('Next build: did not recieve static site data: ' + msg); + return null; + }); } diff --git a/utils/logging.ts b/utils/logging.ts index f229d66f..a11fa64e 100644 --- a/utils/logging.ts +++ b/utils/logging.ts @@ -124,3 +124,5 @@ export class logclos { return logContextInfo(this)(errorCol)(this.logger())(a); } } + +export const log = () => new logclos(); diff --git a/utils/recursive_const.ts b/utils/recursive_const.ts new file mode 100644 index 00000000..318923db --- /dev/null +++ b/utils/recursive_const.ts @@ -0,0 +1,85 @@ +//Test code to see how easy it is to define recursive constants in the CCC + +interface IfooPackage { + prop1: (bind: IfooPackage) => string; + prop2: (bind: IfooPackage) => string; + prop3: (bind: IfooPackage) => undefined; +} +enum FooMethods { + Up = 'prop1', + Down = 'prop2', + Bad = 'prop3', +} +const Prop1 = 'prop1'; +const Prop2 = 'prop2'; + +type FooProps = typeof Prop1 | typeof Prop2; + +export const fooPackage = { + prop1: (self: IfooPackage) => 'hi', + prop2: (self: IfooPackage) => self.prop1 + ' world', + prop3: (self: IfooPackage) => undefined, +} as const; + +export const bindMod = (pack: IfooPackage) => (attr: FooMethods) => { + return pack[attr](pack); +}; + +export const bindMod2 = (pack: IfooPackage) => (attr: FooProps) => { + return pack[attr](pack); +}; + +export const bindMod3 = (pack: IfooPackage) => (attr: FooProps) => { + let fun = pack[attr](pack); + return fun === undefined ? 'undefined' : fun; +}; + +console.log(fooPackage.prop2(fooPackage)); + +console.log(bindMod(fooPackage)(FooMethods.Down)); + +console.log(bindMod2(fooPackage)(Prop2)); + +//Not very easy, but probably necessary for parsing js structures, or can we use a neater CMC pattern? + +//What needs to be achieved get_attr(obj)(attr).good(...).bad() + +export type BadValue = undefined | null; + +export type Possibly = T | BadValue; + +export class MaybeIOAux { + val: Possibly; + constructor(v: Possibly) { + this.val = v; + } + good(f: (maps: T) => void) { + if (this.val !== undefined && this.val !== null) f(this.val); + return this; + } + bad(f: (maps: BadValue) => void) { + if (this.val === undefined || this.val === null) f(this.val as BadValue); + } +} + +const sub_flds = { + page1: 'hi', + page2: 'hi2', +}; + +const test_vals = { + sf: sub_flds, + nv: null, + uv: undefined, +}; +export const MaybeInput = (vals: Possibly) => new MaybeIOAux(vals); + +export const MaybeInputTests = () => { + MaybeInput(test_vals) + .good((val: typeof test_vals) => console.log('Good Value: ' + val.sf.page1)) + .bad((val: T) => console.log('Bad Value')); + + MaybeInput(null) + .good((val: T) => console.log('Good Value')) + .bad((val: T) => console.log('Bad Value')); +}; From e4d9e6bd9bdd7cc16605c23a669b14867b138ffe Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sun, 17 Oct 2021 17:55:50 +0100 Subject: [PATCH 148/325] Input monad, messy WIP : 2 --- schema/access.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/schema/access.ts b/schema/access.ts index 69f864d1..f59346c3 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -1,5 +1,6 @@ import { KeystoneContext } from '.keystone/types'; -import { keystoneNextjsBuildApiKey, log } from '../keystone'; +import { keystoneNextjsBuildApiKey } from '../keystone'; +import { log } from '../utils/logging'; import { ItemType } from '../wrap_any'; From fcf51da2fc710d58b6e0a9db59026d9f4ff47bfc Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sun, 17 Oct 2021 17:58:11 +0100 Subject: [PATCH 149/325] Input monad, messy WIP : 3 versioning. --- keystone.ts | 4 +--- schema/mutations.ts | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/keystone.ts b/keystone.ts index f5e2f4ba..9bcc9723 100644 --- a/keystone.ts +++ b/keystone.ts @@ -1,4 +1,4 @@ -import { logclos } from './utils/logging'; +import { log } from './utils/logging'; import { config } from '@keystone-next/keystone'; import { statelessSessions } from '@keystone-next/keystone/session'; import { createAuth } from '@keystone-next/auth'; @@ -27,8 +27,6 @@ export const keystoneNextjsBuildApiKey = // The resulting object is non-clonable, without entanglement, so is in the CMC, and not the CCC. // Since objects are so hard to clone it ts, this is not a big issue, indeed, ts seems better suited to the CMC -export const log = () => new logclos(); - MaybeInputTests(); log() diff --git a/schema/mutations.ts b/schema/mutations.ts index 9d8fa27c..8e650bb0 100644 --- a/schema/mutations.ts +++ b/schema/mutations.ts @@ -5,7 +5,7 @@ import { PollWhereUniqueInput, } from '.keystone/types'; -import { log } from '../keystone'; +import { log } from '../utils/logging'; const gql = ([content]: TemplateStringsArray) => content; From 3d54c84123ece7ea58d1bc1d264cea00da289b12 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sun, 17 Oct 2021 19:21:03 +0100 Subject: [PATCH 150/325] Testing release. --- keystone.ts | 3 -- package.json | 1 + utils/recursive_const.ts | 85 ---------------------------------------- yarn.lock | 17 +++----- 4 files changed, 6 insertions(+), 100 deletions(-) delete mode 100644 utils/recursive_const.ts diff --git a/keystone.ts b/keystone.ts index 9bcc9723..4099ad69 100644 --- a/keystone.ts +++ b/keystone.ts @@ -5,7 +5,6 @@ import { createAuth } from '@keystone-next/auth'; import { lists, extendGraphqlSchema } from './schema'; import { permissions } from './schema/access'; -import { MaybeInputTests } from './utils/recursive_const'; const dbUrl = `${process.env.DATABASE_URL}` || @@ -27,8 +26,6 @@ export const keystoneNextjsBuildApiKey = // The resulting object is non-clonable, without entanglement, so is in the CMC, and not the CCC. // Since objects are so hard to clone it ts, this is not a big issue, indeed, ts seems better suited to the CMC -MaybeInputTests(); - log() .info(`Database url: ${dbUrl}`) .success(dbUrl) diff --git a/package.json b/package.json index 09d999f6..af5cdab7 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "node-fetch": "^2.6.1", "react": "^17.0.2", "react-dom": "^17.0.2", + "readline": "^1.3.0", "urql": "^2.0.5" }, "devDependencies": { diff --git a/utils/recursive_const.ts b/utils/recursive_const.ts deleted file mode 100644 index 318923db..00000000 --- a/utils/recursive_const.ts +++ /dev/null @@ -1,85 +0,0 @@ -//Test code to see how easy it is to define recursive constants in the CCC - -interface IfooPackage { - prop1: (bind: IfooPackage) => string; - prop2: (bind: IfooPackage) => string; - prop3: (bind: IfooPackage) => undefined; -} -enum FooMethods { - Up = 'prop1', - Down = 'prop2', - Bad = 'prop3', -} -const Prop1 = 'prop1'; -const Prop2 = 'prop2'; - -type FooProps = typeof Prop1 | typeof Prop2; - -export const fooPackage = { - prop1: (self: IfooPackage) => 'hi', - prop2: (self: IfooPackage) => self.prop1 + ' world', - prop3: (self: IfooPackage) => undefined, -} as const; - -export const bindMod = (pack: IfooPackage) => (attr: FooMethods) => { - return pack[attr](pack); -}; - -export const bindMod2 = (pack: IfooPackage) => (attr: FooProps) => { - return pack[attr](pack); -}; - -export const bindMod3 = (pack: IfooPackage) => (attr: FooProps) => { - let fun = pack[attr](pack); - return fun === undefined ? 'undefined' : fun; -}; - -console.log(fooPackage.prop2(fooPackage)); - -console.log(bindMod(fooPackage)(FooMethods.Down)); - -console.log(bindMod2(fooPackage)(Prop2)); - -//Not very easy, but probably necessary for parsing js structures, or can we use a neater CMC pattern? - -//What needs to be achieved get_attr(obj)(attr).good(...).bad() - -export type BadValue = undefined | null; - -export type Possibly = T | BadValue; - -export class MaybeIOAux { - val: Possibly; - constructor(v: Possibly) { - this.val = v; - } - good(f: (maps: T) => void) { - if (this.val !== undefined && this.val !== null) f(this.val); - return this; - } - bad(f: (maps: BadValue) => void) { - if (this.val === undefined || this.val === null) f(this.val as BadValue); - } -} - -const sub_flds = { - page1: 'hi', - page2: 'hi2', -}; - -const test_vals = { - sf: sub_flds, - nv: null, - uv: undefined, -}; -export const MaybeInput = (vals: Possibly) => new MaybeIOAux(vals); - -export const MaybeInputTests = () => { - MaybeInput(test_vals) - .good((val: typeof test_vals) => console.log('Good Value: ' + val.sf.page1)) - .bad((val: T) => console.log('Bad Value')); - - MaybeInput(null) - .good((val: T) => console.log('Good Value')) - .bad((val: T) => console.log('Bad Value')); -}; diff --git a/yarn.lock b/yarn.lock index cc6bcbe9..d5857034 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2035,13 +2035,6 @@ axe-core@^4.0.2: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.3.tgz#b55cd8e8ddf659fe89b064680e1c6a4dceab0325" integrity sha512-/lqqLAmuIPi79WYfRpy2i8z+x+vxU3zX2uAm0gs1q52qTuKwolOj1P8XbufpXcsydrpKx2yGn2wzAnxCMV86QA== -axios@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.23.0.tgz#b0fa5d0948a8d1d75e3d5635238b6c4625b05149" - integrity sha512-NmvAE4i0YAv5cKq8zlDoPd1VLKAqX5oLuZKs8xkJa4qi6RGn0uhCYFjWtHHC9EM/MwOwYWOs53W+V0aqEXq1sg== - dependencies: - follow-redirects "^1.14.4" - axobject-query@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" @@ -3592,11 +3585,6 @@ focus-trap@^6.7.1: dependencies: tabbable "^5.2.1" -follow-redirects@^1.14.4: - version "1.14.4" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" - integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== - foreach@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" @@ -6094,6 +6082,11 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +readline@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" + integrity sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw= + redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" From 6b55161484858557afb5c305306a9aa9547db965 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sun, 17 Oct 2021 19:46:32 +0100 Subject: [PATCH 151/325] Testing release: readme --- README.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b4067872..9d7477c6 100644 --- a/README.md +++ b/README.md @@ -220,13 +220,23 @@ With these caveats in mind, enjoy this latest release of @jeds prisma day worksh Known Issues: -Code can siliently fail in a ?. chain. CURRENT WIP +Code can siliently fail in a ?. chain. Status: Research suspended. The ?. construction is convenient, but not suitable for production logging, error trapping. -To be replaced with a maybe sytle monad. +To be replaced with a maybe sytle monad. -How to code where: true/false in gql without touching keystone core code. +The code to perform this is too complex to develop quickly. Instead, the code has been frozen to +a version which is known to work in all cases tested. However, rigorous monadic code is to be preferred +for hardened servers. Typescript appears too unwieldy to express the types required in a succinct manner, but +early prototypes are working, albeit with a horribly precise/verbose grammar. + +https://www.youtube.com/watch?v=vkcxgagQ4bM + +almost worked out the box, to give a rigorous foundation for Monadic IO, but rapidly ran into type complications because of `async`, `Maybe>` etc. Getting a version of Bartosz's elegant code working under `ts` does look doable, but its also likely to run into subtle type issues. The lack of Haskell type matching makes providing a coroutine/Haskell sytle do notation to `ts` almost impossible imho. This is Bartosz's main point, imho. If you can't interpret recursively typed monadic code in terms of mutually recursive coroutines, your functional language will be severely limited (like the `C++` std library is). + +How to code where: `true/false` in `gql` without touching keystone core code. + +Extend type `WhereInput` to be `WhereInput` | `true` | `false` ... is yet to be tested as a patch to core. Can this work as a local patch? To be investigated ... -Extend WhereInput to be WhereInput | true | false ... is yet to be tested as a patch to core. Can this work as a local patch? To be investigated ... ``` From 1a343af32da31ed6cc6712c1204ce3097b0851db Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sun, 17 Oct 2021 19:51:49 +0100 Subject: [PATCH 152/325] Testing release: removed deprecated code --- utils/clone.ts | 13 ------------- utils/logging.ts | 3 +-- 2 files changed, 1 insertion(+), 15 deletions(-) delete mode 100644 utils/clone.ts diff --git a/utils/clone.ts b/utils/clone.ts deleted file mode 100644 index 9b54f5f7..00000000 --- a/utils/clone.ts +++ /dev/null @@ -1,13 +0,0 @@ -export const testShallowCopy = (obj: T): T => { - var copy: any; - - // Handle non object - if (undefined === obj || null === obj || 'object' != typeof obj) return obj; - - for (var attr in obj) { - copy[attr] = obj[attr]; - } - return copy as T; -}; - -export const shallowCopy = (obj: T): T => obj; diff --git a/utils/logging.ts b/utils/logging.ts index a11fa64e..b166f81a 100644 --- a/utils/logging.ts +++ b/utils/logging.ts @@ -1,5 +1,4 @@ import { HardenedAny } from '../wrap_any'; -import { shallowCopy } from './clone'; import colors from 'colors/safe'; @@ -87,7 +86,7 @@ export const logContextInfoGen = logger(info + sep + cleanMessage); } - return shallowCopy(retObj); + return retObj; }; const logContextInfo = From 11f492e0fe3a83700fbb2d5bcf7e700c7aadc4ca Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sun, 17 Oct 2021 23:24:02 +0100 Subject: [PATCH 153/325] Logging uses error-stack-parser: Removed test code. --- keystone.ts | 5 ++- package.json | 2 +- utils/logging.ts | 104 ++++++++++++++++++++++++++++++++++++----------- yarn.lock | 12 ++++++ 4 files changed, 96 insertions(+), 27 deletions(-) diff --git a/keystone.ts b/keystone.ts index 4099ad69..3d426e1b 100644 --- a/keystone.ts +++ b/keystone.ts @@ -1,4 +1,4 @@ -import { log } from './utils/logging'; +import { log, xlog } from './utils/logging'; import { config } from '@keystone-next/keystone'; import { statelessSessions } from '@keystone-next/keystone/session'; import { createAuth } from '@keystone-next/auth'; @@ -26,7 +26,8 @@ export const keystoneNextjsBuildApiKey = // The resulting object is non-clonable, without entanglement, so is in the CMC, and not the CCC. // Since objects are so hard to clone it ts, this is not a big issue, indeed, ts seems better suited to the CMC -log() +//xlog makes a log trivial: this one is to check the URL is being properly decoded. +xlog() .info(`Database url: ${dbUrl}`) .success(dbUrl) .info(`Keystone host`) diff --git a/package.json b/package.json index af5cdab7..dc06debe 100644 --- a/package.json +++ b/package.json @@ -27,12 +27,12 @@ "@prisma/client": "^3.2.1", "classnames": "^2.3.1", "colors": "^1.4.0", + "error-stack-parser": "^2.0.6", "graphql": "^15.6.1", "next": "^11.1.2", "node-fetch": "^2.6.1", "react": "^17.0.2", "react-dom": "^17.0.2", - "readline": "^1.3.0", "urql": "^2.0.5" }, "devDependencies": { diff --git a/utils/logging.ts b/utils/logging.ts index b166f81a..a5f5c164 100644 --- a/utils/logging.ts +++ b/utils/logging.ts @@ -1,6 +1,7 @@ import { HardenedAny } from '../wrap_any'; import colors from 'colors/safe'; +import ErrorStackParser from 'error-stack-parser'; // Logging is one place where HardenedAny is needed! The intent was object dumping code, down to // every leaf, in a hardened way. A testground for DRY logging in ts. @@ -35,37 +36,70 @@ export const unknownLineAndFileMsg = export const cantOpenErrorMsg = baseErrorMsg + 'Cant access stack info from Error()' + sep; -export const fileLineRenderer = (e: CleanError) => { - const regex = /\((.*):(\d+):(\d+)\)$/; - const match = regex.exec(e.stack); +export type LoggerFun = (maps: string) => void; +export const simpleLogger = (msg: string) => console.log(msg); +export const dateRenderer = (msg: string): string => { + return Date() + sep + msg; +}; - return match - ? match[1] + sep + match[2] + sep + match[3] - : unknownLineAndFileMsg + sep + e.stack; +export const fileLineRenderer = (e: CleanError) => { + const stackFrames = ErrorStackParser.parse(e); + const elem = stackFrames[0]; + + var scope = + elem.functionName === undefined ? 'file scope' : elem.functionName; + return dateRenderer( + elem.fileName + + sep + + scope + + sep + + elem.lineNumber + + sep + + elem.columnNumber + ); }; -export const stackRenderer = (e: CleanError) => e.stack; +export const abbreviatedRenderer = (e: CleanError): string => { + return ''; +}; -export type LoggerFun = (maps: string) => void; -export const simpleLogger = (msg: string) => console.log(msg); -export const dateLogger = (msg: string) => simpleLogger(Date() + sep + msg); +export const stackRenderer = (e: CleanError): string => { + var str: string = ''; + + ErrorStackParser.parse(e)?.map((elem: ErrorStackParser.StackFrame) => { + var scope = + elem.functionName === undefined ? 'file scope' : elem.functionName; + + str = + str + + '\n' + + elem?.fileName + + sep + + scope + + sep + + elem?.lineNumber + + sep + + elem?.columnNumber; + }); + return dateRenderer(str); +}; //export type MonadicType = (maps: T) => MonadicType // This apparently simple operation, logging, has a fairly rich monadic structure. // FIXME: TYPEME: return type. It seems to be a recursive union. export const logContextInfoGen = (retObj: TretObj) => - (msgRenderer: LogEventRenderer) => - (col: ColFun) => (logger: LoggerFun) => + (col: ColFun) => + (msgRenderer: LogEventRenderer) => (toBeLogged: HardenedAny): TretObj => { if (toBeLogged === undefined) - return logContextInfoGen(retObj)(stackRenderer)(warningCol)(logger)( + return logContextInfoGen(retObj)(logger)(warningCol)(stackRenderer)( undefinedVariableMsg ); if (toBeLogged === null) - return logContextInfoGen(retObj)(stackRenderer)(warningCol)(logger)( + return logContextInfoGen(retObj)(logger)(warningCol)(stackRenderer)( nullVariableMsg ); var cleanMessage: string; @@ -92,36 +126,58 @@ export const logContextInfoGen = const logContextInfo = (retObj: TretObj) => (col: ColFun) => - (logger: LoggerFun) => + (msgRenderer: LogEventRenderer) => (a: HardenedAny): TretObj => - logContextInfoGen(retObj)(fileLineRenderer)(col)(logger)(a); + logContextInfoGen(retObj)(simpleLogger)(col)(msgRenderer)(a); export class logclos { depth: number = -1; - logger() { + renderer() { this.depth = this.depth + 1; - return this.depth ? simpleLogger : dateLogger; + return this.depth ? abbreviatedRenderer : fileLineRenderer; } warning(a: HardenedAny): this { - return logContextInfo(this)(warningCol)(this.logger())(a); + return logContextInfo(this)(warningCol)(this.renderer())(a); + } + error(a: HardenedAny): this { + return logContextInfo(this)(errorCol)(this.renderer())(a); + } + success(a: HardenedAny): this { + return logContextInfo(this)(successCol)(this.renderer())(a); + } + trace(a: HardenedAny): this { + return logContextInfoGen(this)(simpleLogger)(fix)(stackRenderer)(a); + } + info(a: HardenedAny): this { + return logContextInfoGen(this)(simpleLogger)(fix)(fileLineRenderer)(a); + } + reportSecurityIncident(a: HardenedAny): this { + return logContextInfo(this)(errorCol)(this.renderer())(a); + } +} + +export class xlogclos { + warning(a: HardenedAny): this { + return this; } error(a: HardenedAny): this { - return logContextInfo(this)(errorCol)(this.logger())(a); + return this; } success(a: HardenedAny): this { - return logContextInfo(this)(successCol)(this.logger())(a); + return this; } trace(a: HardenedAny): this { - return logContextInfoGen(this)(stackRenderer)(fix)(this.logger())(a); + return this; } info(a: HardenedAny): this { - return logContextInfoGen(this)(fileLineRenderer)(fix)(this.logger())(a); + return this; } reportSecurityIncident(a: HardenedAny): this { - return logContextInfo(this)(errorCol)(this.logger())(a); + return this; } } export const log = () => new logclos(); +export const xlog = () => new xlogclos(); diff --git a/yarn.lock b/yarn.lock index d5857034..d3fee5a7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3053,6 +3053,13 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +error-stack-parser@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" + integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== + dependencies: + stackframe "^1.1.1" + es-abstract@^1.18.5, es-abstract@^1.19.0, es-abstract@^1.19.1: version "1.19.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" @@ -6487,6 +6494,11 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +stackframe@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" + integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== + stacktrace-parser@0.1.10: version "0.1.10" resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" From 69cabac0c08ac2503aebb042a2964da9f88af016 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sun, 17 Oct 2021 23:31:30 +0100 Subject: [PATCH 154/325] Added xlog to comment logging monads. --- schema/access.ts | 2 +- schema/mutations.ts | 2 +- utils/fetchGraphQL.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/schema/access.ts b/schema/access.ts index f59346c3..6358eca0 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -1,6 +1,6 @@ import { KeystoneContext } from '.keystone/types'; import { keystoneNextjsBuildApiKey } from '../keystone'; -import { log } from '../utils/logging'; +import { log, xlog } from '../utils/logging'; import { ItemType } from '../wrap_any'; diff --git a/schema/mutations.ts b/schema/mutations.ts index 8e650bb0..7c13c484 100644 --- a/schema/mutations.ts +++ b/schema/mutations.ts @@ -5,7 +5,7 @@ import { PollWhereUniqueInput, } from '.keystone/types'; -import { log } from '../utils/logging'; +import { log, xlog } from '../utils/logging'; const gql = ([content]: TemplateStringsArray) => content; diff --git a/utils/fetchGraphQL.ts b/utils/fetchGraphQL.ts index 3ee0d982..779a919f 100644 --- a/utils/fetchGraphQL.ts +++ b/utils/fetchGraphQL.ts @@ -1,5 +1,5 @@ import { keystoneNextjsBuildApiKey, keyStoneHost } from '../keystone'; -import { log } from '../utils/logging'; +import { log, xlog } from '../utils/logging'; import { HardenedAny } from '../wrap_any'; export const gql = ([content]: TemplateStringsArray) => content; From bd789772d6aa93c3b46b192353a79e0b796c51d2 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sun, 17 Oct 2021 23:33:12 +0100 Subject: [PATCH 155/325] Added xlog to comment out logging monads. --- keystone.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/keystone.ts b/keystone.ts index 3d426e1b..78f6c4a9 100644 --- a/keystone.ts +++ b/keystone.ts @@ -2,7 +2,6 @@ import { log, xlog } from './utils/logging'; import { config } from '@keystone-next/keystone'; import { statelessSessions } from '@keystone-next/keystone/session'; import { createAuth } from '@keystone-next/auth'; - import { lists, extendGraphqlSchema } from './schema'; import { permissions } from './schema/access'; From 92694e4b25ce795d3d15aa2aa95237f8b3717d6a Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sun, 17 Oct 2021 23:37:09 +0100 Subject: [PATCH 156/325] Added xlog to comment out logging monads : vers. --- schema/access.ts | 1 - schema/mutations.ts | 1 - utils/fetchGraphQL.ts | 1 + 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/schema/access.ts b/schema/access.ts index 6358eca0..91655de0 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -1,7 +1,6 @@ import { KeystoneContext } from '.keystone/types'; import { keystoneNextjsBuildApiKey } from '../keystone'; import { log, xlog } from '../utils/logging'; - import { ItemType } from '../wrap_any'; export const PUBLISHED = 'published'; diff --git a/schema/mutations.ts b/schema/mutations.ts index 7c13c484..2478fa79 100644 --- a/schema/mutations.ts +++ b/schema/mutations.ts @@ -4,7 +4,6 @@ import { PollWhereInput, PollWhereUniqueInput, } from '.keystone/types'; - import { log, xlog } from '../utils/logging'; const gql = ([content]: TemplateStringsArray) => content; diff --git a/utils/fetchGraphQL.ts b/utils/fetchGraphQL.ts index 779a919f..20e821dd 100644 --- a/utils/fetchGraphQL.ts +++ b/utils/fetchGraphQL.ts @@ -1,6 +1,7 @@ import { keystoneNextjsBuildApiKey, keyStoneHost } from '../keystone'; import { log, xlog } from '../utils/logging'; import { HardenedAny } from '../wrap_any'; + export const gql = ([content]: TemplateStringsArray) => content; export async function fetchGraphQL_inject_api_key( From 1d69834cf7f509d1c46d7221e816c531a72d5f1d Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sun, 17 Oct 2021 23:46:50 +0100 Subject: [PATCH 157/325] Updated readme --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9d7477c6..3cf93bb2 100644 --- a/README.md +++ b/README.md @@ -227,7 +227,7 @@ To be replaced with a maybe sytle monad. The code to perform this is too complex to develop quickly. Instead, the code has been frozen to a version which is known to work in all cases tested. However, rigorous monadic code is to be preferred for hardened servers. Typescript appears too unwieldy to express the types required in a succinct manner, but -early prototypes are working, albeit with a horribly precise/verbose grammar. +early prototypes are working, albeit with a horribly precise/verbose grammar that seems to require interfaces as well as classes. https://www.youtube.com/watch?v=vkcxgagQ4bM @@ -265,10 +265,11 @@ The definitive install instructions, assuming fedora, bar seeding, are in the wo Install it like this and you know you will get the latest CI build. ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) -If for some reason, the latest CI build is failing (it happens!), find the last good build. +If for some reason, the latest CI build is failing (it happens!), find the last good build. As it stands, the yml specifies a test, not a production framework. -Seeding and post seeding CI unit tests: WIP. This is a high priority if anyone wants to take it on. -I have some scripts that can boot the process, but they are bash/pqsql, not quite the Keystone way, but they are tried, tested, lightweight and effective. +Seeding and post seeding CI unit tests: The harsh test of +building the database unseeded works. This leaves the application agnostic on +how data is seeded, since there are many ways to achieve this. All testing/patches/security audits are welcome. Feel free to contribute to documenting the industry best practises for using keystone CMS combined with the powerhouse front end nextjs. From 417131f8c4b0756ac1c83a7c7240912736b9044c Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Mon, 18 Oct 2021 08:41:32 +0100 Subject: [PATCH 158/325] Readme: removed link destroying styles --- README.md | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 3cf93bb2..49a5048b 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ Ready for exhaustive testing. Bug reports welcome! ## Resiliance testing, unit testing -``` + ✅ A stale session led to the app throwing when voting occured. Code fixed by a log.warning and return. @@ -107,7 +107,9 @@ handling of `any`. ✅ Any issues tracked down using the empty database technique. It triggers every any bug, with a vengeance. Strongly recommended as a unit testing technique. -``` + +✅ Polyfilled monadic logging parses variable Error() format. + Localised abbreviated logging grammar for more readable logs. ## Security audit Status: `Preliminary`. @@ -216,46 +218,45 @@ With these caveats in mind, enjoy this latest release of @jeds prisma day worksh -``` -Known Issues: +Known Issues: -Code can siliently fail in a ?. chain. Status: Research suspended. +Code can siliently fail in a ?. chain. Status: WIP. The ?. construction is convenient, but not suitable for production logging, error trapping. To be replaced with a maybe sytle monad. -The code to perform this is too complex to develop quickly. Instead, the code has been frozen to -a version which is known to work in all cases tested. However, rigorous monadic code is to be preferred -for hardened servers. Typescript appears too unwieldy to express the types required in a succinct manner, but -early prototypes are working, albeit with a horribly precise/verbose grammar that seems to require interfaces as well as classes. +The Promise monad is a bit of a mess. The more general, recursive approach, without an explicit array, is outlined in `C++`: https://www.youtube.com/watch?v=vkcxgagQ4bM -almost worked out the box, to give a rigorous foundation for Monadic IO, but rapidly ran into type complications because of `async`, `Maybe>` etc. Getting a version of Bartosz's elegant code working under `ts` does look doable, but its also likely to run into subtle type issues. The lack of Haskell type matching makes providing a coroutine/Haskell sytle do notation to `ts` almost impossible imho. This is Bartosz's main point, imho. If you can't interpret recursively typed monadic code in terms of mutually recursive coroutines, your functional language will be severely limited (like the `C++` std library is). +and almost works out the box in `ts`. Currently investigating complications caused by interactions with `async`, `Promise` etc. Getting a version of Bartosz's elegant code working under `ts` does look doable, but its also likely to run into subtle type issues. The lack of Haskell type matching makes providing a coroutine/Haskell sytle do notation to `ts` very fiddly. This is Bartosz's main point, imho. If you can't interpret recursively typed monadic code in terms of mutually recursive coroutines, your functional language will be limited (like the `C++` std library is). However, it is sufficient for non-recursive chains, and many use cases are. + How to code where: `true/false` in `gql` without touching keystone core code. Extend type `WhereInput` to be `WhereInput` | `true` | `false` ... is yet to be tested as a patch to core. Can this work as a local patch? To be investigated ... -``` + Additional functionality from upstream main: -``` + Polls fully working. Production build: - Detailed logging: + Detailed logging: Date time and polyfilled stack parsing. next lint tailwind purge - telemetry disable + telemetry disable: interferes with logging. x-api-key for next build events CI scripts: - Unseeded corner case working. - WIP: Seeding + Local CI, then remote CI if and only if local CI succeeds. + Unseeded corner case working in a test k8s framework. + Seeding: Agnostic: there are multiple routes. Prettier applied in gitadd. -``` + Utils folder for additional code, informative naming. + ## How to install the latest branch From 770b68918491aace3fe9dd2b711ad951acf689df Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Mon, 18 Oct 2021 08:42:47 +0100 Subject: [PATCH 159/325] Readme: titles --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 49a5048b..8bcb8c92 100644 --- a/README.md +++ b/README.md @@ -219,7 +219,7 @@ With these caveats in mind, enjoy this latest release of @jeds prisma day worksh -Known Issues: +##Known Issues Code can siliently fail in a ?. chain. Status: WIP. The ?. construction is convenient, but not suitable for production logging, error trapping. From e74b2c8bdc606020f78c70b58636b66de3f0ab63 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Mon, 18 Oct 2021 08:44:18 +0100 Subject: [PATCH 160/325] Readme: titles : 2 --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8bcb8c92..16de7f7e 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ This branch is dedicated to creating a solid foundation for a production build t `yarn commit "message" && yarn push` is what lands up being used most often. ## Production status report -``` + ✅ CI: Github actions runner working in a test framework. Unseeded build cases handled (any bugs fixed!) ✅ Pre release: Testing @@ -86,7 +86,7 @@ Full k8s spec: WIP. Deferred because its an endless task. ✅ Authorization: Strong typing for keystone auth frame types ✅ Next build super user authorization to keystone, allowing SSR/SSG/ISR tunneling. -``` + A shout out to @jed for explaining the keystone way. Ready for exhaustive testing. Bug reports welcome! @@ -219,7 +219,7 @@ With these caveats in mind, enjoy this latest release of @jeds prisma day worksh -##Known Issues +## Known Issues Code can siliently fail in a ?. chain. Status: WIP. The ?. construction is convenient, but not suitable for production logging, error trapping. @@ -241,7 +241,7 @@ Extend type `WhereInput` to be `WhereInput` | `true` | `false` ... is yet to be -Additional functionality from upstream main: +## Additional functionality from upstream main Polls fully working. Production build: From 7b0e4d72e5cdf8d12091592387bc68d11fcc5b2b Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Mon, 18 Oct 2021 08:45:58 +0100 Subject: [PATCH 161/325] Readme: Prod status formatting --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 16de7f7e..28f3a8e2 100644 --- a/README.md +++ b/README.md @@ -75,15 +75,19 @@ This branch is dedicated to creating a solid foundation for a production build t ## Production status report ✅ CI: Github actions runner working in a test framework. Unseeded build cases handled (any bugs fixed!) + ✅ Pre release: Testing Full k8s spec: WIP. Deferred because its an endless task. ✅ More informative logging, suitable for deployment. + ✅ Logging: Code coverage: complete ✅ Refactored literals. + ✅ Authorization: Strong typing for keystone auth frame types + ✅ Next build super user authorization to keystone, allowing SSR/SSG/ISR tunneling. From 8faf84a2908507e0f732d0cf6ca83718cad56202 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Mon, 18 Oct 2021 08:55:43 +0100 Subject: [PATCH 162/325] Readme: more tinkering --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 28f3a8e2..52ac4076 100644 --- a/README.md +++ b/README.md @@ -186,11 +186,11 @@ When reviewing code, it can be hard to tell these dummy parameter names from imp `(a: T)` is a type safe replacement for any, because we need to trap the awkward `undefined` cases at build time. Then the type inferrence become far more similar to `C++`, which works well until it hits recursive types (with the unfortunate side effect of nerfing monads/coroutines). -Another point is that as soon as `any` is used, the code becomes ... javascript. No more needs to be said. My mission against `any` is more than fully justified, and I'm not alone: +Another point is that as soon as `any` is used, the code becomes ... `javascript`. No more needs to be said. My mission against `any` is more than fully justified, and I'm not alone: https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes-func.html -However, some functional code doesn't seem to work properly without the total polymorphism `any` allows, and some ts functional code looks fine, ... but bizarrely doesn't work in all contexts. It might have to do with the inner depths of js module linkage. The places audits have to go ... +However, some functional code doesn't seem to work properly without the total polymorphism `any` allows. There is also a `dodgy C++ style cast`, right where it's not needed ... `TBC`. @@ -225,15 +225,15 @@ With these caveats in mind, enjoy this latest release of @jeds prisma day worksh ## Known Issues -Code can siliently fail in a ?. chain. Status: WIP. -The ?. construction is convenient, but not suitable for production logging, error trapping. +Code can siliently fail in a `?.` chain. Status: WIP. +The `?.` construction is convenient, but not suitable for production logging, error trapping. To be replaced with a maybe sytle monad. The Promise monad is a bit of a mess. The more general, recursive approach, without an explicit array, is outlined in `C++`: https://www.youtube.com/watch?v=vkcxgagQ4bM -and almost works out the box in `ts`. Currently investigating complications caused by interactions with `async`, `Promise` etc. Getting a version of Bartosz's elegant code working under `ts` does look doable, but its also likely to run into subtle type issues. The lack of Haskell type matching makes providing a coroutine/Haskell sytle do notation to `ts` very fiddly. This is Bartosz's main point, imho. If you can't interpret recursively typed monadic code in terms of mutually recursive coroutines, your functional language will be limited (like the `C++` std library is). However, it is sufficient for non-recursive chains, and many use cases are. +and almost works out the box in `ts`. Currently investigating complications caused by interactions with `async`, `Promise` etc. Getting a version of Bartosz's elegant code working under `ts` looks doable, but its also likely to run into subtle type issues. The lack of Haskell type matching makes providing a coroutine/Haskell sytle do notation to `ts` very fiddly. This is Bartosz's main point, imho. If you can't interpret recursively typed monadic code in terms of mutually recursive coroutines, your functional language will be limited (like the `C++` std library is). However, it is sufficient for non-recursive chains, and many use cases are. How to code where: `true/false` in `gql` without touching keystone core code. From 62523b8f52cec77655ea04a65a9fe4f5b3a8e6a0 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Mon, 18 Oct 2021 13:51:37 +0100 Subject: [PATCH 163/325] Updated license --- LICENSE | 2 ++ 1 file changed, 2 insertions(+) diff --git a/LICENSE b/LICENSE index 8c4c8ef5..50e00b72 100644 --- a/LICENSE +++ b/LICENSE @@ -2,6 +2,8 @@ MIT License Copyright (c) 2021 KeystoneJS +Modifications: Copyright (c) 2021 Fourcube Ltd + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights From 463a0637369c41ed36fc0980e166fb89634f62ee Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Thu, 21 Oct 2021 17:26:40 +0100 Subject: [PATCH 164/325] Auto generation of session secret --- README.md | 3 +++ keystone.ts | 7 ++++--- package.json | 1 + pages/post/[slug].tsx | 14 ++++++++++---- schema/access.ts | 14 +++++++++++--- schema/content.ts | 4 ++-- schema/users.ts | 20 ++++++++++++++++++-- utils/fetchGraphQL.ts | 2 +- utils/logging.ts | 2 +- yarn.lock | 5 ----- 10 files changed, 51 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 52ac4076..0a1e1a98 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,9 @@ Ready for exhaustive testing. Bug reports welcome! ✅ A stale session led to the app throwing when voting occured. Code fixed by a log.warning and return. +✅ Session secret autogenerated using two CUID's at start of AdminUI, leading to stale session rejection + and enforced return to Admin UI login page. + ✅ Rejigged fetch command because some failure continuations were never been called. Tested and working. diff --git a/keystone.ts b/keystone.ts index 78f6c4a9..14cb7a3f 100644 --- a/keystone.ts +++ b/keystone.ts @@ -4,6 +4,7 @@ import { statelessSessions } from '@keystone-next/keystone/session'; import { createAuth } from '@keystone-next/auth'; import { lists, extendGraphqlSchema } from './schema'; import { permissions } from './schema/access'; +var cuid = require('cuid'); const dbUrl = `${process.env.DATABASE_URL}` || @@ -11,9 +12,9 @@ const dbUrl = export const keyStoneHost = process.env?.KEYSTONE_HOST || 'localhost'; -const sessionSecret = - process.env.SESSION_SECERT || - 'iLqbHhm7qwiBNc8KgL4NQ8tD8fFVhNhNqZ2nRdprgnKNjgJHgvitWx6DPoZJpYHa'; +const sessionSecret = cuid() + cuid(); +//process.env.SESSION_SECERT || +//'iLqbHhm7qwiBNc8KgL4NQ8tD8fFVhNhNqZ2nRdprgnKNjgJHgvitWx6DPoZJpYHa'; export const keystoneNextjsBuildApiKey = process.env.KEYSTONE_NEXTJS_BUILD_API_KEY || diff --git a/package.json b/package.json index dc06debe..dc40763c 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "@prisma/client": "^3.2.1", "classnames": "^2.3.1", "colors": "^1.4.0", + "cuid": "^2.1.8", "error-stack-parser": "^2.0.6", "graphql": "^15.6.1", "next": "^11.1.2", diff --git a/pages/post/[slug].tsx b/pages/post/[slug].tsx index ae049d49..54f962ee 100644 --- a/pages/post/[slug].tsx +++ b/pages/post/[slug].tsx @@ -30,7 +30,9 @@ export default function Post({ post }: { post: any }) { } export async function getStaticPaths(): Promise { - const data = await fetchGraphQL_inject_api_key( + const emptyResponse = { paths: [].map((post: HardenedAny) => ({ params: { slug: "" } })), fallback: false}; + + try { const data = await fetchGraphQL_inject_api_key( gql` query { posts { @@ -40,13 +42,17 @@ export async function getStaticPaths(): Promise { ` ); if (data === undefined || data.posts === undefined || data.posts === null) - return { paths: [].map((post: HardenedAny) => ({ params: { slug: "" } })), - fallback: false,}; - + return emptyResponse; return { paths: data!.posts!.map((post: HardenedAny) => ({ params: { slug: post?.slug } })), fallback: 'blocking', }; + } + catch (error: unknown) + { + return emptyResponse; + } + } export async function getStaticProps({ params }: GetStaticPropsContext) { diff --git a/schema/access.ts b/schema/access.ts index 91655de0..b7294b0d 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -23,6 +23,7 @@ export const PUBLISHED_POST_STATUS = { status: { in: [PUBLISHED] } }; export type SessionContext = { session?: { data: { + id: string; name: string; role: { canManageContent: boolean; @@ -41,6 +42,13 @@ export type SessionFrame = { operation: string; }; +export type FilterFrame = SessionFrame & { + session: SessionContext; + context: KeystoneContext; + listKey: string; + operation: string; +}; + export type ItemContext = { item: ItemType } & SessionContext; //FIXME: Needs API key. @@ -102,7 +110,7 @@ export const permissions = { export const operationCanManageContentList = (frame: SessionFrame) => permissions.canManageContent(frame); -export const FilterCanManageContentList = (frame: SessionFrame) => { +export const filterCanManageContentList = (frame: SessionFrame) => { if (frame === undefined) { log().reportSecurityIncident( 'Minor security breach: potential auth bug. undefined frame: query downgraded to public.' @@ -114,7 +122,7 @@ export const FilterCanManageContentList = (frame: SessionFrame) => { } //Needs shared secret, set in bash, imported via process.env, usage tested in the CI workflow, which act as the base spec for a container to run keystone/next in. if (isBuildEnvir(frame)) { - return EVERY_POST_STATUS; + return true; } //The perms check is only running client side. Review: check the authorization props are checked //server side to. @@ -122,7 +130,7 @@ export const FilterCanManageContentList = (frame: SessionFrame) => { log() .success('Blessed super user access to the known content manager:') .success(frame?.context?.session?.data?.name); - return EVERY_POST_STATUS; + return true; } log() diff --git a/schema/content.ts b/schema/content.ts index bd920308..7a832736 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -11,7 +11,7 @@ import { permissions, ItemContext, operationCanManageContentList, - FilterCanManageContentList, + filterCanManageContentList, SessionFrame, PUBLISHED, DRAFT, @@ -89,7 +89,7 @@ export const Post = list({ delete: operationCanManageContentList, }, filter: { - query: (frame: SessionFrame) => FilterCanManageContentList(frame), + query: (frame: SessionFrame) => filterCanManageContentList(frame), }, }, ui: contentUIConfig, diff --git a/schema/users.ts b/schema/users.ts index 406c3ec3..597af0d5 100644 --- a/schema/users.ts +++ b/schema/users.ts @@ -6,20 +6,24 @@ import { virtual, } from '@keystone-next/keystone/fields'; -import { graphql } from '@keystone-next/keystone'; -import { list } from '@keystone-next/keystone'; +import { graphql, list } from '@keystone-next/keystone'; import { permissions, SessionContext, ItemContext, SessionFrame, + FilterFrame, EDIT, READ, HIDDEN, } from './access'; import { GitHubRepo, githubReposResolver } from './fields/githubRepos/field'; +import { KeystoneContext } from '.keystone/types'; + +import { log } from '../utils/logging'; + const fieldModes = { editSelfOrRead: ({ session, item }: ItemContext) => permissions.canManageUsersSession({ session }) || @@ -33,6 +37,18 @@ const fieldModes = { : HIDDEN, }; +declare type BaseAccessArgs = { + session: any; + listKey: string; + context: KeystoneContext; +}; + +declare type LocalAccessArgs = { + session: SessionContext; + listKey: string; + context: KeystoneContext; +}; + export const User = list({ access: { operation: { diff --git a/utils/fetchGraphQL.ts b/utils/fetchGraphQL.ts index 20e821dd..0baac98d 100644 --- a/utils/fetchGraphQL.ts +++ b/utils/fetchGraphQL.ts @@ -30,7 +30,7 @@ export async function fetchGraphQL_inject_api_key( return data; }) .catch(msg => { - log().error('Next build: did not recieve static site data: ' + msg); + log().warning('Next build: did not recieve static site data: ' + msg); return null; }); } diff --git a/utils/logging.ts b/utils/logging.ts index a5f5c164..078f032e 100644 --- a/utils/logging.ts +++ b/utils/logging.ts @@ -109,7 +109,7 @@ export const logContextInfoGen = } else { // Strip anything else down to its source code, so we know what is being sent to us. // and print it plain, nothing is worse than red source code ... - cleanMessage = toBeLogged.toString(); + cleanMessage = JSON.stringify(toBeLogged, null, 3); } const e = new Error(); if (!e.stack) { diff --git a/yarn.lock b/yarn.lock index d3fee5a7..1db06c5a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6089,11 +6089,6 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -readline@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" - integrity sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw= - redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" From b5bf1aea83566ef1bbcbc109855b6c54616747d7 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Thu, 21 Oct 2021 17:42:02 +0100 Subject: [PATCH 165/325] WIP: catch after await --- README.md | 4 +-- schema/access.ts | 66 +++++++++++++++++++++-------------------------- schema/content.ts | 17 ++++++------ schema/users.ts | 2 ++ 4 files changed, 41 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 0a1e1a98..294d302b 100644 --- a/README.md +++ b/README.md @@ -102,10 +102,10 @@ Ready for exhaustive testing. Bug reports welcome! Code fixed by a log.warning and return. ✅ Session secret autogenerated using two CUID's at start of AdminUI, leading to stale session rejection - and enforced return to Admin UI login page. + and enforced return to Admin UI login page when KS server restarted. ✅ Rejigged fetch command because some failure continuations were never been called. -Tested and working. +Tested and working. (WIP: Additional hardening, catch after await) ✅ Only throws were in polls and static data fetch. Both have been refactored. diff --git a/schema/access.ts b/schema/access.ts index b7294b0d..57a8192f 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -11,14 +11,7 @@ export const EDIT = 'edit'; export const READ = 'read'; export const HIDDEN = 'hidden'; -//This is the fastest workaround I could find for not being able to return (where:) true (all records), or false (for no records). - -export const EVERY_POST_STATUS = { - status: { in: [PUBLISHED, DRAFT, ARCHIVED] }, -}; - -//export const UNIT_POST_STATUS = { status: { in: [] } }; -export const PUBLISHED_POST_STATUS = { status: { in: [PUBLISHED] } }; +export const PUBLISHED_POST_STATUS = { status: { eq: PUBLISHED } }; export type SessionContext = { session?: { @@ -105,39 +98,38 @@ export const permissions = { canManageUsersSession: ({ session }: SessionContext): boolean => { return !!session?.data?.role?.canManageUsers; }, -}; + canManageContentList: (frame: SessionFrame) => + permissions.canManageContent(frame), -export const operationCanManageContentList = (frame: SessionFrame) => - permissions.canManageContent(frame); + filterCanManageContentList: (frame: SessionFrame) => { + if (frame === undefined) { + log().reportSecurityIncident( + 'Minor security breach: potential auth bug. undefined frame: query downgraded to public.' + ); + return PUBLISHED_POST_STATUS; + //Give no information away that they have been noticed, but if there's no frame + //it's hard to imagine where the reply is going to go ... if exec ever gets here, it's close + //to a fatal error. What is the best thing to do here? Nothing? throw? + } + //Needs shared secret, set in bash, imported via process.env, usage tested in the CI workflow, which act as the base spec for a container to run keystone/next in. + if (isBuildEnvir(frame)) { + return true; + } + //The perms check is only running client side. Review: check the authorization props are checked + //server side to. + if (!!frame.context.session?.data?.role?.canManageContent) { + log() + .success('Blessed super user access to the known content manager:') + .success(frame?.context?.session?.data?.name); + return true; + } -export const filterCanManageContentList = (frame: SessionFrame) => { - if (frame === undefined) { - log().reportSecurityIncident( - 'Minor security breach: potential auth bug. undefined frame: query downgraded to public.' - ); - return PUBLISHED_POST_STATUS; - //Give no information away that they have been noticed, but if there's no frame - //it's hard to imagine where the reply is going to go ... if exec ever gets here, it's close - //to a fatal error. What is the best thing to do here? Nothing? throw? - } - //Needs shared secret, set in bash, imported via process.env, usage tested in the CI workflow, which act as the base spec for a container to run keystone/next in. - if (isBuildEnvir(frame)) { - return true; - } - //The perms check is only running client side. Review: check the authorization props are checked - //server side to. - if (!!frame.context.session?.data?.role?.canManageContent) { log() - .success('Blessed super user access to the known content manager:') + .success('Client receives only published posts:') .success(frame?.context?.session?.data?.name); - return true; - } - - log() - .success('Client receives only published posts:') - .success(frame?.context?.session?.data?.name); - //success(frame.context.session?.data?.role?.canManageContent); - return PUBLISHED_POST_STATUS; + //success(frame.context.session?.data?.role?.canManageContent); + return PUBLISHED_POST_STATUS; + }, }; //The front line security audit: Initial musings: diff --git a/schema/content.ts b/schema/content.ts index 7a832736..d6c8194d 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -10,8 +10,6 @@ import { list } from '@keystone-next/keystone'; import { permissions, ItemContext, - operationCanManageContentList, - filterCanManageContentList, SessionFrame, PUBLISHED, DRAFT, @@ -42,9 +40,9 @@ export const contentUIConfig = { export const contentListAccess = { operation: { - create: operationCanManageContentList, - update: operationCanManageContentList, - delete: operationCanManageContentList, + create: permissions.canManageContentList, + update: permissions.canManageContentList, + delete: permissions.canManageContentList, }, }; @@ -84,12 +82,13 @@ function defaultTimestamp() { export const Post = list({ access: { operation: { - create: operationCanManageContentList, - update: operationCanManageContentList, - delete: operationCanManageContentList, + create: permissions.canManageContentList, + update: permissions.canManageContentList, + delete: permissions.canManageContentList, }, filter: { - query: (frame: SessionFrame) => filterCanManageContentList(frame), + query: (frame: SessionFrame) => + permissions.filterCanManageContentList(frame), }, }, ui: contentUIConfig, diff --git a/schema/users.ts b/schema/users.ts index 597af0d5..d14020b5 100644 --- a/schema/users.ts +++ b/schema/users.ts @@ -57,10 +57,12 @@ export const User = list({ update: (frame: SessionFrame) => permissions.canManageUsers(frame), delete: (frame: SessionFrame) => permissions.canManageUsers(frame), }, + /* filter: { update: (frame: SessionFrame) => permissions.canManageUsers(frame), //delete: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList(session) }, + */ }, ui: { From 4a3ee83877d7b0ced5d62a081aeeedf33e02781e Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 22 Oct 2021 00:26:58 +0100 Subject: [PATCH 166/325] filtered user list in Admin UI --- keystone.ts | 2 -- schema/access.ts | 29 +++++++++++++++++++++++++++++ schema/users.ts | 9 +++++---- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/keystone.ts b/keystone.ts index 14cb7a3f..f6e31fd2 100644 --- a/keystone.ts +++ b/keystone.ts @@ -13,8 +13,6 @@ const dbUrl = export const keyStoneHost = process.env?.KEYSTONE_HOST || 'localhost'; const sessionSecret = cuid() + cuid(); -//process.env.SESSION_SECERT || -//'iLqbHhm7qwiBNc8KgL4NQ8tD8fFVhNhNqZ2nRdprgnKNjgJHgvitWx6DPoZJpYHa'; export const keystoneNextjsBuildApiKey = process.env.KEYSTONE_NEXTJS_BUILD_API_KEY || diff --git a/schema/access.ts b/schema/access.ts index 57a8192f..6f37f6a9 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -130,6 +130,35 @@ export const permissions = { //success(frame.context.session?.data?.role?.canManageContent); return PUBLISHED_POST_STATUS; }, + filterCanManageUserList: (frame: SessionFrame) => { + if (frame === undefined) { + log().reportSecurityIncident( + 'Minor security breach: potential auth bug. undefined frame: query downgraded to public.' + ); + return false; + //Give no information away that they have been noticed, but if there's no frame + //it's hard to imagine where the reply is going to go ... if exec ever gets here, it's close + //to a fatal error. What is the best thing to do here? Nothing? throw? + } + //Needs shared secret, set in bash, imported via process.env, usage tested in the CI workflow, which act as the base spec for a container to run keystone/next in. + if (isBuildEnvir(frame)) { + return true; + } + //The perms check is only running client side. Review: check the authorization props are checked + //server side to. + if (!!frame.context.session?.data?.role?.canManageUsers) { + log() + .success('Blessed super user access to the known user manager:') + .success(frame?.context?.session?.data?.name); + return true; + } + + log() + .success('Client receives only their own user data:') + .success(frame?.context?.session?.data?.name); + //success(frame.context.session?.data?.role?.canManageContent); + return { id: { equals: frame.context.session?.itemId } }; + }, }; //The front line security audit: Initial musings: diff --git a/schema/users.ts b/schema/users.ts index d14020b5..4ae4d82c 100644 --- a/schema/users.ts +++ b/schema/users.ts @@ -57,12 +57,13 @@ export const User = list({ update: (frame: SessionFrame) => permissions.canManageUsers(frame), delete: (frame: SessionFrame) => permissions.canManageUsers(frame), }, - /* + filter: { - update: (frame: SessionFrame) => permissions.canManageUsers(frame), - //delete: ({ session, context, listKey, operation } : SessionFrame) => rules.filterCanManageUserList(session) + query: (frame: SessionFrame) => + permissions.filterCanManageUserList(frame), + update: (frame: SessionFrame) => + permissions.filterCanManageUserList(frame), }, - */ }, ui: { From 2f01eae1910f8c5a7e7aa5fa1c67f46dd3833fdf Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 22 Oct 2021 00:55:54 +0100 Subject: [PATCH 167/325] Logging abbrev. fix --- utils/logging.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/logging.ts b/utils/logging.ts index 078f032e..52bc5841 100644 --- a/utils/logging.ts +++ b/utils/logging.ts @@ -151,7 +151,7 @@ export class logclos { return logContextInfoGen(this)(simpleLogger)(fix)(stackRenderer)(a); } info(a: HardenedAny): this { - return logContextInfoGen(this)(simpleLogger)(fix)(fileLineRenderer)(a); + return logContextInfoGen(this)(simpleLogger)(fix)(this.renderer())(a); } reportSecurityIncident(a: HardenedAny): this { return logContextInfo(this)(errorCol)(this.renderer())(a); From deb8c91c549c497d72b83cf3baa119e627707723 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 22 Oct 2021 01:24:06 +0100 Subject: [PATCH 168/325] Added readline-sync --- package.json | 2 + pages/index.tsx | 2 +- utils/badValues.ts | 15 +++++++ utils/logging.ts | 10 +++++ utils/maybeIO.ts | 82 +++++++++++++++++++++++++++++++++++ utils/maybeIOPromise.ts | 94 +++++++++++++++++++++++++++++++++++++++++ utils/unit.ts | 13 ++++++ yarn.lock | 10 +++++ 8 files changed, 227 insertions(+), 1 deletion(-) create mode 100644 utils/badValues.ts create mode 100644 utils/maybeIO.ts create mode 100644 utils/maybeIOPromise.ts create mode 100644 utils/unit.ts diff --git a/package.json b/package.json index dc40763c..ed346adf 100644 --- a/package.json +++ b/package.json @@ -34,11 +34,13 @@ "node-fetch": "^2.6.1", "react": "^17.0.2", "react-dom": "^17.0.2", + "readline-sync": "^1.4.10", "urql": "^2.0.5" }, "devDependencies": { "@tailwindcss/forms": "^0.3.3", "@types/react": "17.0.27", + "@types/readline-sync": "^1.4.4", "autoprefixer": "^10.3.7", "eslint": "7.32.0", "eslint-config-next": "11.1.2", diff --git a/pages/index.tsx b/pages/index.tsx index 4029448a..a1387b3e 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -92,7 +92,7 @@ export async function getStaticProps({ params }: GetStaticPropsContext) { } ` ); - const postsRx = data?.posts || null; + const postsRx = data?.posts || []; return { props: { posts: postsRx }, revalidate: 60 }; } diff --git a/utils/badValues.ts b/utils/badValues.ts new file mode 100644 index 00000000..0bb4da75 --- /dev/null +++ b/utils/badValues.ts @@ -0,0 +1,15 @@ +export type BadData = undefined | null; + +export type Possibly = T | BadData; + +export const isBad = (value: Possibly) => + value === null || value === undefined; + +export const bad = () => null as unknown as T; + +export const mapBad = (val: T) => (isBad(val) ? bad() : val); + +export const with_default = + (def: T) => + (val: T) => + isBad(val) ? def! : val; diff --git a/utils/logging.ts b/utils/logging.ts index 52bc5841..7ec0b8b6 100644 --- a/utils/logging.ts +++ b/utils/logging.ts @@ -84,6 +84,16 @@ export const stackRenderer = (e: CleanError): string => { return dateRenderer(str); }; +export const cleanStackRenderer = (cleanMessage: string) => (e: Error) => { + if (!e.stack) { + dateRenderer(errorCol(cantOpenErrorMsg) + cleanMessage); + } else { + const ce = e as CleanError; + const info = stackRenderer(ce); + dateRenderer(info + sep + cleanMessage); + } +}; + //export type MonadicType = (maps: T) => MonadicType // This apparently simple operation, logging, has a fairly rich monadic structure. // FIXME: TYPEME: return type. It seems to be a recursive union. diff --git a/utils/maybeIO.ts b/utils/maybeIO.ts new file mode 100644 index 00000000..f79e1a70 --- /dev/null +++ b/utils/maybeIO.ts @@ -0,0 +1,82 @@ +import reader from 'readline-sync'; + +import { u, U, cr, sideEffect } from './unit'; + +import { log, xlog, fix } from './logging'; + +import { isBad, mapBad, with_default } from './badValues'; + +export type IOthunk = () => T; + +// A combination of IO/Maybe, all linked together in a way that largely works as expected. +// If used non-recursively, it forces the CCC, quite rigorously. Trying to run the code unbound +// to the other scripts is an amusingly visual lesson in async code. +// String IO needs additonal forwarding parms to allow persistance of environment. +//https://www.youtube.com/watch?v=vkcxgagQ4bM 21:15 ... you might be asking, what is this U? + +// The next line is a problem, because it uses the heap. The compiler needs to do a lot more work +// to build monadic code efficiently, largely eliminating this new, according to the context. +// Since we are explicitly calling new, this will be tricky. +// The compiler will take this new instruction literally. This is the main point of Bartosz's +// lecture, its a howto and a warning: take this code seriously, it presents problems for compilers. +// C++ has big issues with it, and typescript suffers too. +// There are workarounds, based on coroutines, which can allocate memory more efficiently. +// It's not clear these will code that cleanly in typescipt, but the basic monadic code is simpler +// in typescript, bar it requires async handling. + +export const makeIO = (f: IOthunk): IO => new IO(f); + +export class IO { + private act: IOthunk; + + constructor(action: IOthunk) { + this.act = action; + } + + //Embed values and functions + static root = (val: T) => makeIO(() => val); + static rootfun = (thunk: () => T) => makeIO(thunk); + + private readonly run = () => this.act(); + + readonly warn = + (msg: string) => + (f: (maps: T) => R) => + sideEffect(x => log().warning(msg))(f); + + readonly fbind = (io: (maps: T) => IO) => + makeIO(() => io(mapBad(this.act())).run()); + + readonly then = (f: (maps: T) => R) => + makeIO(() => { + const x = this.act(); + return isBad(x) ? mapBad(x) : mapBad(f(x)); + //.catch(this.warn("fbind error")(x => bad())); + }); + + readonly fmap = this.then; + + //give a then callback to implement the async api. + readonly exec = (def: T) => { + return { then: (f: (maps: T) => R) => f(with_default(def)(this.run())) }; + }; +} + +export function delay(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)); +} +export const putStr = (s: string) => process.stdout.write(s); + +//This is a good model, its a raw socket write, +//So we need to attach a callback to it +export const putStrM = (s: string) => + makeIO(() => { + putStr(s); + return s; + }); + +export const getLine = () => reader.question(''); + +export const getStrM = (x: U) => IO.rootfun(getLine); + +export const pure = (x: T) => IO.root(x); diff --git a/utils/maybeIOPromise.ts b/utils/maybeIOPromise.ts new file mode 100644 index 00000000..7dad161b --- /dev/null +++ b/utils/maybeIOPromise.ts @@ -0,0 +1,94 @@ +import reader from 'readline-sync'; +import { u, U, cr, sideEffect } from './unit'; + +import { log, xlog, fix } from './logging'; + +import { isBad, mapBad, with_default } from './badValues'; + +export type IOthunk = () => Promise; + +// A combination of IO/Maybe/Promises, all linked together in a way that largely works as expected. +// If used non-recursively, it forces the CCC, quite rigorously. Trying to run the code unbound +// to the other scripts is an amusingly visual lesson in async code. +// String IO needs additonal forwarding parms to allow persistance of environment. + +//https://www.youtube.com/watch?v=vkcxgagQ4bM 21:15 ... you might be asking, what is this U? + +// The next line is a problem, because it uses the heap. The compiler needs to do a lot more work +// to build monadic code efficiently, largely eliminating this new, according to the context. +// Since we are explicitly calling new, this will be tricky. +// The compiler will take this new instruction literally. This is the main point of Bartosz's +// lecture, its a howto and a warning: take this code seriously, it presents problems for compilers. +// C++ has big issues with it, and typescript suffers too. +// There are workarounds, based on coroutines, which can allocate memory more efficiently. +// It's not clear these will code that cleanly in typescipt, but the basic monadic code is simpler +// in typescript, bar it requires async handling. + +export const makeIO = (f: IOthunk): IO => new IO(f); + +export class IO { + private act: IOthunk; + + constructor(action: IOthunk) { + this.act = action; + } + + //Embed values and functions + static root = (val: T) => makeIO(() => Promise.resolve(val)); + static rootfun = (thunk: () => T) => + makeIO(() => Promise.resolve(thunk())); + + private readonly run = () => this.act(); + + readonly warn = + (msg: string) => + (f: (maps: T) => R) => + sideEffect(x => log().warning(msg))(f); + + readonly fbind = (io: (maps: T) => IO) => + makeIO( + () => this.act().then(x => io(mapBad(x)).run()) + //.catch(x => this.warn("fbind error")(err => io(bad()).run())) + ); + + readonly then = (f: (maps: T) => R) => + makeIO(() => { + return this.act().then(x => (isBad(x) ? mapBad(x) : mapBad(f(x)))); + //.catch(this.warn("fbind error")(x => bad())); + }); + + readonly fmap = this.then; + + readonly exec = (def: T) => { + return this.run() + .then(x => with_default(def)(x)) + .catch(x => this.warn(x.toString())(z => def)) + .finally(); + }; +} + +export function delay(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)); +} +export const putStr = + (env: T) => + (s: string) => + new Promise(resolved => { + process.stdout.write(s, z => resolved(env)); + return env; + }); + +//This is a good model, its a raw socket write, +//So we need to attach a callback to it +export const putStrM = (s: string) => makeIO(() => putStr(s)(s)); + +export const getLine = () => reader.question(''); + +export const getStrM = (x: U) => IO.rootfun(getLine); + +export const pure = (x: T) => IO.root(x); + +const prompt = + (str: string) => + (x: V) => + putStrM(str); diff --git a/utils/unit.ts b/utils/unit.ts new file mode 100644 index 00000000..e3cac64b --- /dev/null +++ b/utils/unit.ts @@ -0,0 +1,13 @@ +export const u = {}; + +export type U = typeof u; + +export const cr = '\n'; + +export const sideEffect = + (side: (maps: T) => SR) => + (ctn: (maps: T) => R) => + (env: T): R => { + side(env); + return ctn(env); + }; diff --git a/yarn.lock b/yarn.lock index 1db06c5a..3de1ff9d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1479,6 +1479,11 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/readline-sync@^1.4.4": + version "1.4.4" + resolved "https://registry.yarnpkg.com/@types/readline-sync/-/readline-sync-1.4.4.tgz#8568292efe4ddd94d0ccee958b29cc3f4e0ea140" + integrity sha512-cFjVIoiamX7U6zkO2VPvXyTxbFDdiRo902IarJuPVxBhpDnXhwSaVE86ip+SCuyWBbEioKCkT4C88RNTxBM1Dw== + "@types/redis@^2.8.32": version "2.8.32" resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.32.tgz#1d3430219afbee10f8cfa389dad2571a05ecfb11" @@ -6089,6 +6094,11 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +readline-sync@^1.4.10: + version "1.4.10" + resolved "https://registry.yarnpkg.com/readline-sync/-/readline-sync-1.4.10.tgz#41df7fbb4b6312d673011594145705bf56d8873b" + integrity sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw== + redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" From 3301641f8e1559f025de000c3f92e3149a23cbb2 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 22 Oct 2021 01:37:28 +0100 Subject: [PATCH 169/325] GraphQLOutput type --- schema/content.ts | 4 ++-- utils/fetchGraphQL.ts | 4 ++-- wrap_any.ts | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/schema/content.ts b/schema/content.ts index d6c8194d..a1c6f93a 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -20,7 +20,7 @@ import { } from './access'; import { componentBlocks } from '../schema/fields/content/components'; -import { ItemSession, GraphQLInput } from '../wrap_any'; +import { ItemSession, GraphQLOutput } from '../wrap_any'; //FIXME: // These anys are causing issues. What is the strong type? @@ -62,7 +62,7 @@ export const Label = list({ }, }); -function defaultSlug(inputData: GraphQLInput) { +function defaultSlug(inputData: GraphQLOutput) { const date = new Date(); return `${ inputData?.title diff --git a/utils/fetchGraphQL.ts b/utils/fetchGraphQL.ts index 0baac98d..9d31ad30 100644 --- a/utils/fetchGraphQL.ts +++ b/utils/fetchGraphQL.ts @@ -1,12 +1,12 @@ import { keystoneNextjsBuildApiKey, keyStoneHost } from '../keystone'; import { log, xlog } from '../utils/logging'; -import { HardenedAny } from '../wrap_any'; +import { GraphQLOutput } from '../wrap_any'; export const gql = ([content]: TemplateStringsArray) => content; export async function fetchGraphQL_inject_api_key( query: string, - variables?: Record + variables?: GraphQLOutput ) { //Intentionally create an undefined to test HardenedAny //var x; diff --git a/wrap_any.ts b/wrap_any.ts index edf03cd1..a1cdb986 100644 --- a/wrap_any.ts +++ b/wrap_any.ts @@ -25,6 +25,7 @@ export type HardenedAny = WrappedRampantlyPolymorphic; // Others are just puzzling, and might have a local solution. // A JSX type? + export type DocumentType = WrappedRampantlyPolymorphic; // These have taken hours of time to resolve, with no joy, and have found a temporary home here ... @@ -32,4 +33,4 @@ export type ItemType = WrappedRampantlyPolymorphic; export type ItemSession = WrappedRampantlyPolymorphic; //From deep down in the keystone types ... -export type GraphQLInput = Record; +export type GraphQLOutput = Record; From b4baef62497da19a7593960b4ebff69f21f02bfe Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 22 Oct 2021 01:45:08 +0100 Subject: [PATCH 170/325] Readme --- README.md | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 294d302b..3159f25d 100644 --- a/README.md +++ b/README.md @@ -236,16 +236,9 @@ The Promise monad is a bit of a mess. The more general, recursive approach, with https://www.youtube.com/watch?v=vkcxgagQ4bM -and almost works out the box in `ts`. Currently investigating complications caused by interactions with `async`, `Promise` etc. Getting a version of Bartosz's elegant code working under `ts` looks doable, but its also likely to run into subtle type issues. The lack of Haskell type matching makes providing a coroutine/Haskell sytle do notation to `ts` very fiddly. This is Bartosz's main point, imho. If you can't interpret recursively typed monadic code in terms of mutually recursive coroutines, your functional language will be limited (like the `C++` std library is). However, it is sufficient for non-recursive chains, and many use cases are. - - -How to code where: `true/false` in `gql` without touching keystone core code. - -Extend type `WhereInput` to be `WhereInput` | `true` | `false` ... is yet to be tested as a patch to core. Can this work as a local patch? To be investigated ... - - - +and almost works out the box in `ts`. Currently investigating complications caused by interactions with `async`, `Promise` etc. A version of Bartosz's elegant code working under `ts` is complete. The lack of Haskell type matching makes providing a coroutine/Haskell sytle do notation to `ts` very fiddly. This is Bartosz's main point, imho. If you can't interpret recursively typed monadic code in terms of mutually recursive coroutines, your functional language will be limited (like the `C++` std library is). However, it is sufficient for non-recursive chains, and many use cases are. +Only trampolines left to implement in the MaybeIOPromise family of monads, which will be deployed for error checking, because they do this very well, even without a tramoline. ## Additional functionality from upstream main From 702f95fa07e8e6788f8b66774fe4c83ec4bb95eb Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 22 Oct 2021 03:47:51 +0100 Subject: [PATCH 171/325] MaybeIOPromise for SSG/ISR --- README.md | 24 ++++++++++-- pages/index.tsx | 17 ++++++--- pages/post/[slug].tsx | 84 ++++++++++++++++++++++------------------- utils/maybeIO.ts | 7 ++++ utils/maybeIOPromise.ts | 4 +- 5 files changed, 86 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 3159f25d..2ac43e71 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,14 @@ Full k8s spec: WIP. Deferred because its an endless task. ✅ Next build super user authorization to keystone, allowing SSR/SSG/ISR tunneling. +✅ MaybeIOPromise rolled out for SSG/ISR. + Returns expected values on failed query. + +✅ Catches any exceptions transparently and uniquely, at point of execution. + Runs deferred using a compiled monadic script that can never return a null or undefined value. + Use case guarantees low stack usage, which allows pure `CCC` code to run without coroutine optimizations. + + A shout out to @jed for explaining the keystone way. Ready for exhaustive testing. Bug reports welcome! @@ -221,10 +229,9 @@ I'm fairly new to `ts`, and like it a lot, but without a formal style, it can be With these caveats in mind, enjoy this latest release of @jeds prisma day workshop app, ported to Keystone 26, with useful contrib from @Guatam Singh, and polished endlessly by qfunq (it deserves it, Keystone 6 is the best CMS out there, Next, best in class, the same for prisma, and jeds code pulls it all together in a very useful way), and be fully aware, however solid it seems, this application is still in a `testing` phase. +## DRY = sole source of truth - - - +... and it sets deep theoretical/practical puzzles, part addressed in this code base. `typescript` is not ideal for `DRY`, but it suffices. ## Known Issues @@ -232,14 +239,22 @@ Code can siliently fail in a `?.` chain. Status: WIP. The `?.` construction is convenient, but not suitable for production logging, error trapping. To be replaced with a maybe sytle monad. +✅ Currently being rolled out to all gql queries, which become much tidier as a result. + The Promise monad is a bit of a mess. The more general, recursive approach, without an explicit array, is outlined in `C++`: https://www.youtube.com/watch?v=vkcxgagQ4bM -and almost works out the box in `ts`. Currently investigating complications caused by interactions with `async`, `Promise` etc. A version of Bartosz's elegant code working under `ts` is complete. The lack of Haskell type matching makes providing a coroutine/Haskell sytle do notation to `ts` very fiddly. This is Bartosz's main point, imho. If you can't interpret recursively typed monadic code in terms of mutually recursive coroutines, your functional language will be limited (like the `C++` std library is). However, it is sufficient for non-recursive chains, and many use cases are. +and almost works out the box in `ts`. Currently investigating complications caused by interactions with `async`, `Promise` etc. A version of Bartosz's elegant code working under `ts` is complete. The lack of Haskell type matching makes providing a coroutine/Haskell sytle do notation to `ts` very fiddly. This is Bartosz's main point, imho. If you can't interpret recursively typed monadic code in terms of mutually recursive coroutines, your functional language will be limited (like the `C++` std library is). However, it is sufficient for non-recursive chains, and many use cases are. + +✅ `CCC` Implementation of MaybeIOPromise tested and working. Only trampolines left to implement in the MaybeIOPromise family of monads, which will be deployed for error checking, because they do this very well, even without a tramoline. +✅ WIP: Rolling out MaybeIOPromise to all `gql` instances. Deploying this error trapping monad has already resolved unnoticed bugs, and further separates `gql` code from the core functional environment. + +Research has shown that the Keystone session data might have a recursive type, which prevents it being dumped as an object. In theory it can be represented as a dumpable tree, without looping back to itself. These loops make it hard to prove there is a well defined maximal subset of the context which is in the `CCC`. It's type is that exotic! + ## Additional functionality from upstream main @@ -256,6 +271,7 @@ Production build: Seeding: Agnostic: there are multiple routes. Prettier applied in gitadd. Utils folder for additional code, informative naming. + MaybeIO/Promise for DRY declarative specification of graphql parsing/error handling. ## How to install the latest branch diff --git a/pages/index.tsx b/pages/index.tsx index a1387b3e..8cad0d7c 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -9,6 +9,7 @@ import { Link } from '../components/ui/link'; import { H1 } from '../components/ui/typography'; import { useAuth } from '../components/auth'; +import { makeIO } from '../utils/maybeIOPromise' import { DocumentType } from '../wrap_any' @@ -69,8 +70,9 @@ export default function Home({ posts }: { posts: Post[] }) { ); } -export async function getStaticProps({ params }: GetStaticPropsContext) { - const data = await fetchGraphQL_inject_api_key( +//We can save a little time by compiling the functional code to a runtime constant +const fetchScript = makeIO (() => + fetchGraphQL_inject_api_key( gql` query { posts( @@ -91,8 +93,11 @@ export async function getStaticProps({ params }: GetStaticPropsContext) { } } ` - ); - const postsRx = data?.posts || []; - - return { props: { posts: postsRx }, revalidate: 60 }; + )) +.then (data => data!.posts); + +export async function getStaticProps({ params }: GetStaticPropsContext) { + return fetchScript + .exec ([]) + .then (postsRx => { return { props: { posts: postsRx }, revalidate: 60 } }) } diff --git a/pages/post/[slug].tsx b/pages/post/[slug].tsx index 54f962ee..4a40274e 100644 --- a/pages/post/[slug].tsx +++ b/pages/post/[slug].tsx @@ -9,6 +9,8 @@ import { Link } from '../../components/ui/link'; import { H1 } from '../../components/ui/typography'; import { HardenedAny } from '../../wrap_any' +import { log } from '../../utils/logging' +import { makeIO } from '../../utils/maybeIOPromise' export default function Post({ post }: { post: any }) { return ( @@ -29,50 +31,54 @@ export default function Post({ post }: { post: any }) { ); } -export async function getStaticPaths(): Promise { - const emptyResponse = { paths: [].map((post: HardenedAny) => ({ params: { slug: "" } })), fallback: false}; - - try { const data = await fetchGraphQL_inject_api_key( - gql` - query { - posts { - slug - } +const fetchStaticPaths = makeIO (() => fetchGraphQL_inject_api_key( + gql` + query { + posts { + slug } - ` - ); - if (data === undefined || data.posts === undefined || data.posts === null) - return emptyResponse; - return { - paths: data!.posts!.map((post: HardenedAny) => ({ params: { slug: post?.slug } })), + } + ` +)) + .then( data => data!.posts) + .then(posts => { + return { paths: posts!.map((post: HardenedAny) => ({ params: { slug: post?.slug } })), fallback: 'blocking', - }; - } - catch (error: unknown) - { - return emptyResponse; - } + }} +) + +export async function getStaticPaths(): Promise { + return fetchStaticPaths + .exec({ paths: [], fallback: false }); } -export async function getStaticProps({ params }: GetStaticPropsContext) { - const data = await fetchGraphQL_inject_api_key( - gql` - query ($slug: String!) { - post(where: { slug: $slug }) { - title - content { - document(hydrateRelationships: true) - } - publishedDate - author { - id - name - } +const fetchStaticProps = ({ params }: GetStaticPropsContext) => makeIO (() => +fetchGraphQL_inject_api_key( + gql` + query ($slug: String!) { + post(where: { slug: $slug }) { + title + content { + document(hydrateRelationships: true) + } + publishedDate + author { + id + name } } - `, - { slug: params!.slug } - ); - return { props: { post: data!.post }, revalidate: 60 }; + } + `, + { slug: params!.slug } +)) +.then (data => data!.post); + + +export async function getStaticProps({ params }: GetStaticPropsContext) { + return fetchStaticProps({params}) + .exec({}) + .then(match_post => { + return { props: { post: match_post }, revalidate: 60 } + }) } diff --git a/utils/maybeIO.ts b/utils/maybeIO.ts index f79e1a70..61381ee1 100644 --- a/utils/maybeIO.ts +++ b/utils/maybeIO.ts @@ -80,3 +80,10 @@ export const getLine = () => reader.question(''); export const getStrM = (x: U) => IO.rootfun(getLine); export const pure = (x: T) => IO.root(x); + +export const prompt = + (str: string) => + (x: V) => + putStrM(str); + +export const ioRoot = IO.root(u); diff --git a/utils/maybeIOPromise.ts b/utils/maybeIOPromise.ts index 7dad161b..d5546dc6 100644 --- a/utils/maybeIOPromise.ts +++ b/utils/maybeIOPromise.ts @@ -88,7 +88,9 @@ export const getStrM = (x: U) => IO.rootfun(getLine); export const pure = (x: T) => IO.root(x); -const prompt = +export const prompt = (str: string) => (x: V) => putStrM(str); + +export const ioRoot = IO.root(u); From cea69f93beb3a793a480c1f75ee1a23e565e2ea4 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 22 Oct 2021 04:12:04 +0100 Subject: [PATCH 172/325] MaybeIOPromise for SSG/ISR: 2 --- pages/post/[slug].tsx | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/pages/post/[slug].tsx b/pages/post/[slug].tsx index 4a40274e..ccb61e7b 100644 --- a/pages/post/[slug].tsx +++ b/pages/post/[slug].tsx @@ -42,7 +42,7 @@ const fetchStaticPaths = makeIO (() => fetchGraphQL_inject_api_key( )) .then( data => data!.posts) .then(posts => { - return { paths: posts!.map((post: HardenedAny) => ({ params: { slug: post?.slug } })), + return { paths: posts!.map((post: HardenedAny) => ({ params: { slug: post!.slug } })), fallback: 'blocking', }} ) @@ -54,25 +54,25 @@ export async function getStaticPaths(): Promise { } const fetchStaticProps = ({ params }: GetStaticPropsContext) => makeIO (() => -fetchGraphQL_inject_api_key( - gql` - query ($slug: String!) { - post(where: { slug: $slug }) { - title - content { - document(hydrateRelationships: true) - } - publishedDate - author { - id - name + fetchGraphQL_inject_api_key( + gql` + query ($slug: String!) { + post(where: { slug: $slug }) { + title + content { + document(hydrateRelationships: true) + } + publishedDate + author { + id + name + } } } - } - `, - { slug: params!.slug } -)) -.then (data => data!.post); + `, + { slug: params!.slug } + )) + .then (data => data!.post); export async function getStaticProps({ params }: GetStaticPropsContext) { From a2df52173eb650142e1f509b3038f2b0c025214b Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 22 Oct 2021 04:25:13 +0100 Subject: [PATCH 173/325] Coding best practises: 1 --- keystone.ts | 2 +- schema/access.ts | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/keystone.ts b/keystone.ts index f6e31fd2..c6310a52 100644 --- a/keystone.ts +++ b/keystone.ts @@ -4,7 +4,7 @@ import { statelessSessions } from '@keystone-next/keystone/session'; import { createAuth } from '@keystone-next/auth'; import { lists, extendGraphqlSchema } from './schema'; import { permissions } from './schema/access'; -var cuid = require('cuid'); +import cuid from 'cuid'; const dbUrl = `${process.env.DATABASE_URL}` || diff --git a/schema/access.ts b/schema/access.ts index 6f37f6a9..b08f21d0 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -52,8 +52,8 @@ export const isBuildEnvir = (frame: SessionFrame): boolean => { // The top level query prefers SessionFrame, and does not build against KeystoneFrame (same, bar KeystoneContext for context) // This does appear to be the right way to access the context, but why do we need to // cast something as important as this? - let kontext = frame?.context as KeystoneContext; - let recvApiKey = kontext?.req?.headers['x-api-key']; + const kontext = frame?.context as KeystoneContext; + const recvApiKey = kontext?.req?.headers['x-api-key']; if (recvApiKey === keystoneNextjsBuildApiKey) { if (recvApiKey.includes('keystone')) { @@ -76,27 +76,27 @@ export const isBuildEnvir = (frame: SessionFrame): boolean => { }; export const isSignedIn = ({ session }: SessionContext) => { - return !!session; + return session; }; //!! and ?. everywhere to protect from undefined. ts picks this up unless any is used. //They can't easy be expressed in terms of the more elementary functions either. undefined issues. export const permissions = { canUseAdminUI: ({ session }: SessionContext): boolean => - !!session?.data?.role, + Boolean(session?.data?.role), canManageContent: (frame: SessionFrame): boolean => - !!frame?.context?.session?.data?.role?.canManageContent, + Boolean(frame?.context?.session?.data?.role?.canManageContent), canManageUsers: (frame: SessionFrame): boolean => - !!frame?.context?.session?.data?.role?.canManageUsers, + Boolean(frame?.context?.session?.data?.role?.canManageUsers), canManageContentSession: ({ session }: SessionContext): boolean => { - return !!session?.data?.role?.canManageContent; + return Boolean(session?.data?.role?.canManageContent); }, canManageContentItem: (item: ItemContext): boolean => - !!item?.session?.data?.role?.canManageContent, + Boolean(item?.session?.data?.role?.canManageContent), canManageUsersSession: ({ session }: SessionContext): boolean => { - return !!session?.data?.role?.canManageUsers; + return Boolean(session?.data?.role?.canManageUsers); }, canManageContentList: (frame: SessionFrame) => permissions.canManageContent(frame), From c3d228fc3c98825ecbda7f04918697fa90cd50a6 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 22 Oct 2021 05:16:40 +0100 Subject: [PATCH 174/325] Coding best practises: 2 --- .eslintrc.json | 2 +- components/auth.tsx | 17 ++++++++++++----- components/ui/icons.tsx | 2 +- pages/index.tsx | 8 ++++---- pages/post/[slug].tsx | 4 ++-- pages/signin.tsx | 2 +- pages/signup.tsx | 6 +++--- 7 files changed, 24 insertions(+), 17 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index c8b03e11..bffb357a 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,3 +1,3 @@ { "extends": "next/core-web-vitals" -} +} diff --git a/components/auth.tsx b/components/auth.tsx index c4f59aea..21f247e7 100644 --- a/components/auth.tsx +++ b/components/auth.tsx @@ -18,11 +18,18 @@ export type SignInResult = | { success: true } | { success: false; message: string }; + +/* eslint-enable */ + type AuthContextType = | { ready: true; sessionData?: { id: string; name: string }; - signIn: ({ email, password }: SignInArgs) => Promise; + // eslint-disable-next-line no-alert + signIn: (maps: SignInArgs) => Promise; + + + signOut: () => void; } | { @@ -32,7 +39,7 @@ type AuthContextType = const AuthContext = createContext({ ready: false, }); - +/* eslint-disable */ export function useAuth() { return useContext(AuthContext); } @@ -44,7 +51,7 @@ export const AuthProvider = ({ children }: { children: ReactNode }) => { [] ); - const [{ fetching, data: sessionData, error: sessionError }, refetch] = + const [{ fetching, data: sessionData, error: sessionError }/*, refetch*/] = useQuery({ query: gql` query { @@ -106,14 +113,14 @@ export const AuthProvider = ({ children }: { children: ReactNode }) => { } }; - const [{}, signOutMutation] = useMutation(gql` + const [u, signOutMutation] = useMutation(gql` mutation { endSession } `); const signOut = () => { - signOutMutation(undefined, mutationContext); + signOutMutation(u, mutationContext); }; useEffect(() => { diff --git a/components/ui/icons.tsx b/components/ui/icons.tsx index f3589b10..94428c38 100644 --- a/components/ui/icons.tsx +++ b/components/ui/icons.tsx @@ -3,7 +3,7 @@ import cx from 'classnames'; export function ChevronLeft({ className, - ...props + //...props }: SVGAttributes) { const classes = cx('h-6 w-6', className); return ( diff --git a/pages/index.tsx b/pages/index.tsx index 8cad0d7c..ac02d3ce 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,5 +1,5 @@ -import React, { useState } from 'react'; -import { GetStaticPropsContext } from 'next'; +import React from 'react'; + import { fetchGraphQL_inject_api_key, gql } from '../utils/fetchGraphQL'; import { DocumentRenderer } from '../schema/fields/content/renderers'; @@ -94,9 +94,9 @@ const fetchScript = makeIO (() => } ` )) -.then (data => data!.posts); +.then (data => data?.posts?? null); -export async function getStaticProps({ params }: GetStaticPropsContext) { +export async function getStaticProps() { return fetchScript .exec ([]) .then (postsRx => { return { props: { posts: postsRx }, revalidate: 60 } }) diff --git a/pages/post/[slug].tsx b/pages/post/[slug].tsx index ccb61e7b..d962bb6d 100644 --- a/pages/post/[slug].tsx +++ b/pages/post/[slug].tsx @@ -5,11 +5,11 @@ import { fetchGraphQL_inject_api_key, gql } from '../../utils/fetchGraphQL'; import { DocumentRenderer } from '../../schema/fields/content/renderers'; import { Container, HomeLink } from '../../components/ui/layout'; -import { Link } from '../../components/ui/link'; +//import { Link } from '../../components/ui/link'; import { H1 } from '../../components/ui/typography'; import { HardenedAny } from '../../wrap_any' -import { log } from '../../utils/logging' +//import { log } from '../../utils/logging' import { makeIO } from '../../utils/maybeIOPromise' export default function Post({ post }: { post: any }) { diff --git a/pages/signin.tsx b/pages/signin.tsx index 558bcfdc..6ce241bb 100644 --- a/pages/signin.tsx +++ b/pages/signin.tsx @@ -5,7 +5,7 @@ import { Container, HomeLink } from '../components/ui/layout'; import { H1 } from '../components/ui/typography'; import { FieldContainer, FieldLabel, TextInput } from '../components/ui/forms'; import { Link } from '../components/ui/link'; -import { useRouter } from 'next/router'; +//import { useRouter } from 'next/router'; import { useAuth } from '../components/auth'; export default function SigninPage() { diff --git a/pages/signup.tsx b/pages/signup.tsx index e89b87d3..cd992f82 100644 --- a/pages/signup.tsx +++ b/pages/signup.tsx @@ -5,11 +5,11 @@ import { Button } from '../components/ui/controls'; import { Container, HomeLink } from '../components/ui/layout'; import { H1 } from '../components/ui/typography'; import { FieldContainer, FieldLabel, TextInput } from '../components/ui/forms'; -import { useRouter } from 'next/router'; +//import { useRouter } from 'next/router'; import { Link } from '../components/ui/link'; export default function SignupPage() { - const [{ error, data }, signup] = useMutation(gql` + const [{ error }, signup] = useMutation(gql` mutation ($name: String!, $email: String!, $password: String!) { createUser(data: { name: $name, email: $email, password: $password }) { __typename @@ -24,7 +24,7 @@ export default function SignupPage() { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); - const router = useRouter(); + //const router = useRouter(); return ( From ffaf7db00c9e6256542450138efb239543ac944a Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 22 Oct 2021 05:44:09 +0100 Subject: [PATCH 175/325] Coding best practises: dummy var removal: lint friendly --- .eslintrc.json | 2 +- components/auth.tsx | 6 +++--- utils/func.ts | 2 ++ utils/maybeIO.ts | 16 ---------------- 4 files changed, 6 insertions(+), 20 deletions(-) create mode 100644 utils/func.ts diff --git a/.eslintrc.json b/.eslintrc.json index bffb357a..04a9ab77 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,3 +1,3 @@ { - "extends": "next/core-web-vitals" + "extends": ["next/core-web-vitals","eslint:recommended"] } diff --git a/components/auth.tsx b/components/auth.tsx index 21f247e7..717a2a9f 100644 --- a/components/auth.tsx +++ b/components/auth.tsx @@ -8,7 +8,7 @@ import { } from 'react'; import { gql, useQuery, useMutation, OperationResult} from 'urql'; - +import { Tfun } from '../utils/func' //Security audit: //Pushed an `any` one depth lower into urql. export type AuthenticationResponse = OperationResult @@ -25,8 +25,8 @@ type AuthContextType = | { ready: true; sessionData?: { id: string; name: string }; - // eslint-disable-next-line no-alert - signIn: (maps: SignInArgs) => Promise; + + signIn: Tfun>; diff --git a/utils/func.ts b/utils/func.ts new file mode 100644 index 00000000..72fb1c06 --- /dev/null +++ b/utils/func.ts @@ -0,0 +1,2 @@ +// eslint-disable-line no-unused-vars +export type Tfun = (maps: D) => R; diff --git a/utils/maybeIO.ts b/utils/maybeIO.ts index 61381ee1..82298390 100644 --- a/utils/maybeIO.ts +++ b/utils/maybeIO.ts @@ -8,22 +8,6 @@ import { isBad, mapBad, with_default } from './badValues'; export type IOthunk = () => T; -// A combination of IO/Maybe, all linked together in a way that largely works as expected. -// If used non-recursively, it forces the CCC, quite rigorously. Trying to run the code unbound -// to the other scripts is an amusingly visual lesson in async code. -// String IO needs additonal forwarding parms to allow persistance of environment. -//https://www.youtube.com/watch?v=vkcxgagQ4bM 21:15 ... you might be asking, what is this U? - -// The next line is a problem, because it uses the heap. The compiler needs to do a lot more work -// to build monadic code efficiently, largely eliminating this new, according to the context. -// Since we are explicitly calling new, this will be tricky. -// The compiler will take this new instruction literally. This is the main point of Bartosz's -// lecture, its a howto and a warning: take this code seriously, it presents problems for compilers. -// C++ has big issues with it, and typescript suffers too. -// There are workarounds, based on coroutines, which can allocate memory more efficiently. -// It's not clear these will code that cleanly in typescipt, but the basic monadic code is simpler -// in typescript, bar it requires async handling. - export const makeIO = (f: IOthunk): IO => new IO(f); export class IO { From bc69786d8312fc118079ffd112a94eb5c6387216 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 22 Oct 2021 06:37:01 +0100 Subject: [PATCH 176/325] More style improvements --- README.md | 8 ++++++++ keystone.ts | 2 +- pages/post/[slug].tsx | 6 +++--- schema/access.ts | 23 +++++++++++------------ schema/fields/content/components.tsx | 6 ++++-- schema/users.ts | 7 ++++--- wrap_any.ts | 11 +++++++++++ 7 files changed, 42 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 2ac43e71..14c4f564 100644 --- a/README.md +++ b/README.md @@ -126,12 +126,17 @@ handling of `any`. ✅ Polyfilled monadic logging parses variable Error() format. Localised abbreviated logging grammar for more readable logs. +✅ CI: Lint extend set to ["next/core-web-vitals","eslint:recommended"] + ## Security audit Status: `Preliminary`. ## TL;DR `(a: T)` is a type safe replacement for many cases of `(a: any)`, because we need to trap the awkward `undefined` cases at build time. +`Tfun` eliminates the dummy variable in some functional type definitions, in a lint friendly way. +This is both more succinct, and more appropriate for usage in point free type descriptions. + ## any is shouting: I AM WRITTEN IN JAVASCRIPT ... listen to it, and recode it ASAP @@ -149,6 +154,9 @@ Approximately 75% of these situations reveal an unhandled case, hidden from lint Currently developing a reader friendly notation for the rather awkward `ts functional notation`, to try to find ways to eliminte `any`, in all bar recursive types (which are labelled as such, by an `any` subtype). The most readable so far appears to be: +`export const fcompose = (a: (maps: B) => A) => (b: (maps: C) => B) => (c: C) => + a(b(c))` + `export const fcompose = (a: (maps: B) => A) => (b: (maps: C) => B) => (c: C) => a(b(c))` diff --git a/keystone.ts b/keystone.ts index c6310a52..5d9bf795 100644 --- a/keystone.ts +++ b/keystone.ts @@ -16,7 +16,7 @@ const sessionSecret = cuid() + cuid(); export const keystoneNextjsBuildApiKey = process.env.KEYSTONE_NEXTJS_BUILD_API_KEY || - 'keystone.ts:_NextjsBuildApiKey_says_change_me_!!!!!!!_im_just_for_testing_purposes'; + 'keystone.ts:_NextjsBuildApiKey_says_change_me__im_just_for_testing_purposes'; // Unless I'm missing something, its tricky to clone typescript objects // Fortunately theres a workaround for monad like objects, create a new one diff --git a/pages/post/[slug].tsx b/pages/post/[slug].tsx index d962bb6d..a2d943b6 100644 --- a/pages/post/[slug].tsx +++ b/pages/post/[slug].tsx @@ -8,11 +8,11 @@ import { Container, HomeLink } from '../../components/ui/layout'; //import { Link } from '../../components/ui/link'; import { H1 } from '../../components/ui/typography'; -import { HardenedAny } from '../../wrap_any' +import { PostAny } from '../../wrap_any' //import { log } from '../../utils/logging' import { makeIO } from '../../utils/maybeIOPromise' -export default function Post({ post }: { post: any }) { +export default function Post({ post }: { post: PostAny }) { return ( @@ -42,7 +42,7 @@ const fetchStaticPaths = makeIO (() => fetchGraphQL_inject_api_key( )) .then( data => data!.posts) .then(posts => { - return { paths: posts!.map((post: HardenedAny) => ({ params: { slug: post!.slug } })), + return { paths: posts!.map((post: PostAny) => ({ params: { slug: post!.slug } })), fallback: 'blocking', }} ) diff --git a/schema/access.ts b/schema/access.ts index b08f21d0..8522f89f 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -79,24 +79,23 @@ export const isSignedIn = ({ session }: SessionContext) => { return session; }; -//!! and ?. everywhere to protect from undefined. ts picks this up unless any is used. //They can't easy be expressed in terms of the more elementary functions either. undefined issues. export const permissions = { canUseAdminUI: ({ session }: SessionContext): boolean => - Boolean(session?.data?.role), + Boolean(session!.data!.role), canManageContent: (frame: SessionFrame): boolean => - Boolean(frame?.context?.session?.data?.role?.canManageContent), + Boolean(frame!.context!.session!.data!.role!.canManageContent), canManageUsers: (frame: SessionFrame): boolean => - Boolean(frame?.context?.session?.data?.role?.canManageUsers), + Boolean(frame!.context!.session!.data!.role!.canManageUsers), canManageContentSession: ({ session }: SessionContext): boolean => { - return Boolean(session?.data?.role?.canManageContent); + return Boolean(session!.data!.role!.canManageContent); }, canManageContentItem: (item: ItemContext): boolean => - Boolean(item?.session?.data?.role?.canManageContent), + Boolean(item!.session!.data!.role!.canManageContent), canManageUsersSession: ({ session }: SessionContext): boolean => { - return Boolean(session?.data?.role?.canManageUsers); + return Boolean(session!.data!.role!.canManageUsers); }, canManageContentList: (frame: SessionFrame) => permissions.canManageContent(frame), @@ -117,7 +116,7 @@ export const permissions = { } //The perms check is only running client side. Review: check the authorization props are checked //server side to. - if (!!frame.context.session?.data?.role?.canManageContent) { + if (frame.context.session!.data!.role!.canManageContent ?? false) { log() .success('Blessed super user access to the known content manager:') .success(frame?.context?.session?.data?.name); @@ -146,7 +145,7 @@ export const permissions = { } //The perms check is only running client side. Review: check the authorization props are checked //server side to. - if (!!frame.context.session?.data?.role?.canManageUsers) { + if (frame.context.session!.data!.role!.canManageUsers ?? false) { log() .success('Blessed super user access to the known user manager:') .success(frame?.context?.session?.data?.name); @@ -157,7 +156,7 @@ export const permissions = { .success('Client receives only their own user data:') .success(frame?.context?.session?.data?.name); //success(frame.context.session?.data?.role?.canManageContent); - return { id: { equals: frame.context.session?.itemId } }; + return { id: { equals: frame.context.session!.itemId ?? '' } }; }, }; @@ -178,7 +177,7 @@ export const permissions = { // A mitigating factor here is the use of isFilterable on individual fields. When first porting Jeds app, it seemed like an inconvenience, // but now, it is seen as providing critical security, restricting queries to a vulnerable apollo. -// !!! This is so important for a production server than does use gql only, that it might be worth +// This is so important for a production server than does use gql only, that it might be worth // issuing a warning when a list is defaulted to isFilterable on all fields. Warnings like this can // be so useful to the correct setup of a dev kit. Also a warning if a field is in a where clause, but not filterable ... can same poor front end developers hours. // The more info an error can do to help a dev chase its location, the better. When logs get multiplexed by multiple threads, knowing what corresponds to what can waste time. @@ -209,6 +208,6 @@ export const permissions = { //In testing, bad username password combinations were reporting auth failure //immediately. A delay of a few seconds has an improved security model. -// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Core Issues located: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// Core Issues located: // auth/src/index.ts and related files in keystone core are triggering some "any" issues. Strong typing is (strongly) recommended. // e.g. const pageMiddleware: AdminUIConfig['pageMiddleware'] = async ({ context, isValidSession }) diff --git a/schema/fields/content/components.tsx b/schema/fields/content/components.tsx index 436042e1..3f095abf 100644 --- a/schema/fields/content/components.tsx +++ b/schema/fields/content/components.tsx @@ -19,6 +19,8 @@ import { ToolbarSeparator, } from '@keystone-next/fields-document/primitives'; +import { PollAnswerAny } from '../../../wrap_any' + const appearances = { info: { icon: InfoIcon, @@ -49,7 +51,7 @@ const appearances = { export const componentBlocks = { callout: component({ component: function Callout({ content, appearance }) { - const { palette, radii, spacing } = useTheme(); + const { /*palette,*/ radii, spacing } = useTheme(); const intentConfig = appearances[appearance.value]; return ( @@ -179,7 +181,7 @@ export const componentBlocks = {

{poll.value.label}

    - {poll.value.data.answers.map((answer: any) => { + {poll.value.data.answers.map((answer: PollAnswerAny) => { return (
  • {answer.label} ({answer.voteCount} answers) diff --git a/schema/users.ts b/schema/users.ts index 4ae4d82c..f9554aa2 100644 --- a/schema/users.ts +++ b/schema/users.ts @@ -13,7 +13,7 @@ import { SessionContext, ItemContext, SessionFrame, - FilterFrame, + //FilterFrame, EDIT, READ, HIDDEN, @@ -21,8 +21,9 @@ import { import { GitHubRepo, githubReposResolver } from './fields/githubRepos/field'; import { KeystoneContext } from '.keystone/types'; +import { SessionAny } from '../wrap_any'; -import { log } from '../utils/logging'; +//import { log } from '../utils/logging'; const fieldModes = { editSelfOrRead: ({ session, item }: ItemContext) => @@ -38,7 +39,7 @@ const fieldModes = { }; declare type BaseAccessArgs = { - session: any; + session: SessionAny; listKey: string; context: KeystoneContext; }; diff --git a/wrap_any.ts b/wrap_any.ts index a1cdb986..6cf43716 100644 --- a/wrap_any.ts +++ b/wrap_any.ts @@ -5,6 +5,7 @@ // To ensure we only match any once in the top level of this app, // and give any a descriptive type name // This is the local alias for the dreaded `type` +export type auto_aux = T; type WrappedRampantlyPolymorphic = any; //Any any is immediately assigned the status RampantlyPolymorphic, which matches exactly what it means @@ -34,3 +35,13 @@ export type ItemSession = WrappedRampantlyPolymorphic; //From deep down in the keystone types ... export type GraphQLOutput = Record; + +export type PostAny = WrappedRampantlyPolymorphic; + +export type PollAnswerAny = WrappedRampantlyPolymorphic; + +export type StargazersAny = WrappedRampantlyPolymorphic; +export type GithubRepoAny = WrappedRampantlyPolymorphic; +export type GithubResolverItemAny = WrappedRampantlyPolymorphic; + +export type SessionAny = WrappedRampantlyPolymorphic; From b617b78ee62a1df54c331aaa90d1bd473088c061 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 22 Oct 2021 07:00:32 +0100 Subject: [PATCH 177/325] Code inspector --- README.md | 4 + schema/fields/githubRepos/field.ts | 15 +- yarn.lock | 427 +++++++++++++---------------- 3 files changed, 208 insertions(+), 238 deletions(-) diff --git a/README.md b/README.md index 14c4f564..2b271099 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,10 @@ utils.js ## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) + + code inspector badge + + This branch is dedicated to creating a solid foundation for a production build to extend Keystone 6 CMS from. `yarn commit "message"` fires off the CI pipeline and only commits if unit tests are passed locally. No longer requires yarn dev running without the main next front end, since yarn site:build is the primary unit test. "fastcommit" is considered dangerous, and needs some additional logic to be CI safe. Its been the cause of a few red crosses. For that reason, it is being prefixed by an `x`, so commands in the history buffer do not trigger it. diff --git a/schema/fields/githubRepos/field.ts b/schema/fields/githubRepos/field.ts index fec8d4b5..183c648e 100644 --- a/schema/fields/githubRepos/field.ts +++ b/schema/fields/githubRepos/field.ts @@ -3,7 +3,11 @@ import { graphql } from '@keystone-next/keystone'; import fetch from 'node-fetch'; - +import { + StargazersAny, + GithubRepoAny, + GithubResolverItemAny, +} from '../../../wrap_any'; type GitubRepoData = { id: number; name: string; @@ -65,7 +69,7 @@ export const GitHubRepo = graphql.object()({ }, }); -export async function githubReposResolver(item: any) { +export async function githubReposResolver(item: GithubResolverItemAny) { if (!item.githubUsername) return []; try { const token = process.env.GITHUB_AUTH_TOKEN; @@ -79,10 +83,13 @@ export async function githubReposResolver(item: any) { const allRepos = await result.json(); return allRepos .filter( - (repo: any) => + (repo: GithubRepoAny) => !(repo.fork || repo.private || repo.disabled || repo.private) ) - .sort((a: any, b: any) => b.stargazers_count - a.stargazers_count); + .sort( + (a: StargazersAny, b: StargazersAny) => + b.stargazers_count - a.stargazers_count + ); } catch (err) { console.error(err); return []; diff --git a/yarn.lock b/yarn.lock index 3de1ff9d..e600f978 100644 --- a/yarn.lock +++ b/yarn.lock @@ -304,16 +304,16 @@ resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-5.0.2.tgz#b23080fa35520e993a8a37a0f5bca26aa4650a48" integrity sha512-NBEJlHWrhQucLhZGHtSxM2loSaNUMajC7KOYJLyfcdW/6goVoff2HoYI3bz8YCDN0wKGbxtUL0gx2dvHpvnWlw== -"@emotion/cache@^11.4.0": - version "11.4.0" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.4.0.tgz#293fc9d9a7a38b9aad8e9337e5014366c3b09ac0" - integrity sha512-Zx70bjE7LErRO9OaZrhf22Qye1y4F7iDl+ITjet0J+i+B88PrAOBkKvaAWhxsZf72tDLajwCgfCjJ2dvH77C3g== +"@emotion/cache@^11.4.0", "@emotion/cache@^11.5.0": + version "11.5.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.5.0.tgz#a5eb78cbef8163939ee345e3ddf0af217b845e62" + integrity sha512-mAZ5QRpLriBtaj/k2qyrXwck6yeoz1V5lMt/jfj6igWU35yYlNKs2LziXVgvH81gnJZ+9QQNGelSsnuoAy6uIw== dependencies: "@emotion/memoize" "^0.7.4" - "@emotion/sheet" "^1.0.0" + "@emotion/sheet" "^1.0.3" "@emotion/utils" "^1.0.0" "@emotion/weak-memoize" "^0.2.5" - stylis "^4.0.3" + stylis "^4.0.10" "@emotion/hash@^0.8.0": version "0.8.0" @@ -326,14 +326,14 @@ integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ== "@emotion/react@^11.1.1", "@emotion/react@^11.4.1": - version "11.4.1" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.4.1.tgz#a1b0b767b5bad57515ffb0cad9349614d27f4d57" - integrity sha512-pRegcsuGYj4FCdZN6j5vqCALkNytdrKw3TZMekTzNXixRg4wkLsU5QEaBG5LC6l01Vppxlp7FE3aTHpIG5phLg== + version "11.5.0" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.5.0.tgz#19b5771bbfbda5e8517e948a2d9064810f0022bd" + integrity sha512-MYq/bzp3rYbee4EMBORCn4duPQfgpiEB5XzrZEBnUZAL80Qdfr7CEv/T80jwaTl/dnZmt9SnTa8NkTrwFNpLlw== dependencies: "@babel/runtime" "^7.13.10" - "@emotion/cache" "^11.4.0" + "@emotion/cache" "^11.5.0" "@emotion/serialize" "^1.0.2" - "@emotion/sheet" "^1.0.2" + "@emotion/sheet" "^1.0.3" "@emotion/utils" "^1.0.0" "@emotion/weak-memoize" "^0.2.5" hoist-non-react-statics "^3.3.1" @@ -349,10 +349,10 @@ "@emotion/utils" "^1.0.0" csstype "^3.0.2" -"@emotion/sheet@^1.0.0", "@emotion/sheet@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.0.2.tgz#1d9ffde531714ba28e62dac6a996a8b1089719d0" - integrity sha512-QQPB1B70JEVUHuNtzjHftMGv6eC3Y9wqavyarj4x4lg47RACkeSfNo5pxIOKizwS9AEFLohsqoaxGQj4p0vSIw== +"@emotion/sheet@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.0.3.tgz#00c326cd7985c5ccb8fe2c1b592886579dcfab8f" + integrity sha512-YoX5GyQ4db7LpbmXHMuc8kebtBGP6nZfRC5Z13OKJMixBEwdZrJ914D6yJv/P+ZH/YY3F5s89NYX2hlZAf3SRQ== "@emotion/unitless@^0.7.5": version "0.7.5" @@ -384,18 +384,18 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@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.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.2.0.tgz#8f6638eeecf19f59fef28598024308e0452dd0a2" + integrity sha512-nfMLYF7zczjnIbChZtqbvozRfuRweMD1Fe9HHd4RXd3Tcsj6E17srW0QJfxUoIIWh4pitj+XwZAwhj1PWBDU7g== dependencies: - "@graphql-tools/utils" "^8.2.2" + "@graphql-tools/utils" "^8.4.0" tslib "~2.3.0" "@graphql-tools/mock@^8.1.2": - version "8.4.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/mock/-/mock-8.4.0.tgz#c4a5d0c35cc5760b99b3e062145f36ac9cfe9ffb" - integrity sha512-RKcqmw7P5pC2ULh2/kg/erxxsd7lEV/wnI5jNgahkCw8wiSC8OI3SwNMwjfrlpYogs7eEhiXi7Ix6abCiFUURw== + version "8.4.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/mock/-/mock-8.4.1.tgz#c75fae7e4271224c4efbf57e388cb3eb344be59d" + integrity sha512-eIW2H1k9b4Sczzy1Za+GdaKBc8lTXo8MbJH4oivh1AoGl6/Tu9jTOOTS/b07zQzG+6sIQG54o9W6s2TqDmD+YQ== dependencies: "@graphql-tools/schema" "^8.2.0" "@graphql-tools/utils" "^8.2.3" @@ -403,19 +403,19 @@ tslib "~2.3.0" "@graphql-tools/schema@^8.0.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== + version "8.3.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-8.3.0.tgz#ddf4297859c6d7ac1ebbbd91460260ed424115db" + integrity sha512-OJD4Q1Xa3sffRiHzy0sskZz9ZWeqaujINfoim4CTk5Y9es1LS+WnKi25wVhmL2SGzzmKuAv7oDn+dpQAlM+Gfw== dependencies: - "@graphql-tools/merge" "^8.1.0" - "@graphql-tools/utils" "^8.2.0" + "@graphql-tools/merge" "^8.2.0" + "@graphql-tools/utils" "^8.4.0" tslib "~2.3.0" - value-or-promise "1.0.10" + value-or-promise "1.0.11" -"@graphql-tools/utils@^8.0.0", "@graphql-tools/utils@^8.2.0", "@graphql-tools/utils@^8.2.2", "@graphql-tools/utils@^8.2.3": - version "8.2.5" - resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.2.5.tgz#695e6d760c1187ad2b159d5d3c4696eff9c08a27" - integrity sha512-k/Rktklhy22dQfbJLKiLGfQymQCTr6Rd2BilC7g2Yk6wFSzVLYr8jeXNoTD+/p61XBQzBjTVayskvaMvNS3BDg== +"@graphql-tools/utils@^8.0.0", "@graphql-tools/utils@^8.2.3", "@graphql-tools/utils@^8.4.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.5.0.tgz#439487ac756d9458a33091e5e0435ddf8e794f3e" + integrity sha512-jMwLm6YdN+Vbqntg5GHqDvGLpLa/xPSpRs/c40d0rBuel77wo7AaQ8jHeBSpp9y+7kp7HrGSWff1u7yJ7F8ppw== dependencies: tslib "~2.3.0" @@ -908,11 +908,11 @@ "@prisma/engines-version" "3.2.0-34.afdab2f10860244038c4e32458134112852d4dad" "@prisma/client@^3.2.1": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@prisma/client/-/client-3.2.1.tgz#b0c60b4c42ec5b701a271380780c70de55bc3311" - integrity sha512-nakt9YoDFD4cgTkRTSVbzG40AKmmbVEtXE3csVqBdDXsm0/L4PQdtbtzILNzq28xv8HH8oHgFKWnsItM23mSDw== + version "3.3.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-3.3.0.tgz#7945101206af1927d925a8d9c62bb188e9260c97" + integrity sha512-34tonDW2v74VcG1mx+k/IUGG/eSHKwDiYKfFIZgaPLq/C0h8YQxh7pro272xpOf1pt6duX1Bi90dpGijh1MYgQ== dependencies: - "@prisma/engines-version" "3.2.1-1.b71d8cb16c4ddc7e3e9821f42fd09b0f82d7934c" + "@prisma/engines-version" "3.3.0-30.33838b0f78f1fe9052cf9a00e9761c9dc097a63c" "@prisma/debug@3.1.1": version "3.1.1" @@ -955,10 +955,10 @@ resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-3.2.0-34.afdab2f10860244038c4e32458134112852d4dad.tgz#bd63ad4bbc32935ec43e93cb59220495893c844d" integrity sha512-zYzFOmFvk5YzShqm6DuK7ULtjbJQpebAeD3gcpPfPjx6Uf9pug3bxeswp8/3sk2KKVUeKPUQg5p3TZLskyBNjA== -"@prisma/engines-version@3.2.1-1.b71d8cb16c4ddc7e3e9821f42fd09b0f82d7934c": - version "3.2.1-1.b71d8cb16c4ddc7e3e9821f42fd09b0f82d7934c" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-3.2.1-1.b71d8cb16c4ddc7e3e9821f42fd09b0f82d7934c.tgz#63032b40ee09f56ec423eb47617c26de125ffb1e" - integrity sha512-O4dHSbqfX7yAjFMawIEzv6wefv3LRMDK4J20Y70NvE3otbE3CnChlmghkCvMsQ1CGF1QuGlrqfw20aI2JfZcaw== +"@prisma/engines-version@3.3.0-30.33838b0f78f1fe9052cf9a00e9761c9dc097a63c": + version "3.3.0-30.33838b0f78f1fe9052cf9a00e9761c9dc097a63c" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-3.3.0-30.33838b0f78f1fe9052cf9a00e9761c9dc097a63c.tgz#10269530152dc126c81b363c27cefc3c060013e2" + integrity sha512-g21xPYq0zHoJ/xUkNxIf5Hle0oiDyelZHU8gwq7J3RNVrccjbUZ28S99KT4yUabV8SQQRNSnR0QMLGMv9Eqs/A== "@prisma/engines@3.2.0-34.afdab2f10860244038c4e32458134112852d4dad": version "3.2.0-34.afdab2f10860244038c4e32458134112852d4dad" @@ -1121,9 +1121,9 @@ integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= "@rushstack/eslint-patch@^1.0.6": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.0.7.tgz#82f83dcc2eb9b1e1d559b3aca96783e285eb8592" - integrity sha512-3Zi2LGbCLDz4IIL7ir6wD0u/ggHotLkK5SlVzFzTcYaNgPR4MAt/9JYZqXWKcofPWEoptfpnCJU8Bq9sxw8QUg== + version "1.0.8" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.0.8.tgz#be3e914e84eacf16dbebd311c0d0b44aa1174c64" + integrity sha512-ZK5v4bJwgXldAUA8r3q9YKfCwOqoHTK/ZqRjSeRXQrBXWouoPnS4MQtgC4AXGiiBuUu5wxrRgTlv0ktmM4P1Aw== "@sindresorhus/slugify@1.1.2", "@sindresorhus/slugify@^1.1.2": version "1.1.2" @@ -1365,9 +1365,9 @@ "@types/node" "*" "@types/lodash@^4.14.149": - version "4.14.175" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.175.tgz#b78dfa959192b01fae0ad90e166478769b215f45" - integrity sha512-XmdEOrKQ8a1Y/yxQFOMbC47G/V2VDO1GvMRnl4O75M4GW/abC5tnfzadQYkqEveqRM1dEJGFFegfPNA2vvx2iw== + version "4.14.176" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.176.tgz#641150fc1cda36fbfa329de603bbb175d7ee20c0" + integrity sha512-xZmuPTa3rlZoIbtDUyJKZQimJV3bxCmzMIO2c9Pz9afyDro6kr7R79GwcB6mRhuoPmV2p1Vb66WOJH7F886WKQ== "@types/long@^4.0.0": version "4.0.1" @@ -1405,9 +1405,9 @@ form-data "^3.0.0" "@types/node@*": - version "16.10.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.3.tgz#7a8f2838603ea314d1d22bb3171d899e15c57bd5" - integrity sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ== + version "16.11.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.2.tgz#31c249c136c3f9b35d4b60fb8e50e01a1f0cc9a5" + integrity sha512-w34LtBB0OkDTs19FQHXy4Ig/TOXI4zqvXS2Kk1PAsRKZ0I+nik7LlMYxckW0tSNGtvWmzB+mrCTbuEjuB9DVsw== "@types/node@^10.1.0": version "10.17.60" @@ -1464,13 +1464,22 @@ react-select "*" "@types/react-transition-group@^4.4.0": - version "4.4.3" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.3.tgz#b0994da0a7023d67dbb4a8910a62112bc00d5688" - integrity sha512-fUx5muOWSYP8Bw2BUQ9M9RK9+W1XBK/7FLJ8PTQpnpTEkn0ccyMffyEQvan4C3h53gHdx7KE5Qrxi/LnUGQtdg== + version "4.4.4" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.4.tgz#acd4cceaa2be6b757db61ed7b432e103242d163e" + integrity sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@17.0.27", "@types/react@^17.0.27": +"@types/react@*", "@types/react@^17.0.27": + version "17.0.31" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.31.tgz#fe05ebf91ff3ae35bb6b13f6c1b461db8089dff8" + integrity sha512-MQSR5EL4JZtdWRvqDgz9kXhSDDoy2zMTYyg7UhP+FZ5ttUOocWyxiqFJiI57sUG0BtaEX7WDXYQlkCYkb3X9vQ== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/react@17.0.27": version "17.0.27" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.27.tgz#6498ed9b3ad117e818deb5525fa1946c09f2e0e6" integrity sha512-zgiJwtsggVGtr53MndV7jfiUESTqrbxOcBvwfe6KS/9bzaVPCTDieTWnFNecVNx6EAaapg5xsLLWFfHHR437AA== @@ -1735,13 +1744,13 @@ anymatch@~3.1.1, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -apollo-datasource@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-3.1.0.tgz#44153cb99c7602f4524397ebc8f13e486a010c09" - integrity sha512-ywcVjuWNo84eMB9uBOYygQI+00+Ne4ShyPIxJzT//sn1j1Fu3J+KStMNd6s1jyERWgjGZzxkiLn6nLmwsGymBg== +apollo-datasource@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-3.2.0.tgz#fe2fbaae7be0ee10deafa5c3f31732e368a564a1" + integrity sha512-2PK+p6dRFuQQM8F4JbBivGetnJxvb8ggQkY7XLeCSl4qVkBeBjX+mRtsiudk28NUTH3JEll7AgmKj2fHfxYpGQ== dependencies: - apollo-server-caching "^3.1.0" - apollo-server-env "^4.0.3" + apollo-server-caching "^3.2.0" + apollo-server-env "^4.1.0" apollo-graphql@^0.9.0: version "0.9.3" @@ -1752,24 +1761,24 @@ apollo-graphql@^0.9.0: lodash.sortby "^4.7.0" sha.js "^2.4.11" -apollo-reporting-protobuf@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.0.0.tgz#a53966b76a3f373d9336bc953f0bc6dede487270" - integrity sha512-jmCD+6gECt8KS7PxP460hztT/5URTbv2Kg0zgnR6iWPGce88IBmSUjcqf1Z6wJJq7Teb8Hu7WbyyMhn0vN5TxQ== +apollo-reporting-protobuf@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.1.0.tgz#6f5501c58270b157834f2083668bc74f0e4d6104" + integrity sha512-IP7SHrTQEGc1/RYzOihfcLLF56ALxxORywJj5ba/p1SX99y+Stt+6D5+3DA7XFF00C1BhXkIU+EkFHzPmypz0w== dependencies: "@apollo/protobufjs" "1.2.2" -apollo-server-caching@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-3.1.0.tgz#c68f2159ad8a25a0bdbb18ad6bdbbde59cd4647d" - integrity sha512-bZ4bo0kSAsax9LbMQPlpuMTkQ657idF2ehOYe4Iw+8vj7vfAYa39Ii9IlaVAFMC1FxCYzLNFz+leZBm/Stn/NA== +apollo-server-caching@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-3.2.0.tgz#368bc3288cfc2dab8de900d045dbd66cf457f3f3" + integrity sha512-kR92WjoQVe1Z/EXyh365w6Vz8egkRCKmd3mE7KJvKgk+f0+AGO1LPPrez5IhbCXxAgChqzpHhq2FIyfOqEuLFQ== dependencies: lru-cache "^6.0.0" -apollo-server-core@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-3.3.0.tgz#f973c6f755884f8e17452cb9022672ae6f0ed9e7" - integrity sha512-KmkzKVG3yjybouDyUX6Melv39u1EOFipvAKP17IlPis/TjVbubJmb6hkE0am/g2RipyhRvlpxAjHqPaCTXR1dQ== +apollo-server-core@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-3.4.0.tgz#a7a492522132472361cd5ff7c6fc32aef37385b5" + integrity sha512-CbQTgoeijCdfaTFq3DHBrnWtat1M/SlPxS365iy2fb2/p4zbYatOA/S0RON7PMGp2gcMnopvOtokJIOxbNN/YA== dependencies: "@apollographql/apollo-tools" "^0.5.1" "@apollographql/graphql-playground-html" "1.6.29" @@ -1777,14 +1786,14 @@ apollo-server-core@^3.3.0: "@graphql-tools/schema" "^8.0.0" "@graphql-tools/utils" "^8.0.0" "@josephg/resolvable" "^1.0.0" - apollo-datasource "^3.1.0" + apollo-datasource "^3.2.0" apollo-graphql "^0.9.0" - apollo-reporting-protobuf "^3.0.0" - apollo-server-caching "^3.1.0" - apollo-server-env "^4.0.3" - apollo-server-errors "^3.1.0" - apollo-server-plugin-base "^3.2.0" - apollo-server-types "^3.2.0" + apollo-reporting-protobuf "^3.1.0" + apollo-server-caching "^3.2.0" + apollo-server-env "^4.1.0" + apollo-server-errors "^3.2.0" + apollo-server-plugin-base "^3.3.0" + apollo-server-types "^3.3.0" async-retry "^1.2.1" fast-json-stable-stringify "^2.1.0" graphql-tag "^2.11.0" @@ -1793,22 +1802,22 @@ apollo-server-core@^3.3.0: sha.js "^2.4.11" uuid "^8.0.0" -apollo-server-env@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-4.0.3.tgz#082a5c1dd4dfb3b34de5e1fa7dc170dd15a5062f" - integrity sha512-B32+RUOM4GUJAwnQqQE1mT1BG7+VfW3a0A87Bp3gv/q8iNnhY2BIWe74Qn03pX8n27g3EGVCt0kcBuHhjG5ltA== +apollo-server-env@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-4.1.0.tgz#20b69216d87b4e73166b28d2675e72823655fe75" + integrity sha512-pJIqIN7UXYDHcNY/IRi7H9AvdV+aHi96gv/nPmnLsP/LbWMJvMuQY3jQ2obW0P+rO3bx05oYHLsVjwHHaXlEQA== dependencies: node-fetch "^2.6.1" -apollo-server-errors@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-3.1.0.tgz#0b890dc7ae36a1f0ca4841d353e8d1c3c6524ee2" - integrity sha512-bUmobPEvtcBFt+OVHYqD390gacX/Cm5s5OI5gNZho8mYKAA6OjgnRlkm/Lti6NzniXVxEQyD5vjkC6Ox30mGFg== +apollo-server-errors@^3.1.0, apollo-server-errors@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-3.2.0.tgz#6c5051107b073c09bb55c2554878af0e97d59d08" + integrity sha512-Y7YH3JVAaR1199ao4dae3j1UrF9D/6AJwHpsORTjI3BvrwjU1X7Nk1VvEHn9bZfZF6ONaqUM+uCLm5c8GPhffQ== apollo-server-express@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-3.3.0.tgz#23ec8b102a4758548c1416fb4770334e814ffb12" - integrity sha512-qJedh77IxbfT+HpYsDraC2CGdy08wiWTwoKYXjRK4S/DHbe94A4957/1blw4boYO4n44xRKQd1k6zxiixCp+XQ== + version "3.4.0" + resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-3.4.0.tgz#2dfa36531746fa36bfafeeda76b017d608a168a9" + integrity sha512-+J7Nu+I+JLCEnBQrQAzKmZfguHo9GQNb6XJZYuNlg9jdcomAvJpEJW5SKujXiGCT9CCIB6jvf8s102pJvBC9TQ== dependencies: "@types/accepts" "^1.3.5" "@types/body-parser" "1.19.1" @@ -1816,37 +1825,37 @@ apollo-server-express@^3.3.0: "@types/express" "4.17.13" "@types/express-serve-static-core" "4.17.24" accepts "^1.3.5" - apollo-server-core "^3.3.0" - apollo-server-types "^3.2.0" + apollo-server-core "^3.4.0" + apollo-server-types "^3.3.0" body-parser "^1.19.0" cors "^2.8.5" parseurl "^1.3.3" apollo-server-micro@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/apollo-server-micro/-/apollo-server-micro-3.3.0.tgz#02aeed4e130f418d896371bb120c51c399c1e27d" - integrity sha512-PTyTgre87Yh89fwml9pCdac60vlmByLYaUqdGtZMG8Z6GQ4tGMo7cUYPMK+FbNFr8/27oOxK8CvEAF3ogAYlCw== + version "3.4.0" + resolved "https://registry.yarnpkg.com/apollo-server-micro/-/apollo-server-micro-3.4.0.tgz#ebe7200ecdc78d1647db781c7dfa749511bdd17f" + integrity sha512-Q3AiT3sT8LdisTV7GHPSvSZj/m0YmqRL4DwAe8Wf2p1VXe8tlUR+mqSNCsfQjXsBXSTQ8GuGIEpUuAzEaaus/w== dependencies: "@hapi/accept" "^5.0.2" - apollo-server-core "^3.3.0" - apollo-server-types "^3.2.0" + apollo-server-core "^3.4.0" + apollo-server-types "^3.3.0" type-is "^1.6.18" -apollo-server-plugin-base@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-3.2.0.tgz#415337a0b1b88fc1d5f5620130a51e2935dd8dbf" - integrity sha512-anjyiw79wxU4Cj2bYZFWQqZPjuaZ4mVJvxCoyvkFrNvjPua9dovCOfpng43C5NwdsqJpz78Vqs236eFM2QoeaA== +apollo-server-plugin-base@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-3.3.0.tgz#7615cc763848c33099ed4ac8dd5134fbf94df97c" + integrity sha512-4a4KpePhoU9FAIN2YjWm1Cfl7Y3AyRXLH8ZncSRCDcQFWww8gc/ZGqWZ+udRo4ejKvzLjnTwVyxfrd80sf9sHw== dependencies: - apollo-server-types "^3.2.0" + apollo-server-types "^3.3.0" -apollo-server-types@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-3.2.0.tgz#6243b34d35fbb09ded2cc84bf7e5f59968ccfa21" - integrity sha512-Fh7QP84ufDZHbLzoLyyxyzznlW8cpgEZYYkGsS1i36zY4VaAt5OUOp1f+FxWdLGehq0Arwb6D1W7y712IoZ/JQ== +apollo-server-types@^3.2.0, apollo-server-types@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-3.3.0.tgz#20448e2c88e2045764a5fe82ab66069e79c4a834" + integrity sha512-m+GyuXyuZ7YdZO1NIMJdJoOKsocCPx/WRVzBjDegYxNcAa/lDvNYU3hFyX87UGXt8Xsd9VIHxdhO88S6jkgCmw== dependencies: - apollo-reporting-protobuf "^3.0.0" - apollo-server-caching "^3.1.0" - apollo-server-env "^4.0.3" + apollo-reporting-protobuf "^3.1.0" + apollo-server-caching "^3.2.0" + apollo-server-env "^4.1.0" apollo-upload-client@^16.0.0: version "16.0.0" @@ -1919,7 +1928,7 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= -array-includes@^3.1.1, array-includes@^3.1.3: +array-includes@^3.1.1, array-includes@^3.1.3, array-includes@^3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== @@ -1935,7 +1944,7 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.flat@^1.2.4: +array.prototype.flat@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg== @@ -2198,15 +2207,15 @@ browserslist@4.16.6: node-releases "^1.1.71" browserslist@^4.16.6, browserslist@^4.17.3: - version "4.17.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.3.tgz#2844cd6eebe14d12384b0122d217550160d2d624" - integrity sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ== + version "4.17.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.4.tgz#72e2508af2a403aec0a49847ef31bd823c57ead4" + integrity sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ== dependencies: - caniuse-lite "^1.0.30001264" - electron-to-chromium "^1.3.857" + caniuse-lite "^1.0.30001265" + electron-to-chromium "^1.3.867" escalade "^3.1.1" - node-releases "^1.1.77" - picocolors "^0.2.1" + node-releases "^2.0.0" + picocolors "^1.0.0" buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: version "0.2.13" @@ -2302,10 +2311,10 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001202, caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001228, caniuse-lite@^1.0.30001264: - version "1.0.30001265" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz#0613c9e6c922e422792e6fcefdf9a3afeee4f8c3" - integrity sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw== +caniuse-lite@^1.0.30001202, caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001228, caniuse-lite@^1.0.30001264, caniuse-lite@^1.0.30001265: + version "1.0.30001271" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001271.tgz#0dda0c9bcae2cf5407cd34cac304186616cc83e8" + integrity sha512-BBruZFWmt3HFdVPS8kceTBIguKxu4f99n5JNp06OlPD/luoAMIaIK5ieV5YjnBLH3Nysai9sxj9rpJj4ZisXOA== ccount@^1.0.0: version "1.1.0" @@ -2614,9 +2623,9 @@ copy-to-clipboard@^3.3.1: toggle-selection "^1.0.6" core-js-pure@^3.10.2, core-js-pure@^3.16.0: - version "3.18.2" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.18.2.tgz#d8cc11d4885ea919f3de776d45e720e4c769d406" - integrity sha512-4hMMLUlZhKJKOWbbGD1/VDUxGPEhEoN/T01k7bx271WiBKCvCfkgPzy0IeRS4PB50p6/N1q/SZL4B/TRsTE5bA== + version "3.18.3" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.18.3.tgz#7eed77dcce1445ab68fd68715856633e2fb3b90c" + integrity sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw== core-util-is@~1.0.0: version "1.0.3" @@ -2987,10 +2996,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.723, electron-to-chromium@^1.3.857: - version "1.3.864" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.864.tgz#6a993bcc196a2b8b3df84d28d5d4dd912393885f" - integrity sha512-v4rbad8GO6/yVI92WOeU9Wgxc4NA0n4f6P1FvZTY+jyY7JHEhw3bduYu60v3Q1h81Cg6eo4ApZrFPuycwd5hGw== +electron-to-chromium@^1.3.723, electron-to-chromium@^1.3.867: + version "1.3.877" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.877.tgz#956870eea7c9d8cf43cc54ea40687fee4dc0c12a" + integrity sha512-fT5mW5Giw5iyVukeHb2XvB4joBKvzHtl8Vs3QzE7APATpFMt/T7RWyUcIKSZzYkKQgpMbu+vDBTCHfQZvh8klA== elliptic@^6.5.3: version "6.5.4" @@ -3164,32 +3173,31 @@ eslint-import-resolver-typescript@^2.4.0: resolve "^1.20.0" tsconfig-paths "^3.9.0" -eslint-module-utils@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz#94e5540dd15fe1522e8ffa3ec8db3b7fa7e7a534" - integrity sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q== +eslint-module-utils@^2.7.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz#b435001c9f8dd4ab7f6d0efcae4b9696d4c24b7c" + integrity sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ== dependencies: debug "^3.2.7" + find-up "^2.1.0" pkg-dir "^2.0.0" eslint-plugin-import@^2.22.1: - version "2.24.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz#2c8cd2e341f3885918ee27d18479910ade7bb4da" - integrity sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q== + version "2.25.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz#b3b9160efddb702fc1636659e71ba1d10adbe9e9" + integrity sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g== dependencies: - array-includes "^3.1.3" - array.prototype.flat "^1.2.4" + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" debug "^2.6.9" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.6.2" - find-up "^2.0.0" + eslint-module-utils "^2.7.0" has "^1.0.3" - is-core-module "^2.6.0" + is-core-module "^2.7.0" + is-glob "^4.0.3" minimatch "^3.0.4" - object.values "^1.1.4" - pkg-up "^2.0.0" - read-pkg-up "^3.0.0" + object.values "^1.1.5" resolve "^1.20.0" tsconfig-paths "^3.11.0" @@ -3548,7 +3556,7 @@ find-up@5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -3631,9 +3639,9 @@ forwarded@0.2.0: integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fp-ts@^2.11.4: - version "2.11.4" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.11.4.tgz#ad78a0d8eafb0dcfc835a0fb200f6da6422c27f0" - integrity sha512-lhV7tGEbs2qoVw4vmqOovChS7CAoIYU0gdiPEF8Vc4bLZct+PAMMeXrCqRyBNEo33XOvwvAmFDEDIrHPWH2/fg== + version "2.11.5" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.11.5.tgz#97cceb26655b1452d7088d6fb0864f84cceffbe4" + integrity sha512-OqlwJq1BdpB83BZXTqI+dNcA6uYk6qk4u9Cgnt64Y+XS7dwdbp/mobx8S2KXf2AXH+scNmA/UVK3SEFHR3vHZA== fraction.js@^4.1.1: version "4.1.1" @@ -4262,10 +4270,10 @@ is-color-stop@^1.1.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.6.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.7.0.tgz#3c0ef7d31b4acfc574f80c58409d568a836848e3" - integrity sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ== +is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.7.0: + 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" @@ -4474,11 +4482,6 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" @@ -4577,16 +4580,6 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - loader-utils@1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" @@ -4948,9 +4941,9 @@ min-indent@^1.0.0: integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== mini-svg-data-uri@^1.2.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.3.3.tgz#91d2c09f45e056e5e1043340b8b37ba7b50f4fac" - integrity sha512-+fA2oRcR1dJI/7ITmeQJDrYWks0wodlOz0pAEhKYJ2IVc1z0AnwJUsKY2fzFmPAM3Jo9J0rBx8JAA9QQSJ5PuA== + version "1.4.3" + resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.3.tgz#43177b2e93766ba338931a3e2a84a3dfd3a222b8" + integrity sha512-gSfqpMRC8IxghvMcxzzmMnWpXAChSA+vy4cia33RgerMS8Fex95akUyQZPbxJJmeBGiGmK7n/1OpUX8ksRjIdA== minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" @@ -5028,10 +5021,10 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@^3.1.23, nanoid@^3.1.28: - version "3.1.29" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.29.tgz#214fb2d7a33e1a5bef4757b779dfaeb6a4e5aeb4" - integrity sha512-dW2pUSGZ8ZnCFIlBIA31SV8huOGCHb6OwzVCc7A69rb/a+SgPBwfmLvK5TKQ3INPbRkcI8a/Owo0XbiTNH19wg== +nanoid@^3.1.23, 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== native-url@0.3.4: version "0.3.4" @@ -5176,12 +5169,17 @@ 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.71, node-releases@^1.1.77: +node-releases@^1.1.71: version "1.1.77" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: +node-releases@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== + +normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -5287,7 +5285,7 @@ object.hasown@^1.0.0: define-properties "^1.1.3" es-abstract "^1.19.1" -object.values@^1.1.4: +object.values@^1.1.4, object.values@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== @@ -5471,14 +5469,6 @@ parse-entities@^2.0.0: is-decimal "^1.0.0" is-hexadecimal "^1.0.0" -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - parse-json@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -5534,13 +5524,6 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -5562,16 +5545,16 @@ picocolors@^0.2.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - pirates@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" @@ -5600,13 +5583,6 @@ pkg-up@3.1.0: dependencies: find-up "^3.0.0" -pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" - integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= - dependencies: - find-up "^2.1.0" - platform@1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" @@ -5676,12 +5652,12 @@ postcss@8.2.15: source-map "^0.6.1" postcss@^8.1.6, postcss@^8.2.1, postcss@^8.3.9: - version "8.3.9" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.9.tgz#98754caa06c4ee9eb59cc48bd073bb6bd3437c31" - integrity sha512-f/ZFyAKh9Dnqytx5X62jgjhhzttjZS7hMsohcI7HEI5tjELX/HxCy3EFhsRxyzGvrzFF+82XPvCS8T9TFleVJw== + version "8.3.11" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.11.tgz#c3beca7ea811cd5e1c4a3ec6d2e7599ef1f8f858" + integrity sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA== dependencies: - nanoid "^3.1.28" - picocolors "^0.2.1" + nanoid "^3.1.30" + picocolors "^1.0.0" source-map-js "^0.6.2" prelude-ls@^1.2.1: @@ -6031,23 +6007,6 @@ read-pkg-up@7.0.1, read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" @@ -6690,7 +6649,7 @@ stylis@3.5.4: resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== -stylis@^4.0.3: +stylis@^4.0.10: version "4.0.10" resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.10.tgz#446512d1097197ab3f02fb3c258358c3f7a14240" integrity sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg== @@ -6772,9 +6731,9 @@ table@^6.0.9: strip-ansi "^6.0.1" tailwindcss@^2.2.4: - version "2.2.16" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-2.2.16.tgz#32f81bdf1758b639cb83b9d30bf7cbecdda49e5e" - integrity sha512-EireCtpQyyJ4Xz8NYzHafBoy4baCOO96flM0+HgtsFcIQ9KFy/YBK3GEtlnD+rXen0e4xm8t3WiUcKBJmN6yjg== + version "2.2.17" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-2.2.17.tgz#c6332731f9ff1b6628ff589c95c38685347775e3" + integrity sha512-WgRpn+Pxn7eWqlruxnxEbL9ByVRWi3iC10z4b6dW0zSdnkPVC4hPMSWLQkkW8GCyBIv/vbJ0bxIi9dVrl4CfoA== dependencies: arg "^5.0.1" bytes "^3.0.0" @@ -7221,10 +7180,10 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -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== vary@^1, vary@~1.1.2: version "1.1.2" From fd785677fe76d6a18477df864230572629ab61e3 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 22 Oct 2021 07:05:43 +0100 Subject: [PATCH 178/325] Code inspector: 2 --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2b271099..a16afb06 100644 --- a/README.md +++ b/README.md @@ -64,11 +64,15 @@ utils.js ## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) +This branch is dedicated to creating a solid foundation for a production build to extend Keystone 6 CMS from. + code inspector badge -This branch is dedicated to creating a solid foundation for a production build to extend Keystone 6 CMS from. +Currently working on the low code style core, which hates `any` just as much as I do, and spots the tiniest of issues. Industry best practise is a useful side effect of harsh CI tooling. + + `yarn commit "message"` fires off the CI pipeline and only commits if unit tests are passed locally. No longer requires yarn dev running without the main next front end, since yarn site:build is the primary unit test. "fastcommit" is considered dangerous, and needs some additional logic to be CI safe. Its been the cause of a few red crosses. For that reason, it is being prefixed by an `x`, so commands in the history buffer do not trigger it. From 0df247c49d0f7686b2dad54ce68073063f6324db Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 22 Oct 2021 15:36:34 +0100 Subject: [PATCH 179/325] Removed var --- utils/logging.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/utils/logging.ts b/utils/logging.ts index 7ec0b8b6..d6bff67f 100644 --- a/utils/logging.ts +++ b/utils/logging.ts @@ -46,7 +46,7 @@ export const fileLineRenderer = (e: CleanError) => { const stackFrames = ErrorStackParser.parse(e); const elem = stackFrames[0]; - var scope = + const scope = elem.functionName === undefined ? 'file scope' : elem.functionName; return dateRenderer( elem.fileName + @@ -64,10 +64,10 @@ export const abbreviatedRenderer = (e: CleanError): string => { }; export const stackRenderer = (e: CleanError): string => { - var str: string = ''; + let str: string = ''; ErrorStackParser.parse(e)?.map((elem: ErrorStackParser.StackFrame) => { - var scope = + const scope = elem.functionName === undefined ? 'file scope' : elem.functionName; str = @@ -112,7 +112,7 @@ export const logContextInfoGen = return logContextInfoGen(retObj)(logger)(warningCol)(stackRenderer)( nullVariableMsg ); - var cleanMessage: string; + let cleanMessage: string; if (typeof toBeLogged === 'string') { cleanMessage = col(toBeLogged); From 678f2fc39bfb3c1c5b45672be0f96692a88c7c1d Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 22 Oct 2021 15:43:38 +0100 Subject: [PATCH 180/325] xlog eslint no-unused-vars --- utils/logging.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/utils/logging.ts b/utils/logging.ts index d6bff67f..9af98e7d 100644 --- a/utils/logging.ts +++ b/utils/logging.ts @@ -141,7 +141,7 @@ const logContextInfo = logContextInfoGen(retObj)(simpleLogger)(col)(msgRenderer)(a); export class logclos { - depth: number = -1; + depth = -1; renderer() { this.depth = this.depth + 1; @@ -167,7 +167,7 @@ export class logclos { return logContextInfo(this)(errorCol)(this.renderer())(a); } } - +/* eslint no-unused-vars: "off" */ export class xlogclos { warning(a: HardenedAny): this { return this; @@ -188,6 +188,7 @@ export class xlogclos { return this; } } +/* eslint no-unused-vars: "error" */ export const log = () => new logclos(); export const xlog = () => new xlogclos(); From 87d2364a283fead9dced71362cba181b8aa0a232 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 22 Oct 2021 15:50:39 +0100 Subject: [PATCH 181/325] xlog eslint no-explicit-any used once, in wrap_any --- .github/workflows/latest.yml | 158 +++++++++++++++++------------------ wrap_any.ts | 4 +- 2 files changed, 82 insertions(+), 80 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index 1ce2ec8c..e1603406 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -1,79 +1,79 @@ -# This is a basic workflow to help you get started with Actions - -name: CI - -# Controls when the workflow will run -on: - # Triggers the workflow on push or pull request events but only for the main branch - push: - branches: [ latest ] - pull_request: - branches: [ latest ] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - # This workflow contains a single job called "build" - prisma_day_2021: - runs-on: ubuntu-latest - container: node:14.18.1-bullseye - services: - pg: - image: postgres:latest - ports: - - 5432:5432 - options: >- - --health-cmd pg_isready - --health-interval 10s - --health-timeout 5s - --health-retries 5 - env: - POSTGRES_DB: prisma_day_2021_latest - POSTGRES_PASSWORD: change_me_in_multiple_places - POSTGRES_PORT: 5432 - POSTGRES_USER: postgres_user - - steps: - - name: Dump github context - run: echo "$GITHUB_CONTEXT" - shell: bash - env: - GITHUB_CONTEXT: ${{ toJson(github) }} - - - name: Checkout application - uses: actions/checkout@v2 - - - name: Run yarn - run: | - cd $GITHUB_WORKSPACE - ls -alt - yarn - env: - DATABASE_URL: "postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest" - - - name: Start keystone/Next - run: | - yarn dev & - - env: - KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 - DATABASE_URL: "postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest" - - - name: Start next build - run: | - echo "Sleeping to give time for Keystone to kick in. WIP: full micro service yml" - sleep 5 - echo "Building unseeded production server: " - yarn site:build - echo "✅ Success: built unseeded production services" - sleep 25 - env: - KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 - DATABASE_URL: "postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest" - - - - - # Deploy: +# This is a basic workflow to help you get started with Actions + +name: CI + +# Controls when the workflow will run +on: + # Triggers the workflow on push or pull request events but only for the main branch + push: + branches: [latest] + pull_request: + branches: [latest] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + prisma_day_2021: + runs-on: ubuntu-latest + container: node:14.18.1-bullseye + services: + pg: + image: postgres:latest + ports: + - 5432:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + env: + POSTGRES_DB: prisma_day_2021_latest + POSTGRES_PASSWORD: change_me_in_multiple_places + POSTGRES_PORT: 5432 + POSTGRES_USER: postgres_user + + steps: + - name: Dump github context + run: echo "$GITHUB_CONTEXT" + shell: bash + env: + GITHUB_CONTEXT: ${{ toJson(github) }} + + - name: Checkout application + uses: actions/checkout@v2 + + - name: Run yarn + run: | + cd $GITHUB_WORKSPACE + ls -alt + yarn + env: + DATABASE_URL: "postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest" + + - name: Start keystone/Next + run: | + yarn dev & + + env: + KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 + DATABASE_URL: "postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest" + + - name: Start next build + run: | + echo "Sleeping to give time for Keystone to kick in. WIP: full micro service yml" + sleep 5 + echo "Building unseeded production server: " + yarn site:build + echo "✅ Success: built unseeded production services" + sleep 25 + env: + KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 + DATABASE_URL: "postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest" + + + + + # Deploy: diff --git a/wrap_any.ts b/wrap_any.ts index 6cf43716..051305cb 100644 --- a/wrap_any.ts +++ b/wrap_any.ts @@ -5,9 +5,10 @@ // To ensure we only match any once in the top level of this app, // and give any a descriptive type name // This is the local alias for the dreaded `type` -export type auto_aux = T; +// eslint-disable-line no-explicit-any type WrappedRampantlyPolymorphic = any; + //Any any is immediately assigned the status RampantlyPolymorphic, which matches exactly what it means export type RampantlyPolymorphic = WrappedRampantlyPolymorphic; @@ -45,3 +46,4 @@ export type GithubRepoAny = WrappedRampantlyPolymorphic; export type GithubResolverItemAny = WrappedRampantlyPolymorphic; export type SessionAny = WrappedRampantlyPolymorphic; +export type LoggingAny = WrappedRampantlyPolymorphic; From 957cf28d6a098473caa72993bf9b567b43274060 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Fri, 22 Oct 2021 15:53:51 +0100 Subject: [PATCH 182/325] More ESlint added to CI --- package.json | 4 +- yarn.lock | 103 +++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 98 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index ed346adf..1ab075b8 100644 --- a/package.json +++ b/package.json @@ -41,13 +41,15 @@ "@tailwindcss/forms": "^0.3.3", "@types/react": "17.0.27", "@types/readline-sync": "^1.4.4", + "@typescript-eslint/eslint-plugin": "^5.1.0", + "@typescript-eslint/parser": "^5.1.0", "autoprefixer": "^10.3.7", "eslint": "7.32.0", "eslint-config-next": "11.1.2", "postcss": "^8.3.9", "prettier": "^2.4.1", "tailwindcss": "^2.2.4", - "typescript": "4.4.3" + "typescript": "^4.4.4" }, "prettier": { "singleQuote": true, diff --git a/yarn.lock b/yarn.lock index e600f978..172e951a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1333,6 +1333,11 @@ resolved "https://registry.yarnpkg.com/@types/is-hotkey/-/is-hotkey-0.1.5.tgz#f3123ba21228c0408c10594abf378caddbb802f8" integrity sha512-pZTb6AsG7I56FJgYA8Cbit3cB3NGVwyHgwyUCENjXewTQChOtQaxaV+u6BO4hqtS1o9KT1wML+NRkGhQZ6swtA== +"@types/json-schema@^7.0.9": + 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/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" @@ -1560,6 +1565,32 @@ resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.3.tgz#781d360c282436494b32fe7d9f7f8e64b3118aa3" integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw== +"@typescript-eslint/eslint-plugin@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.1.0.tgz#381c188dfab12f7a2c7b6a8ba2402d6273eadeaa" + integrity sha512-bekODL3Tqf36Yz8u+ilha4zGxL9mdB6LIsIoMAvvC5FAuWo4NpZYXtCbv7B2CeR1LhI/lLtLk+q4tbtxuoVuCg== + dependencies: + "@typescript-eslint/experimental-utils" "5.1.0" + "@typescript-eslint/scope-manager" "5.1.0" + debug "^4.3.2" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.2.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.1.0.tgz#918a1a3d30404cc1f8edcfdf0df200804ef90d31" + integrity sha512-ovE9qUiZMOMgxQAESZsdBT+EXIfx/YUYAbwGUI6V03amFdOOxI9c6kitkgRvLkJaLusgMZ2xBhss+tQ0Y1HWxA== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.1.0" + "@typescript-eslint/types" "5.1.0" + "@typescript-eslint/typescript-estree" "5.1.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + "@typescript-eslint/parser@^4.20.0": version "4.33.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" @@ -1570,6 +1601,16 @@ "@typescript-eslint/typescript-estree" "4.33.0" debug "^4.3.1" +"@typescript-eslint/parser@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.1.0.tgz#6c7f837d210d2bc0a811e7ea742af414f4e00908" + integrity sha512-vx1P+mhCtYw3+bRHmbalq/VKP2Y3gnzNgxGxfEWc6OFpuEL7iQdAeq11Ke3Rhy8NjgB+AHsIWEwni3e+Y7djKA== + dependencies: + "@typescript-eslint/scope-manager" "5.1.0" + "@typescript-eslint/types" "5.1.0" + "@typescript-eslint/typescript-estree" "5.1.0" + debug "^4.3.2" + "@typescript-eslint/scope-manager@4.33.0": version "4.33.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" @@ -1578,11 +1619,24 @@ "@typescript-eslint/types" "4.33.0" "@typescript-eslint/visitor-keys" "4.33.0" +"@typescript-eslint/scope-manager@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.1.0.tgz#6f1f26ad66a8f71bbb33b635e74fec43f76b44df" + integrity sha512-yYlyVjvn5lvwCL37i4hPsa1s0ORsjkauhTqbb8MnpvUs7xykmcjGqwlNZ2Q5QpoqkJ1odlM2bqHqJwa28qV6Tw== + dependencies: + "@typescript-eslint/types" "5.1.0" + "@typescript-eslint/visitor-keys" "5.1.0" + "@typescript-eslint/types@4.33.0": version "4.33.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== +"@typescript-eslint/types@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.1.0.tgz#a8a75ddfc611660de6be17d3ad950302385607a9" + integrity sha512-sEwNINVxcB4ZgC6Fe6rUyMlvsB2jvVdgxjZEjQUQVlaSPMNamDOwO6/TB98kFt4sYYfNhdhTPBEQqNQZjMMswA== + "@typescript-eslint/typescript-estree@4.33.0": version "4.33.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" @@ -1596,6 +1650,19 @@ semver "^7.3.5" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.1.0.tgz#132aea34372df09decda961cb42457433aa6e83d" + integrity sha512-SSz+l9YrIIsW4s0ZqaEfnjl156XQ4VRmJsbA0ZE1XkXrD3cRpzuZSVCyqeCMR3EBjF27IisWakbBDGhGNIOvfQ== + dependencies: + "@typescript-eslint/types" "5.1.0" + "@typescript-eslint/visitor-keys" "5.1.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.33.0": version "4.33.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" @@ -1604,6 +1671,14 @@ "@typescript-eslint/types" "4.33.0" eslint-visitor-keys "^2.0.0" +"@typescript-eslint/visitor-keys@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.1.0.tgz#e01a01b27eb173092705ae983aa1451bd1842630" + integrity sha512-uqNXepKBg81JVwjuqAxYrXa1Ql/YDzM+8g/pS+TCPxba0wZttl8m5DkrasbfnmJGHs4lQ2jTbcZ5azGhI7kK+w== + dependencies: + "@typescript-eslint/types" "5.1.0" + eslint-visitor-keys "^3.0.0" + "@urql/core@^2.3.2": version "2.3.3" resolved "https://registry.yarnpkg.com/@urql/core/-/core-2.3.3.tgz#e4777b95c31d8ad0ba21ea1f5c851cbbe1d0ac17" @@ -2806,7 +2881,7 @@ debug@2, debug@2.6.9, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@4.3.2, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: +debug@4, debug@4.3.2, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== @@ -3258,6 +3333,13 @@ eslint-utils@^2.1.0: dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + 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" @@ -3268,6 +3350,11 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== +eslint-visitor-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz#e32e99c6cdc2eb063f204eda5db67bfe58bb4186" + integrity sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q== + eslint@7.32.0: version "7.32.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" @@ -3800,7 +3887,7 @@ globals@^13.6.0, globals@^13.9.0: dependencies: type-fest "^0.20.2" -globby@11.0.4, globby@^11.0.1, globby@^11.0.3: +globby@11.0.4, globby@^11.0.1, globby@^11.0.3, 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== @@ -4066,7 +4153,7 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.4: +ignore@^5.1.4, ignore@^5.1.8: version "5.1.8" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== @@ -6087,7 +6174,7 @@ regexp.prototype.flags@^1.3.1: call-bind "^1.0.2" define-properties "^1.1.3" -regexpp@^3.1.0: +regexpp@^3.1.0, 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== @@ -7005,10 +7092,10 @@ type-is@^1.6.18, type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typescript@4.4.3: - version "4.4.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" - integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== +typescript@^4.4.4: + version "4.4.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" + integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== uid-safe@^2.1.5: version "2.1.5" From 1114ba110829e3069eeafb9f4a2e211d17fc55e6 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 02:03:18 +0100 Subject: [PATCH 183/325] Typesafe monadic IO working with node-fetch --- .eslint.js | 22 ++++++++++ .eslintrc.json | 6 ++- package.json | 1 + pages/index.tsx | 42 ++++++++++-------- pages/post/[slug].tsx | 94 +++++++++++++++++++++++++++++------------ schema/access.ts | 18 ++++---- tsconfig.eslint.json | 7 +++ utils/badValues.ts | 6 +-- utils/fetchGraphQL.ts | 11 ++--- utils/logging.ts | 32 +++++++------- utils/maybeIO.ts | 21 +++++---- utils/maybeIOPromise.ts | 48 +++++++++++++-------- wrap_any.ts | 2 +- yarn.lock | 5 +++ 14 files changed, 206 insertions(+), 109 deletions(-) create mode 100644 .eslint.js create mode 100644 tsconfig.eslint.json diff --git a/.eslint.js b/.eslint.js new file mode 100644 index 00000000..d261ada0 --- /dev/null +++ b/.eslint.js @@ -0,0 +1,22 @@ +module.exports = { + root: true, + env: { + node: true, + }, + globals: { + Promise: "readonly" + }, + parser: "@typescript-eslint/parser", + parserOptions: { + sourceType: "module", + tsconfigRootDir: __dirname, + project: ["./tsconfig.eslint.json"], + }, + plugins: ["@typescript-eslint"], + extends: [ + "eslint:recommended", + "prettier/@typescript-eslint", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + ], + } \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json index 04a9ab77..649a5be4 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,3 +1,7 @@ { - "extends": ["next/core-web-vitals","eslint:recommended"] + "extends": [ + "next/core-web-vitals", + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ] } diff --git a/package.json b/package.json index 1ab075b8..665e72ff 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ }, "devDependencies": { "@tailwindcss/forms": "^0.3.3", + "@types/node": "^16.11.3", "@types/react": "17.0.27", "@types/readline-sync": "^1.4.4", "@typescript-eslint/eslint-plugin": "^5.1.0", diff --git a/pages/index.tsx b/pages/index.tsx index ac02d3ce..f67c0e3e 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -10,26 +10,12 @@ import { H1 } from '../components/ui/typography'; import { useAuth } from '../components/auth'; import { makeIO } from '../utils/maybeIOPromise' -import { DocumentType } from '../wrap_any' +import { DocumentAny } from '../wrap_any' - -type Post = { - id: string; - slug: string; - title: string; - publishedDate: string; - intro: { - document: DocumentType; - }; - author: { - name: string; - }; -}; - -export default function Home({ posts }: { posts: Post[] }) { +export default function Home({ posts }: { posts: QueryPost[] }) { const auth = useAuth(); return ( @@ -70,9 +56,28 @@ export default function Home({ posts }: { posts: Post[] }) { ); } +export type QueryPost = { + id: string; + title: string; + slug: string; + publishedDate: string; + intro: { + document: DocumentAny; + }; + author: { + name: string; + }; +}; + +export type QueryPosts = { + posts: QueryPost[] +} + + + //We can save a little time by compiling the functional code to a runtime constant const fetchScript = makeIO (() => - fetchGraphQL_inject_api_key( + fetchGraphQL_inject_api_key( gql` query { posts( @@ -94,10 +99,11 @@ const fetchScript = makeIO (() => } ` )) -.then (data => data?.posts?? null); + .then (data => data.posts); export async function getStaticProps() { return fetchScript + .info () .exec ([]) .then (postsRx => { return { props: { posts: postsRx }, revalidate: 60 } }) } diff --git a/pages/post/[slug].tsx b/pages/post/[slug].tsx index a2d943b6..5970ead2 100644 --- a/pages/post/[slug].tsx +++ b/pages/post/[slug].tsx @@ -1,4 +1,4 @@ -import { GetStaticPathsResult, GetStaticPropsContext } from 'next'; +import { GetStaticPropsContext } from 'next'; import React from 'react'; import { fetchGraphQL_inject_api_key, gql } from '../../utils/fetchGraphQL'; @@ -8,17 +8,20 @@ import { Container, HomeLink } from '../../components/ui/layout'; //import { Link } from '../../components/ui/link'; import { H1 } from '../../components/ui/typography'; -import { PostAny } from '../../wrap_any' -//import { log } from '../../utils/logging' -import { makeIO } from '../../utils/maybeIOPromise' +//import { PostAny } from '../../wrap_any' +import { log } from '../../utils/logging' +import { makeIO, IO, embed } from '../../utils/maybeIOPromise' +import { DocumentAny } from '../../wrap_any' -export default function Post({ post }: { post: PostAny }) { + + +export default function RenderPost({ post }: { post: PostStaticProps }) { return (

    {post.title}

    - {post.author?.name && ( + {post.author.name && (

    By {post.author.name}

    @@ -31,30 +34,61 @@ export default function Post({ post }: { post: PostAny }) { ); } -const fetchStaticPaths = makeIO (() => fetchGraphQL_inject_api_key( + +type TstaticPaths = { + posts: + { + slug: string; + }[]; +}; + +const fetchStaticPaths = makeIO (() => fetchGraphQL_inject_api_key( gql` query { - posts { - slug + posts { + slug + } } - } - ` -)) - .then( data => data!.posts) - .then(posts => { - return { paths: posts!.map((post: PostAny) => ({ params: { slug: post!.slug } })), + ` + )) + .then (data => data.posts) + + .then( posts => { + return { paths: posts.map(post => ({ params: { slug: post.slug } })), fallback: 'blocking', - }} + } } ) -export async function getStaticPaths(): Promise { +export async function getStaticPaths() { return fetchStaticPaths - .exec({ paths: [], fallback: false }); + .exec({ paths: [], fallback: 'blocking' }); } -const fetchStaticProps = ({ params }: GetStaticPropsContext) => makeIO (() => - fetchGraphQL_inject_api_key( +export type PostStaticProps = { + title: string; + + content: { + document: DocumentAny; + }; + publishedDate: string; + author: { + id: string; + name: string; + }; +}; + +export type QueryPostStaticProps = {post: PostStaticProps}; + + + +const fetchStaticProps = (staticProps: GetStaticPropsContext) => + + IO.root(staticProps) + .then (props => props.params) + .then (params => params.slug ) + .promise(pslug => + fetchGraphQL_inject_api_key( gql` query ($slug: String!) { post(where: { slug: $slug }) { @@ -70,15 +104,19 @@ const fetchStaticProps = ({ params }: GetStaticPropsContext) => makeIO (() => } } `, - { slug: params!.slug } - )) - .then (data => data!.post); + { slug: pslug })) + .info() + .then (data => data.post) + ; -export async function getStaticProps({ params }: GetStaticPropsContext) { - return fetchStaticProps({params}) - .exec({}) + //.then (postsRx => { return { props: { posts: postsRx }, revalidate: 60 } }) + +export async function getStaticProps( params : GetStaticPropsContext) { + return fetchStaticProps(params) + .run () .then(match_post => { - return { props: { post: match_post }, revalidate: 60 } - }) + return { props: { post: match_post }, revalidate: 60 }}) + + } diff --git a/schema/access.ts b/schema/access.ts index 8522f89f..ff55c7fb 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -82,20 +82,20 @@ export const isSignedIn = ({ session }: SessionContext) => { //They can't easy be expressed in terms of the more elementary functions either. undefined issues. export const permissions = { canUseAdminUI: ({ session }: SessionContext): boolean => - Boolean(session!.data!.role), + Boolean(session?.data?.role), canManageContent: (frame: SessionFrame): boolean => - Boolean(frame!.context!.session!.data!.role!.canManageContent), + Boolean(frame?.context?.session?.data?.role?.canManageContent), canManageUsers: (frame: SessionFrame): boolean => - Boolean(frame!.context!.session!.data!.role!.canManageUsers), + Boolean(frame?.context?.session?.data?.role?.canManageUsers), canManageContentSession: ({ session }: SessionContext): boolean => { - return Boolean(session!.data!.role!.canManageContent); + return Boolean(session?.data?.role?.canManageContent); }, canManageContentItem: (item: ItemContext): boolean => - Boolean(item!.session!.data!.role!.canManageContent), + Boolean(item?.session?.data?.role?.canManageContent), canManageUsersSession: ({ session }: SessionContext): boolean => { - return Boolean(session!.data!.role!.canManageUsers); + return Boolean(session?.data?.role?.canManageUsers); }, canManageContentList: (frame: SessionFrame) => permissions.canManageContent(frame), @@ -116,7 +116,7 @@ export const permissions = { } //The perms check is only running client side. Review: check the authorization props are checked //server side to. - if (frame.context.session!.data!.role!.canManageContent ?? false) { + if (frame.context.session?.data?.role?.canManageContent ?? false) { log() .success('Blessed super user access to the known content manager:') .success(frame?.context?.session?.data?.name); @@ -145,7 +145,7 @@ export const permissions = { } //The perms check is only running client side. Review: check the authorization props are checked //server side to. - if (frame.context.session!.data!.role!.canManageUsers ?? false) { + if (frame.context.session?.data?.role?.canManageUsers ?? false) { log() .success('Blessed super user access to the known user manager:') .success(frame?.context?.session?.data?.name); @@ -156,7 +156,7 @@ export const permissions = { .success('Client receives only their own user data:') .success(frame?.context?.session?.data?.name); //success(frame.context.session?.data?.role?.canManageContent); - return { id: { equals: frame.context.session!.itemId ?? '' } }; + return { id: { equals: frame.context.session?.itemId ?? '' } }; }, }; diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json new file mode 100644 index 00000000..930f9a69 --- /dev/null +++ b/tsconfig.eslint.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "include": [ + // ... + "babel.config.js" + ] + } \ No newline at end of file diff --git a/utils/badValues.ts b/utils/badValues.ts index 0bb4da75..0414806e 100644 --- a/utils/badValues.ts +++ b/utils/badValues.ts @@ -10,6 +10,6 @@ export const bad = () => null as unknown as T; export const mapBad = (val: T) => (isBad(val) ? bad() : val); export const with_default = - (def: T) => - (val: T) => - isBad(val) ? def! : val; + (def: NonNullable) => + (val: T): NonNullable => + isBad(val) ? def : (val as NonNullable); diff --git a/utils/fetchGraphQL.ts b/utils/fetchGraphQL.ts index 9d31ad30..245d682c 100644 --- a/utils/fetchGraphQL.ts +++ b/utils/fetchGraphQL.ts @@ -1,13 +1,14 @@ import { keystoneNextjsBuildApiKey, keyStoneHost } from '../keystone'; import { log, xlog } from '../utils/logging'; import { GraphQLOutput } from '../wrap_any'; +import { bad } from './badValues'; export const gql = ([content]: TemplateStringsArray) => content; -export async function fetchGraphQL_inject_api_key( +export const fetchGraphQL_inject_api_key = async ( query: string, variables?: GraphQLOutput -) { +) => { //Intentionally create an undefined to test HardenedAny //var x; //log().success(x); @@ -27,10 +28,10 @@ export async function fetchGraphQL_inject_api_key( .then(x => x.json()) .then(({ data }) => { log().success('Next build: json: rx'); - return data; + return data as T; }) .catch(msg => { log().warning('Next build: did not recieve static site data: ' + msg); - return null; + return bad(); }); -} +}; diff --git a/utils/logging.ts b/utils/logging.ts index 9af98e7d..78bc94c2 100644 --- a/utils/logging.ts +++ b/utils/logging.ts @@ -1,9 +1,9 @@ -import { HardenedAny } from '../wrap_any'; +import { LoggingAny } from '../wrap_any'; import colors from 'colors/safe'; import ErrorStackParser from 'error-stack-parser'; -// Logging is one place where HardenedAny is needed! The intent was object dumping code, down to +// Logging is one place where LoggingAny is needed! The intent was object dumping code, down to // every leaf, in a hardened way. A testground for DRY logging in ts. // Closures are good for logging, localising to particular files/functions/lines, and returning a continuation. @@ -102,7 +102,7 @@ export const logContextInfoGen = (logger: LoggerFun) => (col: ColFun) => (msgRenderer: LogEventRenderer) => - (toBeLogged: HardenedAny): TretObj => { + (toBeLogged: LoggingAny): TretObj => { if (toBeLogged === undefined) return logContextInfoGen(retObj)(logger)(warningCol)(stackRenderer)( undefinedVariableMsg @@ -137,7 +137,7 @@ const logContextInfo = (retObj: TretObj) => (col: ColFun) => (msgRenderer: LogEventRenderer) => - (a: HardenedAny): TretObj => + (a: LoggingAny): TretObj => logContextInfoGen(retObj)(simpleLogger)(col)(msgRenderer)(a); export class logclos { @@ -148,43 +148,43 @@ export class logclos { return this.depth ? abbreviatedRenderer : fileLineRenderer; } - warning(a: HardenedAny): this { + warning(a: LoggingAny): this { return logContextInfo(this)(warningCol)(this.renderer())(a); } - error(a: HardenedAny): this { + error(a: LoggingAny): this { return logContextInfo(this)(errorCol)(this.renderer())(a); } - success(a: HardenedAny): this { + success(a: LoggingAny): this { return logContextInfo(this)(successCol)(this.renderer())(a); } - trace(a: HardenedAny): this { + trace(a: LoggingAny): this { return logContextInfoGen(this)(simpleLogger)(fix)(stackRenderer)(a); } - info(a: HardenedAny): this { + info(a: LoggingAny): this { return logContextInfoGen(this)(simpleLogger)(fix)(this.renderer())(a); } - reportSecurityIncident(a: HardenedAny): this { + reportSecurityIncident(a: LoggingAny): this { return logContextInfo(this)(errorCol)(this.renderer())(a); } } /* eslint no-unused-vars: "off" */ export class xlogclos { - warning(a: HardenedAny): this { + warning(a: LoggingAny): this { return this; } - error(a: HardenedAny): this { + error(a: LoggingAny): this { return this; } - success(a: HardenedAny): this { + success(a: LoggingAny): this { return this; } - trace(a: HardenedAny): this { + trace(a: LoggingAny): this { return this; } - info(a: HardenedAny): this { + info(a: LoggingAny): this { return this; } - reportSecurityIncident(a: HardenedAny): this { + reportSecurityIncident(a: LoggingAny): this { return this; } } diff --git a/utils/maybeIO.ts b/utils/maybeIO.ts index 82298390..7a5ca14c 100644 --- a/utils/maybeIO.ts +++ b/utils/maybeIO.ts @@ -4,7 +4,7 @@ import { u, U, cr, sideEffect } from './unit'; import { log, xlog, fix } from './logging'; -import { isBad, mapBad, with_default } from './badValues'; +import { bad, isBad, mapBad, with_default } from './badValues'; export type IOthunk = () => T; @@ -21,28 +21,27 @@ export class IO { static root = (val: T) => makeIO(() => val); static rootfun = (thunk: () => T) => makeIO(thunk); - private readonly run = () => this.act(); - - readonly warn = - (msg: string) => - (f: (maps: T) => R) => - sideEffect(x => log().warning(msg))(f); + private readonly run = (): T => this.act(); readonly fbind = (io: (maps: T) => IO) => makeIO(() => io(mapBad(this.act())).run()); - readonly then = (f: (maps: T) => R) => + readonly then = (f: (maps: NonNullable) => R) => makeIO(() => { const x = this.act(); - return isBad(x) ? mapBad(x) : mapBad(f(x)); + return isBad(x) ? bad() : mapBad(f(x as NonNullable)); //.catch(this.warn("fbind error")(x => bad())); }); readonly fmap = this.then; + readonly promise = this.then; //give a then callback to implement the async api. - readonly exec = (def: T) => { - return { then: (f: (maps: T) => R) => f(with_default(def)(this.run())) }; + readonly exec = (def: NonNullable) => { + return { + then: (f: (maps: NonNullable) => R) => + f(with_default(def)(this.run())), + } as const; }; } diff --git a/utils/maybeIOPromise.ts b/utils/maybeIOPromise.ts index d5546dc6..f6740ccb 100644 --- a/utils/maybeIOPromise.ts +++ b/utils/maybeIOPromise.ts @@ -3,7 +3,7 @@ import { u, U, cr, sideEffect } from './unit'; import { log, xlog, fix } from './logging'; -import { isBad, mapBad, with_default } from './badValues'; +import { bad, isBad, mapBad, with_default } from './badValues'; export type IOthunk = () => Promise; @@ -26,6 +26,8 @@ export type IOthunk = () => Promise; export const makeIO = (f: IOthunk): IO => new IO(f); +export const embed = (val: T) => Promise.resolve(val); + export class IO { private act: IOthunk; @@ -34,16 +36,10 @@ export class IO { } //Embed values and functions - static root = (val: T) => makeIO(() => Promise.resolve(val)); - static rootfun = (thunk: () => T) => - makeIO(() => Promise.resolve(thunk())); - - private readonly run = () => this.act(); + static root = (val: T) => makeIO(() => embed(val)); + static rootfun = (thunk: () => T) => makeIO(() => embed(thunk())); - readonly warn = - (msg: string) => - (f: (maps: T) => R) => - sideEffect(x => log().warning(msg))(f); + readonly run = () => this.act(); readonly fbind = (io: (maps: T) => IO) => makeIO( @@ -51,18 +47,36 @@ export class IO { //.catch(x => this.warn("fbind error")(err => io(bad()).run())) ); - readonly then = (f: (maps: T) => R) => - makeIO(() => { - return this.act().then(x => (isBad(x) ? mapBad(x) : mapBad(f(x)))); - //.catch(this.warn("fbind error")(x => bad())); + readonly then = (f: (maps: NonNullable) => R) => + makeIO(() => + this.act().then(x => + isBad(x) ? embed(bad()) : embed(mapBad(f(x as NonNullable))) + ) + ); + //.catch(this.warn("fbind error")(x => bad())); + + readonly promise = (f: (maps: NonNullable) => Promise) => + makeIO(() => + this.run().then(x => + isBad(x) ? bad>() : mapBad(f(x as NonNullable)) + ) + ); + readonly info = () => + this.then(x => { + log().info(x); + return x; }); readonly fmap = this.then; - readonly exec = (def: T) => { + readonly exec = (def: NonNullable) => { + const prom = embed(def); return this.run() - .then(x => with_default(def)(x)) - .catch(x => this.warn(x.toString())(z => def)) + .then(x => embed(with_default(def)(x))) + .catch(x => { + console.warn(x); + return prom; + }) .finally(); }; } diff --git a/wrap_any.ts b/wrap_any.ts index 051305cb..da66d8a2 100644 --- a/wrap_any.ts +++ b/wrap_any.ts @@ -28,7 +28,7 @@ export type HardenedAny = WrappedRampantlyPolymorphic; // A JSX type? -export type DocumentType = WrappedRampantlyPolymorphic; +export type DocumentAny = WrappedRampantlyPolymorphic; // These have taken hours of time to resolve, with no joy, and have found a temporary home here ... export type ItemType = WrappedRampantlyPolymorphic; diff --git a/yarn.lock b/yarn.lock index 172e951a..cda37b62 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1419,6 +1419,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== +"@types/node@^16.11.3": + version "16.11.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.3.tgz#fad0b069ec205b0e81429c805d306d2c12e26be1" + integrity sha512-aIYL9Eemcecs1y77XzFGiSc+FdfN58k4J23UEe6+hynf4Wd9g4DzQPwIKL080vSMuubFqy2hWwOzCtJdc6vFKw== + "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" From b18b01121b0967604989ae500c9e2d6868dd903f Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 02:06:55 +0100 Subject: [PATCH 184/325] Typesafe monads: gql/fetch. As dry as pos wout asts --- pages/index.tsx | 1 - pages/post/[slug].tsx | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pages/index.tsx b/pages/index.tsx index f67c0e3e..5b8ba037 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -103,7 +103,6 @@ const fetchScript = makeIO (() => export async function getStaticProps() { return fetchScript - .info () .exec ([]) .then (postsRx => { return { props: { posts: postsRx }, revalidate: 60 } }) } diff --git a/pages/post/[slug].tsx b/pages/post/[slug].tsx index 5970ead2..da8afa12 100644 --- a/pages/post/[slug].tsx +++ b/pages/post/[slug].tsx @@ -105,7 +105,7 @@ const fetchStaticProps = (staticProps: GetStaticPropsContext) => } `, { slug: pslug })) - .info() + //.info() .then (data => data.post) ; From 7a7e6bff233eeec957cefb216b2ae8ef62f42183 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 03:21:00 +0100 Subject: [PATCH 185/325] es plugin react: no warnings --- .eslint.js | 2 +- .eslintrc.json | 3 ++- components/auth.tsx | 6 ++++-- components/ui/controls.tsx | 2 +- components/ui/forms.tsx | 2 +- components/ui/icons.tsx | 2 +- components/ui/layout.tsx | 2 +- components/ui/typography.tsx | 2 +- package.json | 1 + pages/_app.tsx | 2 +- pages/index.tsx | 8 ++++---- pages/post/[slug].tsx | 8 +++----- pages/signin.tsx | 11 ++++++----- pages/signup.tsx | 8 ++++++-- pages/ui.tsx | 2 ++ schema/content.ts | 4 ++-- utils/fetchGraphQL.ts | 4 ++-- utils/gotoPage.ts | 8 ++++++++ utils/maybeIO.ts | 2 +- utils/maybeIOPromise.ts | 7 +++++-- wrap_any.ts | 3 ++- yarn.lock | 2 +- 22 files changed, 56 insertions(+), 35 deletions(-) create mode 100644 utils/gotoPage.ts diff --git a/.eslint.js b/.eslint.js index d261ada0..4c9cda7f 100644 --- a/.eslint.js +++ b/.eslint.js @@ -18,5 +18,5 @@ module.exports = { "prettier/@typescript-eslint", "plugin:@typescript-eslint/recommended", "plugin:@typescript-eslint/recommended-requiring-type-checking", - ], + ] } \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json index 649a5be4..45d9ac3b 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -2,6 +2,7 @@ "extends": [ "next/core-web-vitals", "eslint:recommended", - "plugin:@typescript-eslint/recommended" + "plugin:@typescript-eslint/recommended", + "plugin:react/recommended" ] } diff --git a/components/auth.tsx b/components/auth.tsx index 717a2a9f..908c58e5 100644 --- a/components/auth.tsx +++ b/components/auth.tsx @@ -1,4 +1,4 @@ -import { +import React, { createContext, useRef, useMemo, @@ -9,9 +9,11 @@ import { import { gql, useQuery, useMutation, OperationResult} from 'urql'; import { Tfun } from '../utils/func' + +import { AuthenticationResponseAny } from '../wrap_any'; //Security audit: //Pushed an `any` one depth lower into urql. -export type AuthenticationResponse = OperationResult +export type AuthenticationResponse = OperationResult export type SignInArgs = { email: string; password: string }; export type SignInResult = diff --git a/components/ui/controls.tsx b/components/ui/controls.tsx index 9a68e925..94057355 100644 --- a/components/ui/controls.tsx +++ b/components/ui/controls.tsx @@ -1,4 +1,4 @@ -import { ButtonHTMLAttributes } from 'react'; +import React, { ButtonHTMLAttributes } from 'react'; import cx from 'classnames'; export function Button({ diff --git a/components/ui/forms.tsx b/components/ui/forms.tsx index 1ed48acc..12198869 100644 --- a/components/ui/forms.tsx +++ b/components/ui/forms.tsx @@ -1,4 +1,4 @@ -import { +import React, { HTMLAttributes, InputHTMLAttributes, SelectHTMLAttributes, diff --git a/components/ui/icons.tsx b/components/ui/icons.tsx index 94428c38..a54e80f1 100644 --- a/components/ui/icons.tsx +++ b/components/ui/icons.tsx @@ -1,4 +1,4 @@ -import { SVGAttributes } from 'react'; +import React, { SVGAttributes } from 'react'; import cx from 'classnames'; export function ChevronLeft({ diff --git a/components/ui/layout.tsx b/components/ui/layout.tsx index 5abc55cc..8928870b 100644 --- a/components/ui/layout.tsx +++ b/components/ui/layout.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import React, { ReactNode } from 'react'; import { ChevronLeft } from './icons'; import { Link } from './link'; diff --git a/components/ui/typography.tsx b/components/ui/typography.tsx index b9e137a1..60cc3b7d 100644 --- a/components/ui/typography.tsx +++ b/components/ui/typography.tsx @@ -1,4 +1,4 @@ -import { HTMLAttributes } from 'react'; +import React, { HTMLAttributes } from 'react'; import cx from 'classnames'; type Alignable = { diff --git a/package.json b/package.json index 665e72ff..36750ef7 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "autoprefixer": "^10.3.7", "eslint": "7.32.0", "eslint-config-next": "11.1.2", + "eslint-plugin-react": "^7.26.1", "postcss": "^8.3.9", "prettier": "^2.4.1", "tailwindcss": "^2.2.4", diff --git a/pages/_app.tsx b/pages/_app.tsx index 2f47b738..c8ed8263 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,7 +1,7 @@ import 'tailwindcss/tailwind.css'; import type { AppProps } from 'next/app'; import { createClient, Provider } from 'urql'; - +import React from 'react' import { AuthProvider } from '../components/auth'; export const client = createClient({ diff --git a/pages/index.tsx b/pages/index.tsx index 5b8ba037..c3ebe31e 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -69,15 +69,15 @@ export type QueryPost = { }; }; -export type QueryPosts = { +export type TQueryPostsForIndex = { posts: QueryPost[] } //We can save a little time by compiling the functional code to a runtime constant -const fetchScript = makeIO (() => - fetchGraphQL_inject_api_key( +const fetchAllPostsForIndex = makeIO (() => + fetchGraphQL_inject_api_key( gql` query { posts( @@ -102,7 +102,7 @@ const fetchScript = makeIO (() => .then (data => data.posts); export async function getStaticProps() { - return fetchScript + return fetchAllPostsForIndex .exec ([]) .then (postsRx => { return { props: { posts: postsRx }, revalidate: 60 } }) } diff --git a/pages/post/[slug].tsx b/pages/post/[slug].tsx index da8afa12..d9d41107 100644 --- a/pages/post/[slug].tsx +++ b/pages/post/[slug].tsx @@ -9,8 +9,7 @@ import { Container, HomeLink } from '../../components/ui/layout'; import { H1 } from '../../components/ui/typography'; //import { PostAny } from '../../wrap_any' -import { log } from '../../utils/logging' -import { makeIO, IO, embed } from '../../utils/maybeIOPromise' +import { makeIO, IO} from '../../utils/maybeIOPromise' import { DocumentAny } from '../../wrap_any' @@ -87,7 +86,7 @@ const fetchStaticProps = (staticProps: GetStaticPropsContext) => IO.root(staticProps) .then (props => props.params) .then (params => params.slug ) - .promise(pslug => + .promise(slug => fetchGraphQL_inject_api_key( gql` query ($slug: String!) { @@ -104,8 +103,7 @@ const fetchStaticProps = (staticProps: GetStaticPropsContext) => } } `, - { slug: pslug })) - //.info() + { slug: slug })) .then (data => data.post) ; diff --git a/pages/signin.tsx b/pages/signin.tsx index 6ce241bb..76a89dad 100644 --- a/pages/signin.tsx +++ b/pages/signin.tsx @@ -7,6 +7,7 @@ import { FieldContainer, FieldLabel, TextInput } from '../components/ui/forms'; import { Link } from '../components/ui/link'; //import { useRouter } from 'next/router'; import { useAuth } from '../components/auth'; +import { gotoPage } from '../utils/gotoPage' export default function SigninPage() { const auth = useAuth(); @@ -28,11 +29,11 @@ export default function SigninPage() { setError(''); const result = await auth.signIn({ email, password }); if (result.success) { - // FIXME: there's a cache issue with Urql where it's not reloading the - // current user properly if we do a client-side redirect here. - // router.push('/'); - top!.location!.href = '/'; - } else { + + + gotoPage('/'); + } + else { setEmail(''); setPassword(''); setError(result.message); diff --git a/pages/signup.tsx b/pages/signup.tsx index cd992f82..5a14a3e6 100644 --- a/pages/signup.tsx +++ b/pages/signup.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import React,{ useState } from 'react'; import { gql, useMutation } from 'urql'; import { Button } from '../components/ui/controls'; @@ -7,6 +7,10 @@ import { H1 } from '../components/ui/typography'; import { FieldContainer, FieldLabel, TextInput } from '../components/ui/forms'; //import { useRouter } from 'next/router'; import { Link } from '../components/ui/link'; +import { gotoPage } from '../utils/gotoPage' + + + export default function SignupPage() { const [{ error }, signup] = useMutation(gql` @@ -38,7 +42,7 @@ export default function SignupPage() { // FIXME: there's a cache issue with Urql where it's not reloading the // current user properly if we do a client-side redirect here. // router.push('/'); - top!.location!.href = '/'; + gotoPage('/'); } }); }} diff --git a/pages/ui.tsx b/pages/ui.tsx index 8a6e993d..432aa86e 100644 --- a/pages/ui.tsx +++ b/pages/ui.tsx @@ -1,6 +1,8 @@ +import React from 'react' import { Container, Divider } from '../components/ui/layout'; import { H1, H2, H3, H4, H5, H6 } from '../components/ui/typography'; + export default function UIPage() { return ( diff --git a/schema/content.ts b/schema/content.ts index a1c6f93a..9a5f9cfa 100644 --- a/schema/content.ts +++ b/schema/content.ts @@ -20,7 +20,7 @@ import { } from './access'; import { componentBlocks } from '../schema/fields/content/components'; -import { ItemSession, GraphQLOutput } from '../wrap_any'; +import { ItemSession, GraphQLClause } from '../wrap_any'; //FIXME: // These anys are causing issues. What is the strong type? @@ -62,7 +62,7 @@ export const Label = list({ }, }); -function defaultSlug(inputData: GraphQLOutput) { +function defaultSlug(inputData: GraphQLClause) { const date = new Date(); return `${ inputData?.title diff --git a/utils/fetchGraphQL.ts b/utils/fetchGraphQL.ts index 245d682c..f354bbff 100644 --- a/utils/fetchGraphQL.ts +++ b/utils/fetchGraphQL.ts @@ -1,13 +1,13 @@ import { keystoneNextjsBuildApiKey, keyStoneHost } from '../keystone'; import { log, xlog } from '../utils/logging'; -import { GraphQLOutput } from '../wrap_any'; +import { GraphQLClause } from '../wrap_any'; import { bad } from './badValues'; export const gql = ([content]: TemplateStringsArray) => content; export const fetchGraphQL_inject_api_key = async ( query: string, - variables?: GraphQLOutput + variables?: GraphQLClause ) => { //Intentionally create an undefined to test HardenedAny //var x; diff --git a/utils/gotoPage.ts b/utils/gotoPage.ts new file mode 100644 index 00000000..ab332266 --- /dev/null +++ b/utils/gotoPage.ts @@ -0,0 +1,8 @@ +import React from 'react'; +// FIXME: there's a cache issue with Urql where it's not reloading the +// current user properly if we do a client-side redirect here. +// router.push('/'); + +export const gotoPage = (page: string) => { + if (top) if (top.location) if (top.location.href) top.location.href = page; +}; diff --git a/utils/maybeIO.ts b/utils/maybeIO.ts index 7a5ca14c..59bbb65f 100644 --- a/utils/maybeIO.ts +++ b/utils/maybeIO.ts @@ -21,7 +21,7 @@ export class IO { static root = (val: T) => makeIO(() => val); static rootfun = (thunk: () => T) => makeIO(thunk); - private readonly run = (): T => this.act(); + readonly run = (): T => this.act(); readonly fbind = (io: (maps: T) => IO) => makeIO(() => io(mapBad(this.act())).run()); diff --git a/utils/maybeIOPromise.ts b/utils/maybeIOPromise.ts index f6740ccb..596ba13c 100644 --- a/utils/maybeIOPromise.ts +++ b/utils/maybeIOPromise.ts @@ -55,13 +55,16 @@ export class IO { ); //.catch(this.warn("fbind error")(x => bad())); + //.then for promise returning functions. readonly promise = (f: (maps: NonNullable) => Promise) => makeIO(() => this.run().then(x => isBad(x) ? bad>() : mapBad(f(x as NonNullable)) ) ); - readonly info = () => + + //Monitor the current state of the environment + readonly env = () => this.then(x => { log().info(x); return x; @@ -74,7 +77,7 @@ export class IO { return this.run() .then(x => embed(with_default(def)(x))) .catch(x => { - console.warn(x); + log().warning(x); return prom; }) .finally(); diff --git a/wrap_any.ts b/wrap_any.ts index da66d8a2..308d283f 100644 --- a/wrap_any.ts +++ b/wrap_any.ts @@ -35,7 +35,7 @@ export type ItemType = WrappedRampantlyPolymorphic; export type ItemSession = WrappedRampantlyPolymorphic; //From deep down in the keystone types ... -export type GraphQLOutput = Record; +export type GraphQLClause = Record; export type PostAny = WrappedRampantlyPolymorphic; @@ -47,3 +47,4 @@ export type GithubResolverItemAny = WrappedRampantlyPolymorphic; export type SessionAny = WrappedRampantlyPolymorphic; export type LoggingAny = WrappedRampantlyPolymorphic; +export type AuthenticationResponseAny = WrappedRampantlyPolymorphic; diff --git a/yarn.lock b/yarn.lock index cda37b62..a1b4afde 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3303,7 +3303,7 @@ eslint-plugin-react-hooks@^4.2.0: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== -eslint-plugin-react@^7.23.1: +eslint-plugin-react@^7.23.1, eslint-plugin-react@^7.26.1: version "7.26.1" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.26.1.tgz#41bcfe3e39e6a5ac040971c1af94437c80daa40e" integrity sha512-Lug0+NOFXeOE+ORZ5pbsh6mSKjBKXDXItUD2sQoT+5Yl0eoT82DqnXeTMfUare4QVCn9QwXbfzO/dBLjLXwVjQ== From f2400753378b30fb9858ea8821296363d5432b8c Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 03:33:30 +0100 Subject: [PATCH 186/325] Tidy up YAML --- .github/workflows/latest.yml | 35 +++++++++++++---------------------- README.md | 6 ++++++ 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index e1603406..c62924da 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -1,7 +1,5 @@ # This is a basic workflow to help you get started with Actions - name: CI - # Controls when the workflow will run on: # Triggers the workflow on push or pull request events but only for the main branch @@ -9,10 +7,8 @@ on: branches: [latest] pull_request: branches: [latest] - # Allows you to run this workflow manually from the Actions tab workflow_dispatch: - # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: # This workflow contains a single job called "build" @@ -34,10 +30,10 @@ jobs: POSTGRES_PASSWORD: change_me_in_multiple_places POSTGRES_PORT: 5432 POSTGRES_USER: postgres_user - + steps: - name: Dump github context - run: echo "$GITHUB_CONTEXT" + run: echo "$GITHUB_CONTEXT" shell: bash env: GITHUB_CONTEXT: ${{ toJson(github) }} @@ -46,34 +42,29 @@ jobs: uses: actions/checkout@v2 - name: Run yarn - run: | + run: | cd $GITHUB_WORKSPACE ls -alt yarn env: - DATABASE_URL: "postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest" - + DATABASE_URL: "postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest" + - name: Start keystone/Next - run: | + run: | yarn dev & - env: KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 DATABASE_URL: "postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest" - - name: Start next build - run: | + - name: Start next build + run: | echo "Sleeping to give time for Keystone to kick in. WIP: full micro service yml" - sleep 5 - echo "Building unseeded production server: " - yarn site:build - echo "✅ Success: built unseeded production services" - sleep 25 + sleep 5 + echo "Building unseeded production server: " + yarn site:build + echo "✅ Success: built unseeded production services" + sleep 25 env: KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 DATABASE_URL: "postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest" - - - - # Deploy: diff --git a/README.md b/README.md index a16afb06..308d641f 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,8 @@ This branch is dedicated to creating a solid foundation for a production build t code inspector badge +https://www.code-inspector.com/project/29475/status/svg + Currently working on the low code style core, which hates `any` just as much as I do, and spots the tiniest of issues. Industry best practise is a useful side effect of harsh CI tooling. @@ -298,6 +300,10 @@ The definitive install instructions, assuming fedora, bar seeding, are in the wo Install it like this and you know you will get the latest CI build. ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) +https://www.code-inspector.com/project/29475/status/svg + +https://www.code-inspector.com/project/29475/score/svg + If for some reason, the latest CI build is failing (it happens!), find the last good build. As it stands, the yml specifies a test, not a production framework. Seeding and post seeding CI unit tests: The harsh test of From c6396ce4f0604c05151e02d4ee1b2febc1241c64 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 03:36:43 +0100 Subject: [PATCH 187/325] Badges --- README.md | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 308d641f..14525d11 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,10 @@ This branch is dedicated to creating a solid foundation for a production build t code inspector badge -https://www.code-inspector.com/project/29475/status/svg + + + Currently working on the low code style core, which hates `any` just as much as I do, and spots the tiniest of issues. Industry best practise is a useful side effect of harsh CI tooling. @@ -300,9 +303,17 @@ The definitive install instructions, assuming fedora, bar seeding, are in the wo Install it like this and you know you will get the latest CI build. ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) -https://www.code-inspector.com/project/29475/status/svg + + + + + + + + -https://www.code-inspector.com/project/29475/score/svg If for some reason, the latest CI build is failing (it happens!), find the last good build. As it stands, the yml specifies a test, not a production framework. From bbb7643f08f01dfed641410633aaaa4fbc847cc8 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 03:38:19 +0100 Subject: [PATCH 188/325] Badges : 2 --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 14525d11..6fd62754 100644 --- a/README.md +++ b/README.md @@ -63,17 +63,17 @@ utils.js ## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) - + + + This branch is dedicated to creating a solid foundation for a production build to extend Keystone 6 CMS from. code inspector badge - - - + Currently working on the low code style core, which hates `any` just as much as I do, and spots the tiniest of issues. Industry best practise is a useful side effect of harsh CI tooling. From 669f3ca883c9891f648f52592b5c41d9b6553a07 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 03:39:06 +0100 Subject: [PATCH 189/325] Badges : 3 --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6fd62754..0208df07 100644 --- a/README.md +++ b/README.md @@ -300,9 +300,6 @@ Production build: The definitive install instructions, assuming fedora, bar seeding, are in the workflow file: https://github.com/qfunq/prisma-day-2021-workshop/blob/latest/.github/workflows/latest.yml - -Install it like this and you know you will get the latest CI build. ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) - code inspector grade @@ -312,6 +309,9 @@ alt="code inspector grade" /> code inspector score +Install it like this and you know you will get the latest CI build. ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) + + From 60d8a4a345b5d6c0b78243ffcfe6e16c2372b33e Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 03:41:37 +0100 Subject: [PATCH 190/325] Badges : 4 --- README.md | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 0208df07..ee5cfbb6 100644 --- a/README.md +++ b/README.md @@ -62,16 +62,11 @@ utils.js -## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) - - - +## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg,https://www.code-inspector.com/project/29475/status/svg,https://frontend.code-inspector.com/public/user/github/qfunq ) + This branch is dedicated to creating a solid foundation for a production build to extend Keystone 6 CMS from. - - code inspector badge - + From e961ac9615d5278e1c7ca30372dec31cba2b95e5 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 03:42:45 +0100 Subject: [PATCH 191/325] Badges : 5 --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ee5cfbb6..5d3bc0de 100644 --- a/README.md +++ b/README.md @@ -62,8 +62,14 @@ utils.js -## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg,https://www.code-inspector.com/project/29475/status/svg,https://frontend.code-inspector.com/public/user/github/qfunq ) - +## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) + + + + +alt="code inspector badge" /> + This branch is dedicated to creating a solid foundation for a production build to extend Keystone 6 CMS from. From f78c9ccb28351f398c2efa245f6efef397fdf448 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 03:44:24 +0100 Subject: [PATCH 192/325] Badges : 6 --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5d3bc0de..f32e659f 100644 --- a/README.md +++ b/README.md @@ -63,15 +63,16 @@ utils.js ## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) + code inspector grade -alt="code inspector badge" /> + code inspector badge -This branch is dedicated to creating a solid foundation for a production build to extend Keystone 6 CMS from. +This branch is dedicated to creating a solid foundation for a production build to extend Keystone 6 CMS from. From e4e6394cf8c64fcfe52a5a1eaab69bdcacc1cca1 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 03:46:51 +0100 Subject: [PATCH 193/325] Badges : 7 --- README.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f32e659f..60a7cd60 100644 --- a/README.md +++ b/README.md @@ -62,16 +62,21 @@ utils.js -## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) +## About the latest branch: + code inspector badge + + +![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) code inspector grade - - code inspector badge - + + + This branch is dedicated to creating a solid foundation for a production build to extend Keystone 6 CMS from. @@ -309,7 +314,7 @@ alt="code inspector grade" /> +alt="code quality score" /> Install it like this and you know you will get the latest CI build. ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) From 602fa11be95232822b73dbfb2daa0ceb30f7fb27 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 03:48:43 +0100 Subject: [PATCH 194/325] Badges --- README.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 60a7cd60..595f10ab 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,9 @@ utils.js -## About the latest branch: +## About the latest branch: + + code inspector badge @@ -77,6 +79,7 @@ alt="code inspector grade" /> code quality score + This branch is dedicated to creating a solid foundation for a production build to extend Keystone 6 CMS from. @@ -306,7 +309,12 @@ Production build: The definitive install instructions, assuming fedora, bar seeding, are in the workflow file: - https://github.com/qfunq/prisma-day-2021-workshop/blob/latest/.github/workflows/latest.yml + + code inspector badge + + +![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) + code inspector grade @@ -316,6 +324,8 @@ alt="code inspector grade" /> code quality score + + Install it like this and you know you will get the latest CI build. ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) From efa572937edbe06a77090ef52744fc963d916be9 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 03:50:07 +0100 Subject: [PATCH 195/325] Badges --- README.md | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 595f10ab..349f68dc 100644 --- a/README.md +++ b/README.md @@ -313,20 +313,19 @@ The definitive install instructions, assuming fedora, bar seeding, are in the wo code inspector badge -![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) - + + + + + +Install it like this and you know you will get the latest CI build. ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) code inspector grade - - - + code quality score - - - -Install it like this and you know you will get the latest CI build. ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) + From 8af4a15d45273cf8f13a435ca358a85ca62008e7 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 03:51:33 +0100 Subject: [PATCH 196/325] Badges --- README.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 349f68dc..8a7f8488 100644 --- a/README.md +++ b/README.md @@ -68,17 +68,15 @@ utils.js code inspector badge -![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) - - +![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) code inspector grade - - - + code quality score - + + + This branch is dedicated to creating a solid foundation for a production build to extend Keystone 6 CMS from. From 3ca8b7d14ada183e306f4d6c0e60941c90414ba9 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 03:51:59 +0100 Subject: [PATCH 197/325] Badges --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 8a7f8488..5cde50e6 100644 --- a/README.md +++ b/README.md @@ -62,13 +62,7 @@ utils.js -## About the latest branch: - - - code inspector badge - - -![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) +## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) code inspector grade @@ -76,6 +70,12 @@ alt="code inspector grade" /> alt="code quality score" /> + + code inspector badge + + + + This branch is dedicated to creating a solid foundation for a production build to extend Keystone 6 CMS from. From 5dfdb972ac2609e89bef446f8f20bd9826aaf17f Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 03:52:44 +0100 Subject: [PATCH 198/325] Badges --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5cde50e6..3a4ae6c2 100644 --- a/README.md +++ b/README.md @@ -62,10 +62,8 @@ utils.js -## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) - - +## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) code quality score From 3de78a0de32e092ab88a06267de36515a54d7f98 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 03:54:09 +0100 Subject: [PATCH 199/325] Badges --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3a4ae6c2..5cde50e6 100644 --- a/README.md +++ b/README.md @@ -62,8 +62,10 @@ utils.js -## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) +## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) + + code quality score From c8126cacdcfa564df5f72f13f2cd77f67fd01de6 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 03:56:07 +0100 Subject: [PATCH 200/325] Badges --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5cde50e6..014a75ac 100644 --- a/README.md +++ b/README.md @@ -64,11 +64,9 @@ utils.js ## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) - +alt="code inspector grade" /> - +alt="code quality score" /> code inspector badge From 1889ca33a0137726b2bc030963afc86c96d7a5a2 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 03:57:37 +0100 Subject: [PATCH 201/325] Badges --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 014a75ac..b0d71e55 100644 --- a/README.md +++ b/README.md @@ -62,10 +62,7 @@ utils.js -## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) - - code inspector grade code quality score From e326935b57587bceb44550970f53336c94648c32 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 03:59:02 +0100 Subject: [PATCH 202/325] Badges --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b0d71e55..c1d845e3 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,12 @@ utils.js -## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) code inspector grade + + + code quality score From 64a0273aa27f0adc777f12001623a8f7e7c85413 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 04:00:05 +0100 Subject: [PATCH 203/325] Badges --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c1d845e3..01666701 100644 --- a/README.md +++ b/README.md @@ -70,9 +70,7 @@ alt="code inspector grade" /> code quality score - - code inspector badge - + @@ -325,7 +323,9 @@ alt="code inspector grade" /> alt="code quality score" /> - + + code inspector badge + From 5cb9f2071867057e2324591575073710d0451a9a Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 04:01:00 +0100 Subject: [PATCH 204/325] Badges --- README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/README.md b/README.md index 01666701..362e8d48 100644 --- a/README.md +++ b/README.md @@ -305,13 +305,6 @@ Production build: The definitive install instructions, assuming fedora, bar seeding, are in the workflow file: - - code inspector badge - - - - - From 9f768a86eb00204c3155d7ae96084c9f29df2205 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 04:01:56 +0100 Subject: [PATCH 205/325] Badges --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 362e8d48..8f71d0fd 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,9 @@ utils.js -## About the latest branch: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) +## About the latest branch: + +CI status: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) code inspector grade From 408bd478555634fcb3f82fd69783e1ea0d77f2db Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 04:13:07 +0100 Subject: [PATCH 206/325] Maps type functions to fix ESlint violations in logging. --- README.md | 4 ++-- components/auth.tsx | 4 ++-- utils/func.ts | 2 +- utils/logging.ts | 9 +++++---- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 8f71d0fd..67c29db8 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ utils.js ## About the latest branch: -CI status: ![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) +![workflow](https://github.com/qfunq/prisma-day-2021-workshop/actions/workflows/latest.yml/badge.svg) code inspector grade @@ -155,7 +155,7 @@ Status: `Preliminary`. ## TL;DR `(a: T)` is a type safe replacement for many cases of `(a: any)`, because we need to trap the awkward `undefined` cases at build time. -`Tfun` eliminates the dummy variable in some functional type definitions, in a lint friendly way. +`Maps` eliminates the dummy variable in some functional type definitions, in a lint friendly way. This is both more succinct, and more appropriate for usage in point free type descriptions. diff --git a/components/auth.tsx b/components/auth.tsx index 908c58e5..d524948b 100644 --- a/components/auth.tsx +++ b/components/auth.tsx @@ -8,7 +8,7 @@ import React, { } from 'react'; import { gql, useQuery, useMutation, OperationResult} from 'urql'; -import { Tfun } from '../utils/func' +import { Maps } from '../utils/func' import { AuthenticationResponseAny } from '../wrap_any'; //Security audit: @@ -28,7 +28,7 @@ type AuthContextType = ready: true; sessionData?: { id: string; name: string }; - signIn: Tfun>; + signIn: Maps>; diff --git a/utils/func.ts b/utils/func.ts index 72fb1c06..2831c3dc 100644 --- a/utils/func.ts +++ b/utils/func.ts @@ -1,2 +1,2 @@ // eslint-disable-line no-unused-vars -export type Tfun = (maps: D) => R; +export type Maps = (maps: D) => R; diff --git a/utils/logging.ts b/utils/logging.ts index 78bc94c2..2e8105a9 100644 --- a/utils/logging.ts +++ b/utils/logging.ts @@ -2,6 +2,7 @@ import { LoggingAny } from '../wrap_any'; import colors from 'colors/safe'; import ErrorStackParser from 'error-stack-parser'; +import { Maps } from './func'; // Logging is one place where LoggingAny is needed! The intent was object dumping code, down to // every leaf, in a hardened way. A testground for DRY logging in ts. @@ -20,9 +21,9 @@ interface CleanError { stack: string; } -export type LogEventRenderer = (maps: CleanError) => string; +export type LogEventRenderer = Maps; -export type ColFun = (maps: string) => string; +export type ColFun = Maps; export const sep = ': '; @@ -36,7 +37,7 @@ export const unknownLineAndFileMsg = export const cantOpenErrorMsg = baseErrorMsg + 'Cant access stack info from Error()' + sep; -export type LoggerFun = (maps: string) => void; +export type LoggerFun = Maps; export const simpleLogger = (msg: string) => console.log(msg); export const dateRenderer = (msg: string): string => { return Date() + sep + msg; @@ -188,7 +189,7 @@ export class xlogclos { return this; } } -/* eslint no-unused-vars: "error" */ export const log = () => new logclos(); export const xlog = () => new xlogclos(); +/* eslint no-unused-vars: "error" */ From 46a35d20fb73783c8bac1f8e8805c8d4df1ae579 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 04:19:22 +0100 Subject: [PATCH 207/325] Readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 67c29db8..ef55cd3a 100644 --- a/README.md +++ b/README.md @@ -155,7 +155,7 @@ Status: `Preliminary`. ## TL;DR `(a: T)` is a type safe replacement for many cases of `(a: any)`, because we need to trap the awkward `undefined` cases at build time. -`Maps` eliminates the dummy variable in some functional type definitions, in a lint friendly way. +`Maps` (reads: `maps domain to range`) eliminates the dummy variable in some functional type definitions, in a lint friendly way. This is both more succinct, and more appropriate for usage in point free type descriptions. From 361e211cadec6ad614e4e9ea11d1416c8fcf5092 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 06:19:20 +0100 Subject: [PATCH 208/325] Logging style --- utils/badValues.ts | 9 ++++++--- utils/logging.ts | 14 +++++++++++--- utils/maybeIOPromise.ts | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/utils/badValues.ts b/utils/badValues.ts index 0414806e..925aba58 100644 --- a/utils/badValues.ts +++ b/utils/badValues.ts @@ -1,9 +1,12 @@ +import { U } from './unit'; + export type BadData = undefined | null; -export type Possibly = T | BadData; +export type RemoveType = Dest extends Base ? never : ToGo; + +export type WellTyped = RemoveType, null, any>; -export const isBad = (value: Possibly) => - value === null || value === undefined; +export const isBad = (value: T) => value === null || value === undefined; export const bad = () => null as unknown as T; diff --git a/utils/logging.ts b/utils/logging.ts index 2e8105a9..be216251 100644 --- a/utils/logging.ts +++ b/utils/logging.ts @@ -60,12 +60,13 @@ export const fileLineRenderer = (e: CleanError) => { ); }; +// eslint-disable-line no-unused-vars export const abbreviatedRenderer = (e: CleanError): string => { return ''; }; export const stackRenderer = (e: CleanError): string => { - let str: string = ''; + let str = ''; ErrorStackParser.parse(e)?.map((elem: ErrorStackParser.StackFrame) => { const scope = @@ -168,28 +169,35 @@ export class logclos { return logContextInfo(this)(errorCol)(this.renderer())(a); } } -/* eslint no-unused-vars: "off" */ + export class xlogclos { + // eslint-disable-line no-unused-vars warning(a: LoggingAny): this { return this; } + // eslint-disable-line no-unused-vars error(a: LoggingAny): this { return this; } + // eslint-disable-line no-unused-vars success(a: LoggingAny): this { return this; } + // eslint-disable-line no-unused-vars trace(a: LoggingAny): this { return this; } + // eslint-disable-line no-unused-vars info(a: LoggingAny): this { return this; } + // eslint-disable-line no-unused-vars reportSecurityIncident(a: LoggingAny): this { return this; } } export const log = () => new logclos(); + +// eslint-disable-line no-unused-vars export const xlog = () => new xlogclos(); -/* eslint no-unused-vars: "error" */ diff --git a/utils/maybeIOPromise.ts b/utils/maybeIOPromise.ts index 596ba13c..88efcb0c 100644 --- a/utils/maybeIOPromise.ts +++ b/utils/maybeIOPromise.ts @@ -3,7 +3,7 @@ import { u, U, cr, sideEffect } from './unit'; import { log, xlog, fix } from './logging'; -import { bad, isBad, mapBad, with_default } from './badValues'; +import { bad, isBad, mapBad, with_default, WellTyped } from './badValues'; export type IOthunk = () => Promise; From 8802bc4e9ab29961684fba2bcdf5da0bf3168b68 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 06:58:31 +0100 Subject: [PATCH 209/325] Logging code style + --- utils/maybeIOPromise.ts | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/utils/maybeIOPromise.ts b/utils/maybeIOPromise.ts index 88efcb0c..06d41b68 100644 --- a/utils/maybeIOPromise.ts +++ b/utils/maybeIOPromise.ts @@ -1,9 +1,9 @@ import reader from 'readline-sync'; -import { u, U, cr, sideEffect } from './unit'; +import { u, U } from './unit'; -import { log, xlog, fix } from './logging'; +import { log } from './logging'; -import { bad, isBad, mapBad, with_default, WellTyped } from './badValues'; +import { bad, isBad, mapBad, with_default } from './badValues'; export type IOthunk = () => Promise; @@ -91,6 +91,7 @@ export const putStr = (env: T) => (s: string) => new Promise(resolved => { + // eslint-disable-line no-unused-vars process.stdout.write(s, z => resolved(env)); return env; }); @@ -100,14 +101,18 @@ export const putStr = export const putStrM = (s: string) => makeIO(() => putStr(s)(s)); export const getLine = () => reader.question(''); - -export const getStrM = (x: U) => IO.rootfun(getLine); - export const pure = (x: T) => IO.root(x); +// disable the error, but lint has a point, the environment is lost +// synchronous, because async keyboard IO is a pain. + +// eslint-disable-line no-unused-vars +export const getStrM = (x: U) => IO.root(x).then(z => getLine()); export const prompt = (str: string) => - (x: V) => + (x: V) => { putStrM(str); + return x; + }; export const ioRoot = IO.root(u); From 0f4bf942c2b7da31de9caf79eb1c0bef014e18e6 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 07:44:11 +0100 Subject: [PATCH 210/325] Typesafe add prop --- utils/func.ts | 8 ++++++++ utils/maybeIO.ts | 2 +- utils/maybeIOPromise.ts | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/utils/func.ts b/utils/func.ts index 2831c3dc..4c866c6a 100644 --- a/utils/func.ts +++ b/utils/func.ts @@ -1,2 +1,10 @@ // eslint-disable-line no-unused-vars export type Maps = (maps: D) => R; + +// typescript is better at deducing the types of curried types than uncurried, +// thus this style of definition is necessary to eliminate the need for the dreaded polymorphic types. + +export const addPropValue = + (oldData: O) => + (newDataFun: (old: O) => N): O & N => + Object.assign({}, oldData, newDataFun(oldData)); diff --git a/utils/maybeIO.ts b/utils/maybeIO.ts index 59bbb65f..42bf00e4 100644 --- a/utils/maybeIO.ts +++ b/utils/maybeIO.ts @@ -69,4 +69,4 @@ export const prompt = (x: V) => putStrM(str); -export const ioRoot = IO.root(u); +export const ioRoot = pure(u); diff --git a/utils/maybeIOPromise.ts b/utils/maybeIOPromise.ts index 06d41b68..0c90ce80 100644 --- a/utils/maybeIOPromise.ts +++ b/utils/maybeIOPromise.ts @@ -106,7 +106,7 @@ export const pure = (x: T) => IO.root(x); // synchronous, because async keyboard IO is a pain. // eslint-disable-line no-unused-vars -export const getStrM = (x: U) => IO.root(x).then(z => getLine()); +export const getStrM = (x: U) => pure(x).then(z => getLine()); export const prompt = (str: string) => @@ -115,4 +115,4 @@ export const prompt = return x; }; -export const ioRoot = IO.root(u); +export const ioRoot = pure(u); From 6ef0bb69686d84dd6cd79b35103247199bb63ebf Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 09:56:04 +0100 Subject: [PATCH 211/325] yarn lint: failing: harsher than CI build --- .eslint.js | 22 -- .eslint.rc | 59 ++++ .eslintrc.json | 4 +- keystone.ts | 2 +- package.json | 11 +- pages/_app.tsx | 46 +-- pages/index.tsx | 208 ++++++------ pages/post/[slug].tsx | 239 +++++++------ pages/signin.tsx | 170 +++++----- pages/signup.tsx | 178 +++++----- schema/access.ts | 3 +- schema/fields/content/components.tsx | 406 +++++++++++------------ schema/fields/content/renderers.tsx | 378 ++++++++++----------- schema/fields/githubRepos/components.tsx | 8 +- schema/mutations.ts | 2 +- schema/users.ts | 27 +- tsconfig.eslint.json | 7 - tsconfig.json | 4 +- utils/badValues.ts | 4 - utils/fetchGraphQL.ts | 4 +- utils/func.ts | 4 +- utils/gotoPage.ts | 1 - utils/maybeIO.ts | 4 +- utils/maybeIOPromise.ts | 8 +- utils/unit.ts | 14 +- wrap_any.ts | 1 - yarn.lock | 67 ++-- 27 files changed, 958 insertions(+), 923 deletions(-) delete mode 100644 .eslint.js create mode 100644 .eslint.rc delete mode 100644 tsconfig.eslint.json diff --git a/.eslint.js b/.eslint.js deleted file mode 100644 index 4c9cda7f..00000000 --- a/.eslint.js +++ /dev/null @@ -1,22 +0,0 @@ -module.exports = { - root: true, - env: { - node: true, - }, - globals: { - Promise: "readonly" - }, - parser: "@typescript-eslint/parser", - parserOptions: { - sourceType: "module", - tsconfigRootDir: __dirname, - project: ["./tsconfig.eslint.json"], - }, - plugins: ["@typescript-eslint"], - extends: [ - "eslint:recommended", - "prettier/@typescript-eslint", - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/recommended-requiring-type-checking", - ] - } \ No newline at end of file diff --git a/.eslint.rc b/.eslint.rc new file mode 100644 index 00000000..e20d1b56 --- /dev/null +++ b/.eslint.rc @@ -0,0 +1,59 @@ +module.exports = { + env: { + browser: true, + node: true, + es2020: true, + }, + parser: "@typescript-eslint/parser", + parserOptions: { + ecmaVersion: 2020, + sourceType: "module", + ecmaFeatures: { + jsx: true, + }, + }, + plugins: ["@typescript-eslint", "react", "prettier"], + extends: [ + "airbnb", + "airbnb/hooks", + "plugin:@typescript-eslint/recommended", + "plugin:react/recommended", + "plugin:import/errors", + "plugin:import/warnings", + "plugin:import/typescript", + "prettier", + "prettier/@typescript-eslint", + "prettier/react", + ], + rules: { + "react/jsx-filename-extension": [1, { extensions: [".ts", ".tsx"] }], + "import/extensions": "off", + "react/prop-types": "off", + "jsx-a11y/anchor-is-valid": "off", + "react/jsx-props-no-spreading": ["error", { custom: "ignore" }], + "prettier/prettier": "error", + "react/no-unescaped-entities": "off", + "import/no-cycle": [0, { ignoreExternal: true }], + "prefer-const": "off", + // needed because of https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-use-before-define.md#how-to-use & https://stackoverflow.com/questions/63818415/react-was-used-before-it-was-defined + "no-use-before-define": "off", + "@typescript-eslint/no-use-before-define": [ + "error", + { functions: false, classes: false, variables: true }, + + "no-unused-vars": ["error", { "vars": "all", "args": "after-used", "ignoreRestSiblings": false, "varsIgnorePattern": "[iI]gnored" }] + + ], + }, + settings: { + "import/resolver": { + "babel-module": { + extensions: [".js", ".jsx", ".ts", ".tsx"], + }, + node: { + extensions: [".js", ".jsx", ".ts", ".tsx"], + paths: ["src"], + }, + }, + }, +}; diff --git a/.eslintrc.json b/.eslintrc.json index 45d9ac3b..95158550 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -3,6 +3,8 @@ "next/core-web-vitals", "eslint:recommended", "plugin:@typescript-eslint/recommended", - "plugin:react/recommended" + "plugin:react/recommended", + "eslint:recommended", + "next" ] } diff --git a/keystone.ts b/keystone.ts index 5d9bf795..ac4bb1f5 100644 --- a/keystone.ts +++ b/keystone.ts @@ -1,4 +1,4 @@ -import { log, xlog } from './utils/logging'; +import { xlog } from './utils/logging'; import { config } from '@keystone-next/keystone'; import { statelessSessions } from '@keystone-next/keystone/session'; import { createAuth } from '@keystone-next/auth'; diff --git a/package.json b/package.json index 36750ef7..07d96bd7 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ "start": "keystone-next start", "build": "keystone-next build", "migrate": "keystone-next prisma migrate deploy", - "format": "prettier --write \"**/*.ts\"" + "format": "prettier --write \"**/*.ts\"", + "lint": "eslint ./utils ./pages ./schema ./*.ts ./*.js" }, "dependencies": { "@keystone-next/auth": "34.0.0", @@ -39,15 +40,19 @@ }, "devDependencies": { "@tailwindcss/forms": "^0.3.3", - "@types/node": "^16.11.3", - "@types/react": "17.0.27", + "@types/node": "^16.11.4", + "@types/react": "^17.0.31", "@types/readline-sync": "^1.4.4", "@typescript-eslint/eslint-plugin": "^5.1.0", "@typescript-eslint/parser": "^5.1.0", "autoprefixer": "^10.3.7", + "babel-plugin-module-resolver": "^4.1.0", "eslint": "7.32.0", "eslint-config-next": "11.1.2", + "eslint-import-resolver-babel-module": "^5.3.1", + "eslint-plugin-import": "^2.25.2", "eslint-plugin-react": "^7.26.1", + "eslint-plugin-react-hooks": "^4.2.0", "postcss": "^8.3.9", "prettier": "^2.4.1", "tailwindcss": "^2.2.4", diff --git a/pages/_app.tsx b/pages/_app.tsx index c8ed8263..b4c55a4b 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,23 +1,23 @@ -import 'tailwindcss/tailwind.css'; -import type { AppProps } from 'next/app'; -import { createClient, Provider } from 'urql'; -import React from 'react' -import { AuthProvider } from '../components/auth'; - -export const client = createClient({ - url: - typeof window === undefined - ? 'http://localhost:3000/api/graphql' - : '/api/graphql', -}); - -function MyApp({ Component, pageProps }: AppProps) { - return ( - - - - - - ); -} -export default MyApp; +import 'tailwindcss/tailwind.css'; +import type { AppProps } from 'next/app'; +import { createClient, Provider } from 'urql'; +import React from 'react' +import { AuthProvider } from '../components/auth'; + +export const client = createClient({ + url: + typeof window === undefined + ? 'http://localhost:3000/api/graphql' + : '/api/graphql', +}); + +function MyApp({ Component, pageProps }: AppProps) { + return ( + + + + + + ); +} +export default MyApp; diff --git a/pages/index.tsx b/pages/index.tsx index c3ebe31e..1edab3cd 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,108 +1,100 @@ -import React from 'react'; - - -import { fetchGraphQL_inject_api_key, gql } from '../utils/fetchGraphQL'; -import { DocumentRenderer } from '../schema/fields/content/renderers'; - -import { Container } from '../components/ui/layout'; -import { Link } from '../components/ui/link'; -import { H1 } from '../components/ui/typography'; -import { useAuth } from '../components/auth'; - -import { makeIO } from '../utils/maybeIOPromise' - -import { DocumentAny } from '../wrap_any' - - - -export default function Home({ posts }: { posts: QueryPost[] }) { - const auth = useAuth(); - return ( - -

    My Blog

    - {auth.ready && auth.sessionData ? ( -

    - You're signed in as {auth.sessionData.name} |{' '} - -

    - ) : ( -

    - Sign In | Join -

    - )} - -
    - {posts?.map(post => { - const date = post.publishedDate - ? new Date(post.publishedDate).toLocaleDateString() - : null; - return ( -
    -
    {date}
    -

    - {post.title} -

    - {post.intro?.document && ( - - )} -
    - Read the full story -
    -
    - ); - })} -
    -
    - ); -} - -export type QueryPost = { - id: string; - title: string; - slug: string; - publishedDate: string; - intro: { - document: DocumentAny; - }; - author: { - name: string; - }; -}; - -export type TQueryPostsForIndex = { - posts: QueryPost[] -} - - - -//We can save a little time by compiling the functional code to a runtime constant -const fetchAllPostsForIndex = makeIO (() => - fetchGraphQL_inject_api_key( - gql` - query { - posts( - where: { status: { equals: "published" } } - orderBy: [{ publishedDate: desc }] - ) { - id - title - slug - publishedDate - intro { - document(hydrateRelationships: true) - } - author { - id - name - } - } - } - ` - )) - .then (data => data.posts); - -export async function getStaticProps() { - return fetchAllPostsForIndex - .exec ([]) - .then (postsRx => { return { props: { posts: postsRx }, revalidate: 60 } }) -} +import { fetchGraphQLInjectApiKey, gql } from '../utils/fetchGraphQL'; +import { DocumentRenderer } from '../schema/fields/content/renderers'; +import { Container } from '../components/ui/layout'; +import { Link } from '../components/ui/link'; +import { H1 } from '../components/ui/typography'; +import { useAuth } from '../components/auth'; +import { makeIO } from '../utils/maybeIOPromise' +import { DocumentAny } from '../wrap_any' + +export default function Home({ posts }: { posts: QueryPost[] }) { + const auth = useAuth(); + return ( + +

    My Blog

    + {auth.ready && auth.sessionData ? ( +

    + You're signed in as {auth.sessionData.name} |{' '} + +

    + ) : ( +

    + Sign In | Join +

    + )} + +
    + {posts?.map(post => { + const date = post.publishedDate + ? new Date(post.publishedDate).toLocaleDateString() + : null; + return ( +
    +
    {date}
    +

    + {post.title} +

    + {post.intro?.document && ( + + )} +
    + Read the full story +
    +
    + ); + })} +
    +
    + ); +} + +export type QueryPost = { + id: string; + title: string; + slug: string; + publishedDate: string; + intro: { + document: DocumentAny; + }; + author: { + name: string; + }; +}; + +export type TQueryPostsForIndex = { + posts: QueryPost[] +} + + + +//We can save a little time by compiling the functional code to a runtime constant +const fetchAllPostsForIndex = makeIO (() => + fetchGraphQLInjectApiKey( + gql` + query { + posts( + where: { status: { equals: "published" } } + orderBy: [{ publishedDate: desc }] + ) { + id + title + slug + publishedDate + intro { + document(hydrateRelationships: true) + } + author { + id + name + } + } + } + ` + )) + .then (data => data.posts); + +export async function getStaticProps() { + return fetchAllPostsForIndex + .exec ([]) + .then (postsRx => { return { props: { posts: postsRx }, revalidate: 60 } }) +} diff --git a/pages/post/[slug].tsx b/pages/post/[slug].tsx index d9d41107..765e7ced 100644 --- a/pages/post/[slug].tsx +++ b/pages/post/[slug].tsx @@ -1,120 +1,119 @@ -import { GetStaticPropsContext } from 'next'; -import React from 'react'; - -import { fetchGraphQL_inject_api_key, gql } from '../../utils/fetchGraphQL'; -import { DocumentRenderer } from '../../schema/fields/content/renderers'; - -import { Container, HomeLink } from '../../components/ui/layout'; -//import { Link } from '../../components/ui/link'; -import { H1 } from '../../components/ui/typography'; - -//import { PostAny } from '../../wrap_any' -import { makeIO, IO} from '../../utils/maybeIOPromise' -import { DocumentAny } from '../../wrap_any' - - - -export default function RenderPost({ post }: { post: PostStaticProps }) { - return ( - - -
    -

    {post.title}

    - {post.author.name && ( -

    - By {post.author.name} -

    - )} - {post.content?.document && ( - - )} -
    -
    - ); -} - - -type TstaticPaths = { - posts: - { - slug: string; - }[]; -}; - -const fetchStaticPaths = makeIO (() => fetchGraphQL_inject_api_key( - gql` - query { - posts { - slug - } - } - ` - )) - .then (data => data.posts) - - .then( posts => { - return { paths: posts.map(post => ({ params: { slug: post.slug } })), - fallback: 'blocking', - } } -) - - -export async function getStaticPaths() { - return fetchStaticPaths - .exec({ paths: [], fallback: 'blocking' }); -} - -export type PostStaticProps = { - title: string; - - content: { - document: DocumentAny; - }; - publishedDate: string; - author: { - id: string; - name: string; - }; -}; - -export type QueryPostStaticProps = {post: PostStaticProps}; - - - -const fetchStaticProps = (staticProps: GetStaticPropsContext) => - - IO.root(staticProps) - .then (props => props.params) - .then (params => params.slug ) - .promise(slug => - fetchGraphQL_inject_api_key( - gql` - query ($slug: String!) { - post(where: { slug: $slug }) { - title - content { - document(hydrateRelationships: true) - } - publishedDate - author { - id - name - } - } - } - `, - { slug: slug })) - .then (data => data.post) - ; - - - //.then (postsRx => { return { props: { posts: postsRx }, revalidate: 60 } }) - -export async function getStaticProps( params : GetStaticPropsContext) { - return fetchStaticProps(params) - .run () - .then(match_post => { - return { props: { post: match_post }, revalidate: 60 }}) - - -} +import { GetStaticPropsContext } from 'next'; +import React from 'react'; + +import { fetchGraphQLInjectApiKey, gql } from '../../utils/fetchGraphQL'; +import { DocumentRenderer } from '../../schema/fields/content/renderers'; + +import { Container, HomeLink } from '../../components/ui/layout'; +//import { Link } from '../../components/ui/link'; +import { H1 } from '../../components/ui/typography'; + +//import { PostAny } from '../../wrap_any' +import { makeIO, pure} from '../../utils/maybeIOPromise' +import { DocumentAny } from '../../wrap_any' + + + +export default function RenderPost({ post }: { post: PostStaticProps }) { + return ( + + +
    +

    {post.title}

    + {post.author.name && ( +

    + By {post.author.name} +

    + )} + {post.content?.document && ( + + )} +
    +
    + ); +} + + +type TstaticPaths = { + posts: + { + slug: string; + }[]; +}; + +const fetchStaticPaths = makeIO (() => fetchGraphQLInjectApiKey( + gql` + query { + posts { + slug + } + } + ` + )) + .then (data => data.posts) + .then( posts => { + return { paths: posts.map(post => ({ params: { slug: post.slug } })), + fallback: 'blocking', + } } +) + + +export async function getStaticPaths() { + return fetchStaticPaths + .exec({ paths: [], fallback: 'blocking' }); +} + +export type PostStaticProps = { + title: string; + + content: { + document: DocumentAny; + }; + publishedDate: string; + author: { + id: string; + name: string; + }; +}; + +export type QueryPostStaticProps = {post: PostStaticProps}; + + + +const fetchStaticProps = (staticProps: GetStaticPropsContext) => + + pure(staticProps) + .then (props => props.params) + .then (params => params.slug ) + .promise(slug => + fetchGraphQLInjectApiKey( + gql` + query ($slug: String!) { + post(where: { slug: $slug }) { + title + content { + document(hydrateRelationships: true) + } + publishedDate + author { + id + name + } + } + } + `, + { slug: slug })) + .then (data => data.post) + ; + + + //.then (postsRx => { return { props: { posts: postsRx }, revalidate: 60 } }) + +export async function getStaticProps( params : GetStaticPropsContext) { + return fetchStaticProps(params) + .run () + .then(match_post => { + return { props: { post: match_post }, revalidate: 60 }}) + + +} diff --git a/pages/signin.tsx b/pages/signin.tsx index 76a89dad..bf313dc2 100644 --- a/pages/signin.tsx +++ b/pages/signin.tsx @@ -1,85 +1,85 @@ -import React, { useState } from 'react'; - -import { Button } from '../components/ui/controls'; -import { Container, HomeLink } from '../components/ui/layout'; -import { H1 } from '../components/ui/typography'; -import { FieldContainer, FieldLabel, TextInput } from '../components/ui/forms'; -import { Link } from '../components/ui/link'; -//import { useRouter } from 'next/router'; -import { useAuth } from '../components/auth'; -import { gotoPage } from '../utils/gotoPage' - -export default function SigninPage() { - const auth = useAuth(); - const [email, setEmail] = useState('admin@demo.com'); - const [password, setPassword] = useState('password'); - const [error, setError] = useState(''); - - // const router = useRouter(); - - const signIn = async () => { - if (!auth.ready) { - setError('Auth is not ready, try again in a moment.'); - return; - } - if (!email.length || !password.length) { - setError('Please enter a username and password.'); - return; - } - setError(''); - const result = await auth.signIn({ email, password }); - if (result.success) { - - - gotoPage('/'); - } - else { - setEmail(''); - setPassword(''); - setError(result.message); - } - }; - - return ( - - -

    Sign in

    - {error ?
    {error}
    : null} -
    { - event.preventDefault(); - signIn(); - }} - > - - Email address - { - setEmail(event.target.value); - }} - /> - - - Password - { - setPassword(event.target.value); - }} - /> - - -
    -
    -
    - Want to join instead? -
    -
    - ); -} +import React, { useState } from 'react'; + +import { Button } from '../components/ui/controls'; +import { Container, HomeLink } from '../components/ui/layout'; +import { H1 } from '../components/ui/typography'; +import { FieldContainer, FieldLabel, TextInput } from '../components/ui/forms'; +import { Link } from '../components/ui/link'; +//import { useRouter } from 'next/router'; +import { useAuth } from '../components/auth'; +import { gotoPage } from '../utils/gotoPage' + +export default function SigninPage() { + const auth = useAuth(); + const [email, setEmail] = useState('admin@demo.com'); + const [password, setPassword] = useState('password'); + const [error, setError] = useState(''); + + // const router = useRouter(); + + const signIn = async () => { + if (!auth.ready) { + setError('Auth is not ready, try again in a moment.'); + return; + } + if (!email.length || !password.length) { + setError('Please enter a username and password.'); + return; + } + setError(''); + const result = await auth.signIn({ email, password }); + if (result.success) { + + + gotoPage('/'); + } + else { + setEmail(''); + setPassword(''); + setError(result.message); + } + }; + + return ( + + +

    Sign in

    + {error ?
    {error}
    : null} +
    { + event.preventDefault(); + signIn(); + }} + > + + Email address + { + setEmail(event.target.value); + }} + /> + + + Password + { + setPassword(event.target.value); + }} + /> + + +
    +
    +
    + Want to join instead? +
    +
    + ); +} diff --git a/pages/signup.tsx b/pages/signup.tsx index 5a14a3e6..76b07420 100644 --- a/pages/signup.tsx +++ b/pages/signup.tsx @@ -1,89 +1,89 @@ -import React,{ useState } from 'react'; -import { gql, useMutation } from 'urql'; - -import { Button } from '../components/ui/controls'; -import { Container, HomeLink } from '../components/ui/layout'; -import { H1 } from '../components/ui/typography'; -import { FieldContainer, FieldLabel, TextInput } from '../components/ui/forms'; -//import { useRouter } from 'next/router'; -import { Link } from '../components/ui/link'; -import { gotoPage } from '../utils/gotoPage' - - - - -export default function SignupPage() { - const [{ error }, signup] = useMutation(gql` - mutation ($name: String!, $email: String!, $password: String!) { - createUser(data: { name: $name, email: $email, password: $password }) { - __typename - id - } - authenticateUserWithPassword(email: $email, password: $password) { - __typename - } - } - `); - const [name, setName] = useState(''); - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); - - //const router = useRouter(); - - return ( - - -

    Join

    -
    { - event.preventDefault(); - signup({ name, email, password }).then(result => { - if (result.data?.createUser) { - // FIXME: there's a cache issue with Urql where it's not reloading the - // current user properly if we do a client-side redirect here. - // router.push('/'); - gotoPage('/'); - } - }); - }} - > - {error &&
    {error.toString()}
    } - - Name - { - setName(event.target.value); - }} - /> - - - Email address - { - setEmail(event.target.value); - }} - /> - - - Password - { - setPassword(event.target.value); - }} - /> - - -
    -
    -
    - Already have an account? Sign in -
    -
    - ); -} +import React,{ useState } from 'react'; +import { gql, useMutation } from 'urql'; + +import { Button } from '../components/ui/controls'; +import { Container, HomeLink } from '../components/ui/layout'; +import { H1 } from '../components/ui/typography'; +import { FieldContainer, FieldLabel, TextInput } from '../components/ui/forms'; +//import { useRouter } from 'next/router'; +import { Link } from '../components/ui/link'; +import { gotoPage } from '../utils/gotoPage' + + + + +export default function SignupPage() { + const [{ error }, signup] = useMutation(gql` + mutation ($name: String!, $email: String!, $password: String!) { + createUser(data: { name: $name, email: $email, password: $password }) { + __typename + id + } + authenticateUserWithPassword(email: $email, password: $password) { + __typename + } + } + `); + const [name, setName] = useState(''); + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + + //const router = useRouter(); + + return ( + + +

    Join

    +
    { + event.preventDefault(); + signup({ name, email, password }).then(result => { + if (result.data?.createUser) { + // FIXME: there's a cache issue with Urql where it's not reloading the + // current user properly if we do a client-side redirect here. + // router.push('/'); + gotoPage('/'); + } + }); + }} + > + {error &&
    {error.toString()}
    } + + Name + { + setName(event.target.value); + }} + /> + + + Email address + { + setEmail(event.target.value); + }} + /> + + + Password + { + setPassword(event.target.value); + }} + /> + + +
    +
    +
    + Already have an account? Sign in +
    +
    + ); +} diff --git a/schema/access.ts b/schema/access.ts index ff55c7fb..318bc42c 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -1,6 +1,6 @@ import { KeystoneContext } from '.keystone/types'; import { keystoneNextjsBuildApiKey } from '../keystone'; -import { log, xlog } from '../utils/logging'; +import { log } from '../utils/logging'; import { ItemType } from '../wrap_any'; export const PUBLISHED = 'published'; @@ -88,6 +88,7 @@ export const permissions = { canManageUsers: (frame: SessionFrame): boolean => Boolean(frame?.context?.session?.data?.role?.canManageUsers), + allow: (frame: T) => true, canManageContentSession: ({ session }: SessionContext): boolean => { return Boolean(session?.data?.role?.canManageContent); }, diff --git a/schema/fields/content/components.tsx b/schema/fields/content/components.tsx index 3f095abf..250acacb 100644 --- a/schema/fields/content/components.tsx +++ b/schema/fields/content/components.tsx @@ -1,203 +1,203 @@ -/** @jsxRuntime classic */ -/** @jsx jsx */ - -import { jsx, useTheme } from '@keystone-ui/core'; -import { InfoIcon } from '@keystone-ui/icons/icons/InfoIcon'; -import { AlertTriangleIcon } from '@keystone-ui/icons/icons/AlertTriangleIcon'; -import { AlertOctagonIcon } from '@keystone-ui/icons/icons/AlertOctagonIcon'; -import { CheckCircleIcon } from '@keystone-ui/icons/icons/CheckCircleIcon'; -import { Trash2Icon } from '@keystone-ui/icons/icons/Trash2Icon'; -import { Tooltip } from '@keystone-ui/tooltip'; -import { - component, - fields, - NotEditable, -} from '@keystone-next/fields-document/component-blocks'; -import { - ToolbarButton, - ToolbarGroup, - ToolbarSeparator, -} from '@keystone-next/fields-document/primitives'; - -import { PollAnswerAny } from '../../../wrap_any' - -const appearances = { - info: { - icon: InfoIcon, - backgroundColor: '#E0F2FE', - borderColor: '#38BDF8', - foregroundColor: '#0C4A6E', - }, - error: { - icon: AlertOctagonIcon, - backgroundColor: '#FFE4E6', - borderColor: '#FB7185', - foregroundColor: '#881337', - }, - warning: { - icon: AlertTriangleIcon, - backgroundColor: '#FEF3C7', - borderColor: '#FBBF24', - foregroundColor: '#78350F', - }, - success: { - icon: CheckCircleIcon, - backgroundColor: '#D1FAE5', - borderColor: '#34D399', - foregroundColor: '#064E3B', - }, -} as const; - -export const componentBlocks = { - callout: component({ - component: function Callout({ content, appearance }) { - const { /*palette,*/ radii, spacing } = useTheme(); - const intentConfig = appearances[appearance.value]; - - return ( -
    - -
    - -
    -
    -
    {content}
    -
    - ); - }, - label: 'Notice', - chromeless: true, - props: { - appearance: fields.select({ - label: 'Appearance', - options: [ - { value: 'info', label: 'Info' }, - { value: 'error', label: 'Error' }, - { value: 'warning', label: 'Warning' }, - { value: 'success', label: 'Success' }, - ] as const, - defaultValue: 'info', - }), - content: fields.child({ - kind: 'block', - placeholder: '', - formatting: 'inherit', - dividers: 'inherit', - links: 'inherit', - }), - }, - toolbar({ props, onRemove }) { - return ( - - {props.appearance.options.map(opt => { - const Icon = appearances[opt.value].icon; - - return ( - - {attrs => ( - { - props.appearance.onChange(opt.value); - }} - {...attrs} - > - - - )} - - ); - })} - - - - - {attrs => ( - - - - )} - - - ); - }, - }), - quote: component({ - component: ({ content, name, position }) => { - return ( -
    -
    {content}
    -
    - {name} -
    -
    {position}
    -
    - ); - }, - label: 'Quote', - props: { - content: fields.child({ - kind: 'block', - placeholder: 'Quote...', - formatting: { inlineMarks: 'inherit', softBreaks: 'inherit' }, - links: 'inherit', - }), - name: fields.child({ - kind: 'inline', - placeholder: 'Name...', - }), - position: fields.child({ - kind: 'inline', - placeholder: 'Description...', - }), - image: fields.text({ label: 'Profile Photo URL' }), - href: fields.text({ label: 'Profile Link URL' }), - }, - }), - poll: component({ - component: ({ poll }) => { - if (!poll.value) return No Poll Selected; - return ( - -

    {poll.value.label}

    -
      - {poll.value.data.answers.map((answer: PollAnswerAny) => { - return ( -
    • - {answer.label} ({answer.voteCount} answers) -
    • - ); - })} -
    -
    - ); - }, - label: 'Poll', - props: { - poll: fields.relationship<'one'>({ - label: 'Poll', - relationship: 'poll', - }), - }, - }), -}; +/** @jsxRuntime classic */ +/** @jsx jsx */ + +import { jsx, useTheme } from '@keystone-ui/core'; +import { InfoIcon } from '@keystone-ui/icons/icons/InfoIcon'; +import { AlertTriangleIcon } from '@keystone-ui/icons/icons/AlertTriangleIcon'; +import { AlertOctagonIcon } from '@keystone-ui/icons/icons/AlertOctagonIcon'; +import { CheckCircleIcon } from '@keystone-ui/icons/icons/CheckCircleIcon'; +import { Trash2Icon } from '@keystone-ui/icons/icons/Trash2Icon'; +import { Tooltip } from '@keystone-ui/tooltip'; +import { + component, + fields, + NotEditable, +} from '@keystone-next/fields-document/component-blocks'; +import { + ToolbarButton, + ToolbarGroup, + ToolbarSeparator, +} from '@keystone-next/fields-document/primitives'; + +import { PollAnswerAny } from '../../../wrap_any' + +const appearances = { + info: { + icon: InfoIcon, + backgroundColor: '#E0F2FE', + borderColor: '#38BDF8', + foregroundColor: '#0C4A6E', + }, + error: { + icon: AlertOctagonIcon, + backgroundColor: '#FFE4E6', + borderColor: '#FB7185', + foregroundColor: '#881337', + }, + warning: { + icon: AlertTriangleIcon, + backgroundColor: '#FEF3C7', + borderColor: '#FBBF24', + foregroundColor: '#78350F', + }, + success: { + icon: CheckCircleIcon, + backgroundColor: '#D1FAE5', + borderColor: '#34D399', + foregroundColor: '#064E3B', + }, +} as const; + +export const componentBlocks = { + callout: component({ + component: function Callout({ content, appearance }) { + const { /*palette,*/ radii, spacing } = useTheme(); + const intentConfig = appearances[appearance.value]; + + return ( +
    + +
    + +
    +
    +
    {content}
    +
    + ); + }, + label: 'Notice', + chromeless: true, + props: { + appearance: fields.select({ + label: 'Appearance', + options: [ + { value: 'info', label: 'Info' }, + { value: 'error', label: 'Error' }, + { value: 'warning', label: 'Warning' }, + { value: 'success', label: 'Success' }, + ] as const, + defaultValue: 'info', + }), + content: fields.child({ + kind: 'block', + placeholder: '', + formatting: 'inherit', + dividers: 'inherit', + links: 'inherit', + }), + }, + toolbar({ props, onRemove }) { + return ( + + {props.appearance.options.map(opt => { + const Icon = appearances[opt.value].icon; + + return ( + + {attrs => ( + { + props.appearance.onChange(opt.value); + }} + {...attrs} + > + + + )} + + ); + })} + + + + + {attrs => ( + + + + )} + + + ); + }, + }), + quote: component({ + component: ({ content, name, position }) => { + return ( +
    +
    {content}
    +
    + {name} +
    +
    {position}
    +
    + ); + }, + label: 'Quote', + props: { + content: fields.child({ + kind: 'block', + placeholder: 'Quote...', + formatting: { inlineMarks: 'inherit', softBreaks: 'inherit' }, + links: 'inherit', + }), + name: fields.child({ + kind: 'inline', + placeholder: 'Name...', + }), + position: fields.child({ + kind: 'inline', + placeholder: 'Description...', + }), + image: fields.text({ label: 'Profile Photo URL' }), + href: fields.text({ label: 'Profile Link URL' }), + }, + }), + poll: component({ + component: ({ poll }) => { + if (!poll.value) return No Poll Selected; + return ( + +

    {poll.value.label}

    +
      + {poll.value.data.answers.map((answer: PollAnswerAny) => { + return ( +
    • + {answer.label} ({answer.voteCount} answers) +
    • + ); + })} +
    +
    + ); + }, + label: 'Poll', + props: { + poll: fields.relationship<'one'>({ + label: 'Poll', + relationship: 'poll', + }), + }, + }), +}; diff --git a/schema/fields/content/renderers.tsx b/schema/fields/content/renderers.tsx index fae47a99..e00aebe3 100644 --- a/schema/fields/content/renderers.tsx +++ b/schema/fields/content/renderers.tsx @@ -1,189 +1,189 @@ -import { InferRenderersForComponentBlocks } from '@keystone-next/fields-document/component-blocks'; -import { - DocumentRenderer as KeystoneDocumentRenderer, - DocumentRendererProps, -} from '@keystone-next/document-renderer'; -import React, { ComponentProps, Fragment } from 'react'; - -import { H1, H2, H3, H4, H5, H6, P } from '../../../components/ui/typography'; -import { Divider } from '../../../components/ui/layout'; -import { useAuth } from '../../../components/auth'; -import { Button } from '../../../components/ui/controls'; -import { Link } from '../../../components/ui/link'; -import { gql, useMutation, useQuery } from 'urql'; - -// by default the DocumentRenderer will render unstyled html elements -// we're customising how headings are rendered here but you can customise any of the renderers that the DocumentRenderer uses -export const renderers: DocumentRendererProps['renderers'] = { - block: { - heading({ level, children, textAlign }) { - switch (level) { - case 1: - return

    {children}

    ; - case 2: - return

    {children}

    ; - case 3: - return

    {children}

    ; - case 4: - return

    {children}

    ; - case 5: - return
    {children}
    ; - default: - return
    {children}
    ; - } - }, - paragraph({ children, textAlign }) { - return

    {children}

    ; - }, - divider() { - return ; - }, - }, -}; - -type Answer = { - id: string; - label: string; - voteCount: number; -}; -type Poll = { - id: string; - label: string; - answers: Answer[]; - userAnswer: { id: string } | null; -}; - -const calloutStyles = { - info: 'text-blue-800 bg-blue-50 border-blue-300', - error: 'text-red-800 bg-red-50 border-red-300', - warning: 'text-yellow-800 bg-yellow-50 border-yellow-300', - success: 'text-green-800 bg-green-50 border-green-300', -}; - -export const componentBlockRenderers: InferRenderersForComponentBlocks< - typeof import('./components').componentBlocks -> = { - callout: function Callout({ appearance, content }) { - const classes = `my-4 py-2 px-4 rounded border-l-4 ${calloutStyles[appearance]}`; - return
    {content}
    ; - }, - quote: function Quote({ content, name, position, image, href }) { - return ( -
    -
    {content}
    -
    - {href ? ( - - {name} - - ) : ( - name - )} -
    -
    {position}
    -
    - ); - }, - poll: function Poll({ poll: relatedPoll }) { - if (!relatedPoll?.data) return null; - const [{ data }] = useQuery({ - query: gql` - query ($id: ID!) { - poll(where: { id: $id }) { - id - label - answers { - id - label - voteCount - } - userAnswer { - id - } - } - } - `, - variables: { id: relatedPoll.id }, - }); - const poll = (data?.poll || relatedPoll.data) as Poll; - - const [{}, voteForPoll] = - useMutation(gql` - mutation ($answerId: ID!) { - voteForPoll(answerId: $answerId) - } - `) - ; - const [{}, clearVoteForPoll] = useMutation(gql` - mutation ($pollId: ID!) { - clearVoteForPoll(pollId: $pollId) - } - `); - const auth = useAuth(); - return ( -
    -
    - {poll.label} -
    -
    - {poll.answers.map(answer => { - return ( - - ); - })} -
    - {auth.ready && !auth.sessionData && ( - - Sign In or{' '} - Join to vote - - )} - {poll.userAnswer?.id && ( - - )} -
    - ); - }, -}; - -export function DocumentRenderer({ - document, -}: Pick, 'document'>) { - return ( - - ); -} +import { InferRenderersForComponentBlocks } from '@keystone-next/fields-document/component-blocks'; +import { + DocumentRenderer as KeystoneDocumentRenderer, + DocumentRendererProps, +} from '@keystone-next/document-renderer'; +import React, { ComponentProps, Fragment } from 'react'; + +import { H1, H2, H3, H4, H5, H6, P } from '../../../components/ui/typography'; +import { Divider } from '../../../components/ui/layout'; +import { useAuth } from '../../../components/auth'; +import { Button } from '../../../components/ui/controls'; +import { Link } from '../../../components/ui/link'; +import { gql, useMutation, useQuery } from 'urql'; + +// by default the DocumentRenderer will render unstyled html elements +// we're customising how headings are rendered here but you can customise any of the renderers that the DocumentRenderer uses +export const renderers: DocumentRendererProps['renderers'] = { + block: { + heading({ level, children, textAlign }) { + switch (level) { + case 1: + return

    {children}

    ; + case 2: + return

    {children}

    ; + case 3: + return

    {children}

    ; + case 4: + return

    {children}

    ; + case 5: + return
    {children}
    ; + default: + return
    {children}
    ; + } + }, + paragraph({ children, textAlign }) { + return

    {children}

    ; + }, + divider() { + return ; + }, + }, +}; + +type Answer = { + id: string; + label: string; + voteCount: number; +}; +type Poll = { + id: string; + label: string; + answers: Answer[]; + userAnswer: { id: string } | null; +}; + +const calloutStyles = { + info: 'text-blue-800 bg-blue-50 border-blue-300', + error: 'text-red-800 bg-red-50 border-red-300', + warning: 'text-yellow-800 bg-yellow-50 border-yellow-300', + success: 'text-green-800 bg-green-50 border-green-300', +}; + +export const componentBlockRenderers: InferRenderersForComponentBlocks< + typeof import('./components').componentBlocks +> = { + callout: function Callout({ appearance, content }) { + const classes = `my-4 py-2 px-4 rounded border-l-4 ${calloutStyles[appearance]}`; + return
    {content}
    ; + }, + quote: function Quote({ content, name, position, image, href }) { + return ( +
    +
    {content}
    +
    + {href ? ( + + {name} + + ) : ( + name + )} +
    +
    {position}
    +
    + ); + }, + poll: function Poll({ poll: relatedPoll }) { + if (!relatedPoll?.data) return null; + const [{ data }] = useQuery({ + query: gql` + query ($id: ID!) { + poll(where: { id: $id }) { + id + label + answers { + id + label + voteCount + } + userAnswer { + id + } + } + } + `, + variables: { id: relatedPoll.id }, + }); + const poll = (data?.poll || relatedPoll.data) as Poll; + + const [{}, voteForPoll] = + useMutation(gql` + mutation ($answerId: ID!) { + voteForPoll(answerId: $answerId) + } + `) + ; + const [{}, clearVoteForPoll] = useMutation(gql` + mutation ($pollId: ID!) { + clearVoteForPoll(pollId: $pollId) + } + `); + const auth = useAuth(); + return ( +
    +
    + {poll.label} +
    +
    + {poll.answers.map(answer => { + return ( + + ); + })} +
    + {auth.ready && !auth.sessionData && ( + + Sign In or{' '} + Join to vote + + )} + {poll.userAnswer?.id && ( + + )} +
    + ); + }, +}; + +export function DocumentRenderer({ + document, +}: Pick, 'document'>) { + return ( + + ); +} diff --git a/schema/fields/githubRepos/components.tsx b/schema/fields/githubRepos/components.tsx index c47dbdd8..07ef7c82 100644 --- a/schema/fields/githubRepos/components.tsx +++ b/schema/fields/githubRepos/components.tsx @@ -26,9 +26,9 @@ function Star() { css={{ width: 16, height: 16, marginLeft: 12, marginRight: 4 }} > @@ -54,7 +54,7 @@ export const Field: FC = ({ field, value }) => { return (
  • - + {repo.name} {stars} diff --git a/schema/mutations.ts b/schema/mutations.ts index 2478fa79..13a680cd 100644 --- a/schema/mutations.ts +++ b/schema/mutations.ts @@ -4,7 +4,7 @@ import { PollWhereInput, PollWhereUniqueInput, } from '.keystone/types'; -import { log, xlog } from '../utils/logging'; +import { log } from '../utils/logging'; const gql = ([content]: TemplateStringsArray) => content; diff --git a/schema/users.ts b/schema/users.ts index f9554aa2..a252586b 100644 --- a/schema/users.ts +++ b/schema/users.ts @@ -20,9 +20,6 @@ import { } from './access'; import { GitHubRepo, githubReposResolver } from './fields/githubRepos/field'; -import { KeystoneContext } from '.keystone/types'; -import { SessionAny } from '../wrap_any'; - //import { log } from '../utils/logging'; const fieldModes = { @@ -36,25 +33,13 @@ const fieldModes = { session?.itemId === item.id ? EDIT : HIDDEN, -}; - -declare type BaseAccessArgs = { - session: SessionAny; - listKey: string; - context: KeystoneContext; -}; - -declare type LocalAccessArgs = { - session: SessionContext; - listKey: string; - context: KeystoneContext; -}; +} as const; export const User = list({ access: { operation: { - create: (frame: SessionFrame) => true, - query: (frame: SessionFrame) => true, + create: (frame: SessionFrame) => permissions.allow(frame), + query: (frame: SessionFrame) => permissions.allow(frame), update: (frame: SessionFrame) => permissions.canManageUsers(frame), delete: (frame: SessionFrame) => permissions.canManageUsers(frame), }, @@ -146,7 +131,7 @@ export const User = list({ }, }), }, -}); +} as const); export const Role = list({ fields: { @@ -165,6 +150,6 @@ export const Role = list({ }, //permissions.canManageUsers, ui: { - isHidden: session => !permissions.canManageUsersSession(session), + isHidden: (session: T) => !permissions.canManageUsersSession(session), }, -}); +} as const); diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json deleted file mode 100644 index 930f9a69..00000000 --- a/tsconfig.eslint.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig.json", - "include": [ - // ... - "babel.config.js" - ] - } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index bc613d9d..a05d7bb6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,7 +18,7 @@ // "removeComments": true, /* Do not emit comments to output. */ "noEmit": true, /* Do not emit outputs. */ // "importHelpers": true, /* Import emit helpers from 'tslib'. */ // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + //"isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ /* Strict Type-Checking Options */ "strict": true, /* Enable all strict type-checking options. */ // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ // "strictNullChecks": true, /* Enable strict null checks. */ @@ -57,6 +57,7 @@ // "skipLibCheck": true, /* Skip type checking of declaration files. */ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, "lib": [ + "es6", "dom", "dom.iterable", "esnext" @@ -70,6 +71,7 @@ }, "include": [ "next-env.d.ts", + "next.config.js", "**/*.ts", "**/*.tsx" ], diff --git a/utils/badValues.ts b/utils/badValues.ts index 925aba58..1f50be70 100644 --- a/utils/badValues.ts +++ b/utils/badValues.ts @@ -1,11 +1,7 @@ -import { U } from './unit'; - export type BadData = undefined | null; export type RemoveType = Dest extends Base ? never : ToGo; -export type WellTyped = RemoveType, null, any>; - export const isBad = (value: T) => value === null || value === undefined; export const bad = () => null as unknown as T; diff --git a/utils/fetchGraphQL.ts b/utils/fetchGraphQL.ts index f354bbff..93a36620 100644 --- a/utils/fetchGraphQL.ts +++ b/utils/fetchGraphQL.ts @@ -1,11 +1,11 @@ import { keystoneNextjsBuildApiKey, keyStoneHost } from '../keystone'; -import { log, xlog } from '../utils/logging'; +import { log } from '../utils/logging'; import { GraphQLClause } from '../wrap_any'; import { bad } from './badValues'; export const gql = ([content]: TemplateStringsArray) => content; -export const fetchGraphQL_inject_api_key = async ( +export const fetchGraphQLInjectApiKey = async ( query: string, variables?: GraphQLClause ) => { diff --git a/utils/func.ts b/utils/func.ts index 4c866c6a..1ad800a7 100644 --- a/utils/func.ts +++ b/utils/func.ts @@ -1,10 +1,10 @@ // eslint-disable-line no-unused-vars -export type Maps = (maps: D) => R; +export type Maps = (mapsIgnored: D) => R; // typescript is better at deducing the types of curried types than uncurried, // thus this style of definition is necessary to eliminate the need for the dreaded polymorphic types. export const addPropValue = (oldData: O) => - (newDataFun: (old: O) => N): O & N => + (newDataFun: Maps): O & N => Object.assign({}, oldData, newDataFun(oldData)); diff --git a/utils/gotoPage.ts b/utils/gotoPage.ts index ab332266..20e9d9a1 100644 --- a/utils/gotoPage.ts +++ b/utils/gotoPage.ts @@ -1,4 +1,3 @@ -import React from 'react'; // FIXME: there's a cache issue with Urql where it's not reloading the // current user properly if we do a client-side redirect here. // router.push('/'); diff --git a/utils/maybeIO.ts b/utils/maybeIO.ts index 42bf00e4..c5620224 100644 --- a/utils/maybeIO.ts +++ b/utils/maybeIO.ts @@ -1,8 +1,6 @@ import reader from 'readline-sync'; -import { u, U, cr, sideEffect } from './unit'; - -import { log, xlog, fix } from './logging'; +import { u, U } from './unit'; import { bad, isBad, mapBad, with_default } from './badValues'; diff --git a/utils/maybeIOPromise.ts b/utils/maybeIOPromise.ts index 0c90ce80..b9832d98 100644 --- a/utils/maybeIOPromise.ts +++ b/utils/maybeIOPromise.ts @@ -1,6 +1,8 @@ import reader from 'readline-sync'; import { u, U } from './unit'; +import { Maps } from './func'; + import { log } from './logging'; import { bad, isBad, mapBad, with_default } from './badValues'; @@ -41,13 +43,13 @@ export class IO { readonly run = () => this.act(); - readonly fbind = (io: (maps: T) => IO) => + readonly fbind = (io: Maps>) => makeIO( () => this.act().then(x => io(mapBad(x)).run()) //.catch(x => this.warn("fbind error")(err => io(bad()).run())) ); - readonly then = (f: (maps: NonNullable) => R) => + readonly then = (f: Maps, R>) => makeIO(() => this.act().then(x => isBad(x) ? embed(bad()) : embed(mapBad(f(x as NonNullable))) @@ -56,7 +58,7 @@ export class IO { //.catch(this.warn("fbind error")(x => bad())); //.then for promise returning functions. - readonly promise = (f: (maps: NonNullable) => Promise) => + readonly promise = (f: Maps, Promise>) => makeIO(() => this.run().then(x => isBad(x) ? bad>() : mapBad(f(x as NonNullable)) diff --git a/utils/unit.ts b/utils/unit.ts index e3cac64b..339fea12 100644 --- a/utils/unit.ts +++ b/utils/unit.ts @@ -5,9 +5,11 @@ export type U = typeof u; export const cr = '\n'; export const sideEffect = - (side: (maps: T) => SR) => - (ctn: (maps: T) => R) => - (env: T): R => { - side(env); - return ctn(env); - }; + // eslint-disable-line no-unused-vars + + (side: (mapsIgnored: T) => SR) => + (ctn: (mapsIgnored: T) => R) => + (env: T): R => { + side(env); + return ctn(env); + }; diff --git a/wrap_any.ts b/wrap_any.ts index 308d283f..c675278c 100644 --- a/wrap_any.ts +++ b/wrap_any.ts @@ -6,7 +6,6 @@ // and give any a descriptive type name // This is the local alias for the dreaded `type` -// eslint-disable-line no-explicit-any type WrappedRampantlyPolymorphic = any; //Any any is immediately assigned the status RampantlyPolymorphic, which matches exactly what it means diff --git a/yarn.lock b/yarn.lock index a1b4afde..2ced17df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1409,21 +1409,16 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*": - version "16.11.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.2.tgz#31c249c136c3f9b35d4b60fb8e50e01a1f0cc9a5" - integrity sha512-w34LtBB0OkDTs19FQHXy4Ig/TOXI4zqvXS2Kk1PAsRKZ0I+nik7LlMYxckW0tSNGtvWmzB+mrCTbuEjuB9DVsw== +"@types/node@*", "@types/node@^16.11.4": + version "16.11.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.4.tgz#90771124822d6663814f7c1c9b45a6654d8fd964" + integrity sha512-TMgXmy0v2xWyuCSCJM6NCna2snndD8yvQF67J29ipdzMcsPa9u+o0tjF5+EQNdhcuZplYuouYqpc4zcd5I6amQ== "@types/node@^10.1.0": version "10.17.60" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== -"@types/node@^16.11.3": - version "16.11.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.3.tgz#fad0b069ec205b0e81429c805d306d2c12e26be1" - integrity sha512-aIYL9Eemcecs1y77XzFGiSc+FdfN58k4J23UEe6+hynf4Wd9g4DzQPwIKL080vSMuubFqy2hWwOzCtJdc6vFKw== - "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" @@ -1480,7 +1475,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^17.0.27": +"@types/react@*", "@types/react@^17.0.27", "@types/react@^17.0.31": version "17.0.31" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.31.tgz#fe05ebf91ff3ae35bb6b13f6c1b461db8089dff8" integrity sha512-MQSR5EL4JZtdWRvqDgz9kXhSDDoy2zMTYyg7UhP+FZ5ttUOocWyxiqFJiI57sUG0BtaEX7WDXYQlkCYkb3X9vQ== @@ -1489,15 +1484,6 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@17.0.27": - version "17.0.27" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.27.tgz#6498ed9b3ad117e818deb5525fa1946c09f2e0e6" - integrity sha512-zgiJwtsggVGtr53MndV7jfiUESTqrbxOcBvwfe6KS/9bzaVPCTDieTWnFNecVNx6EAaapg5xsLLWFfHHR437AA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - "@types/readline-sync@^1.4.4": version "1.4.4" resolved "https://registry.yarnpkg.com/@types/readline-sync/-/readline-sync-1.4.4.tgz#8568292efe4ddd94d0ccee958b29cc3f4e0ea140" @@ -2134,6 +2120,17 @@ axobject-query@^2.2.0: resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== +babel-plugin-module-resolver@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz#22a4f32f7441727ec1fbf4967b863e1e3e9f33e2" + integrity sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA== + dependencies: + find-babel-config "^1.2.0" + glob "^7.1.6" + pkg-up "^3.1.0" + reselect "^4.0.0" + resolve "^1.13.1" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -3234,6 +3231,14 @@ eslint-config-next@11.1.2: eslint-plugin-react "^7.23.1" eslint-plugin-react-hooks "^4.2.0" +eslint-import-resolver-babel-module@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-babel-module/-/eslint-import-resolver-babel-module-5.3.1.tgz#808a42f311a6c33d473f9f4c846d1d487d29eff4" + integrity sha512-WomQAkjO7lUNOdU3FG2zgNgylkoAVUmaw04bHgSpM9QrMWuOLLWa2qcP6CrsBd4VWuLRbUPyzrgBc9ZQIx9agw== + dependencies: + pkg-up "^3.1.0" + resolve "^1.20.0" + eslint-import-resolver-node@^0.3.4, eslint-import-resolver-node@^0.3.6: version "0.3.6" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" @@ -3262,7 +3267,7 @@ eslint-module-utils@^2.7.0: find-up "^2.1.0" pkg-dir "^2.0.0" -eslint-plugin-import@^2.22.1: +eslint-plugin-import@^2.22.1, eslint-plugin-import@^2.25.2: version "2.25.2" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz#b3b9160efddb702fc1636659e71ba1d10adbe9e9" integrity sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g== @@ -3622,6 +3627,14 @@ finalhandler@~1.1.2: statuses "~1.5.0" unpipe "~1.0.0" +find-babel-config@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2" + integrity sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA== + dependencies: + json5 "^0.5.1" + path-exists "^3.0.0" + find-cache-dir@3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" @@ -4594,6 +4607,11 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -5668,7 +5686,7 @@ pkg-dir@^4.1.0: dependencies: find-up "^4.0.0" -pkg-up@3.1.0: +pkg-up@3.1.0, pkg-up@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== @@ -6199,6 +6217,11 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +reselect@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7" + integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -6216,7 +6239,7 @@ resolve-pkg@2.0.0: dependencies: resolve-from "^5.0.0" -resolve@1.20.0, resolve@^1.10.0, resolve@^1.20.0: +resolve@1.20.0, resolve@^1.10.0, resolve@^1.13.1, 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== From 982cb99476834f1a0a97772f23e53ce8a43989b4 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 10:01:11 +0100 Subject: [PATCH 212/325] yaml trailing space removal --- .github/workflows/latest.yml | 10 +++++----- utils/unit.ts | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/latest.yml b/.github/workflows/latest.yml index c62924da..09c61abd 100644 --- a/.github/workflows/latest.yml +++ b/.github/workflows/latest.yml @@ -45,22 +45,22 @@ jobs: run: | cd $GITHUB_WORKSPACE ls -alt - yarn + yarn env: DATABASE_URL: "postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest" - - name: Start keystone/Next + - name: Start keystone/Next run: | - yarn dev & + yarn dev & env: KEYSTONE_NEXTJS_BUILD_API_KEY: keystone_change_me2 DATABASE_URL: "postgres://postgres_user:change_me_in_multiple_places@pg/prisma_day_2021_latest" - name: Start next build run: | - echo "Sleeping to give time for Keystone to kick in. WIP: full micro service yml" + echo "Sleeping to give time for Keystone to kick in. WIP: full micro service yml" sleep 5 - echo "Building unseeded production server: " + echo "Building unseeded production server: " yarn site:build echo "✅ Success: built unseeded production services" sleep 25 diff --git a/utils/unit.ts b/utils/unit.ts index 339fea12..69c2484c 100644 --- a/utils/unit.ts +++ b/utils/unit.ts @@ -7,6 +7,7 @@ export const cr = '\n'; export const sideEffect = // eslint-disable-line no-unused-vars + (side: (mapsIgnored: T) => SR) => (ctn: (mapsIgnored: T) => R) => (env: T): R => { From cbba8954da7ec43eebb5e1608437d1cad44f88a9 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 10:54:48 +0100 Subject: [PATCH 213/325] Non-CI harsher lint: 12 error, 4 warnings --- schema/access.ts | 3 +- utils/func.ts | 6 ++++ utils/logging.ts | 69 +++++++++++++---------------------------- utils/maybeIO.ts | 16 ++++++---- utils/maybeIOPromise.ts | 8 +++-- utils/unit.ts | 19 ++++++------ wrap_any.ts | 1 + 7 files changed, 54 insertions(+), 68 deletions(-) diff --git a/schema/access.ts b/schema/access.ts index 318bc42c..8aaa1758 100644 --- a/schema/access.ts +++ b/schema/access.ts @@ -1,6 +1,7 @@ import { KeystoneContext } from '.keystone/types'; import { keystoneNextjsBuildApiKey } from '../keystone'; import { log } from '../utils/logging'; +import { drop } from '../utils/func'; import { ItemType } from '../wrap_any'; export const PUBLISHED = 'published'; @@ -88,7 +89,7 @@ export const permissions = { canManageUsers: (frame: SessionFrame): boolean => Boolean(frame?.context?.session?.data?.role?.canManageUsers), - allow: (frame: T) => true, + allow: (frame: T) => drop(frame)(true), canManageContentSession: ({ session }: SessionContext): boolean => { return Boolean(session?.data?.role?.canManageContent); }, diff --git a/utils/func.ts b/utils/func.ts index 1ad800a7..fc93ca8e 100644 --- a/utils/func.ts +++ b/utils/func.ts @@ -1,6 +1,12 @@ // eslint-disable-line no-unused-vars export type Maps = (mapsIgnored: D) => R; +// eslint-disable-line no-unused-vars +export const drop = + (valIgnored: T) => + (f: F) => + f; + // typescript is better at deducing the types of curried types than uncurried, // thus this style of definition is necessary to eliminate the need for the dreaded polymorphic types. diff --git a/utils/logging.ts b/utils/logging.ts index be216251..78b5cca2 100644 --- a/utils/logging.ts +++ b/utils/logging.ts @@ -2,7 +2,7 @@ import { LoggingAny } from '../wrap_any'; import colors from 'colors/safe'; import ErrorStackParser from 'error-stack-parser'; -import { Maps } from './func'; +import { Maps, drop } from './func'; // Logging is one place where LoggingAny is needed! The intent was object dumping code, down to // every leaf, in a hardened way. A testground for DRY logging in ts. @@ -62,7 +62,7 @@ export const fileLineRenderer = (e: CleanError) => { // eslint-disable-line no-unused-vars export const abbreviatedRenderer = (e: CleanError): string => { - return ''; + return drop(e)(''); }; export const stackRenderer = (e: CleanError): string => { @@ -144,57 +144,30 @@ const logContextInfo = export class logclos { depth = -1; - - renderer() { + renderer = () => { this.depth = this.depth + 1; return this.depth ? abbreviatedRenderer : fileLineRenderer; - } - - warning(a: LoggingAny): this { - return logContextInfo(this)(warningCol)(this.renderer())(a); - } - error(a: LoggingAny): this { - return logContextInfo(this)(errorCol)(this.renderer())(a); - } - success(a: LoggingAny): this { - return logContextInfo(this)(successCol)(this.renderer())(a); - } - trace(a: LoggingAny): this { - return logContextInfoGen(this)(simpleLogger)(fix)(stackRenderer)(a); - } - info(a: LoggingAny): this { - return logContextInfoGen(this)(simpleLogger)(fix)(this.renderer())(a); - } - reportSecurityIncident(a: LoggingAny): this { - return logContextInfo(this)(errorCol)(this.renderer())(a); - } + }; + warning = (a: LoggingAny) => + logContextInfo(this)(warningCol)(this.renderer())(a); + error = (a: LoggingAny) => logContextInfo(this)(errorCol)(this.renderer())(a); + success = (a: LoggingAny) => + logContextInfo(this)(successCol)(this.renderer())(a); + trace = (a: LoggingAny) => + logContextInfoGen(this)(simpleLogger)(fix)(stackRenderer)(a); + info = (a: LoggingAny) => + logContextInfoGen(this)(simpleLogger)(fix)(this.renderer())(a); + reportSecurityIncident = (a: LoggingAny) => + logContextInfo(this)(errorCol)(this.renderer())(a); } export class xlogclos { - // eslint-disable-line no-unused-vars - warning(a: LoggingAny): this { - return this; - } - // eslint-disable-line no-unused-vars - error(a: LoggingAny): this { - return this; - } - // eslint-disable-line no-unused-vars - success(a: LoggingAny): this { - return this; - } - // eslint-disable-line no-unused-vars - trace(a: LoggingAny): this { - return this; - } - // eslint-disable-line no-unused-vars - info(a: LoggingAny): this { - return this; - } - // eslint-disable-line no-unused-vars - reportSecurityIncident(a: LoggingAny): this { - return this; - } + warning = (a: LoggingAny) => drop(a)(this); + error = (a: LoggingAny) => drop(a)(this); + success = (a: LoggingAny) => drop(a)(this); + trace = (a: LoggingAny) => drop(a)(this); + info = (a: LoggingAny) => drop(a)(this); + reportSecurityIncident = (a: LoggingAny) => drop(a)(this); } export const log = () => new logclos(); diff --git a/utils/maybeIO.ts b/utils/maybeIO.ts index c5620224..e382ff2f 100644 --- a/utils/maybeIO.ts +++ b/utils/maybeIO.ts @@ -1,6 +1,7 @@ import reader from 'readline-sync'; import { u, U } from './unit'; +import { drop, Maps } from './func'; import { bad, isBad, mapBad, with_default } from './badValues'; @@ -21,10 +22,10 @@ export class IO { readonly run = (): T => this.act(); - readonly fbind = (io: (maps: T) => IO) => + readonly fbind = (io: Maps>) => makeIO(() => io(mapBad(this.act())).run()); - readonly then = (f: (maps: NonNullable) => R) => + readonly then = (f: Maps, R>) => makeIO(() => { const x = this.act(); return isBad(x) ? bad() : mapBad(f(x as NonNullable)); @@ -37,8 +38,7 @@ export class IO { //give a then callback to implement the async api. readonly exec = (def: NonNullable) => { return { - then: (f: (maps: NonNullable) => R) => - f(with_default(def)(this.run())), + then: (f: Maps, R>) => f(with_default(def)(this.run())), } as const; }; } @@ -58,13 +58,17 @@ export const putStrM = (s: string) => export const getLine = () => reader.question(''); -export const getStrM = (x: U) => IO.rootfun(getLine); +const dropEnvir = drop; + +export const getStrM = (x: U) => dropEnvir(x)(IO.rootfun(getLine)); export const pure = (x: T) => IO.root(x); +//Lint is right about these drops being dodgy. Theres +//Still some envir coding to do export const prompt = (str: string) => (x: V) => - putStrM(str); + dropEnvir(x)(putStrM(str)); export const ioRoot = pure(u); diff --git a/utils/maybeIOPromise.ts b/utils/maybeIOPromise.ts index b9832d98..2d669486 100644 --- a/utils/maybeIOPromise.ts +++ b/utils/maybeIOPromise.ts @@ -1,7 +1,7 @@ import reader from 'readline-sync'; import { u, U } from './unit'; -import { Maps } from './func'; +import { Maps, drop } from './func'; import { log } from './logging'; @@ -89,12 +89,14 @@ export class IO { export function delay(ms: number) { return new Promise(resolve => setTimeout(resolve, ms)); } +const dropEnvir = drop; + export const putStr = (env: T) => (s: string) => new Promise(resolved => { // eslint-disable-line no-unused-vars - process.stdout.write(s, z => resolved(env)); + process.stdout.write(s, z => dropEnvir(z)(resolved(env))); return env; }); @@ -108,7 +110,7 @@ export const pure = (x: T) => IO.root(x); // synchronous, because async keyboard IO is a pain. // eslint-disable-line no-unused-vars -export const getStrM = (x: U) => pure(x).then(z => getLine()); +export const getStrM = (x: U) => pure(x).then(z => dropEnvir(z)(getLine())); export const prompt = (str: string) => diff --git a/utils/unit.ts b/utils/unit.ts index 69c2484c..05bdd4ee 100644 --- a/utils/unit.ts +++ b/utils/unit.ts @@ -1,16 +1,15 @@ -export const u = {}; +import { Maps } from './func'; + +export const u = {} as const; export type U = typeof u; export const cr = '\n'; export const sideEffect = - // eslint-disable-line no-unused-vars - - - (side: (mapsIgnored: T) => SR) => - (ctn: (mapsIgnored: T) => R) => - (env: T): R => { - side(env); - return ctn(env); - }; + (side: Maps) => + (ctn: Maps) => + (env: T): R => { + side(env); + return ctn(env); + }; diff --git a/wrap_any.ts b/wrap_any.ts index c675278c..2ade35f9 100644 --- a/wrap_any.ts +++ b/wrap_any.ts @@ -6,6 +6,7 @@ // and give any a descriptive type name // This is the local alias for the dreaded `type` +// eslint-disable-line no-unused-vars type WrappedRampantlyPolymorphic = any; //Any any is immediately assigned the status RampantlyPolymorphic, which matches exactly what it means From 63e548fcbe6a22abb485ba2d12f78a4de545e700 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 11:20:40 +0100 Subject: [PATCH 214/325] Readme --- README.md | 90 ++++++++++++++++++--------------------------------- utils/unit.ts | 4 +++ 2 files changed, 35 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index ef55cd3a..85d09ddc 100644 --- a/README.md +++ b/README.md @@ -149,9 +149,33 @@ handling of `any`. ✅ CI: Lint extend set to ["next/core-web-vitals","eslint:recommended"] +✅ Currently being rolled out to all gql queries, which become much tidier as a result. + +✅ The Promise monad has been battle hardened, and is seen as a critical tool + in the CI process, since the code it produces is even more modular than `ts` alone. + +https://www.youtube.com/watch?v=vkcxgagQ4bM + +✅ Works out the box in `ts`. + +✅ Resolved complications caused by interactions with `async`, `Promise` etc. + +✅ `CCC` Implementation of MaybeIOPromise tested and working. + ## Security audit Status: `Preliminary`. + + code inspector badge + + +Weak links: code style. Many of the remaining errors are real, and have been in place for a long time, unnoticed because of the general noise. + +wrap_any.ts: the place where dark hacks live to get the system building. Its grown +rather than shrank, because `any` is often used to create objects without delegating +a strong typed call to the top level application. DRY is harsh, and forces certain design contraints, which are not often followed. But when they are, everything clicks together perfectly. + + ## TL;DR `(a: T)` is a type safe replacement for many cases of `(a: any)`, because we need to trap the awkward `undefined` cases at build time. @@ -173,53 +197,11 @@ This `dangerous construct` is used in upstream auth. Approximately 75% of these situations reveal an unhandled case, hidden from lint. ``` -Currently developing a reader friendly notation for the rather awkward `ts functional notation`, to try to find ways to eliminte `any`, in all bar recursive types (which are labelled as such, by an `any` subtype). The most readable so far appears to be: - -`export const fcompose = (a: (maps: B) => A) => (b: (maps: C) => B) => (c: C) => - a(b(c))` - -`export const fcompose = (a: (maps: B) => A) => (b: (maps: C) => B) => (c: C) => - a(b(c))` - -and in second place, - -`export const fcompose = (a: (X: B) => A) => (b: (X: C) => B) => (c: C) => - a(b(c))` - -For cartestian products: - - `transferFun: (maps: T) => (cross: T) => T` +## eslint is just as harsh. any is a virus that infects code. -we would rather write: +✅ Abstract away the dummy variable in `typescipt` type definitions. +`f: Maps`, which is implemented in `func.ts`. It absracts away the old `maps:` notation using a lint violation in a single location, removing a blemish from the `ts` type system. Uniquely declared lint violations are handled using drop, i.e. Curried `false`. Because it's used so often, it's aliased to it's local usage, so as not the swamp the namespace with too many `drop`s. - `transferFun: T => T => T,` - -but its a bit odd too, at least the ts reads a bit like the intended, - - `transferFun: maps T cross T to T,` - -just all the brackets are in the wrong place for the eye to flow smoothly over it, and the one place we want a new dummy variable, `to`, `ts` forces `=>`. I'd prefer the Haskell style notation to read - - `transferFun: T => T to T,` - -since `=>` is somewhat overused. Also, the return type is special in comparisson to intermediary closure parameters. - -But when printed, the shorter - `transferFun: (maps: T) => (X: T) => T,` - -doesn't seem to read as well as - `transferFun: (maps: T) => (cross: T) => T` - -The issue here is we have to name variables for types which are `not instantiated`, and `naming things is hard`. - - - -Using this convention, a free grammar is pinned down, in which the two new constructs make sense, and the rather clunky type specifications almost become readable, a bit like what tailwind does to css. `cross:` is preferred for short defintions, opposed to `x:` or `X:`. At first these both looked excellent options, then they didn't. `x` is heavily overused. So of the two `X` looks better, but is in caps, so I vote it runner up, but perhaps optimal for long type definitions. `X` in maths means roughly the same thing, as does `cross`, but `cross` is far less likely to be mistaken for a real variable. This is subtle because we are talking about a morphism between the Cartesian product embedded in the closure algebra, and a perhaps a different model of the product i.e. `(a,b)`, or a purely functional list api. - -Also cross will match fewer searches when greping though code. - - -When reviewing code, it can be hard to tell these dummy parameter names from important ones. That's the real point of this comment. `(a: T)` is not the same as `(a: any)`. The templated class can't echo undefined types, but `any` can! This is seen as a `very good thing`. @@ -264,23 +246,12 @@ With these caveats in mind, enjoy this latest release of @jeds prisma day worksh ## Known Issues -Code can siliently fail in a `?.` chain. Status: WIP. -The `?.` construction is convenient, but not suitable for production logging, error trapping. -To be replaced with a maybe sytle monad. - -✅ Currently being rolled out to all gql queries, which become much tidier as a result. - -The Promise monad is a bit of a mess. The more general, recursive approach, without an explicit array, is outlined in `C++`: - -https://www.youtube.com/watch?v=vkcxgagQ4bM +A version of Bartosz's elegant code working under `ts` is complete. The lack of Haskell type matching makes providing a coroutine/Haskell sytle do notation to `ts` very fiddly. This is Bartosz's main point, imho. If you can't interpret recursively typed monadic code in terms of mutually recursive coroutines, your functional language will be limited (like the `C++` std library is). However, it is sufficient for non-recursive chains, and many use cases are. -and almost works out the box in `ts`. Currently investigating complications caused by interactions with `async`, `Promise` etc. A version of Bartosz's elegant code working under `ts` is complete. The lack of Haskell type matching makes providing a coroutine/Haskell sytle do notation to `ts` very fiddly. This is Bartosz's main point, imho. If you can't interpret recursively typed monadic code in terms of mutually recursive coroutines, your functional language will be limited (like the `C++` std library is). However, it is sufficient for non-recursive chains, and many use cases are. - -✅ `CCC` Implementation of MaybeIOPromise tested and working. -Only trampolines left to implement in the MaybeIOPromise family of monads, which will be deployed for error checking, because they do this very well, even without a tramoline. +So only trampolines left to implement in the MaybeIOPromise family of monads, which will be deployed for error checking, because they do this very well, even without a tramoline. -✅ WIP: Rolling out MaybeIOPromise to all `gql` instances. Deploying this error trapping monad has already resolved unnoticed bugs, and further separates `gql` code from the core functional environment. +WIP: Rolling out MaybeIOPromise to all `gql` instances. Deploying this error trapping monad has already resolved unnoticed bugs, and further separates `gql` code from the core functional environment. Research has shown that the Keystone session data might have a recursive type, which prevents it being dumped as an object. In theory it can be represented as a dumpable tree, without looping back to itself. These loops make it hard to prove there is a well defined maximal subset of the context which is in the `CCC`. It's type is that exotic! @@ -301,6 +272,7 @@ Production build: Prettier applied in gitadd. Utils folder for additional code, informative naming. MaybeIO/Promise for DRY declarative specification of graphql parsing/error handling. + yarn lint: additional, harsher lint checks ## How to install the latest branch diff --git a/utils/unit.ts b/utils/unit.ts index 05bdd4ee..49c33f8e 100644 --- a/utils/unit.ts +++ b/utils/unit.ts @@ -6,6 +6,10 @@ export type U = typeof u; export const cr = '\n'; +// The typical modeling of side effects in functional environments +// Silently drop the return value of the side effect, which has no effect +// on the constant environment, and call the continuation with the initial environment, +// as though nothing happened. export const sideEffect = (side: Maps) => (ctn: Maps) => From c1708a7dc5061933e5e50a9c1e8c531f5d6b15b4 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 11:39:27 +0100 Subject: [PATCH 215/325] Readme --- README.md | 36 +++++++++++------------------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 85d09ddc..2d32b718 100644 --- a/README.md +++ b/README.md @@ -73,20 +73,12 @@ alt="code inspector grade" /> alt="code quality score" /> - - - - - This branch is dedicated to creating a solid foundation for a production build to extend Keystone 6 CMS from. - - Currently working on the low code style core, which hates `any` just as much as I do, and spots the tiniest of issues. Industry best practise is a useful side effect of harsh CI tooling. - `yarn commit "message"` fires off the CI pipeline and only commits if unit tests are passed locally. No longer requires yarn dev running without the main next front end, since yarn site:build is the primary unit test. "fastcommit" is considered dangerous, and needs some additional logic to be CI safe. Its been the cause of a few red crosses. For that reason, it is being prefixed by an `x`, so commands in the history buffer do not trigger it. `yarn push` auto push to origin latest @@ -138,10 +130,9 @@ Tested and working. (WIP: Additional hardening, catch after await) ✅ Only throws were in polls and static data fetch. Both have been refactored. -✅ Next builds even when there is no static data, i.e. an empty database. Requires precise -handling of `any`. +✅ Next builds even when there is no static data, i.e. an empty database. Requires precise handling to return the correct types. -✅ Any issues tracked down using the empty database technique. It triggers every any bug, with a vengeance. +✅ Many issues tracked down using the empty database technique. It triggers every any/null/undefined bug, with a vengeance. Strongly recommended as a unit testing technique. ✅ Polyfilled monadic logging parses variable Error() format. @@ -149,7 +140,6 @@ handling of `any`. ✅ CI: Lint extend set to ["next/core-web-vitals","eslint:recommended"] -✅ Currently being rolled out to all gql queries, which become much tidier as a result. ✅ The Promise monad has been battle hardened, and is seen as a critical tool in the CI process, since the code it produces is even more modular than `ts` alone. @@ -162,6 +152,8 @@ https://www.youtube.com/watch?v=vkcxgagQ4bM ✅ `CCC` Implementation of MaybeIOPromise tested and working. +✅ Currently being rolled out to all gql queries, which become much tidier as a result. + ## Security audit Status: `Preliminary`. @@ -207,25 +199,22 @@ Approximately 75% of these situations reveal an unhandled case, hidden from lint `(a: T)` is a type safe replacement for any, because we need to trap the awkward `undefined` cases at build time. Then the type inferrence become far more similar to `C++`, which works well until it hits recursive types (with the unfortunate side effect of nerfing monads/coroutines). - -Another point is that as soon as `any` is used, the code becomes ... `javascript`. No more needs to be said. My mission against `any` is more than fully justified, and I'm not alone: +My mission against `any` is more than fully justified, and I'm not alone: https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes-func.html -However, some functional code doesn't seem to work properly without the total polymorphism `any` allows. There is also a `dodgy C++ style cast`, right where it's not needed ... `TBC`. -The reason this is important is that `ts` offers us the `CCC` to programme in, (eliminating `any` completely), if we so desire. Then a programme can be proved to do exactly what it says it does, and this painfully pedantic style is fully justified. +The reason monads are important is that `ts` offers us the `CCC` to programme in, (eliminating `any` completely), if we so desire. Then a programme can be proved to do exactly what it says it does. -Research has demonstrated `ts` has issues expressing the `CCC`, but has fewer issues expressing the `CMC`, i.e. quantum categories. This is a slight -surprise, but now known, the `CMC` is used exculsively. This means all transformations of objects are monadic. This is because -`ts` is call by reference, and objects cant be cloned easily, instead they are `entangled` when referred to twice. So its best to -accept this, and make new objects using a class factory, to be modified by a monad (that that the object is trapped inside of), which cannot be cloned either. This is an efficient way to code closures, because passing the object pointer ensures only a minimum of copying environment is performed, at creation time. +`ts` appears equally capable of expressing algorithms in the `CMC` or the `CCC`. -There are also positive benefits resulting from entanglement in the `CMC`, it can be used to model subscriptions. +There are positive benefits resulting from entanglement in the `CMC`, it can be used to model subscriptions. +## DRY = sole source of truth +... and it sets deep theoretical/practical puzzles, part addressed in this code base. However `typescript` is not ideal for `DRY`, but it suffices. When enhanced with `abstract syntax trees` it bites back that bit more, a critical technique in Keystone core. ## On naming The Native American naming/language model is used. Functions are verbs, and are named by what they do. @@ -240,16 +229,13 @@ I'm fairly new to `ts`, and like it a lot, but without a formal style, it can be With these caveats in mind, enjoy this latest release of @jeds prisma day workshop app, ported to Keystone 26, with useful contrib from @Guatam Singh, and polished endlessly by qfunq (it deserves it, Keystone 6 is the best CMS out there, Next, best in class, the same for prisma, and jeds code pulls it all together in a very useful way), and be fully aware, however solid it seems, this application is still in a `testing` phase. -## DRY = sole source of truth -... and it sets deep theoretical/practical puzzles, part addressed in this code base. `typescript` is not ideal for `DRY`, but it suffices. ## Known Issues A version of Bartosz's elegant code working under `ts` is complete. The lack of Haskell type matching makes providing a coroutine/Haskell sytle do notation to `ts` very fiddly. This is Bartosz's main point, imho. If you can't interpret recursively typed monadic code in terms of mutually recursive coroutines, your functional language will be limited (like the `C++` std library is). However, it is sufficient for non-recursive chains, and many use cases are. - -So only trampolines left to implement in the MaybeIOPromise family of monads, which will be deployed for error checking, because they do this very well, even without a tramoline. +So only trampolines left to implement in the MaybeIOPromise family of monads, which will be deployed for error checking, because they do this very well, even without a tramoline. But trampolines open a can of worms, requiring an intricate `ast` to target this subtle setup properly. WIP: Rolling out MaybeIOPromise to all `gql` instances. Deploying this error trapping monad has already resolved unnoticed bugs, and further separates `gql` code from the core functional environment. From e6fa3bd55a06174e33b4cdf711f30887e518abe6 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 12:03:19 +0100 Subject: [PATCH 216/325] Removed lint disable lines --- utils/logging.ts | 2 -- utils/maybeIOPromise.ts | 2 -- 2 files changed, 4 deletions(-) diff --git a/utils/logging.ts b/utils/logging.ts index 78b5cca2..876e1825 100644 --- a/utils/logging.ts +++ b/utils/logging.ts @@ -60,7 +60,6 @@ export const fileLineRenderer = (e: CleanError) => { ); }; -// eslint-disable-line no-unused-vars export const abbreviatedRenderer = (e: CleanError): string => { return drop(e)(''); }; @@ -172,5 +171,4 @@ export class xlogclos { export const log = () => new logclos(); -// eslint-disable-line no-unused-vars export const xlog = () => new xlogclos(); diff --git a/utils/maybeIOPromise.ts b/utils/maybeIOPromise.ts index 2d669486..f3d9c285 100644 --- a/utils/maybeIOPromise.ts +++ b/utils/maybeIOPromise.ts @@ -95,7 +95,6 @@ export const putStr = (env: T) => (s: string) => new Promise(resolved => { - // eslint-disable-line no-unused-vars process.stdout.write(s, z => dropEnvir(z)(resolved(env))); return env; }); @@ -109,7 +108,6 @@ export const pure = (x: T) => IO.root(x); // disable the error, but lint has a point, the environment is lost // synchronous, because async keyboard IO is a pain. -// eslint-disable-line no-unused-vars export const getStrM = (x: U) => pure(x).then(z => dropEnvir(z)(getLine())); export const prompt = From 614fa849336ea5de581082e543cbc62e5f285dce Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sat, 23 Oct 2021 12:16:30 +0100 Subject: [PATCH 217/325] react hook useQuery called unconditionally --- schema/fields/content/renderers.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/schema/fields/content/renderers.tsx b/schema/fields/content/renderers.tsx index e00aebe3..c801b71d 100644 --- a/schema/fields/content/renderers.tsx +++ b/schema/fields/content/renderers.tsx @@ -85,7 +85,7 @@ export const componentBlockRenderers: InferRenderersForComponentBlocks< ); }, poll: function Poll({ poll: relatedPoll }) { - if (!relatedPoll?.data) return null; + //if (!relatedPoll?.data) return null; const [{ data }] = useQuery({ query: gql` query ($id: ID!) { @@ -103,9 +103,9 @@ export const componentBlockRenderers: InferRenderersForComponentBlocks< } } `, - variables: { id: relatedPoll.id }, + variables: { id: relatedPoll?.id }, }); - const poll = (data?.poll || relatedPoll.data) as Poll; + const poll = (data?.poll || relatedPoll?.data) as Poll; const [{}, voteForPoll] = useMutation(gql` @@ -163,7 +163,7 @@ export const componentBlockRenderers: InferRenderersForComponentBlocks<
    ; }, quote: function Quote({ content, name, position, image, href }) { + return (
    {content}
    @@ -75,11 +77,22 @@ export const componentBlockRenderers: InferRenderersForComponentBlocks< {href ? ( {name} - - ) : ( - name - )} + ) + : (name) + } + {image !== ''? + ( + < Image + src={image} + alt = "Avatar" + width = "80" + height = "80" + /> + ) + : "" + }
    +
    {position}
); From 55ffaf31816c83defc97d0c017e0f0856df002fb Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sun, 24 Oct 2021 02:06:35 +0100 Subject: [PATCH 224/325] Poll filtering simplified --- package.json | 1 + schema/fields/content/renderers.tsx | 4 +- schema/mutations.ts | 19 +- yarn.lock | 271 +++++++++++++++++++++++++++- 4 files changed, 271 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index 07d96bd7..967afb8a 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "react": "^17.0.2", "react-dom": "^17.0.2", "readline-sync": "^1.4.10", + "sharp": "^0.29.2", "urql": "^2.0.5" }, "devDependencies": { diff --git a/schema/fields/content/renderers.tsx b/schema/fields/content/renderers.tsx index 5ca1efdd..09209a76 100644 --- a/schema/fields/content/renderers.tsx +++ b/schema/fields/content/renderers.tsx @@ -85,8 +85,8 @@ export const componentBlockRenderers: InferRenderersForComponentBlocks< < Image src={image} alt = "Avatar" - width = "80" - height = "80" + width = "50" + height = "50" /> ) : "" diff --git a/schema/mutations.ts b/schema/mutations.ts index 13a680cd..dcc8b473 100644 --- a/schema/mutations.ts +++ b/schema/mutations.ts @@ -1,17 +1,10 @@ import { graphQLSchemaExtension } from '@keystone-next/keystone'; -import { - KeystoneContext, - PollWhereInput, - PollWhereUniqueInput, -} from '.keystone/types'; +import { KeystoneContext, PollWhereUniqueInput } from '.keystone/types'; import { log } from '../utils/logging'; const gql = ([content]: TemplateStringsArray) => content; -async function clearVote( - _context: KeystoneContext, - pollFilter: PollWhereInput -) { +async function clearVote(_context: KeystoneContext) { const context = _context.sudo(); if (!context.session) { //Removed throw, which was crashing keystone @@ -46,12 +39,12 @@ export const extendGraphqlSchema = graphQLSchemaExtension({ `, resolvers: { Mutation: { - async clearVoteForPoll(rootVal, { pollId }, context) { - await clearVote(context as KeystoneContext, { id: pollId }); + async clearVoteForPoll(context) { + await clearVote(context as KeystoneContext); }, - async voteForPoll(rootVal, { answerId }, _context) { + async voteForPoll({ answerId }, _context) { const context = _context.sudo() as KeystoneContext; - clearVote(context, { answers: { some: { id: { equals: answerId } } } }); + clearVote(context); await context.db.PollAnswer.updateOne({ where: { id: answerId }, data: { diff --git a/yarn.lock b/yarn.lock index a54c8665..46aa17d7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1783,6 +1783,11 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + ansi-regex@^5.0.0, ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -1935,6 +1940,11 @@ apply-ref@^1.0.0: resolved "https://registry.yarnpkg.com/apply-ref/-/apply-ref-1.0.0.tgz#036947786ec24f64c92e905b56d6ffec2fa81951" integrity sha512-InKjUB8TMcIiSVV/9hqmMpIXkpIjCIbRiB3qdPu4/kU9AagF2uRAdAfFgt9+ykw5xQYyqAmcIKNsgy4tqKPquQ== +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + archiver-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2" @@ -1964,6 +1974,14 @@ archiver@4.0.2: tar-stream "^2.1.2" zip-stream "^3.0.1" +are-we-there-yet@~1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" + integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + arg@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.0.tgz#583c518199419e0037abb74062c37f8519e575f0" @@ -2481,6 +2499,11 @@ chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" @@ -2539,6 +2562,11 @@ clipboard-copy@^4.0.1: resolved "https://registry.yarnpkg.com/clipboard-copy/-/clipboard-copy-4.0.1.tgz#326ef9726d4ffe72d9a82a7bbe19379de692017d" integrity sha512-wOlqdqziE/NNTUJsfSgXmBMIrYmfd5V0HCGsR8uAKHcg+h9NENWINcfRjtWGU77wDHC8B8ijV4hMTGYbrKovng== +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -2641,6 +2669,11 @@ console-browserify@^1.1.0: resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + constants-browserify@1.0.0, constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" @@ -2915,6 +2948,18 @@ decimal.js@10.3.1: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== +decompress-response@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" + integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== + dependencies: + mimic-response "^2.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -2951,6 +2996,11 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + depd@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" @@ -2974,6 +3024,11 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + detect-node-es@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" @@ -3118,7 +3173,7 @@ encoding@0.1.13: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.4.1: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -3492,6 +3547,11 @@ execa@5.1.1, execa@^5.0.0, execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" @@ -3804,6 +3864,20 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^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" @@ -3843,6 +3917,11 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= + glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -3982,6 +4061,11 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + has-yarn@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" @@ -4260,6 +4344,11 @@ ini@2.0.0: resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + internal-slot@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" @@ -4404,6 +4493,13 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + is-fullwidth-code-point@^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" @@ -5045,6 +5141,11 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-response@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" + integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -5081,7 +5182,7 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -5101,6 +5202,11 @@ minizlib@^2.1.1: minipass "^3.0.0" yallist "^4.0.0" +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" @@ -5136,6 +5242,11 @@ nanoid@^3.1.23, nanoid@^3.1.30: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + native-url@0.3.4: version "0.3.4" resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.3.4.tgz#29c943172aed86c63cee62c8c04db7f5756661f8" @@ -5219,6 +5330,18 @@ next@^11.1.0, next@^11.1.2: "@next/swc-linux-x64-gnu" "11.1.2" "@next/swc-win32-x64-msvc" "11.1.2" +node-abi@^2.21.0: + version "2.30.1" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf" + integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w== + dependencies: + semver "^5.4.1" + +node-addon-api@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.2.0.tgz#117cbb5a959dff0992e1c586ae0393573e4d2a87" + integrity sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q== + node-emoji@^1.11.0: version "1.11.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" @@ -5326,7 +5449,22 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -object-assign@^4, object-assign@^4.1.1: +npmlog@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.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" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -5411,7 +5549,7 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" -once@^1.3.0, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -5770,6 +5908,25 @@ postcss@^8.1.6, postcss@^8.2.1, postcss@^8.3.9: picocolors "^1.0.0" source-map-js "^0.6.2" +prebuild-install@^6.1.4: + version "6.1.4" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.4.tgz#ae3c0142ad611d58570b89af4986088a4937e00f" + integrity sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ== + dependencies: + detect-libc "^1.0.3" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^2.21.0" + npmlog "^4.0.1" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^3.0.3" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -5857,6 +6014,14 @@ public-encrypt@^4.0.0: randombytes "^2.0.1" safe-buffer "^5.1.2" +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -5986,6 +6151,16 @@ raw-body@2.4.1: iconv-lite "0.4.24" unpipe "1.0.0" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + react-clientside-effect@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.5.tgz#e2c4dc3c9ee109f642fac4f5b6e9bf5bcd2219a3" @@ -6127,7 +6302,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@^2.3.7: +readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@^2.3.7: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -6335,7 +6510,7 @@ scroll-into-view-if-needed@^2.2.20, scroll-into-view-if-needed@^2.2.28: dependencies: compute-scroll-into-view "^1.0.17" -"semver@2 || 3 || 4 || 5": +"semver@2 || 3 || 4 || 5", semver@^5.4.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -6381,6 +6556,11 @@ serve-static@1.14.1: parseurl "~1.3.3" send "0.17.1" +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -6409,6 +6589,20 @@ sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +sharp@^0.29.2: + version "0.29.2" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.29.2.tgz#e8c003cd9cb321585b32dbda6eed3baa7d6f2308" + integrity sha512-XWRdiYLIJ3tDUejRyG24KERnJzMfIoyiJBntd2S6/uj3NEeNgRFRLgiBlvPxMa8aml14dKKD98yHinSNKp1xzQ== + dependencies: + color "^4.0.1" + detect-libc "^1.0.3" + node-addon-api "^4.2.0" + prebuild-install "^6.1.4" + semver "^7.3.5" + simple-get "^3.1.0" + tar-fs "^2.1.1" + tunnel-agent "^0.6.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -6435,11 +6629,25 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.2, signal-exit@^3.0.3: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.5" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^3.0.3, simple-get@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" + integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== + dependencies: + decompress-response "^4.2.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -6644,7 +6852,7 @@ string-hash@1.1.3: resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= -string-width@4.2.3, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@4.2.3, "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 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== @@ -6653,6 +6861,15 @@ string-width@4.2.3, 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-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + string.prototype.matchall@^4.0.5: version "4.0.6" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" @@ -6711,6 +6928,13 @@ strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -6733,6 +6957,11 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + strip-outer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" @@ -6883,7 +7112,17 @@ tailwindcss@^2.2.4: resolve "^1.20.0" tmp "^0.2.1" -tar-stream@^2.1.2: +tar-fs@^2.0.0, tar-fs@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.2, tar-stream@^2.1.4: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== @@ -7070,6 +7309,13 @@ tty-browserify@0.0.1: resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -7382,6 +7628,13 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +wide-align@^1.1.0: + 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 "^1.0.2 || 2 || 3 || 4" + wonka@^4.0.14: version "4.0.15" resolved "https://registry.yarnpkg.com/wonka/-/wonka-4.0.15.tgz#9aa42046efa424565ab8f8f451fcca955bf80b89" From 159e11da8e731cbedce78624103403c8833bcf56 Mon Sep 17 00:00:00 2001 From: Jonathan Weinreich Date: Sun, 24 Oct 2021 02:30:44 +0100 Subject: [PATCH 225/325] Passing harsher linting: now included in CI. --- package.json | 2 +- schema/fields/content/components.tsx | 4 ++-- schema/fields/content/renderers.tsx | 4 +++- schema/fields/githubRepos/components.tsx | 2 +- utils/func.ts | 6 +++--- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 967afb8a..cd2abdea 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "clean": "rm -rf node_modules yarn.lock .keystone .next", "gitadd": "yarn format && git add . ||:", - "commit": "yarn site:build && yarn gitadd && git commit -a -m ", + "commit": "yarn site:build && yarn lint && yarn gitadd && git commit -a -m ", "xfastcommit": "yarn gitadd && git commit -a -m ", "push": "git push origin latest", "postinstall": "keystone-next postinstall && yarn next telemetry disable && yarn next lint", diff --git a/schema/fields/content/components.tsx b/schema/fields/content/components.tsx index 250acacb..bd8ab596 100644 --- a/schema/fields/content/components.tsx +++ b/schema/fields/content/components.tsx @@ -183,8 +183,8 @@ export const componentBlocks = {