├── .node-version ├── .gitignore ├── .eslintignore ├── src ├── index.ts ├── plugin │ ├── generateTypeScriptFile │ │ ├── mocks │ │ │ ├── pages │ │ │ │ ├── 404.tsx │ │ │ │ ├── README.md │ │ │ │ ├── _app.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── _document.tsx │ │ │ │ ├── api │ │ │ │ │ ├── [authId].ts │ │ │ │ │ ├── users │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── [userId] │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── catch-all │ │ │ │ │ │ └── [...slug].ts │ │ │ │ │ ├── optional-catch-all │ │ │ │ │ │ └── [[...slug]].ts │ │ │ │ │ └── multiple-periods │ │ │ │ │ │ └── site.webmanifest.ts │ │ │ │ ├── users │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── [userId] │ │ │ │ │ │ └── index.tsx │ │ │ │ ├── catch-all │ │ │ │ │ └── [...slug].tsx │ │ │ │ ├── optional-catch-all │ │ │ │ │ └── [[...slug]].tsx │ │ │ │ ├── nested-catch-all │ │ │ │ │ └── [dynamic] │ │ │ │ │ │ └── slugs │ │ │ │ │ │ └── [...slug].tsx │ │ │ │ └── route-with-symbols │ │ │ │ │ └── [value-with-hyphens].tsx │ │ │ └── pages-no-api-routes │ │ │ │ └── index.tsx │ │ ├── index.ts │ │ ├── utils.ts │ │ ├── types.ts │ │ ├── getNextRouteUrlParams.ts │ │ ├── generateTypeScriptFile.test.ts │ │ ├── getRoutes.ts │ │ ├── getNextPageRoute.ts │ │ ├── generateTypeScriptFile.ts │ │ ├── getFileContent.ts │ │ └── __snapshots__ │ │ │ └── generateTypeScriptFile.test.ts.snap │ └── index.ts ├── utils.test.ts └── utils.ts ├── plugin.js ├── example ├── src │ ├── components │ │ ├── index.tsx │ │ └── Link.tsx │ ├── hooks │ │ ├── index.ts │ │ ├── useRouter.ts │ │ └── useApiRoute.ts │ ├── pages │ │ ├── _app.tsx │ │ ├── api │ │ │ ├── users │ │ │ │ ├── index.ts │ │ │ │ └── [userId].ts │ │ │ └── mocks.ts │ │ ├── catch-all │ │ │ └── [...slug].tsx │ │ ├── optional-catch-all │ │ │ └── [[...slug]].tsx │ │ ├── nested-catch-all │ │ │ └── [dynamic] │ │ │ │ └── slugs │ │ │ │ └── [...slug].tsx │ │ ├── users │ │ │ ├── index.tsx │ │ │ └── [userId].tsx │ │ └── index.tsx │ └── @types │ │ └── next-type-safe-routes │ │ └── index.d.ts ├── next-env.d.ts ├── public │ ├── favicon.ico │ └── vercel.svg ├── next.config.js ├── package.json ├── .gitignore ├── tsconfig.json ├── README.md └── yarn.lock ├── example.gif ├── getRoute.gif ├── jest.config.js ├── .github └── workflows │ ├── test.yml │ └── main.yml ├── tsconfig.json ├── .prettierrc.js ├── .eslintrc.js ├── license.md ├── package.json └── README.md /.node-version: -------------------------------------------------------------------------------- 1 | 14.16.0 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | \dist 2 | \node_modules -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | dist 2 | example 3 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./utils"; 2 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/mocks/pages/404.tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/mocks/pages/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/mocks/pages/_app.tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/mocks/pages/index.tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/mocks/pages/_document.tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/mocks/pages/api/[authId].ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/mocks/pages/users/index.tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /plugin.js: -------------------------------------------------------------------------------- 1 | module.exports = require("./dist/plugin").default; 2 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/mocks/pages/api/users/index.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/mocks/pages-no-api-routes/index.tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/mocks/pages/api/catch-all/[...slug].ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/mocks/pages/api/users/[userId]/index.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/mocks/pages/catch-all/[...slug].tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/mocks/pages/users/[userId]/index.tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /example/src/components/index.tsx: -------------------------------------------------------------------------------- 1 | export { default as Link } from "./Link"; 2 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/mocks/pages/api/optional-catch-all/[[...slug]].ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/mocks/pages/optional-catch-all/[[...slug]].tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/mocks/pages/api/multiple-periods/site.webmanifest.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ckastbjerg/next-type-safe-routes/HEAD/example.gif -------------------------------------------------------------------------------- /getRoute.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ckastbjerg/next-type-safe-routes/HEAD/getRoute.gif -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/mocks/pages/nested-catch-all/[dynamic]/slugs/[...slug].tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/mocks/pages/route-with-symbols/[value-with-hyphens].tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | preset: 'ts-jest', 3 | testEnvironment: 'node', 4 | }; -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./generateTypeScriptFile"; 2 | -------------------------------------------------------------------------------- /example/next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /example/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ckastbjerg/next-type-safe-routes/HEAD/example/public/favicon.ico -------------------------------------------------------------------------------- /example/src/hooks/index.ts: -------------------------------------------------------------------------------- 1 | export { default as useRouter } from "./useRouter"; 2 | export { default as useApiRoute } from "./useApiRoute"; 3 | -------------------------------------------------------------------------------- /example/src/pages/_app.tsx: -------------------------------------------------------------------------------- 1 | function MyApp({ Component, pageProps }) { 2 | return ; 3 | } 4 | 5 | export default MyApp; 6 | -------------------------------------------------------------------------------- /example/next.config.js: -------------------------------------------------------------------------------- 1 | const withPlugins = require("next-compose-plugins"); 2 | const nextTypeSafePages = require("next-type-safe-routes/plugin"); 3 | 4 | module.exports = withPlugins([nextTypeSafePages]); 5 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/utils.ts: -------------------------------------------------------------------------------- 1 | export const getIsCatchAllRoute = (route: string) => !!route.match(/\[\.\.\./); 2 | export const getIsOptionalCatchAllRoute = (route: string) => 3 | !!route.match(/\[\[\.\.\./); 4 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/types.ts: -------------------------------------------------------------------------------- 1 | export type Page = { 2 | route: string; 3 | params?: string[]; 4 | isCatchAllRoute: boolean; 5 | isOptionalCatchAllRoute: boolean; 6 | }; 7 | 8 | export type ApiRoute = Page; 9 | -------------------------------------------------------------------------------- /example/src/pages/api/users/index.ts: -------------------------------------------------------------------------------- 1 | import { NextApiRequest, NextApiResponse } from "next"; 2 | 3 | import { users } from "../mocks"; 4 | 5 | export default function handler(req: NextApiRequest, res: NextApiResponse) { 6 | res.status(200).json(users); 7 | } 8 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | on: push 3 | jobs: 4 | build: 5 | runs-on: ubuntu-latest 6 | steps: 7 | - uses: actions/checkout@v2 8 | - name: Install modules 9 | run: yarn 10 | - name: Run tests 11 | run: yarn test 12 | -------------------------------------------------------------------------------- /example/src/pages/api/mocks.ts: -------------------------------------------------------------------------------- 1 | export const users = [ 2 | { userId: "1", name: "Nat Friedman" }, 3 | { userId: "2", name: "Jordan Walke" }, 4 | { userId: "3", name: "Naval Ravikant" }, 5 | { userId: "4", name: "Jessie Frazelle" }, 6 | { userId: "5", name: "Ilya Sukhar" }, 7 | ]; 8 | -------------------------------------------------------------------------------- /example/src/pages/catch-all/[...slug].tsx: -------------------------------------------------------------------------------- 1 | import { useRouter } from "hooks"; 2 | 3 | const CatchAll = () => { 4 | const router = useRouter(); 5 | const slug = router.query.slug as string[]; 6 | return
Slugs: {slug.join(",")}
; 7 | }; 8 | 9 | export default CatchAll; 10 | -------------------------------------------------------------------------------- /example/src/pages/optional-catch-all/[[...slug]].tsx: -------------------------------------------------------------------------------- 1 | import { useRouter } from "hooks"; 2 | 3 | const OptionalCatchAll = () => { 4 | const router = useRouter(); 5 | const slug = router.query.slug; 6 | return
{slug ? (slug as string[]).join(",") : "no slug"}
; 7 | }; 8 | 9 | export default OptionalCatchAll; 10 | -------------------------------------------------------------------------------- /example/src/pages/api/users/[userId].ts: -------------------------------------------------------------------------------- 1 | import { NextApiRequest, NextApiResponse } from "next"; 2 | 3 | import { users } from "../mocks"; 4 | 5 | export default function handler(req: NextApiRequest, res: NextApiResponse) { 6 | const userId = req.query.userId as string; 7 | const user = users.find((user) => user.userId === userId); 8 | res.status(200).json(user); 9 | } 10 | -------------------------------------------------------------------------------- /example/src/pages/nested-catch-all/[dynamic]/slugs/[...slug].tsx: -------------------------------------------------------------------------------- 1 | import { useRouter } from "hooks"; 2 | 3 | const CatchAll = () => { 4 | const router = useRouter(); 5 | const { dynamic, slug } = router.query; 6 | return ( 7 |
8 |
dynamic: {dynamic}
9 |
Slugs: {(slug as string[]).join(",")}
10 |
11 | ); 12 | }; 13 | 14 | export default CatchAll; 15 | -------------------------------------------------------------------------------- /example/src/hooks/useRouter.ts: -------------------------------------------------------------------------------- 1 | import { TypeSafePage, getRoute } from "next-type-safe-routes"; 2 | import { useRouter as useNextRouter } from "next/router"; 3 | 4 | const useRouter = () => { 5 | const router = useNextRouter(); 6 | 7 | const push = (typeSafeUrl: TypeSafePage) => { 8 | router.push(getRoute(typeSafeUrl)); 9 | }; 10 | 11 | return { ...router, push }; 12 | }; 13 | 14 | export default useRouter; 15 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "strictNullChecks": true, 5 | "target": "es5", 6 | "outDir": "dist", 7 | "module": "commonjs", 8 | "moduleResolution": "node", 9 | "esModuleInterop": true, 10 | "sourceMap": true, 11 | "lib": ["es2015", "dom"], 12 | "rootDir": "src" 13 | }, 14 | "include": ["src"], 15 | "exclude": ["node_modules", "dist"] 16 | } 17 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | semi: true, 3 | tabWidth: 2, 4 | printWidth: 80, 5 | singleQuote: false, 6 | trailingComma: "es5", 7 | useTabs: false, 8 | quoteProps: "as-needed", 9 | bracketSpacing: true, 10 | arrowParens: "always", 11 | requirePragma: false, 12 | insertPragma: false, 13 | proseWrap: "preserve", 14 | htmlWhitespaceSensitivity: "css", 15 | endOfLine: "lf", 16 | embeddedLanguageFormatting: "auto", 17 | }; 18 | -------------------------------------------------------------------------------- /example/src/components/Link.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import NextLink from "next/link"; 4 | 5 | import { getRoute, TypeSafePage } from "next-type-safe-routes"; 6 | 7 | type Props = { 8 | to: TypeSafePage; 9 | children: any; 10 | }; 11 | 12 | const Link = ({ to, children, ...rest }: Props) => ( 13 | 14 | {children} 15 | 16 | ); 17 | 18 | export default Link; 19 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/getNextRouteUrlParams.ts: -------------------------------------------------------------------------------- 1 | const isCatchAllParam = (param: string) => param.match(/\.\.\./); 2 | const getNextRouteUrlParams = (href: string) => { 3 | const paramStrings = href.match(/\[([^\]]+)\]/g); 4 | const params = paramStrings 5 | ?.filter((param) => !isCatchAllParam(param)) 6 | .map((param) => param.replace("[", "").replace("]", "")); 7 | 8 | return params?.length ? params : undefined; 9 | }; 10 | 11 | export default getNextRouteUrlParams; 12 | -------------------------------------------------------------------------------- /example/src/pages/users/index.tsx: -------------------------------------------------------------------------------- 1 | import { Link } from "components"; 2 | import { useApiRoute } from "hooks"; 3 | 4 | const UsersPage = () => { 5 | const [users] = useApiRoute("/api/users"); 6 | 7 | if (!users) { 8 | return "Loading..."; 9 | } 10 | 11 | return ( 12 | <> 13 | {users.map(({ userId, name }) => ( 14 | 15 | {name} 16 | 17 | ))} 18 | 19 | ); 20 | }; 21 | 22 | export default UsersPage; 23 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Node.js Package 2 | on: 3 | release: 4 | types: [created] 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v2 10 | # Setup .npmrc file to publish to npm 11 | - uses: actions/setup-node@v2 12 | with: 13 | node-version: "14.x" 14 | registry-url: "https://registry.npmjs.org" 15 | - run: npm install 16 | - run: npm publish 17 | env: 18 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 19 | -------------------------------------------------------------------------------- /example/src/hooks/useApiRoute.ts: -------------------------------------------------------------------------------- 1 | import useSWR from "swr"; 2 | import { getRoute, TypeSafeApiRoute } from "next-type-safe-routes"; 3 | 4 | // @ts-ignore fetch(...args) expects 1-2 arguments, but this is from swr docs 5 | const fetcher = (...args) => fetch(...args).then((res) => res.json()); 6 | 7 | const useApiRoute = (typeSafeRoute: TypeSafeApiRoute) => { 8 | const route = getRoute(typeSafeRoute); 9 | const { data, error } = useSWR(route, fetcher); 10 | return [data, { error }] as const; 11 | }; 12 | 13 | export default useApiRoute; 14 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/generateTypeScriptFile.test.ts: -------------------------------------------------------------------------------- 1 | import generateTypeScriptFile from "./index"; 2 | 3 | describe("plugin/generateTypeScriptFile", () => { 4 | it("works as expected", () => { 5 | const pagesDir = __dirname + "/mocks/pages"; 6 | expect(generateTypeScriptFile(pagesDir)).toMatchSnapshot(); 7 | }); 8 | it("works for projects not using API routes", () => { 9 | const pagesDir = __dirname + "/mocks/pages-no-api-routes"; 10 | expect(generateTypeScriptFile(pagesDir)).toMatchSnapshot(); 11 | }); 12 | }); 13 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start" 9 | }, 10 | "dependencies": { 11 | "next": "10.0.9", 12 | "react": "17.0.1", 13 | "react-dom": "17.0.1", 14 | "next-compose-plugins": "^2.2.1", 15 | "next-type-safe-routes": "latest", 16 | "swr": "^0.5.4" 17 | }, 18 | "devDependencies": { 19 | "@types/react": "^17.0.3", 20 | "typescript": "^4.2.3" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /example/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env.local 29 | .env.development.local 30 | .env.test.local 31 | .env.production.local 32 | 33 | # vercel 34 | .vercel 35 | -------------------------------------------------------------------------------- /example/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": false, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "baseUrl": "./src" 17 | }, 18 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 19 | "exclude": ["node_modules"] 20 | } 21 | -------------------------------------------------------------------------------- /example/src/pages/users/[userId].tsx: -------------------------------------------------------------------------------- 1 | import { Link } from "components"; 2 | import { useApiRoute, useRouter } from "hooks"; 3 | 4 | const UserPage = () => { 5 | const { query } = useRouter(); 6 | const userId = query.userId as string; 7 | const [user] = useApiRoute({ 8 | route: "/api/users/[userId]", 9 | params: { userId }, 10 | query: { test: 2 }, 11 | }); 12 | 13 | if (!user) { 14 | return "Loading..."; 15 | } 16 | 17 | return ( 18 | <> 19 |

{user.name}

20 | Back to users 21 | 22 | ); 23 | }; 24 | 25 | export default UserPage; 26 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/getRoutes.ts: -------------------------------------------------------------------------------- 1 | import getNextPageRoute from "./getNextPageRoute"; 2 | import getNextRouteUrlParams from "./getNextRouteUrlParams"; 3 | import { Page } from "./types"; 4 | import { getIsCatchAllRoute, getIsOptionalCatchAllRoute } from "./utils"; 5 | 6 | const getRoutes = (fileNames: string[]): Page[] => { 7 | return fileNames.map((fileName) => { 8 | return { 9 | route: getNextPageRoute(fileName), 10 | params: getNextRouteUrlParams(fileName), 11 | isCatchAllRoute: getIsCatchAllRoute(fileName), 12 | isOptionalCatchAllRoute: getIsOptionalCatchAllRoute(fileName), 13 | }; 14 | }); 15 | }; 16 | 17 | export default getRoutes; 18 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/getNextPageRoute.ts: -------------------------------------------------------------------------------- 1 | import { getIsCatchAllRoute, getIsOptionalCatchAllRoute } from "./utils"; 2 | 3 | const getNextPageRoute = (fileName: string) => { 4 | if (getIsOptionalCatchAllRoute(fileName)) { 5 | return fileName.split("/[[...")[0]; 6 | } else if (getIsCatchAllRoute(fileName)) { 7 | return fileName.split("/[...")[0]; 8 | } 9 | 10 | const route = fileName 11 | // remove the file extension 12 | .replace(/\.[^.]+$/, "") 13 | // index pages don't need the "/index" when used as hrefs 14 | .replace("/index", ""); 15 | 16 | // if this is the root index file, return "/"" instead of "" 17 | return route === "" ? "/" : route; 18 | }; 19 | 20 | export default getNextPageRoute; 21 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | parser: "@typescript-eslint/parser", // Specifies the ESLint parser 3 | parserOptions: { 4 | ecmaVersion: 2020, // Allows for the parsing of modern ECMAScript features 5 | sourceType: "module", // Allows for the use of imports 6 | ecmaFeatures: { 7 | jsx: true, // Allows for the parsing of JSX 8 | }, 9 | }, 10 | settings: { 11 | react: { 12 | version: "detect", // Tells eslint-plugin-react to automatically detect the version of React to use 13 | }, 14 | }, 15 | plugins: ["prettier"], 16 | extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"], 17 | rules: { 18 | // if you turn off a rule, explain why 19 | "prettier/prettier": "warn", 20 | }, 21 | }; 22 | -------------------------------------------------------------------------------- /example/src/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import { Link } from "components"; 2 | import { useRouter } from "hooks"; 3 | 4 | const Home = () => { 5 | const { push } = useRouter(); 6 | return ( 7 | <> 8 | 9 | Optional catch all (no path) 10 | 11 | Optional catch all 12 | 13 | Catch all 14 | 21 | Nested catch all (with params) 22 | 23 | 24 | ); 25 | }; 26 | 27 | export default Home; 28 | -------------------------------------------------------------------------------- /example/public/vercel.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /example/src/@types/next-type-safe-routes/index.d.ts: -------------------------------------------------------------------------------- 1 | // IMPORTANT! This file is autogenerated by the `type-safe-next-routes` 2 | // package. You should _not_ update these types manually... 3 | 4 | declare module "next-type-safe-routes" { 5 | type Query = { [key: string]: any }; 6 | export type TypeSafePage = { route: "/catch-all", path: string, query?: Query } | "/" | { route: "/", query?: Query } | { route: "/nested-catch-all/[dynamic]/slugs", path: string, params: { dynamic: string | number }, query?: Query } | "/optional-catch-all" | { route: "/optional-catch-all", path?: string, query?: Query } | { route: "/users/[userId]", params: { userId: string | number }, query?: Query } | "/users" | { route: "/users", query?: Query }; 7 | export type TypeSafeApiRoute = "/api/mocks" | { route: "/api/mocks", query?: Query } | { route: "/api/users/[userId]", params: { userId: string | number }, query?: Query } | "/api/users" | { route: "/api/users", query?: Query }; 8 | export const getPathname = (typeSafeUrl: TypeSafePage | TypeSafeApiRoute) => string; 9 | export const getRoute = (typeSafeUrl: TypeSafePage | TypeSafeApiRoute) => string; 10 | } 11 | -------------------------------------------------------------------------------- /license.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) [year] [fullname] 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/utils.test.ts: -------------------------------------------------------------------------------- 1 | import { getRoute, getPathname } from "./utils"; 2 | 3 | describe("utils/getRoute", () => { 4 | it("works as expected for basic routes", () => { 5 | expect(getRoute("/routes")).toBe("/routes"); 6 | }); 7 | 8 | it("works as expected when having (untyped) query params", () => { 9 | expect(getRoute({ route: "/routes", query: { a: "b", 1: 2 } })).toBe( 10 | "/routes?1=2&a=b" 11 | ); 12 | }); 13 | 14 | it("works as expected for dynamic routes", () => { 15 | const route = getRoute({ 16 | route: "/routes/[routeId]", 17 | params: { routeId: 1 }, 18 | }); 19 | expect(route).toBe("/routes/1"); 20 | }); 21 | 22 | it("works as expected when having (untyped) query params for dynamic routes", () => { 23 | const route = getRoute({ 24 | route: "/routes/[routeId]", 25 | params: { routeId: 1 }, 26 | query: { a: "b" }, 27 | }); 28 | expect(route).toBe("/routes/1?a=b"); 29 | }); 30 | }); 31 | 32 | describe("utils/getPathname", () => { 33 | it("works as expected for basic routes", () => { 34 | expect(getPathname("/routes")).toBe("/routes"); 35 | }); 36 | 37 | it("works as expected for dynamic routes", () => { 38 | const route = getPathname({ 39 | route: "/routes/[routeId]", 40 | params: { routeId: 1 }, 41 | }); 42 | expect(route).toBe("/routes/[routeId]"); 43 | }); 44 | }); 45 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | // NOTE, these will be replaced with the "real" TypeSafePage type 2 | // when generating types for a project 3 | type Query = { [key: string]: any }; 4 | type TypeSafePage = 5 | | string 6 | | { route: string; path?: string; query?: Query } 7 | | { route: string; path?: string; params: any; query?: Query }; 8 | type TypeSafeApiRoute = TypeSafePage; 9 | 10 | export const getPathname = (typeSafeUrl: TypeSafePage | TypeSafeApiRoute) => { 11 | if (typeof typeSafeUrl === "string") { 12 | return typeSafeUrl; 13 | } else { 14 | return typeSafeUrl.route; 15 | } 16 | }; 17 | 18 | const getSearchParams = (query: any) => { 19 | if (!query) { 20 | return ""; 21 | } 22 | 23 | const params = new URLSearchParams(query as any).toString(); 24 | return `?${params}`; 25 | }; 26 | 27 | export const getRoute = (typeSafeUrl: TypeSafePage | TypeSafeApiRoute) => { 28 | if (typeof typeSafeUrl === "string") { 29 | return `${typeSafeUrl}`; 30 | } 31 | 32 | const searchParams = getSearchParams(typeSafeUrl.query); 33 | 34 | let route = typeSafeUrl.route as string; 35 | const params = "params" in typeSafeUrl ? typeSafeUrl.params : {}; 36 | Object.keys(params).forEach((param) => { 37 | route = route.replace(`[${param}]`, (params as any)[param]); 38 | }); 39 | const path = typeSafeUrl.path || ""; 40 | 41 | return `${route}${path}${searchParams}`; 42 | }; 43 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-type-safe-routes", 3 | "version": "0.3.1-alpha.1", 4 | "description": "Never should your users experience broken links again!", 5 | "main": "dist/index.js", 6 | "types": "dist/index.d.ts", 7 | "files": [ 8 | "dist", 9 | "bin", 10 | "plugin.js" 11 | ], 12 | "scripts": { 13 | "build": "tsc", 14 | "prepare": "yarn build", 15 | "test": "yarn jest --updateSnapshot", 16 | "lint": "eslint '*/**/*.{js,ts}' --quiet --fix" 17 | }, 18 | "husky": { 19 | "hooks": { 20 | "pre-commit": "lint-staged" 21 | } 22 | }, 23 | "lint-staged": { 24 | "*.{js,ts,tsx}": [ 25 | "eslint --fix" 26 | ] 27 | }, 28 | "dependencies": { 29 | "chokidar": "^3.5.1", 30 | "mkdirp": "^1.0.4", 31 | "walk-sync": "^2.2.0" 32 | }, 33 | "devDependencies": { 34 | "@types/jest": "^26.0.21", 35 | "@types/node": "^14.14.34", 36 | "@typescript-eslint/eslint-plugin": "^5.10.1", 37 | "@typescript-eslint/parser": "^5.10.1", 38 | "commander": "^7.1.0", 39 | "eslint": "^8.7.0", 40 | "eslint-plugin-prettier": "^4.0.0", 41 | "jest": "^26.6.3", 42 | "prettier": "^2.5.1", 43 | "ts-jest": "^26.5.4", 44 | "typescript": "^4.5.5" 45 | }, 46 | "repository": { 47 | "type": "git", 48 | "url": "git+https://github.com/ckastbjerg/next-type-safe-routes.git" 49 | }, 50 | "keywords": [], 51 | "author": "Christian Kastbjerg", 52 | "license": "ISC" 53 | } 54 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/generateTypeScriptFile.ts: -------------------------------------------------------------------------------- 1 | import walkSync from "walk-sync"; 2 | 3 | import getFileContent from "./getFileContent"; 4 | import getRoutes from "./getRoutes"; 5 | 6 | const ignorePagesRoutes = ["_app.tsx", "_document.tsx"]; 7 | const shouldIncludePageEntry = (route: string) => 8 | route.match(".tsx") && !ignorePagesRoutes.includes(route); 9 | const shouldIncludeApiRouteEntry = (endpoint: string) => endpoint.match(".ts"); 10 | 11 | const getApiRouteFiles = (pagesDir: string) => { 12 | try { 13 | return walkSync(`${pagesDir}/api`, { 14 | directories: false, 15 | }); 16 | } catch (err) { 17 | // api routes are not required 18 | if (err.code === "ENOENT") { 19 | return []; 20 | } 21 | throw err; 22 | } 23 | }; 24 | 25 | const generateTypeScriptFile = (pagesDir: string) => { 26 | const pagesFiles = walkSync(pagesDir, { 27 | directories: false, 28 | ignore: ["api"], 29 | }); 30 | const apiRouteFiles = getApiRouteFiles(pagesDir); 31 | const relevantPages = pagesFiles.filter(shouldIncludePageEntry); 32 | const pages = getRoutes(relevantPages.map((page) => `/${page}`)); 33 | const relavantApiRoutes = apiRouteFiles.filter(shouldIncludeApiRouteEntry); 34 | const apiRoutes = getRoutes( 35 | relavantApiRoutes.map((route) => `/api/${route}`) 36 | ); 37 | 38 | const fileContent = getFileContent({ pages, apiRoutes }); 39 | 40 | return fileContent; 41 | }; 42 | 43 | export default generateTypeScriptFile; 44 | -------------------------------------------------------------------------------- /example/README.md: -------------------------------------------------------------------------------- 1 | This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). 2 | 3 | ## Getting Started 4 | 5 | First, run the development server: 6 | 7 | ```bash 8 | npm run dev 9 | # or 10 | yarn dev 11 | ``` 12 | 13 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 14 | 15 | You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file. 16 | 17 | [API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`. 18 | 19 | The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. 20 | 21 | ## Learn More 22 | 23 | To learn more about Next.js, take a look at the following resources: 24 | 25 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 26 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 27 | 28 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! 29 | 30 | ## Deploy on Vercel 31 | 32 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. 33 | 34 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. 35 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/getFileContent.ts: -------------------------------------------------------------------------------- 1 | import { ApiRoute, Page } from "./types"; 2 | 3 | const getParam = (param: string) => `"${param}": string | number`; 4 | 5 | const getTypeSafeRoute = ({ 6 | route, 7 | params, 8 | isCatchAllRoute, 9 | isOptionalCatchAllRoute, 10 | }: ApiRoute) => { 11 | if (!params?.length) { 12 | if (isOptionalCatchAllRoute) { 13 | return `"${route}" | { route: "${route}", path?: string, query?: Query }`; 14 | } else if (isCatchAllRoute) { 15 | return `{ route: "${route}", path: string, query?: Query }`; 16 | } else { 17 | return `"${route}" | { route: "${route}", query?: Query }`; 18 | } 19 | } else { 20 | const paramsString = params.map(getParam).join(","); 21 | if (isOptionalCatchAllRoute) { 22 | return `"${route}" | { route: "${route}", path?: string, params: { ${paramsString} }, query?: Query }`; 23 | } else if (isCatchAllRoute) { 24 | return `{ route: "${route}", path: string, params: { ${paramsString} }, query?: Query }`; 25 | } else { 26 | return `{ route: "${route}", params: { ${paramsString} }, query?: Query }`; 27 | } 28 | } 29 | }; 30 | 31 | type Args = { 32 | apiRoutes: ApiRoute[]; 33 | pages: Page[]; 34 | }; 35 | 36 | const getFileContent = ({ 37 | apiRoutes, 38 | pages, 39 | }: Args) => `// IMPORTANT! This file is autogenerated by the \`type-safe-next-routes\` 40 | // package. You should _not_ update these types manually... 41 | 42 | declare module "next-type-safe-routes" { 43 | type Query = { [key: string]: any }; 44 | export type TypeSafePage = ${pages.map(getTypeSafeRoute).join(" | ")}; 45 | ${ 46 | apiRoutes.length > 0 47 | ? `export type TypeSafeApiRoute = ${apiRoutes 48 | .map(getTypeSafeRoute) 49 | .join(" | ")};` 50 | : "" 51 | } 52 | export const getPathname: (typeSafeUrl: TypeSafePage | TypeSafeApiRoute) => string; 53 | export const getRoute: (typeSafeUrl: TypeSafePage | TypeSafeApiRoute) => string; 54 | } 55 | `; 56 | 57 | export default getFileContent; 58 | -------------------------------------------------------------------------------- /src/plugin/index.ts: -------------------------------------------------------------------------------- 1 | import generateTypeScriptFile from "./generateTypeScriptFile"; 2 | 3 | import mkdirp from "mkdirp"; 4 | import fs from "fs"; 5 | import chokidar from "chokidar"; 6 | import path from "path"; 7 | 8 | const packageName = "next-type-safe-routes"; 9 | const typeFolder = path.join("@types", packageName); 10 | 11 | const log = (message: string) => { 12 | console.log(`\x1b[36m${packageName}\x1b[0m: ${message}`); 13 | }; 14 | 15 | const writeTypesToDisc = (nextPagesDirectory: string) => { 16 | // we assume the src directory is the directory containing the pages directory 17 | const srcDir = path.dirname(nextPagesDirectory); 18 | const typeFolderPath = path.join(srcDir, typeFolder); 19 | const typeScriptFile = generateTypeScriptFile(nextPagesDirectory); 20 | 21 | mkdirp.sync(typeFolderPath); 22 | fs.writeFileSync(path.join(typeFolderPath, "index.d.ts"), typeScriptFile); 23 | 24 | log(`types written to ${typeFolder}`); 25 | }; 26 | 27 | const run = (nextConfig: any = {}) => { 28 | return Object.assign({}, nextConfig, { 29 | webpack(config, options) { 30 | // This seems to be the way to get the path to the pages 31 | // directory in a Next.js app. Since it's possible to have a 32 | // `/src` folder (https://nextjs.org/docs/advanced-features/src-directory) 33 | // we cannot assume that it just in a `/pages` folder directly 34 | // in the root of the project 35 | const pagesDir = config.resolve.alias["private-next-pages"]; 36 | // Generate the types file when the app is being compiled 37 | writeTypesToDisc(pagesDir); 38 | // Generate the types file again when page files are added/removed 39 | const watcher = chokidar.watch(pagesDir, { ignoreInitial: true }); 40 | watcher.on("add", () => writeTypesToDisc(pagesDir)); 41 | watcher.on("unlink", () => writeTypesToDisc(pagesDir)); 42 | 43 | // if other webpack customizations exist, run them 44 | if (typeof nextConfig.webpack === "function") { 45 | return nextConfig.webpack(config, options); 46 | } 47 | 48 | // Return the un-modified config 49 | return config; 50 | }, 51 | }); 52 | }; 53 | 54 | export default run; 55 | -------------------------------------------------------------------------------- /src/plugin/generateTypeScriptFile/__snapshots__/generateTypeScriptFile.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`plugin/generateTypeScriptFile works as expected 1`] = ` 4 | "// IMPORTANT! This file is autogenerated by the \`type-safe-next-routes\` 5 | // package. You should _not_ update these types manually... 6 | 7 | declare module \\"next-type-safe-routes\\" { 8 | type Query = { [key: string]: any }; 9 | export type TypeSafePage = \\"/404\\" | { route: \\"/404\\", query?: Query } | { route: \\"/catch-all\\", path: string, query?: Query } | \\"/\\" | { route: \\"/\\", query?: Query } | { route: \\"/nested-catch-all/[dynamic]/slugs\\", path: string, params: { \\"dynamic\\": string | number }, query?: Query } | \\"/optional-catch-all\\" | { route: \\"/optional-catch-all\\", path?: string, query?: Query } | { route: \\"/route-with-symbols/[value-with-hyphens]\\", params: { \\"value-with-hyphens\\": string | number }, query?: Query } | { route: \\"/users/[userId]\\", params: { \\"userId\\": string | number }, query?: Query } | \\"/users\\" | { route: \\"/users\\", query?: Query }; 10 | export type TypeSafeApiRoute = { route: \\"/api/[authId]\\", params: { \\"authId\\": string | number }, query?: Query } | { route: \\"/api/catch-all\\", path: string, query?: Query } | \\"/api/multiple-periods/site.webmanifest\\" | { route: \\"/api/multiple-periods/site.webmanifest\\", query?: Query } | \\"/api/optional-catch-all\\" | { route: \\"/api/optional-catch-all\\", path?: string, query?: Query } | { route: \\"/api/users/[userId]\\", params: { \\"userId\\": string | number }, query?: Query } | \\"/api/users\\" | { route: \\"/api/users\\", query?: Query }; 11 | export const getPathname: (typeSafeUrl: TypeSafePage | TypeSafeApiRoute) => string; 12 | export const getRoute: (typeSafeUrl: TypeSafePage | TypeSafeApiRoute) => string; 13 | } 14 | " 15 | `; 16 | 17 | exports[`plugin/generateTypeScriptFile works for projects not using API routes 1`] = ` 18 | "// IMPORTANT! This file is autogenerated by the \`type-safe-next-routes\` 19 | // package. You should _not_ update these types manually... 20 | 21 | declare module \\"next-type-safe-routes\\" { 22 | type Query = { [key: string]: any }; 23 | export type TypeSafePage = \\"/\\" | { route: \\"/\\", query?: Query }; 24 | 25 | export const getPathname: (typeSafeUrl: TypeSafePage | TypeSafeApiRoute) => string; 26 | export const getRoute: (typeSafeUrl: TypeSafePage | TypeSafeApiRoute) => string; 27 | } 28 | " 29 | `; 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

next-type-safe-routes

4 |

5 | 6 |

7 | 8 | 9 | 10 | 11 | 12 | 13 |

14 | 15 | `next-type-safe-routes` parses the `/pages` folder in your Next.js app and generates types for all the **pages** and **API routes** in the application. These types can then be used to ensure that you only link to pages (and only use API routes) that _actually_ exists in your application. 16 | 17 | With the types generated, you can use the `getRoute` utility to retrieve **links that are guaranteed to exist** in your the application: 18 | 19 | 20 | 21 | ## Features 22 | 23 | - **Automatic route listing**. Avoid having to maintain a list of existing pages for your application 24 | - **Compile time route validation**. Avoid having to run your application to verify if links are correct, just use types 25 | - **Unopinionated**. Use our simple and composable utils or create your own abstraction 26 | 27 | ## Installation 28 | 29 | Install using yarn: 30 | 31 | ```bash 32 | yarn add next-type-safe-routes 33 | ``` 34 | 35 | Or using npm: 36 | 37 | ```bash 38 | npm install next-type-safe-routes --save 39 | ``` 40 | 41 | ## Usage 42 | 43 | > For an example setup, see the [`/example`](/example) folder 44 | 45 | The easiest way to use `next-type-safe-routes`, is with [`next-compose-plugins`](https://github.com/cyrilwanner/next-compose-plugins). With `next-compose-plugins` installed, you can add a `next.config.js` file with the following content: 46 | 47 | ```js 48 | const withPlugins = require("next-compose-plugins"); 49 | const nextTypeSafePages = require("next-type-safe-routes/plugin"); 50 | 51 | module.exports = withPlugins([nextTypeSafePages]); 52 | ``` 53 | 54 | When you start up your application, we will generate types for all of your pages and API routes and save them to the file `@types/next-type-safe-routes/index.d.ts` in the root of your project. The file will be updated whenever you add or remove pages and API routes. 55 | 56 | > Note, you should commit this file as part of your project. And if you're using a code formatter or linter, you may want to add this file to your ignore files. E.g. `.eslintignore` and `.prettierignore` files. 57 | 58 | You can now import the `getRoute` util from `next-type-safe-routes` and use it to retrieve a route that's is guaranteed to exist in your application. 59 | 60 | ```ts 61 | import { getRoute } from "next-type-safe-routes"; 62 | 63 | // for simple routes (e.g. the file `/pages/users.tsx`) 64 | getRoute("/users"); 65 | // for dynamic routes (e.g. the file `/pages/users/[userId]/index.tsx`) 66 | getRoute({ route: "/users/[userId]", params: { userId: "1" } }); 67 | // for catch all routes (e.g. the file `/pages/catch-all/[[...slug]].tsx`) 68 | getRoute({ route: "/catch-all", path: "/a/b/c" }); 69 | ``` 70 | 71 | Now you just need to decide how you want to integrate `next-type-safe-routes` in your project. If you want inspiration, we demonstrate how to create a simple abstraction for the Next.js `Link` and `router` in [the example project](/example/src). 72 | 73 | 74 | 75 | ## How it works 76 | 77 | Since the Next.js router is based (strictly) on the file-system, we can determine which pages and API routes exists in an application simply by parsing the `/pages` folder. And due to the strictness, we can also determine which parameters are needed for dynamic routes. 78 | 79 | As mentioned in the usage section, we generate a module declaration specific to your project when running your project. The output looks like this: 80 | 81 | ```ts 82 | declare module "next-type-safe-routes" { 83 | export type TypeSafePage = ... // all your pages 84 | export type TypeSafeApiRoute = ... // all your routes 85 | export const getPathname = ... // typed based on your routes 86 | export const getRoute = ... // typed based on your routes 87 | } 88 | ``` 89 | 90 | > See [`/example/src/@types/next-type-safe-routes/index.d.ts`](/example/src/@types/next-type-safe-routes/index.d.ts) for a real example 91 | 92 | The trick here is, that we override the types for `next-type-safe-routes`. And we (re)define the args accepted by the `getRoute` and `getPathname` to match the types for your project. 93 | 94 | The declaration will be written to `@types/next-type-safe-routes/index.d.ts` in the root (determined by Next.js) of your project. 95 | 96 | ## API reference 97 | 98 | How you ensure that only links to existing pages is essentially up to you, but we do expose a few _tiny_ util methods to help you do this. 99 | 100 | #### The `getRoute` method 101 | 102 | A simple method that converts a type-safe route to an "actual" route. 103 | 104 | **Examples:** 105 | 106 | ```ts 107 | import { getRoute } from "next-type-safe-routes"; 108 | 109 | // For simple (non-dynamic) routes 110 | const route = getRoute("/users"); // => "/users" 111 | 112 | // With query params 113 | const route = getRoute({ 114 | route: "/users", 115 | query: { "not-typed": "whatevs" }, 116 | }); // => "/users?not-typed=whatevs" 117 | 118 | // For dynamic routes 119 | const route = getRoute({ 120 | route: "/users/[userId]", 121 | params: { userId: 1234 }, 122 | }); // => "/users/1234" 123 | 124 | // For catch all routes 125 | const route = getRoute({ 126 | route: "/catch-all", 127 | path: "/can/be/anything", 128 | }); // => "/catch-all/can/be/anything" 129 | ``` 130 | 131 | > [Optional catch all routes](https://nextjs.org/docs/routing/dynamic-routes#optional-catch-all-routes) are also supported. 132 | 133 | #### The `getPathname` method 134 | 135 | The `getPathname` works similarly to the `getRoute`. It just returs a [Next.js pathname](https://nextjs.org/docs/api-reference/next/router#router-object). For instance: 136 | 137 | ```ts 138 | import { getPathname } from "next-type-safe-routes"; 139 | 140 | const path = getPathname({ 141 | route: "/users/[userId]", 142 | params: { userId: 1234 }, 143 | }); // => `/users/[userId]` 144 | ``` 145 | 146 | #### The `TypeSafePage` and `TypeSafeApiRoute` types 147 | 148 | These can be useful for making your own abstraction. For instance, if you want to make a tiny abstraction ontop of the `next/router`: 149 | 150 | ```ts 151 | import { TypeSafePage, getRoute } from "next-type-safe-routes"; 152 | import { useRouter as useNextRouter } from "next/router"; 153 | 154 | const useRouter = () => { 155 | const router = useNextRouter(); 156 | 157 | // Say you only want to allow links to pages (and not API routes) 158 | const push = (typeSafeUrl: TypeSafePage) => { 159 | router.push(getRoute(typeSafeUrl)); 160 | }; 161 | 162 | return { ...router, push }; 163 | }; 164 | 165 | export default useRouter; 166 | ``` 167 | 168 | For basic routes, the type can be of the type `string` or: 169 | 170 | ```ts 171 | { 172 | route: string, 173 | query?: { ... } // any key value pairs (not type-safe) 174 | } 175 | ``` 176 | 177 | And for dynamic routes, the type is always: 178 | 179 | ```ts 180 | { 181 | route: string, 182 | params: { ... }, // based on the file name 183 | query?: { ... } // any key value pairs (not type-safe) 184 | } 185 | ``` 186 | 187 | And for [catch all routes](https://nextjs.org/docs/routing/dynamic-routes#catch-all-routes), a (non-typed) `path` will also be required (or optional for [optional catch all routes](https://nextjs.org/docs/routing/dynamic-routes#optional-catch-all-routes)): 188 | 189 | ```ts 190 | { 191 | route: string, 192 | path: string, 193 | params: { ... }, // based on the file name 194 | query?: { ... } // any key value pairs (not type-safe) 195 | } 196 | ``` 197 | 198 | **Examples**: 199 | 200 | ```ts 201 | type Query = { [key: string]: any }; 202 | export type TypeSafePage = 203 | | "/users" 204 | | { route: "/users"; query?: Query } 205 | | { 206 | route: "/users/[userId]"; 207 | params: { userId: string | number }; 208 | query?: Query; 209 | } 210 | | { 211 | route: "/users/[userId]/catch-all-route"; 212 | params: { userId: string | number }; 213 | path="/catch/all/path" 214 | query?: Query; 215 | }; 216 | ``` 217 | 218 | > Note, the `TypeSafePage` and `TypeSafeApiRoute` are kept separate even though they are essentially the same type. We do this, as you may potentially want to distinguish between them in your application. 219 | 220 | ## Motivation 221 | 222 | At my company, [Proper](https://helloproper.com/), we like pages. Like...a lot! Our platform is a fairly large Next.js application consisting of ~70 pages. And we link between pages ~200 places in the application. 223 | 224 | We find that having pages make features easily discoverable by end-users and developers alike. And having pages (urls) for each of our features help us maintain a sane information architecture throughout our platform. 225 | 226 | The [Next.js file-system based router](https://nextjs.org/docs/routing/introduction) help us stay consistent and organised around our pages. But we've had some incidents where our application was released with dead links. 227 | 228 | At one point, a file in the `/pages` folder was renamed and we simply overlooked (forgot to change) some of the links to that page. Another time, a bit of "clever" string concatenation caused an issue. In this case, we had moved a page, and failed to update all links to the page correctly due to the concatenated links. 229 | 230 | With the `next-type-safe-routes`, we're trying to mitigate this issue. The plugin gives us confidence when refactoring as well as a top notch developer experience. 231 | 232 | > We considered something like the [`next-routes`](https://github.com/fridays/next-routes) approach, but we don't want to manually have to maintain a list of routes in the application. We prefer conventions to be enforced when possible. 233 | -------------------------------------------------------------------------------- /example/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@7.12.11": 6 | version "7.12.11" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" 8 | integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== 9 | dependencies: 10 | "@babel/highlight" "^7.10.4" 11 | 12 | "@babel/helper-validator-identifier@^7.12.11": 13 | version "7.12.11" 14 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" 15 | integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== 16 | 17 | "@babel/highlight@^7.10.4": 18 | version "7.13.10" 19 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" 20 | integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== 21 | dependencies: 22 | "@babel/helper-validator-identifier" "^7.12.11" 23 | chalk "^2.0.0" 24 | js-tokens "^4.0.0" 25 | 26 | "@babel/runtime@7.12.5": 27 | version "7.12.5" 28 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" 29 | integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== 30 | dependencies: 31 | regenerator-runtime "^0.13.4" 32 | 33 | "@babel/types@7.8.3": 34 | version "7.8.3" 35 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" 36 | integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== 37 | dependencies: 38 | esutils "^2.0.2" 39 | lodash "^4.17.13" 40 | to-fast-properties "^2.0.0" 41 | 42 | "@hapi/accept@5.0.1": 43 | version "5.0.1" 44 | resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-5.0.1.tgz#068553e867f0f63225a506ed74e899441af53e10" 45 | integrity sha512-fMr4d7zLzsAXo28PRRQPXR1o2Wmu+6z+VY1UzDp0iFo13Twj8WePakwXBiqn3E1aAlTpSNzCXdnnQXFhst8h8Q== 46 | dependencies: 47 | "@hapi/boom" "9.x.x" 48 | "@hapi/hoek" "9.x.x" 49 | 50 | "@hapi/boom@9.x.x": 51 | version "9.1.2" 52 | resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.2.tgz#48bd41d67437164a2d636e3b5bc954f8c8dc5e38" 53 | integrity sha512-uJEJtiNHzKw80JpngDGBCGAmWjBtzxDCz17A9NO2zCi8LLBlb5Frpq4pXwyN+2JQMod4pKz5BALwyneCgDg89Q== 54 | dependencies: 55 | "@hapi/hoek" "9.x.x" 56 | 57 | "@hapi/hoek@9.x.x": 58 | version "9.1.1" 59 | resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.1.1.tgz#9daf5745156fd84b8e9889a2dc721f0c58e894aa" 60 | integrity sha512-CAEbWH7OIur6jEOzaai83jq3FmKmv4PmX1JYfs9IrYcGEVI/lyL1EXJGCj7eFVJ0bg5QR8LMxBlEtA+xKiLpFw== 61 | 62 | "@next/env@10.0.9": 63 | version "10.0.9" 64 | resolved "https://registry.yarnpkg.com/@next/env/-/env-10.0.9.tgz#455fd364c8a5ee012b2cd4406d5294164990706d" 65 | integrity sha512-MERX3DY5u0Ed29eAsXeFBCZlFAGBtmjf7+Nht0hfgB25MPKKkIbC/0MRPcX/PQcAgLHsAHO6ay1u9xKzR4Vzjw== 66 | 67 | "@next/polyfill-module@10.0.9": 68 | version "10.0.9" 69 | resolved "https://registry.yarnpkg.com/@next/polyfill-module/-/polyfill-module-10.0.9.tgz#0c21442dd73ec31ae30ac560bc5c5fdce068a98f" 70 | integrity sha512-kPOP6ku/e8zdrK8hwxOrjUrPLcdDEj12huLHVz+DZU+20q6VlhMOtR8aKHW1460L4LoLE/DAa7YyIuxtArhDRg== 71 | 72 | "@next/react-dev-overlay@10.0.9": 73 | version "10.0.9" 74 | resolved "https://registry.yarnpkg.com/@next/react-dev-overlay/-/react-dev-overlay-10.0.9.tgz#5162d66c05b2a0ca0d155f7e6663e8134d9d4ac9" 75 | integrity sha512-JsSh2Y004MEuPYqBD9eTl4PVZIjSzSy2GcD7MrW/gQcExYNpeMIJAbh8/OcyO1t+OnQeIHF5s/xTMsDHBGNcew== 76 | dependencies: 77 | "@babel/code-frame" "7.12.11" 78 | anser "1.4.9" 79 | chalk "4.0.0" 80 | classnames "2.2.6" 81 | css.escape "1.5.1" 82 | data-uri-to-buffer "3.0.1" 83 | platform "1.3.6" 84 | shell-quote "1.7.2" 85 | source-map "0.8.0-beta.0" 86 | stacktrace-parser "0.1.10" 87 | strip-ansi "6.0.0" 88 | 89 | "@next/react-refresh-utils@10.0.9": 90 | version "10.0.9" 91 | resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-10.0.9.tgz#cdf9e41f8854c113397853daf78469b0c8140f14" 92 | integrity sha512-LSoKnM+fI9MHHew+mBg1w2e4/gjwPQsI+mDTzmfwdBwje+j9U2Int6XOZftMqBPXSlL04vjC9SRBkp0+3h8cNA== 93 | 94 | "@opentelemetry/api@0.14.0": 95 | version "0.14.0" 96 | resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-0.14.0.tgz#4e17d8d2f1da72b19374efa7b6526aa001267cae" 97 | integrity sha512-L7RMuZr5LzMmZiQSQDy9O1jo0q+DaLy6XpYJfIGfYSfoJA5qzYwUP3sP1uMIQ549DvxAgM3ng85EaPTM/hUHwQ== 98 | dependencies: 99 | "@opentelemetry/context-base" "^0.14.0" 100 | 101 | "@opentelemetry/context-base@^0.14.0": 102 | version "0.14.0" 103 | resolved "https://registry.yarnpkg.com/@opentelemetry/context-base/-/context-base-0.14.0.tgz#c67fc20a4d891447ca1a855d7d70fa79a3533001" 104 | integrity sha512-sDOAZcYwynHFTbLo6n8kIbLiVF3a3BLkrmehJUyEbT9F+Smbi47kLGS2gG2g0fjBLR/Lr1InPD7kXL7FaTqEkw== 105 | 106 | "@types/prop-types@*": 107 | version "15.7.3" 108 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" 109 | integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== 110 | 111 | "@types/react@^17.0.3": 112 | version "17.0.3" 113 | resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.3.tgz#ba6e215368501ac3826951eef2904574c262cc79" 114 | integrity sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg== 115 | dependencies: 116 | "@types/prop-types" "*" 117 | "@types/scheduler" "*" 118 | csstype "^3.0.2" 119 | 120 | "@types/scheduler@*": 121 | version "0.16.1" 122 | resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275" 123 | integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA== 124 | 125 | anser@1.4.9: 126 | version "1.4.9" 127 | resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz#1f85423a5dcf8da4631a341665ff675b96845760" 128 | integrity sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA== 129 | 130 | ansi-regex@^5.0.0: 131 | version "5.0.0" 132 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 133 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 134 | 135 | ansi-styles@^3.2.1: 136 | version "3.2.1" 137 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 138 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 139 | dependencies: 140 | color-convert "^1.9.0" 141 | 142 | ansi-styles@^4.1.0: 143 | version "4.3.0" 144 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 145 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 146 | dependencies: 147 | color-convert "^2.0.1" 148 | 149 | anymatch@~3.1.1: 150 | version "3.1.1" 151 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" 152 | integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== 153 | dependencies: 154 | normalize-path "^3.0.0" 155 | picomatch "^2.0.4" 156 | 157 | asn1.js@^5.2.0: 158 | version "5.4.1" 159 | resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" 160 | integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== 161 | dependencies: 162 | bn.js "^4.0.0" 163 | inherits "^2.0.1" 164 | minimalistic-assert "^1.0.0" 165 | safer-buffer "^2.1.0" 166 | 167 | assert@^1.1.1: 168 | version "1.5.0" 169 | resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" 170 | integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== 171 | dependencies: 172 | object-assign "^4.1.1" 173 | util "0.10.3" 174 | 175 | ast-types@0.13.2: 176 | version "0.13.2" 177 | resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" 178 | integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== 179 | 180 | babel-plugin-syntax-jsx@6.18.0: 181 | version "6.18.0" 182 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" 183 | integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= 184 | 185 | base64-js@^1.0.2: 186 | version "1.5.1" 187 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 188 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 189 | 190 | big.js@^5.2.2: 191 | version "5.2.2" 192 | resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" 193 | integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== 194 | 195 | binary-extensions@^2.0.0: 196 | version "2.2.0" 197 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 198 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 199 | 200 | bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: 201 | version "4.12.0" 202 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" 203 | integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== 204 | 205 | bn.js@^5.0.0, bn.js@^5.1.1: 206 | version "5.2.0" 207 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" 208 | integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== 209 | 210 | braces@~3.0.2: 211 | version "3.0.2" 212 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 213 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 214 | dependencies: 215 | fill-range "^7.0.1" 216 | 217 | brorand@^1.0.1, brorand@^1.1.0: 218 | version "1.1.0" 219 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 220 | integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= 221 | 222 | browserify-aes@^1.0.0, browserify-aes@^1.0.4: 223 | version "1.2.0" 224 | resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" 225 | integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== 226 | dependencies: 227 | buffer-xor "^1.0.3" 228 | cipher-base "^1.0.0" 229 | create-hash "^1.1.0" 230 | evp_bytestokey "^1.0.3" 231 | inherits "^2.0.1" 232 | safe-buffer "^5.0.1" 233 | 234 | browserify-cipher@^1.0.0: 235 | version "1.0.1" 236 | resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" 237 | integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== 238 | dependencies: 239 | browserify-aes "^1.0.4" 240 | browserify-des "^1.0.0" 241 | evp_bytestokey "^1.0.0" 242 | 243 | browserify-des@^1.0.0: 244 | version "1.0.2" 245 | resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" 246 | integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== 247 | dependencies: 248 | cipher-base "^1.0.1" 249 | des.js "^1.0.0" 250 | inherits "^2.0.1" 251 | safe-buffer "^5.1.2" 252 | 253 | browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: 254 | version "4.1.0" 255 | resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" 256 | integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== 257 | dependencies: 258 | bn.js "^5.0.0" 259 | randombytes "^2.0.1" 260 | 261 | browserify-sign@^4.0.0: 262 | version "4.2.1" 263 | resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" 264 | integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== 265 | dependencies: 266 | bn.js "^5.1.1" 267 | browserify-rsa "^4.0.1" 268 | create-hash "^1.2.0" 269 | create-hmac "^1.1.7" 270 | elliptic "^6.5.3" 271 | inherits "^2.0.4" 272 | parse-asn1 "^5.1.5" 273 | readable-stream "^3.6.0" 274 | safe-buffer "^5.2.0" 275 | 276 | browserify-zlib@^0.2.0: 277 | version "0.2.0" 278 | resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" 279 | integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== 280 | dependencies: 281 | pako "~1.0.5" 282 | 283 | browserslist@4.16.1: 284 | version "4.16.1" 285 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.1.tgz#bf757a2da376b3447b800a16f0f1c96358138766" 286 | integrity sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA== 287 | dependencies: 288 | caniuse-lite "^1.0.30001173" 289 | colorette "^1.2.1" 290 | electron-to-chromium "^1.3.634" 291 | escalade "^3.1.1" 292 | node-releases "^1.1.69" 293 | 294 | buffer-xor@^1.0.3: 295 | version "1.0.3" 296 | resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" 297 | integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= 298 | 299 | buffer@5.6.0: 300 | version "5.6.0" 301 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" 302 | integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== 303 | dependencies: 304 | base64-js "^1.0.2" 305 | ieee754 "^1.1.4" 306 | 307 | buffer@^4.3.0: 308 | version "4.9.2" 309 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" 310 | integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== 311 | dependencies: 312 | base64-js "^1.0.2" 313 | ieee754 "^1.1.4" 314 | isarray "^1.0.0" 315 | 316 | builtin-status-codes@^3.0.0: 317 | version "3.0.0" 318 | resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" 319 | integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= 320 | 321 | bytes@3.1.0: 322 | version "3.1.0" 323 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 324 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 325 | 326 | caniuse-lite@^1.0.30001173, caniuse-lite@^1.0.30001179: 327 | version "1.0.30001202" 328 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001202.tgz#4cb3bd5e8a808e8cd89e4e66c549989bc8137201" 329 | integrity sha512-ZcijQNqrcF8JNLjzvEiXqX4JUYxoZa7Pvcsd9UD8Kz4TvhTonOSNRsK+qtvpVL4l6+T1Rh4LFtLfnNWg6BGWCQ== 330 | 331 | chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.2: 332 | version "2.4.2" 333 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 334 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 335 | dependencies: 336 | ansi-styles "^3.2.1" 337 | escape-string-regexp "^1.0.5" 338 | supports-color "^5.3.0" 339 | 340 | chalk@4.0.0: 341 | version "4.0.0" 342 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" 343 | integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== 344 | dependencies: 345 | ansi-styles "^4.1.0" 346 | supports-color "^7.1.0" 347 | 348 | chokidar@3.5.1: 349 | version "3.5.1" 350 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" 351 | integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== 352 | dependencies: 353 | anymatch "~3.1.1" 354 | braces "~3.0.2" 355 | glob-parent "~5.1.0" 356 | is-binary-path "~2.1.0" 357 | is-glob "~4.0.1" 358 | normalize-path "~3.0.0" 359 | readdirp "~3.5.0" 360 | optionalDependencies: 361 | fsevents "~2.3.1" 362 | 363 | cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: 364 | version "1.0.4" 365 | resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" 366 | integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== 367 | dependencies: 368 | inherits "^2.0.1" 369 | safe-buffer "^5.0.1" 370 | 371 | classnames@2.2.6: 372 | version "2.2.6" 373 | resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" 374 | integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== 375 | 376 | color-convert@^1.9.0: 377 | version "1.9.3" 378 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 379 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 380 | dependencies: 381 | color-name "1.1.3" 382 | 383 | color-convert@^2.0.1: 384 | version "2.0.1" 385 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 386 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 387 | dependencies: 388 | color-name "~1.1.4" 389 | 390 | color-name@1.1.3: 391 | version "1.1.3" 392 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 393 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 394 | 395 | color-name@~1.1.4: 396 | version "1.1.4" 397 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 398 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 399 | 400 | colorette@^1.2.1: 401 | version "1.2.2" 402 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" 403 | integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== 404 | 405 | commondir@^1.0.1: 406 | version "1.0.1" 407 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 408 | integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= 409 | 410 | console-browserify@^1.1.0: 411 | version "1.2.0" 412 | resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" 413 | integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== 414 | 415 | constants-browserify@^1.0.0: 416 | version "1.0.0" 417 | resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" 418 | integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= 419 | 420 | convert-source-map@1.7.0: 421 | version "1.7.0" 422 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" 423 | integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== 424 | dependencies: 425 | safe-buffer "~5.1.1" 426 | 427 | core-util-is@~1.0.0: 428 | version "1.0.2" 429 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 430 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 431 | 432 | create-ecdh@^4.0.0: 433 | version "4.0.4" 434 | resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" 435 | integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== 436 | dependencies: 437 | bn.js "^4.1.0" 438 | elliptic "^6.5.3" 439 | 440 | create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: 441 | version "1.2.0" 442 | resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" 443 | integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== 444 | dependencies: 445 | cipher-base "^1.0.1" 446 | inherits "^2.0.1" 447 | md5.js "^1.3.4" 448 | ripemd160 "^2.0.1" 449 | sha.js "^2.4.0" 450 | 451 | create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: 452 | version "1.1.7" 453 | resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" 454 | integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== 455 | dependencies: 456 | cipher-base "^1.0.3" 457 | create-hash "^1.1.0" 458 | inherits "^2.0.1" 459 | ripemd160 "^2.0.0" 460 | safe-buffer "^5.0.1" 461 | sha.js "^2.4.8" 462 | 463 | crypto-browserify@3.12.0, crypto-browserify@^3.11.0: 464 | version "3.12.0" 465 | resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" 466 | integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== 467 | dependencies: 468 | browserify-cipher "^1.0.0" 469 | browserify-sign "^4.0.0" 470 | create-ecdh "^4.0.0" 471 | create-hash "^1.1.0" 472 | create-hmac "^1.1.0" 473 | diffie-hellman "^5.0.0" 474 | inherits "^2.0.1" 475 | pbkdf2 "^3.0.3" 476 | public-encrypt "^4.0.0" 477 | randombytes "^2.0.0" 478 | randomfill "^1.0.3" 479 | 480 | css.escape@1.5.1: 481 | version "1.5.1" 482 | resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" 483 | integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= 484 | 485 | cssnano-preset-simple@1.2.2: 486 | version "1.2.2" 487 | resolved "https://registry.yarnpkg.com/cssnano-preset-simple/-/cssnano-preset-simple-1.2.2.tgz#c631bf79ffec7fdfc4069e2f2da3ca67d99d8413" 488 | integrity sha512-gtvrcRSGtP3hA/wS8mFVinFnQdEsEpm3v4I/s/KmNjpdWaThV/4E5EojAzFXxyT5OCSRPLlHR9iQexAqKHlhGQ== 489 | dependencies: 490 | caniuse-lite "^1.0.30001179" 491 | postcss "^7.0.32" 492 | 493 | cssnano-simple@1.2.2: 494 | version "1.2.2" 495 | resolved "https://registry.yarnpkg.com/cssnano-simple/-/cssnano-simple-1.2.2.tgz#72c2c3970e67123c3b4130894a30dc1050267007" 496 | integrity sha512-4slyYc1w4JhSbhVX5xi9G0aQ42JnRyPg+7l7cqoNyoIDzfWx40Rq3JQZnoAWDu60A4AvKVp9ln/YSUOdhDX68g== 497 | dependencies: 498 | cssnano-preset-simple "1.2.2" 499 | postcss "^7.0.32" 500 | 501 | csstype@^3.0.2: 502 | version "3.0.7" 503 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.7.tgz#2a5fb75e1015e84dd15692f71e89a1450290950b" 504 | integrity sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g== 505 | 506 | data-uri-to-buffer@3.0.1: 507 | version "3.0.1" 508 | resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" 509 | integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== 510 | 511 | debug@2: 512 | version "2.6.9" 513 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 514 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 515 | dependencies: 516 | ms "2.0.0" 517 | 518 | depd@~1.1.2: 519 | version "1.1.2" 520 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 521 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 522 | 523 | des.js@^1.0.0: 524 | version "1.0.1" 525 | resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" 526 | integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== 527 | dependencies: 528 | inherits "^2.0.1" 529 | minimalistic-assert "^1.0.0" 530 | 531 | diffie-hellman@^5.0.0: 532 | version "5.0.3" 533 | resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" 534 | integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== 535 | dependencies: 536 | bn.js "^4.1.0" 537 | miller-rabin "^4.0.0" 538 | randombytes "^2.0.0" 539 | 540 | domain-browser@^1.1.1: 541 | version "1.2.0" 542 | resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" 543 | integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== 544 | 545 | electron-to-chromium@^1.3.634: 546 | version "1.3.691" 547 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.691.tgz#a671eaf135a3ccec0915eb8d844a0952aba79f3b" 548 | integrity sha512-ZqiO69KImmOGCyoH0icQPU3SndJiW93juEvf63gQngyhODO6SpQIPMTOHldtCs5DS5GMKvAkquk230E2zt2vpw== 549 | 550 | elliptic@^6.5.3: 551 | version "6.5.4" 552 | resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" 553 | integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== 554 | dependencies: 555 | bn.js "^4.11.9" 556 | brorand "^1.1.0" 557 | hash.js "^1.0.0" 558 | hmac-drbg "^1.0.1" 559 | inherits "^2.0.4" 560 | minimalistic-assert "^1.0.1" 561 | minimalistic-crypto-utils "^1.0.1" 562 | 563 | emojis-list@^2.0.0: 564 | version "2.1.0" 565 | resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" 566 | integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= 567 | 568 | escalade@^3.1.1: 569 | version "3.1.1" 570 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 571 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 572 | 573 | escape-string-regexp@^1.0.5: 574 | version "1.0.5" 575 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 576 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 577 | 578 | esutils@^2.0.2: 579 | version "2.0.3" 580 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 581 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 582 | 583 | etag@1.8.1: 584 | version "1.8.1" 585 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 586 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 587 | 588 | events@^3.0.0: 589 | version "3.3.0" 590 | resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" 591 | integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== 592 | 593 | evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: 594 | version "1.0.3" 595 | resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" 596 | integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== 597 | dependencies: 598 | md5.js "^1.3.4" 599 | safe-buffer "^5.1.1" 600 | 601 | fill-range@^7.0.1: 602 | version "7.0.1" 603 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 604 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 605 | dependencies: 606 | to-regex-range "^5.0.1" 607 | 608 | find-cache-dir@3.3.1: 609 | version "3.3.1" 610 | resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" 611 | integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== 612 | dependencies: 613 | commondir "^1.0.1" 614 | make-dir "^3.0.2" 615 | pkg-dir "^4.1.0" 616 | 617 | find-up@^4.0.0: 618 | version "4.1.0" 619 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 620 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 621 | dependencies: 622 | locate-path "^5.0.0" 623 | path-exists "^4.0.0" 624 | 625 | fsevents@~2.3.1: 626 | version "2.3.2" 627 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 628 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 629 | 630 | get-orientation@1.1.2: 631 | version "1.1.2" 632 | resolved "https://registry.yarnpkg.com/get-orientation/-/get-orientation-1.1.2.tgz#20507928951814f8a91ded0a0e67b29dfab98947" 633 | integrity sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ== 634 | dependencies: 635 | stream-parser "^0.3.1" 636 | 637 | glob-parent@~5.1.0: 638 | version "5.1.2" 639 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 640 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 641 | dependencies: 642 | is-glob "^4.0.1" 643 | 644 | glob-to-regexp@^0.4.1: 645 | version "0.4.1" 646 | resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" 647 | integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== 648 | 649 | graceful-fs@^4.1.2: 650 | version "4.2.6" 651 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" 652 | integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== 653 | 654 | has-flag@^3.0.0: 655 | version "3.0.0" 656 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 657 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 658 | 659 | has-flag@^4.0.0: 660 | version "4.0.0" 661 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 662 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 663 | 664 | hash-base@^3.0.0: 665 | version "3.1.0" 666 | resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" 667 | integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== 668 | dependencies: 669 | inherits "^2.0.4" 670 | readable-stream "^3.6.0" 671 | safe-buffer "^5.2.0" 672 | 673 | hash.js@^1.0.0, hash.js@^1.0.3: 674 | version "1.1.7" 675 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" 676 | integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== 677 | dependencies: 678 | inherits "^2.0.3" 679 | minimalistic-assert "^1.0.1" 680 | 681 | he@1.2.0: 682 | version "1.2.0" 683 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 684 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 685 | 686 | hmac-drbg@^1.0.1: 687 | version "1.0.1" 688 | resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" 689 | integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= 690 | dependencies: 691 | hash.js "^1.0.3" 692 | minimalistic-assert "^1.0.0" 693 | minimalistic-crypto-utils "^1.0.1" 694 | 695 | http-errors@1.7.3: 696 | version "1.7.3" 697 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 698 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 699 | dependencies: 700 | depd "~1.1.2" 701 | inherits "2.0.4" 702 | setprototypeof "1.1.1" 703 | statuses ">= 1.5.0 < 2" 704 | toidentifier "1.0.0" 705 | 706 | https-browserify@^1.0.0: 707 | version "1.0.0" 708 | resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" 709 | integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= 710 | 711 | iconv-lite@0.4.24: 712 | version "0.4.24" 713 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 714 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 715 | dependencies: 716 | safer-buffer ">= 2.1.2 < 3" 717 | 718 | ieee754@^1.1.4: 719 | version "1.2.1" 720 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 721 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 722 | 723 | inherits@2.0.1: 724 | version "2.0.1" 725 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" 726 | integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= 727 | 728 | inherits@2.0.3: 729 | version "2.0.3" 730 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 731 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 732 | 733 | 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: 734 | version "2.0.4" 735 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 736 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 737 | 738 | is-binary-path@~2.1.0: 739 | version "2.1.0" 740 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 741 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 742 | dependencies: 743 | binary-extensions "^2.0.0" 744 | 745 | is-extglob@^2.1.1: 746 | version "2.1.1" 747 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 748 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 749 | 750 | is-glob@^4.0.1, is-glob@~4.0.1: 751 | version "4.0.1" 752 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 753 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 754 | dependencies: 755 | is-extglob "^2.1.1" 756 | 757 | is-number@^7.0.0: 758 | version "7.0.0" 759 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 760 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 761 | 762 | isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: 763 | version "1.0.0" 764 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 765 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 766 | 767 | isobject@^2.0.0: 768 | version "2.1.0" 769 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 770 | integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= 771 | dependencies: 772 | isarray "1.0.0" 773 | 774 | jest-worker@24.9.0: 775 | version "24.9.0" 776 | resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" 777 | integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== 778 | dependencies: 779 | merge-stream "^2.0.0" 780 | supports-color "^6.1.0" 781 | 782 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 783 | version "4.0.0" 784 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 785 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 786 | 787 | json5@^1.0.1: 788 | version "1.0.1" 789 | resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" 790 | integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== 791 | dependencies: 792 | minimist "^1.2.0" 793 | 794 | line-column@^1.0.2: 795 | version "1.0.2" 796 | resolved "https://registry.yarnpkg.com/line-column/-/line-column-1.0.2.tgz#d25af2936b6f4849172b312e4792d1d987bc34a2" 797 | integrity sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI= 798 | dependencies: 799 | isarray "^1.0.0" 800 | isobject "^2.0.0" 801 | 802 | loader-utils@1.2.3: 803 | version "1.2.3" 804 | resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" 805 | integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== 806 | dependencies: 807 | big.js "^5.2.2" 808 | emojis-list "^2.0.0" 809 | json5 "^1.0.1" 810 | 811 | locate-path@^5.0.0: 812 | version "5.0.0" 813 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 814 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 815 | dependencies: 816 | p-locate "^4.1.0" 817 | 818 | lodash.sortby@^4.7.0: 819 | version "4.7.0" 820 | resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" 821 | integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= 822 | 823 | lodash@^4.17.13: 824 | version "4.17.21" 825 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 826 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 827 | 828 | loose-envify@^1.1.0, loose-envify@^1.4.0: 829 | version "1.4.0" 830 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 831 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 832 | dependencies: 833 | js-tokens "^3.0.0 || ^4.0.0" 834 | 835 | make-dir@^3.0.2: 836 | version "3.1.0" 837 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 838 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 839 | dependencies: 840 | semver "^6.0.0" 841 | 842 | md5.js@^1.3.4: 843 | version "1.3.5" 844 | resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" 845 | integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== 846 | dependencies: 847 | hash-base "^3.0.0" 848 | inherits "^2.0.1" 849 | safe-buffer "^5.1.2" 850 | 851 | merge-stream@^2.0.0: 852 | version "2.0.0" 853 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 854 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 855 | 856 | miller-rabin@^4.0.0: 857 | version "4.0.1" 858 | resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" 859 | integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== 860 | dependencies: 861 | bn.js "^4.0.0" 862 | brorand "^1.0.1" 863 | 864 | minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: 865 | version "1.0.1" 866 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" 867 | integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== 868 | 869 | minimalistic-crypto-utils@^1.0.1: 870 | version "1.0.1" 871 | resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" 872 | integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= 873 | 874 | minimist@^1.2.0: 875 | version "1.2.5" 876 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 877 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 878 | 879 | ms@2.0.0: 880 | version "2.0.0" 881 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 882 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 883 | 884 | nanoid@^3.1.16: 885 | version "3.1.22" 886 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.22.tgz#b35f8fb7d151990a8aebd5aa5015c03cf726f844" 887 | integrity sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ== 888 | 889 | native-url@0.3.4: 890 | version "0.3.4" 891 | resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.3.4.tgz#29c943172aed86c63cee62c8c04db7f5756661f8" 892 | integrity sha512-6iM8R99ze45ivyH8vybJ7X0yekIcPf5GgLV5K0ENCbmRcaRIDoj37BC8iLEmaaBfqqb8enuZ5p0uhY+lVAbAcA== 893 | dependencies: 894 | querystring "^0.2.0" 895 | 896 | next-compose-plugins@^2.2.1: 897 | version "2.2.1" 898 | resolved "https://registry.yarnpkg.com/next-compose-plugins/-/next-compose-plugins-2.2.1.tgz#020fc53f275a7e719d62521bef4300fbb6fde5ab" 899 | integrity sha512-OjJ+fV15FXO2uQXQagLD4C0abYErBjyjE0I0FHpOEIB8upw0hg1ldFP6cqHTJBH1cZqy96OeR3u1dJ+Ez2D4Bg== 900 | 901 | next@10.0.9: 902 | version "10.0.9" 903 | resolved "https://registry.yarnpkg.com/next/-/next-10.0.9.tgz#ad5d8e0368fee8363cdfd64d22dfbf71f683ae66" 904 | integrity sha512-HyoVjYydcM6LaFAUOHSxVQCcKOsIimVO/IKXCuWUu1rr6DDgXbWNg/8ckH084qD46MOYlLzjViiZ3KCmNQL4Cw== 905 | dependencies: 906 | "@babel/runtime" "7.12.5" 907 | "@hapi/accept" "5.0.1" 908 | "@next/env" "10.0.9" 909 | "@next/polyfill-module" "10.0.9" 910 | "@next/react-dev-overlay" "10.0.9" 911 | "@next/react-refresh-utils" "10.0.9" 912 | "@opentelemetry/api" "0.14.0" 913 | ast-types "0.13.2" 914 | browserslist "4.16.1" 915 | buffer "5.6.0" 916 | caniuse-lite "^1.0.30001179" 917 | chalk "2.4.2" 918 | chokidar "3.5.1" 919 | crypto-browserify "3.12.0" 920 | cssnano-simple "1.2.2" 921 | etag "1.8.1" 922 | find-cache-dir "3.3.1" 923 | get-orientation "1.1.2" 924 | jest-worker "24.9.0" 925 | native-url "0.3.4" 926 | node-fetch "2.6.1" 927 | node-html-parser "1.4.9" 928 | node-libs-browser "^2.2.1" 929 | p-limit "3.1.0" 930 | path-browserify "1.0.1" 931 | pnp-webpack-plugin "1.6.4" 932 | postcss "8.1.7" 933 | process "0.11.10" 934 | prop-types "15.7.2" 935 | raw-body "2.4.1" 936 | react-is "16.13.1" 937 | react-refresh "0.8.3" 938 | stream-browserify "3.0.0" 939 | styled-jsx "3.3.2" 940 | use-subscription "1.5.1" 941 | vm-browserify "1.1.2" 942 | watchpack "2.1.1" 943 | 944 | node-fetch@2.6.1: 945 | version "2.6.1" 946 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" 947 | integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== 948 | 949 | node-html-parser@1.4.9: 950 | version "1.4.9" 951 | resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-1.4.9.tgz#3c8f6cac46479fae5800725edb532e9ae8fd816c" 952 | integrity sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw== 953 | dependencies: 954 | he "1.2.0" 955 | 956 | node-libs-browser@^2.2.1: 957 | version "2.2.1" 958 | resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" 959 | integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== 960 | dependencies: 961 | assert "^1.1.1" 962 | browserify-zlib "^0.2.0" 963 | buffer "^4.3.0" 964 | console-browserify "^1.1.0" 965 | constants-browserify "^1.0.0" 966 | crypto-browserify "^3.11.0" 967 | domain-browser "^1.1.1" 968 | events "^3.0.0" 969 | https-browserify "^1.0.0" 970 | os-browserify "^0.3.0" 971 | path-browserify "0.0.1" 972 | process "^0.11.10" 973 | punycode "^1.2.4" 974 | querystring-es3 "^0.2.0" 975 | readable-stream "^2.3.3" 976 | stream-browserify "^2.0.1" 977 | stream-http "^2.7.2" 978 | string_decoder "^1.0.0" 979 | timers-browserify "^2.0.4" 980 | tty-browserify "0.0.0" 981 | url "^0.11.0" 982 | util "^0.11.0" 983 | vm-browserify "^1.0.1" 984 | 985 | node-releases@^1.1.69: 986 | version "1.1.71" 987 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" 988 | integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== 989 | 990 | normalize-path@^3.0.0, normalize-path@~3.0.0: 991 | version "3.0.0" 992 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 993 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 994 | 995 | object-assign@^4.1.1: 996 | version "4.1.1" 997 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 998 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 999 | 1000 | os-browserify@^0.3.0: 1001 | version "0.3.0" 1002 | resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" 1003 | integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= 1004 | 1005 | p-limit@3.1.0: 1006 | version "3.1.0" 1007 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1008 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1009 | dependencies: 1010 | yocto-queue "^0.1.0" 1011 | 1012 | p-limit@^2.2.0: 1013 | version "2.3.0" 1014 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1015 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1016 | dependencies: 1017 | p-try "^2.0.0" 1018 | 1019 | p-locate@^4.1.0: 1020 | version "4.1.0" 1021 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 1022 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 1023 | dependencies: 1024 | p-limit "^2.2.0" 1025 | 1026 | p-try@^2.0.0: 1027 | version "2.2.0" 1028 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1029 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1030 | 1031 | pako@~1.0.5: 1032 | version "1.0.11" 1033 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" 1034 | integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== 1035 | 1036 | parse-asn1@^5.0.0, parse-asn1@^5.1.5: 1037 | version "5.1.6" 1038 | resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" 1039 | integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== 1040 | dependencies: 1041 | asn1.js "^5.2.0" 1042 | browserify-aes "^1.0.0" 1043 | evp_bytestokey "^1.0.0" 1044 | pbkdf2 "^3.0.3" 1045 | safe-buffer "^5.1.1" 1046 | 1047 | path-browserify@0.0.1: 1048 | version "0.0.1" 1049 | resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" 1050 | integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== 1051 | 1052 | path-browserify@1.0.1: 1053 | version "1.0.1" 1054 | resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" 1055 | integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== 1056 | 1057 | path-exists@^4.0.0: 1058 | version "4.0.0" 1059 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1060 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1061 | 1062 | pbkdf2@^3.0.3: 1063 | version "3.1.1" 1064 | resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" 1065 | integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== 1066 | dependencies: 1067 | create-hash "^1.1.2" 1068 | create-hmac "^1.1.4" 1069 | ripemd160 "^2.0.1" 1070 | safe-buffer "^5.0.1" 1071 | sha.js "^2.4.8" 1072 | 1073 | picomatch@^2.0.4, picomatch@^2.2.1: 1074 | version "2.2.2" 1075 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 1076 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 1077 | 1078 | pkg-dir@^4.1.0: 1079 | version "4.2.0" 1080 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 1081 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 1082 | dependencies: 1083 | find-up "^4.0.0" 1084 | 1085 | platform@1.3.6: 1086 | version "1.3.6" 1087 | resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" 1088 | integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== 1089 | 1090 | pnp-webpack-plugin@1.6.4: 1091 | version "1.6.4" 1092 | resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" 1093 | integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== 1094 | dependencies: 1095 | ts-pnp "^1.1.6" 1096 | 1097 | postcss@8.1.7: 1098 | version "8.1.7" 1099 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.1.7.tgz#ff6a82691bd861f3354fd9b17b2332f88171233f" 1100 | integrity sha512-llCQW1Pz4MOPwbZLmOddGM9eIJ8Bh7SZ2Oj5sxZva77uVaotYDsYTch1WBTNu7fUY0fpWp0fdt7uW40D4sRiiQ== 1101 | dependencies: 1102 | colorette "^1.2.1" 1103 | line-column "^1.0.2" 1104 | nanoid "^3.1.16" 1105 | source-map "^0.6.1" 1106 | 1107 | postcss@^7.0.32: 1108 | version "7.0.35" 1109 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" 1110 | integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== 1111 | dependencies: 1112 | chalk "^2.4.2" 1113 | source-map "^0.6.1" 1114 | supports-color "^6.1.0" 1115 | 1116 | process-nextick-args@~2.0.0: 1117 | version "2.0.1" 1118 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1119 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1120 | 1121 | process@0.11.10, process@^0.11.10: 1122 | version "0.11.10" 1123 | resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" 1124 | integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= 1125 | 1126 | prop-types@15.7.2: 1127 | version "15.7.2" 1128 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" 1129 | integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== 1130 | dependencies: 1131 | loose-envify "^1.4.0" 1132 | object-assign "^4.1.1" 1133 | react-is "^16.8.1" 1134 | 1135 | public-encrypt@^4.0.0: 1136 | version "4.0.3" 1137 | resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" 1138 | integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== 1139 | dependencies: 1140 | bn.js "^4.1.0" 1141 | browserify-rsa "^4.0.0" 1142 | create-hash "^1.1.0" 1143 | parse-asn1 "^5.0.0" 1144 | randombytes "^2.0.1" 1145 | safe-buffer "^5.1.2" 1146 | 1147 | punycode@1.3.2: 1148 | version "1.3.2" 1149 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" 1150 | integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= 1151 | 1152 | punycode@^1.2.4: 1153 | version "1.4.1" 1154 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1155 | integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= 1156 | 1157 | punycode@^2.1.0: 1158 | version "2.1.1" 1159 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1160 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1161 | 1162 | querystring-es3@^0.2.0: 1163 | version "0.2.1" 1164 | resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" 1165 | integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= 1166 | 1167 | querystring@0.2.0: 1168 | version "0.2.0" 1169 | resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" 1170 | integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= 1171 | 1172 | querystring@^0.2.0: 1173 | version "0.2.1" 1174 | resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" 1175 | integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== 1176 | 1177 | randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: 1178 | version "2.1.0" 1179 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1180 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1181 | dependencies: 1182 | safe-buffer "^5.1.0" 1183 | 1184 | randomfill@^1.0.3: 1185 | version "1.0.4" 1186 | resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" 1187 | integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== 1188 | dependencies: 1189 | randombytes "^2.0.5" 1190 | safe-buffer "^5.1.0" 1191 | 1192 | raw-body@2.4.1: 1193 | version "2.4.1" 1194 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" 1195 | integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== 1196 | dependencies: 1197 | bytes "3.1.0" 1198 | http-errors "1.7.3" 1199 | iconv-lite "0.4.24" 1200 | unpipe "1.0.0" 1201 | 1202 | react-dom@17.0.1: 1203 | version "17.0.1" 1204 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.1.tgz#1de2560474ec9f0e334285662ede52dbc5426fc6" 1205 | integrity sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug== 1206 | dependencies: 1207 | loose-envify "^1.1.0" 1208 | object-assign "^4.1.1" 1209 | scheduler "^0.20.1" 1210 | 1211 | react-is@16.13.1, react-is@^16.8.1: 1212 | version "16.13.1" 1213 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" 1214 | integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== 1215 | 1216 | react-refresh@0.8.3: 1217 | version "0.8.3" 1218 | resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" 1219 | integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== 1220 | 1221 | react@17.0.1: 1222 | version "17.0.1" 1223 | resolved "https://registry.yarnpkg.com/react/-/react-17.0.1.tgz#6e0600416bd57574e3f86d92edba3d9008726127" 1224 | integrity sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w== 1225 | dependencies: 1226 | loose-envify "^1.1.0" 1227 | object-assign "^4.1.1" 1228 | 1229 | readable-stream@^2.0.2, readable-stream@^2.3.3, readable-stream@^2.3.6: 1230 | version "2.3.7" 1231 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 1232 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 1233 | dependencies: 1234 | core-util-is "~1.0.0" 1235 | inherits "~2.0.3" 1236 | isarray "~1.0.0" 1237 | process-nextick-args "~2.0.0" 1238 | safe-buffer "~5.1.1" 1239 | string_decoder "~1.1.1" 1240 | util-deprecate "~1.0.1" 1241 | 1242 | readable-stream@^3.5.0, readable-stream@^3.6.0: 1243 | version "3.6.0" 1244 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 1245 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 1246 | dependencies: 1247 | inherits "^2.0.3" 1248 | string_decoder "^1.1.1" 1249 | util-deprecate "^1.0.1" 1250 | 1251 | readdirp@~3.5.0: 1252 | version "3.5.0" 1253 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" 1254 | integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== 1255 | dependencies: 1256 | picomatch "^2.2.1" 1257 | 1258 | regenerator-runtime@^0.13.4: 1259 | version "0.13.7" 1260 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" 1261 | integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== 1262 | 1263 | ripemd160@^2.0.0, ripemd160@^2.0.1: 1264 | version "2.0.2" 1265 | resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" 1266 | integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== 1267 | dependencies: 1268 | hash-base "^3.0.0" 1269 | inherits "^2.0.1" 1270 | 1271 | 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: 1272 | version "5.2.1" 1273 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1274 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1275 | 1276 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1277 | version "5.1.2" 1278 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1279 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1280 | 1281 | "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: 1282 | version "2.1.2" 1283 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1284 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1285 | 1286 | scheduler@^0.20.1: 1287 | version "0.20.1" 1288 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.1.tgz#da0b907e24026b01181ecbc75efdc7f27b5a000c" 1289 | integrity sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw== 1290 | dependencies: 1291 | loose-envify "^1.1.0" 1292 | object-assign "^4.1.1" 1293 | 1294 | semver@^6.0.0: 1295 | version "6.3.0" 1296 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1297 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1298 | 1299 | setimmediate@^1.0.4: 1300 | version "1.0.5" 1301 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 1302 | integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= 1303 | 1304 | setprototypeof@1.1.1: 1305 | version "1.1.1" 1306 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 1307 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 1308 | 1309 | sha.js@^2.4.0, sha.js@^2.4.8: 1310 | version "2.4.11" 1311 | resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" 1312 | integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== 1313 | dependencies: 1314 | inherits "^2.0.1" 1315 | safe-buffer "^5.0.1" 1316 | 1317 | shell-quote@1.7.2: 1318 | version "1.7.2" 1319 | resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" 1320 | integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== 1321 | 1322 | source-map@0.7.3: 1323 | version "0.7.3" 1324 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" 1325 | integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== 1326 | 1327 | source-map@0.8.0-beta.0: 1328 | version "0.8.0-beta.0" 1329 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" 1330 | integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== 1331 | dependencies: 1332 | whatwg-url "^7.0.0" 1333 | 1334 | source-map@^0.6.1: 1335 | version "0.6.1" 1336 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1337 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1338 | 1339 | stacktrace-parser@0.1.10: 1340 | version "0.1.10" 1341 | resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" 1342 | integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== 1343 | dependencies: 1344 | type-fest "^0.7.1" 1345 | 1346 | "statuses@>= 1.5.0 < 2": 1347 | version "1.5.0" 1348 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 1349 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 1350 | 1351 | stream-browserify@3.0.0: 1352 | version "3.0.0" 1353 | resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" 1354 | integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== 1355 | dependencies: 1356 | inherits "~2.0.4" 1357 | readable-stream "^3.5.0" 1358 | 1359 | stream-browserify@^2.0.1: 1360 | version "2.0.2" 1361 | resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" 1362 | integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== 1363 | dependencies: 1364 | inherits "~2.0.1" 1365 | readable-stream "^2.0.2" 1366 | 1367 | stream-http@^2.7.2: 1368 | version "2.8.3" 1369 | resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" 1370 | integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== 1371 | dependencies: 1372 | builtin-status-codes "^3.0.0" 1373 | inherits "^2.0.1" 1374 | readable-stream "^2.3.6" 1375 | to-arraybuffer "^1.0.0" 1376 | xtend "^4.0.0" 1377 | 1378 | stream-parser@^0.3.1: 1379 | version "0.3.1" 1380 | resolved "https://registry.yarnpkg.com/stream-parser/-/stream-parser-0.3.1.tgz#1618548694420021a1182ff0af1911c129761773" 1381 | integrity sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M= 1382 | dependencies: 1383 | debug "2" 1384 | 1385 | string-hash@1.1.3: 1386 | version "1.1.3" 1387 | resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" 1388 | integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= 1389 | 1390 | string_decoder@^1.0.0, string_decoder@^1.1.1: 1391 | version "1.3.0" 1392 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 1393 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 1394 | dependencies: 1395 | safe-buffer "~5.2.0" 1396 | 1397 | string_decoder@~1.1.1: 1398 | version "1.1.1" 1399 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1400 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1401 | dependencies: 1402 | safe-buffer "~5.1.0" 1403 | 1404 | strip-ansi@6.0.0: 1405 | version "6.0.0" 1406 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1407 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1408 | dependencies: 1409 | ansi-regex "^5.0.0" 1410 | 1411 | styled-jsx@3.3.2: 1412 | version "3.3.2" 1413 | resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-3.3.2.tgz#2474601a26670a6049fb4d3f94bd91695b3ce018" 1414 | integrity sha512-daAkGd5mqhbBhLd6jYAjYBa9LpxYCzsgo/f6qzPdFxVB8yoGbhxvzQgkC0pfmCVvW3JuAEBn0UzFLBfkHVZG1g== 1415 | dependencies: 1416 | "@babel/types" "7.8.3" 1417 | babel-plugin-syntax-jsx "6.18.0" 1418 | convert-source-map "1.7.0" 1419 | loader-utils "1.2.3" 1420 | source-map "0.7.3" 1421 | string-hash "1.1.3" 1422 | stylis "3.5.4" 1423 | stylis-rule-sheet "0.0.10" 1424 | 1425 | stylis-rule-sheet@0.0.10: 1426 | version "0.0.10" 1427 | resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430" 1428 | integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw== 1429 | 1430 | stylis@3.5.4: 1431 | version "3.5.4" 1432 | resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" 1433 | integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== 1434 | 1435 | supports-color@^5.3.0: 1436 | version "5.5.0" 1437 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1438 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1439 | dependencies: 1440 | has-flag "^3.0.0" 1441 | 1442 | supports-color@^6.1.0: 1443 | version "6.1.0" 1444 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" 1445 | integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== 1446 | dependencies: 1447 | has-flag "^3.0.0" 1448 | 1449 | supports-color@^7.1.0: 1450 | version "7.2.0" 1451 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1452 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1453 | dependencies: 1454 | has-flag "^4.0.0" 1455 | 1456 | swr@^0.5.4: 1457 | version "0.5.4" 1458 | resolved "https://registry.yarnpkg.com/swr/-/swr-0.5.4.tgz#9516af6ffd84ba2c23a804ff771be2eb83ba8d46" 1459 | integrity sha512-TUSxxuC8uP/4JKV22ml91WQ0tbif+9HVhm683xm8KYfwZIW5ogwcnU634dg3x6N7azpIDIOLokoIi+z5vCz/yA== 1460 | 1461 | timers-browserify@^2.0.4: 1462 | version "2.0.12" 1463 | resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" 1464 | integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== 1465 | dependencies: 1466 | setimmediate "^1.0.4" 1467 | 1468 | to-arraybuffer@^1.0.0: 1469 | version "1.0.1" 1470 | resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" 1471 | integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= 1472 | 1473 | to-fast-properties@^2.0.0: 1474 | version "2.0.0" 1475 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 1476 | integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= 1477 | 1478 | to-regex-range@^5.0.1: 1479 | version "5.0.1" 1480 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1481 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1482 | dependencies: 1483 | is-number "^7.0.0" 1484 | 1485 | toidentifier@1.0.0: 1486 | version "1.0.0" 1487 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 1488 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 1489 | 1490 | tr46@^1.0.1: 1491 | version "1.0.1" 1492 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" 1493 | integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= 1494 | dependencies: 1495 | punycode "^2.1.0" 1496 | 1497 | ts-pnp@^1.1.6: 1498 | version "1.2.0" 1499 | resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" 1500 | integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== 1501 | 1502 | tty-browserify@0.0.0: 1503 | version "0.0.0" 1504 | resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" 1505 | integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= 1506 | 1507 | type-fest@^0.7.1: 1508 | version "0.7.1" 1509 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" 1510 | integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== 1511 | 1512 | typescript@^4.2.3: 1513 | version "4.2.3" 1514 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.3.tgz#39062d8019912d43726298f09493d598048c1ce3" 1515 | integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw== 1516 | 1517 | unpipe@1.0.0: 1518 | version "1.0.0" 1519 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1520 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 1521 | 1522 | url@^0.11.0: 1523 | version "0.11.0" 1524 | resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" 1525 | integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= 1526 | dependencies: 1527 | punycode "1.3.2" 1528 | querystring "0.2.0" 1529 | 1530 | use-subscription@1.5.1: 1531 | version "1.5.1" 1532 | resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.5.1.tgz#73501107f02fad84c6dd57965beb0b75c68c42d1" 1533 | integrity sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA== 1534 | dependencies: 1535 | object-assign "^4.1.1" 1536 | 1537 | util-deprecate@^1.0.1, util-deprecate@~1.0.1: 1538 | version "1.0.2" 1539 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1540 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1541 | 1542 | util@0.10.3: 1543 | version "0.10.3" 1544 | resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" 1545 | integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= 1546 | dependencies: 1547 | inherits "2.0.1" 1548 | 1549 | util@^0.11.0: 1550 | version "0.11.1" 1551 | resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" 1552 | integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== 1553 | dependencies: 1554 | inherits "2.0.3" 1555 | 1556 | vm-browserify@1.1.2, vm-browserify@^1.0.1: 1557 | version "1.1.2" 1558 | resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" 1559 | integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== 1560 | 1561 | watchpack@2.1.1: 1562 | version "2.1.1" 1563 | resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.1.1.tgz#e99630550fca07df9f90a06056987baa40a689c7" 1564 | integrity sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw== 1565 | dependencies: 1566 | glob-to-regexp "^0.4.1" 1567 | graceful-fs "^4.1.2" 1568 | 1569 | webidl-conversions@^4.0.2: 1570 | version "4.0.2" 1571 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" 1572 | integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== 1573 | 1574 | whatwg-url@^7.0.0: 1575 | version "7.1.0" 1576 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" 1577 | integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== 1578 | dependencies: 1579 | lodash.sortby "^4.7.0" 1580 | tr46 "^1.0.1" 1581 | webidl-conversions "^4.0.2" 1582 | 1583 | xtend@^4.0.0: 1584 | version "4.0.2" 1585 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 1586 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 1587 | 1588 | yocto-queue@^0.1.0: 1589 | version "0.1.0" 1590 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1591 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1592 | --------------------------------------------------------------------------------