From 558207872d34f172170a6d9298d8084e2223ff30 Mon Sep 17 00:00:00 2001 From: Katalina Okano Date: Thu, 3 Dec 2020 10:16:15 -0500 Subject: [PATCH] fix a bunch of build issues --- .babelrc | 4 - .babelrc.js | 4 + .eslintrc.js | 2 + .storybook/.babelrc.js | 1 + docs/getting-started.md | 36 +++++ hack/dockerfiles/bot.Dockerfile | 46 ++++++ hack/jestSetup.ts | 4 + next.config.js | 3 + package.json | 7 +- src/backend-worker/handlers/bot-join.ts | 3 +- src/backend-worker/utils/api-tools.ts | 2 +- src/backend-worker/utils/config.ts | 14 +- src/backend-worker/utils/kv.ts | 70 ++++++++- .../editor-category/EditorCategory.tsx | 2 + .../organisms/editor/EditorShell.tsx | 2 +- src/design-system/templates/errors/Errors.tsx | 6 +- tsconfig.json | 2 +- tsconfig.stories.json | 4 +- yarn.lock | 140 ++++++++++++------ 19 files changed, 283 insertions(+), 69 deletions(-) delete mode 100644 .babelrc create mode 100644 .babelrc.js create mode 100644 .storybook/.babelrc.js create mode 100644 docs/getting-started.md create mode 100644 hack/dockerfiles/bot.Dockerfile create mode 100644 next.config.js diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 9555ba3..0000000 --- a/.babelrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "presets": ["next/babel"], - "plugins": [["styled-components", { "ssr": true }]] -} diff --git a/.babelrc.js b/.babelrc.js new file mode 100644 index 0000000..ae078bb --- /dev/null +++ b/.babelrc.js @@ -0,0 +1,4 @@ +module.exports = { + presets: ['next/babel'], + plugins: [['styled-components', { ssr: true }]], +}; diff --git a/.eslintrc.js b/.eslintrc.js index 18c8aaa..13c4e15 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -18,6 +18,8 @@ module.exports = { '@typescript-eslint/tslint', ], rules: { + 'react/jsx-uses-react': 'off', + 'react/react-in-jsx-scope': 'off', '@typescript-eslint/await-thenable': 'error', '@typescript-eslint/consistent-type-assertions': 'error', '@typescript-eslint/indent': 'off', diff --git a/.storybook/.babelrc.js b/.storybook/.babelrc.js new file mode 100644 index 0000000..b8871e8 --- /dev/null +++ b/.storybook/.babelrc.js @@ -0,0 +1 @@ +module.exports = require('../.babelrc.js'); diff --git a/docs/getting-started.md b/docs/getting-started.md new file mode 100644 index 0000000..96be966 --- /dev/null +++ b/docs/getting-started.md @@ -0,0 +1,36 @@ +# Roleypoly Developer Guide + +If you would like to help build Roleypoly, this guide will help get you started. + +## Prerequisites + +- Node.js 14+ & Yarn +- Wrangler CLI +- (Optional): Terraform 0.14+ +- (Optional): Go 1.15+ + +## What things are built with + +- **Backend/API** + - Node.js & Typescript + - Cloudflare Workers +- **Frontend** + - Next.js & React & Typescript + - Storybooks + - Homegrown Atomic Design System +- **Discord Bot** + - Go + - Google Cloud Run +- **CI/CD** + - GitHub Actions + - Terraform + +## How does stuff fit together + +As for infrastructure: + +- CI/CD process deploys all pieces. +- Discord Bot is deployed on a Google Cloud VM +- UI & Backend is deployed via a Cloudflare Worker + +Biggest thing to note: this "discord bot" is an optional piece of the system, and should always remain as such. Giving it responsibility has actual engineering and dollar cost. diff --git a/hack/dockerfiles/bot.Dockerfile b/hack/dockerfiles/bot.Dockerfile new file mode 100644 index 0000000..a686281 --- /dev/null +++ b/hack/dockerfiles/bot.Dockerfile @@ -0,0 +1,46 @@ +FROM golang:1.15-alpine AS builder + +# Create the user and group files that will be used in the running container to +# run the process as an unprivileged user. +RUN mkdir /user && \ + echo 'nobody:x:65534:65534:nobody:/:' > /user/passwd && \ + echo 'nobody:x:65534:' > /user/group + +# Install the Certificate-Authority certificates for the app to be able to make +# calls to HTTPS endpoints. +# Git is required for fetching the dependencies. +RUN apk add --no-cache ca-certificates git + +# Set the working directory outside $GOPATH to enable the support for modules. +WORKDIR /src + +# Fetch dependencies first; they are less susceptible to change on every build +# and will therefore be cached for speeding up the next build +COPY ./go.mod ./go.sum ./ +RUN go mod download + +# Import the code from the context. +COPY ./ ./ + +# Build the executable to `/app`. Mark the build as statically linked. +RUN CGO_ENABLED=0 go build \ + -installsuffix "static" \ + -o /app ./src/discord-bot + +# Final stage: the running container. +FROM scratch AS final + +# Import the user and group files from the first stage. +COPY --from=builder /user/group /user/passwd /etc/ + +# Import the Certificate-Authority certificates for enabling HTTPS. +COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ + +# Import the compiled executable from the first stage. +COPY --from=builder /app /app + +# Perform any further action as an unprivileged user. +USER nobody:nobody + +# Run the compiled binary. +ENTRYPOINT ["/app"] \ No newline at end of file diff --git a/hack/jestSetup.ts b/hack/jestSetup.ts index a60a8bb..bdd340a 100644 --- a/hack/jestSetup.ts +++ b/hack/jestSetup.ts @@ -1,4 +1,8 @@ +import Enzyme from 'enzyme'; +import Adapter from '@wojtekmaj/enzyme-adapter-react-17'; import enableHooks from 'jest-react-hooks-shallow'; +Enzyme.configure({ adapter: new Adapter() }); + // pass an instance of jest to `enableHooks()` enableHooks(jest); diff --git a/next.config.js b/next.config.js new file mode 100644 index 0000000..91f9e81 --- /dev/null +++ b/next.config.js @@ -0,0 +1,3 @@ +module.exports = { + // target: 'serverless', +}; diff --git a/package.json b/package.json index 15c647b..a29af35 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "devDependencies": { "@babel/core": "^7.12.9", "@cloudflare/workers-types": "^2.1.0", + "@icons/material": "^0.4.1", "@storybook/addon-actions": "^6.1.10", "@storybook/addon-essentials": "^6.1.10", "@storybook/addon-links": "^6.1.10", @@ -51,6 +52,7 @@ "@types/chroma-js": "^2.1.2", "@types/enzyme": "^3.10.8", "@types/enzyme-adapter-react-16": "^1.0.6", + "@types/express": "^4.17.9", "@types/jest": "^26.0.16", "@types/minimist": "^1.2.1", "@types/node": "^14.14.10", @@ -62,17 +64,18 @@ "@typescript-eslint/eslint-plugin": "^4.9.0", "@typescript-eslint/eslint-plugin-tslint": "^4.9.0", "@typescript-eslint/parser": "^4.9.0", + "@wojtekmaj/enzyme-adapter-react-17": "^0.3.2", "babel-jest": "^26.6.3", "babel-loader": "^8.2.2", "babel-plugin-styled-components": "^1.12.0", "enzyme": "^3.11.0", - "enzyme-adapter-react-16": "^1.15.5", "enzyme-to-json": "^3.6.1", "eslint": "^7.15.0", - "eslint-config-prettier": "^6.15.0", + "eslint-config-prettier": "^7.0.0", "eslint-plugin-import": "^2.22.1", "eslint-plugin-jsdoc": "^30.7.8", "eslint-plugin-react": "^7.21.5", + "express": "^4.17.1", "jest": "^26.6.3", "jest-cli": "^26.6.3", "jest-environment-enzyme": "^7.1.2", diff --git a/src/backend-worker/handlers/bot-join.ts b/src/backend-worker/handlers/bot-join.ts index a9b31f4..c980ea4 100644 --- a/src/backend-worker/handlers/bot-join.ts +++ b/src/backend-worker/handlers/bot-join.ts @@ -1,4 +1,5 @@ import { Bounce } from '../utils/bounce'; +import { botClientID } from '../utils/config'; const validGuildID = /^[0-9]+$/; @@ -27,7 +28,7 @@ export const BotJoin = (request: Request): Response => { return Bounce( buildURL({ - clientID: BOT_CLIENT_ID, + clientID: botClientID, permissions: 268435456, guildID, }) diff --git a/src/backend-worker/utils/api-tools.ts b/src/backend-worker/utils/api-tools.ts index badd55d..8fbb06e 100644 --- a/src/backend-worker/utils/api-tools.ts +++ b/src/backend-worker/utils/api-tools.ts @@ -16,7 +16,7 @@ export const respond = (obj: Record, init?: ResponseInit) => export const resolveFailures = ( handleWith: Response, handler: (request: Request) => Promise | Response -) => async (request: Request): Promise | Response => { +) => async (request: Request): Promise => { try { return handler(request); } catch (e) { diff --git a/src/backend-worker/utils/config.ts b/src/backend-worker/utils/config.ts index 4fe1a94..4582ea8 100644 --- a/src/backend-worker/utils/config.ts +++ b/src/backend-worker/utils/config.ts @@ -1,11 +1,13 @@ const self = (global as any) as Record; +const env = (key: string) => self[key] ?? process?.env[key] ?? ''; + const safeURI = (x: string) => x.replace(/\/$/, ''); const list = (x: string) => x.split(','); -export const botClientID = self.BOT_CLIENT_ID; -export const botClientSecret = self.BOT_CLIENT_SECRET; -export const uiPublicURI = safeURI(self.UI_PUBLIC_URI); -export const apiPublicURI = safeURI(self.API_PUBLIC_URI); -export const rootUsers = list(self.ROOT_USERS); -export const kvPrefix = self.KV_PREFIX; +export const botClientID = env('BOT_CLIENT_ID'); +export const botClientSecret = env('BOT_CLIENT_SECRET'); +export const uiPublicURI = safeURI(env('UI_PUBLIC_URI')); +export const apiPublicURI = safeURI(env('API_PUBLIC_URI')); +export const rootUsers = list(env('ROOT_USERS')); +export const kvPrefix = env('KV_PREFIX'); diff --git a/src/backend-worker/utils/kv.ts b/src/backend-worker/utils/kv.ts index ba2a6ab..8b86f71 100644 --- a/src/backend-worker/utils/kv.ts +++ b/src/backend-worker/utils/kv.ts @@ -21,6 +21,70 @@ class WrappedKVNamespace { delete = this.kvNamespace.delete; } -export const Sessions = new WrappedKVNamespace(KV_SESSIONS); -export const GuildData = new WrappedKVNamespace(KV_GUILD_DATA); -export const Guilds = new WrappedKVNamespace(KV_GUILDS); +class EmulatedKV implements KVNamespace { + constructor() { + console.warn('EmulatedKV used. Data will be lost.'); + } + + private data: Map = new Map(); + + async get(key: string): Promise { + if (!this.data.has(key)) { + return null; + } + + return this.data.get(key); + } + + async getWithMetadata( + key: string + ): KVValueWithMetadata { + return { + value: await this.get(key), + metadata: {} as Metadata, + }; + } + + async put(key: string, value: string | ReadableStream | ArrayBuffer | FormData) { + this.data.set(key, value); + } + + async delete(key: string) { + this.data.delete(key); + } + + async list(options?: { + prefix?: string; + limit?: number; + cursor?: string; + }): Promise<{ + keys: { name: string; expiration?: number; metadata?: unknown }[]; + list_complete: boolean; + cursor: string; + }> { + let keys: { name: string }[] = []; + + for (let key of this.data.keys()) { + if (options?.prefix && !key.startsWith(options.prefix)) { + continue; + } + + keys.push({ name: key }); + } + + return { + keys, + cursor: '0', + list_complete: true, + }; + } +} + +const kvOrLocal = (namespace: KVNamespace | null): KVNamespace => + namespace || new EmulatedKV(); + +const self = (global as any) as Record; + +export const Sessions = new WrappedKVNamespace(kvOrLocal(self.KV_SESSIONS ?? null)); +export const GuildData = new WrappedKVNamespace(kvOrLocal(self.KV_GUILD_DATA ?? null)); +export const Guilds = new WrappedKVNamespace(kvOrLocal(self.KV_GUILDS ?? null)); diff --git a/src/design-system/molecules/editor-category/EditorCategory.tsx b/src/design-system/molecules/editor-category/EditorCategory.tsx index 071e862..2d580f1 100644 --- a/src/design-system/molecules/editor-category/EditorCategory.tsx +++ b/src/design-system/molecules/editor-category/EditorCategory.tsx @@ -98,6 +98,8 @@ export const EditorCategory = (props: Props) => { Roles setRoleSearchPopoverActive(false)} > diff --git a/src/design-system/organisms/editor/EditorShell.tsx b/src/design-system/organisms/editor/EditorShell.tsx index 41c9cda..5608a18 100644 --- a/src/design-system/organisms/editor/EditorShell.tsx +++ b/src/design-system/organisms/editor/EditorShell.tsx @@ -9,7 +9,7 @@ type Props = { }; export const EditorShell = (props: Props) => ( - + {() => } {() =>
hi2!
}
diff --git a/src/design-system/templates/errors/Errors.tsx b/src/design-system/templates/errors/Errors.tsx index 7b80a04..44b7afd 100644 --- a/src/design-system/templates/errors/Errors.tsx +++ b/src/design-system/templates/errors/Errors.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; +import { DiscordUser } from 'roleypoly/common/types'; import { DotOverlay } from 'roleypoly/design-system/atoms/dot-overlay'; import { Hero } from 'roleypoly/design-system/atoms/hero'; import { @@ -6,20 +7,19 @@ import { ErrorMessage, } from 'roleypoly/design-system/molecules/error-banner'; import { AppShell } from 'roleypoly/design-system/organisms/app-shell'; -import { RoleypolyUser } from 'roleypoly/common/types'; import { getMessageFromCode } from './errorStrings'; export type ErrorProps = { code: string | number; messageOverride?: ErrorMessage; - user?: RoleypolyUser | null; + user?: DiscordUser | null; }; export const Error = (props: ErrorProps) => { const messageFromCode = getMessageFromCode(props.code); return ( - + diff --git a/tsconfig.json b/tsconfig.json index 001aebc..745aa87 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -28,5 +28,5 @@ "isolatedModules": true }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], - "exclude": ["node_modules", "**/*.stories.tsx"] + "exclude": ["node_modules", "**/*.stories.tsx", "src/backend-worker"] } diff --git a/tsconfig.stories.json b/tsconfig.stories.json index 01df361..70c8c8b 100644 --- a/tsconfig.stories.json +++ b/tsconfig.stories.json @@ -2,6 +2,6 @@ "extends": "./tsconfig.json", "compilerOptions": { "jsx": "react-jsx" - }, - "exclude": ["node_modules"] + } + // "exclude": ["node_modules"] } diff --git a/yarn.lock b/yarn.lock index 62b1fd1..830e9a0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1237,6 +1237,11 @@ resolved "https://registry.yarnpkg.com/@icons/material/-/material-0.2.4.tgz#e90c9f71768b3736e76d7dd6783fc6c2afa88bc8" integrity sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw== +"@icons/material@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@icons/material/-/material-0.4.1.tgz#20ba0dff8d59a2b8749c7ad765faad52ae45b868" + integrity sha512-r4CuKUZv9GeAYvWc6WEVF0Xiw/IS4S50zna/M0/ISJOKe3RbpbHN3yBjX7ZnaPGqH/rm5SnDBv8FNOHLpM7OpQ== + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -2253,6 +2258,14 @@ dependencies: "@babel/types" "^7.3.0" +"@types/body-parser@*": + version "1.19.0" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" + integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== + dependencies: + "@types/connect" "*" + "@types/node" "*" + "@types/braces@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/braces/-/braces-3.0.0.tgz#7da1c0d44ff1c7eb660a36ec078ea61ba7eb42cb" @@ -2270,6 +2283,13 @@ resolved "https://registry.yarnpkg.com/@types/chroma-js/-/chroma-js-2.1.2.tgz#edd640f17dbd13561ace34c13fdc43416b013223" integrity sha512-fpIsY+9doOvRiBLR0xtubHmGBEVhis2z3CSWcxRDy7L2noKWXkT49c1QiU0RZ2YLc8lHitxu13HTuVItXUdD/g== +"@types/connect@*": + version "3.4.33" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546" + integrity sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A== + dependencies: + "@types/node" "*" + "@types/enzyme-adapter-react-16@^1.0.6": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.6.tgz#8aca7ae2fd6c7137d869b6616e696d21bb8b0cec" @@ -2306,6 +2326,25 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.45.tgz#e9387572998e5ecdac221950dab3e8c3b16af884" integrity sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g== +"@types/express-serve-static-core@*": + version "4.17.14" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.14.tgz#cabf91debeeb3cb04b798e2cff908864e89b6106" + integrity sha512-uFTLwu94TfUFMToXNgRZikwPuZdOtDgs3syBtAIr/OXorL1kJqUJT9qCLnRZ5KBOWfZQikQ2xKgR2tnDj1OgDA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@^4.17.9": + version "4.17.9" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.9.tgz#f5f2df6add703ff28428add52bdec8a1091b0a78" + integrity sha512-SDzEIZInC4sivGIFY4Sz1GG6J9UObPwCInYJjko2jzOf/Imx/dlpume6Xxwj1ORL82tBbmN4cPDIDkLbWHk9hw== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/qs" "*" + "@types/serve-static" "*" + "@types/glob-base@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@types/glob-base/-/glob-base-0.3.0.tgz#a581d688347e10e50dd7c17d6f2880a10354319d" @@ -2422,6 +2461,11 @@ dependencies: "@types/braces" "*" +"@types/mime@*": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" + integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== + "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -2480,11 +2524,16 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== -"@types/qs@^6.9.0": +"@types/qs@*", "@types/qs@^6.9.0": version "6.9.5" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.5.tgz#434711bdd49eb5ee69d90c1d67c354a9a8ecb18b" integrity sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ== +"@types/range-parser@*": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" + integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== + "@types/reach__router@^1.3.5": version "1.3.6" resolved "https://registry.yarnpkg.com/@types/reach__router/-/reach__router-1.3.6.tgz#413417ce74caab331c70ce6a03a4c825188e4709" @@ -2544,6 +2593,14 @@ dependencies: "@types/react" "*" +"@types/serve-static@*": + version "1.13.8" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.8.tgz#851129d434433c7082148574ffec263d58309c46" + integrity sha512-MoJhSQreaVoL+/hurAZzIm8wafFR6ajiTM1m4A0kv6AGeVBl4r4pOV8bGFrjjq1sGxDTnCoF8i22o0/aE5XCyA== + dependencies: + "@types/mime" "*" + "@types/node" "*" + "@types/source-list-map@*": version "0.1.2" resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" @@ -2871,6 +2928,21 @@ text-table "^0.2.0" webpack-log "^1.1.2" +"@wojtekmaj/enzyme-adapter-react-17@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@wojtekmaj/enzyme-adapter-react-17/-/enzyme-adapter-react-17-0.3.2.tgz#a7d78d9f8765df745e3ddf68d4f5e1d46c91cd4a" + integrity sha512-/zIKdaJ32A2r3roB/plbQD7F5J5cbGXnHFnnAAOW3/DQFLCQU/XpEB1Aasm4StkP0eHs9VhW/tTQiYeglwLi4Q== + dependencies: + enzyme-adapter-utils "^1.13.1" + enzyme-shallow-equal "^1.0.4" + has "^1.0.3" + object.assign "^4.1.0" + object.values "^1.1.1" + prop-types "^15.7.2" + react-is "^16.13.1" + react-test-renderer "^17.0.0-0" + semver "^5.7.0" + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -5725,21 +5797,6 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== -enzyme-adapter-react-16@^1.15.5: - version "1.15.5" - resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.5.tgz#7a6f0093d3edd2f7025b36e7fbf290695473ee04" - integrity sha512-33yUJGT1nHFQlbVI5qdo5Pfqvu/h4qPwi1o0a6ZZsjpiqq92a3HjynDhwd1IeED+Su60HDWV8mxJqkTnLYdGkw== - dependencies: - enzyme-adapter-utils "^1.13.1" - enzyme-shallow-equal "^1.0.4" - has "^1.0.3" - object.assign "^4.1.0" - object.values "^1.1.1" - prop-types "^15.7.2" - react-is "^16.13.1" - react-test-renderer "^16.0.0-0" - semver "^5.7.0" - enzyme-adapter-utils@^1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.13.1.tgz#59c1b734b0927543e3d8dc477299ec957feb312d" @@ -5957,12 +6014,10 @@ escodegen@^1.12.0, escodegen@^1.14.1, escodegen@^1.9.1: optionalDependencies: source-map "~0.6.1" -eslint-config-prettier@^6.15.0: - version "6.15.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" - integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== - dependencies: - get-stdin "^6.0.0" +eslint-config-prettier@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-7.0.0.tgz#c1ae4106f74e6c0357f44adb076771d032ac0e97" + integrity sha512-8Y8lGLVPPZdaNA7JXqnvETVC7IiVRgAP6afQu9gOQRn90YY3otMNh+x7Vr2vMePQntF+5erdSUBqSzCmU/AxaQ== eslint-import-resolver-node@^0.3.4: version "0.3.4" @@ -6255,7 +6310,7 @@ expect@^26.6.2: jest-message-util "^26.6.2" jest-regex-util "^26.0.0" -express@^4.17.0: +express@^4.17.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== @@ -6802,11 +6857,6 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stdin@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" - integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== - get-stdin@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" @@ -11246,12 +11296,12 @@ react-inspector@^5.0.1: is-dom "^1.0.0" prop-types "^15.0.0" -react-is@16.13.1, react-is@^16.12.0, react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6: +react-is@16.13.1, react-is@^16.12.0, react-is@^16.13.1, 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-is@^17.0.1: +"react-is@^16.12.0 || ^17.0.0", react-is@^17.0.1: version "17.0.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== @@ -11283,6 +11333,14 @@ react-refresh@0.8.3, react-refresh@^0.8.3: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== +react-shallow-renderer@^16.13.1: + version "16.14.1" + resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.14.1.tgz#bf0d02df8a519a558fd9b8215442efa5c840e124" + integrity sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg== + dependencies: + object-assign "^4.1.1" + react-is "^16.12.0 || ^17.0.0" + react-sizeme@^2.6.7: version "2.6.12" resolved "https://registry.yarnpkg.com/react-sizeme/-/react-sizeme-2.6.12.tgz#ed207be5476f4a85bf364e92042520499455453e" @@ -11304,15 +11362,15 @@ react-syntax-highlighter@^13.5.0: prismjs "^1.21.0" refractor "^3.1.0" -react-test-renderer@^16.0.0-0: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.14.0.tgz#e98360087348e260c56d4fe2315e970480c228ae" - integrity sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg== +react-test-renderer@^17.0.0-0: + version "17.0.1" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-17.0.1.tgz#3187e636c3063e6ae498aedf21ecf972721574c7" + integrity sha512-/dRae3mj6aObwkjCcxZPlxDFh73XZLgvwhhyON2haZGUEhiaY5EjfAdw+d/rQmlcFwdTpMXCSGVk374QbCTlrA== dependencies: object-assign "^4.1.1" - prop-types "^15.6.2" - react-is "^16.8.6" - scheduler "^0.19.1" + react-is "^17.0.1" + react-shallow-renderer "^16.13.1" + scheduler "^0.20.1" react-textarea-autosize@^8.1.1: version "8.3.0" @@ -11953,14 +12011,6 @@ saxes@^5.0.0: dependencies: xmlchars "^2.2.0" -scheduler@^0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" - integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler@^0.20.1: version "0.20.1" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.1.tgz#da0b907e24026b01181ecbc75efdc7f27b5a000c"