From a58fd3ad77b6cea0f32a1bd79fc77694d657fed0 Mon Sep 17 00:00:00 2001 From: Ryan Date: Sat, 2 Oct 2021 22:17:05 +0000 Subject: [PATCH] feat: mikroorm, convert to monorepo --- .gitignore | 5 +- .pnpmfile.cjs | 12 + .vscode/settings.json | 3 +- README.md | 1 - docker-compose.yml | 1 + next.config.js | 10 - package-lock.json | 36 - package.json | 87 +- packages/api/package.json | 74 + {src/data => packages/api/src}/blocklist.json | 0 .../api/src}/classes/ExifTransformer.ts | 0 .../api/src}/classes/MicroConfig.ts | 0 .../api/src}/classes/MicroConfigPurge.ts | 0 .../api/src}/classes/MicroHost.ts | 2 +- packages/api/src/config.ts | 14 + .../helpers/generate-content-id.helper.ts | 2 +- .../src/helpers/generate-delete-key.helper.ts | 5 + .../src}/helpers/get-stream-type.helper.ts | 0 .../src}/helpers/is-image-scraper.helper.ts | 0 .../api/src}/helpers/random-item.helper.ts | 0 {src => packages/api/src}/main.ts | 24 +- packages/api/src/mikro-orm.config.ts | 12 + .../api/src}/modules/app.controller.ts | 10 +- .../api/src}/modules/app.module.ts | 22 +- .../api/src}/modules/auth/auth.controller.ts | 8 +- .../api/src}/modules/auth/auth.decorators.ts | 6 +- .../api/src}/modules/auth/auth.module.ts | 7 +- .../api/src}/modules/auth/auth.service.ts | 0 .../api/src/modules/auth}/guards/jwt.guard.ts | 0 .../modules/auth}/guards/password.guard.ts | 0 .../modules/auth}/guards/permission.guard.ts | 4 +- .../modules/auth}/strategies/jwt.strategy.ts | 12 +- .../auth}/strategies/password.strategy.ts | 14 +- .../api/src/modules/fastify.d.ts | 4 +- .../api/src}/modules/file/file.controller.ts | 57 +- packages/api/src/modules/file/file.entity.ts | 70 + .../api/src}/modules/file/file.module.ts | 7 +- .../api/src}/modules/file/file.service.ts | 91 +- .../src}/modules/hosts/hosts.controller.ts | 4 +- packages/api/src/modules/hosts/hosts.guard.ts | 20 + .../api/src}/modules/hosts/hosts.module.ts | 0 .../api/src}/modules/hosts/hosts.service.ts | 2 +- .../src/modules/invite/invite.controller.ts | 25 + .../api/src/modules/invite/invite.entity.ts | 38 + .../api/src}/modules/invite/invite.module.ts | 5 +- .../api/src/modules/invite/invite.service.ts | 54 + .../src}/modules/storage/storage.module.ts | 0 .../src}/modules/storage/storage.service.ts | 2 +- .../modules/thumbnail/thumbnail.controller.ts | 8 +- .../src/modules/thumbnail/thumbnail.entity.ts | 24 + .../modules/thumbnail/thumbnail.module.ts | 4 +- .../modules/thumbnail/thumbnail.service.ts | 39 +- .../src}/modules/user/dto/create-user.dto.ts | 2 +- .../src/modules/user/dto/pagination.dto.ts | 17 + .../api/src}/modules/user/user.controller.ts | 82 +- packages/api/src/modules/user/user.entity.ts | 34 + .../api/src}/modules/user/user.module.ts | 5 +- packages/api/src/modules/user/user.service.ts | 75 + packages/api/src/timestamp.type.ts | 17 + {src => packages/api/src}/types.ts | 16 +- packages/api/tsconfig.json | 4 + packages/common/package.json | 12 + {src => packages/common/src}/constants.ts | 2 +- .../common/src}/helpers/is-object.helper.ts | 0 packages/common/src/index.ts | 2 + next-env.d.ts => packages/web/next-env.d.ts | 0 packages/web/next.config.js | 19 + packages/web/package.json | 42 + .../web/postcss.config.js | 0 {public => packages/web/public}/favicon.svg | 0 {public => packages/web/public}/robots.txt | 0 .../src}/components/avatar/avatar.module.css | 0 .../web/src}/components/avatar/avatar.tsx | 0 .../src}/components/button/button.module.css | 0 .../web/src}/components/button/button.tsx | 0 {src => packages/web/src}/components/card.tsx | 0 .../web/src}/components/container.tsx | 0 .../components/dropdown/dropdown-divider.tsx | 0 .../src}/components/dropdown/dropdown-tab.tsx | 0 .../components/dropdown/dropdown.module.css | 0 .../web/src}/components/dropdown/dropdown.tsx | 0 .../file-embed/file-embed-container.tsx | 2 +- .../file-embed/file-embed-default.tsx | 2 +- .../file-embed/file-embed-image.tsx | 4 +- .../file-embed-text-container.tsx | 2 +- .../file-embed-text/file-embed-text.tsx | 2 +- .../file-embed/file-embed-text/prism-theme.ts | 0 .../file-embed/file-embed-video.tsx | 4 +- .../src}/components/file-embed/file-embed.tsx | 2 +- .../file-list/file-list-card-content.tsx | 0 .../components/file-list/file-list-card.tsx | 2 +- .../src}/components/file-list/file-list.tsx | 30 +- .../src}/components/header/header-user.tsx | 0 .../web/src}/components/header/header.tsx | 0 .../web/src}/components/host-list.tsx | 0 .../src}/components/input/input-container.tsx | 0 .../src}/components/input/input.module.css | 0 .../web/src}/components/input/input.tsx | 0 .../web/src}/components/input/select.tsx | 0 {src => packages/web/src}/components/link.tsx | 0 .../web/src}/components/login-form.tsx | 0 .../web/src}/components/page-loader.tsx | 0 .../web/src}/components/section.tsx | 0 .../web/src}/components/sharex-button.tsx | 0 .../web/src}/components/spinner.tsx | 0 packages/web/src/components/time.tsx | 22 + .../web/src}/components/title.tsx | 0 .../src}/components/toast/toast-wrapper.tsx | 0 .../web/src}/components/toast/toast.tsx | 0 .../web/src}/components/user-pill.tsx | 0 {src => packages/web/src}/data/languages.json | 0 .../web/src}/helpers/download.helper.ts | 0 .../web/src}/helpers/fetcher.helper.ts | 0 .../src}/helpers/generate-config.helper.ts | 5 +- .../src}/helpers/get-error-message.helper.ts | 2 +- .../src}/helpers/get-file-language.helper.ts | 3 +- .../web/src}/helpers/http.helper.ts | 0 packages/web/src/hooks/use-config.hook.tsx | 12 + .../web/src}/hooks/use-host.hook.tsx | 0 .../hooks/use-on-click-outside.helper.tsx | 0 .../web/src}/hooks/use-paths.helper.tsx | 0 .../web/src}/hooks/use-toasts.helper.tsx | 0 .../web/src}/hooks/use-user.helper.tsx | 4 +- {src => packages/web/src}/pages/404.tsx | 0 {src => packages/web/src}/pages/500.tsx | 0 {src => packages/web/src}/pages/_app.tsx | 0 {src => packages/web/src}/pages/_error.tsx | 10 - {src => packages/web/src}/pages/dashboard.tsx | 4 +- .../web/src}/pages/file/[fileId].tsx | 16 +- {src => packages/web/src}/pages/index.tsx | 20 +- .../web/src}/pages/invite/[inviteToken].tsx | 34 +- {src => packages/web/src}/pages/login.tsx | 0 {src => packages/web/src}/pages/upload.tsx | 4 +- {src => packages/web/src}/styles/globals.css | 0 .../web/tailwind.config.js | 0 packages/web/tsconfig.json | 30 + pnpm-lock.yaml | 3905 +++++++++++------ pnpm-workspace.yaml | 3 + .../20210403030737_init/migration.sql | 65 - .../20210416050125_host_tags/migration.sql | 9 - .../migration.sql | 3 - .../migration.sql | 4 - prisma/migrations/migration_lock.toml | 3 - prisma/schema.prisma | 62 - src/components/time.tsx | 30 - src/config.ts | 14 - src/helpers/error-handler.helper.ts | 27 - src/hooks/use-config.hook.tsx | 12 - src/interceptors/redirect.interceptor.ts | 26 - src/modules/deletion/deletion.controller.ts | 18 - src/modules/deletion/deletion.module.ts | 14 - src/modules/deletion/deletion.service.ts | 55 - src/modules/invite/invite.controller.ts | 33 - src/modules/invite/invite.service.ts | 47 - src/modules/link/link.controller.ts | 45 - src/modules/link/link.module.ts | 13 - src/modules/link/link.service.ts | 49 - src/modules/upload/upload.controller.ts | 73 - src/modules/upload/upload.module.ts | 13 - src/modules/user/dto/user-files-query.dto.ts | 15 - src/modules/user/user.service.ts | 74 - src/prisma.ts | 10 - tsconfig.build.json | 5 - tsconfig.json | 29 +- tsconfig.server.json | 12 - tsup.config.ts | 20 - 166 files changed, 3515 insertions(+), 2543 deletions(-) create mode 100644 .pnpmfile.cjs delete mode 100644 next.config.js delete mode 100644 package-lock.json create mode 100644 packages/api/package.json rename {src/data => packages/api/src}/blocklist.json (100%) rename {src => packages/api/src}/classes/ExifTransformer.ts (100%) rename {src => packages/api/src}/classes/MicroConfig.ts (100%) rename {src => packages/api/src}/classes/MicroConfigPurge.ts (100%) rename {src => packages/api/src}/classes/MicroHost.ts (95%) create mode 100644 packages/api/src/config.ts rename {src => packages/api/src}/helpers/generate-content-id.helper.ts (91%) create mode 100644 packages/api/src/helpers/generate-delete-key.helper.ts rename {src => packages/api/src}/helpers/get-stream-type.helper.ts (100%) rename {src => packages/api/src}/helpers/is-image-scraper.helper.ts (100%) rename {src => packages/api/src}/helpers/random-item.helper.ts (100%) rename {src => packages/api/src}/main.ts (65%) create mode 100644 packages/api/src/mikro-orm.config.ts rename {src => packages/api/src}/modules/app.controller.ts (77%) rename {src => packages/api/src}/modules/app.module.ts (58%) rename {src => packages/api/src}/modules/auth/auth.controller.ts (88%) rename {src => packages/api/src}/modules/auth/auth.decorators.ts (78%) rename {src => packages/api/src}/modules/auth/auth.module.ts (55%) rename {src => packages/api/src}/modules/auth/auth.service.ts (100%) rename {src => packages/api/src/modules/auth}/guards/jwt.guard.ts (100%) rename {src => packages/api/src/modules/auth}/guards/password.guard.ts (100%) rename {src => packages/api/src/modules/auth}/guards/permission.guard.ts (90%) rename {src => packages/api/src/modules/auth}/strategies/jwt.strategy.ts (74%) rename {src => packages/api/src/modules/auth}/strategies/password.strategy.ts (67%) rename types/fastify/index.d.ts => packages/api/src/modules/fastify.d.ts (55%) rename {src => packages/api/src}/modules/file/file.controller.ts (52%) create mode 100644 packages/api/src/modules/file/file.entity.ts rename {src => packages/api/src}/modules/file/file.module.ts (63%) rename {src => packages/api/src}/modules/file/file.service.ts (65%) rename {src => packages/api/src}/modules/hosts/hosts.controller.ts (89%) create mode 100644 packages/api/src/modules/hosts/hosts.guard.ts rename {src => packages/api/src}/modules/hosts/hosts.module.ts (100%) rename {src => packages/api/src}/modules/hosts/hosts.service.ts (96%) create mode 100644 packages/api/src/modules/invite/invite.controller.ts create mode 100644 packages/api/src/modules/invite/invite.entity.ts rename {src => packages/api/src}/modules/invite/invite.module.ts (62%) create mode 100644 packages/api/src/modules/invite/invite.service.ts rename {src => packages/api/src}/modules/storage/storage.module.ts (100%) rename {src => packages/api/src}/modules/storage/storage.service.ts (97%) rename {src => packages/api/src}/modules/thumbnail/thumbnail.controller.ts (62%) create mode 100644 packages/api/src/modules/thumbnail/thumbnail.entity.ts rename {src => packages/api/src}/modules/thumbnail/thumbnail.module.ts (69%) rename {src => packages/api/src}/modules/thumbnail/thumbnail.service.ts (68%) rename {src => packages/api/src}/modules/user/dto/create-user.dto.ts (87%) create mode 100644 packages/api/src/modules/user/dto/pagination.dto.ts rename {src => packages/api/src}/modules/user/user.controller.ts (64%) create mode 100644 packages/api/src/modules/user/user.entity.ts rename {src => packages/api/src}/modules/user/user.module.ts (71%) create mode 100644 packages/api/src/modules/user/user.service.ts create mode 100644 packages/api/src/timestamp.type.ts rename {src => packages/api/src}/types.ts (64%) create mode 100644 packages/api/tsconfig.json create mode 100644 packages/common/package.json rename {src => packages/common/src}/constants.ts (96%) rename {src => packages/common/src}/helpers/is-object.helper.ts (100%) create mode 100644 packages/common/src/index.ts rename next-env.d.ts => packages/web/next-env.d.ts (100%) create mode 100644 packages/web/next.config.js create mode 100644 packages/web/package.json rename postcss.config.js => packages/web/postcss.config.js (100%) rename {public => packages/web/public}/favicon.svg (100%) rename {public => packages/web/public}/robots.txt (100%) rename {src => packages/web/src}/components/avatar/avatar.module.css (100%) rename {src => packages/web/src}/components/avatar/avatar.tsx (100%) rename {src => packages/web/src}/components/button/button.module.css (100%) rename {src => packages/web/src}/components/button/button.tsx (100%) rename {src => packages/web/src}/components/card.tsx (100%) rename {src => packages/web/src}/components/container.tsx (100%) rename {src => packages/web/src}/components/dropdown/dropdown-divider.tsx (100%) rename {src => packages/web/src}/components/dropdown/dropdown-tab.tsx (100%) rename {src => packages/web/src}/components/dropdown/dropdown.module.css (100%) rename {src => packages/web/src}/components/dropdown/dropdown.tsx (100%) rename {src => packages/web/src}/components/file-embed/file-embed-container.tsx (93%) rename {src => packages/web/src}/components/file-embed/file-embed-default.tsx (89%) rename {src => packages/web/src}/components/file-embed/file-embed-image.tsx (82%) rename {src => packages/web/src}/components/file-embed/file-embed-text/file-embed-text-container.tsx (98%) rename {src => packages/web/src}/components/file-embed/file-embed-text/file-embed-text.tsx (97%) rename {src => packages/web/src}/components/file-embed/file-embed-text/prism-theme.ts (100%) rename {src => packages/web/src}/components/file-embed/file-embed-video.tsx (75%) rename {src => packages/web/src}/components/file-embed/file-embed.tsx (96%) rename {src => packages/web/src}/components/file-list/file-list-card-content.tsx (100%) rename {src => packages/web/src}/components/file-list/file-list-card.tsx (92%) rename {src => packages/web/src}/components/file-list/file-list.tsx (67%) rename {src => packages/web/src}/components/header/header-user.tsx (100%) rename {src => packages/web/src}/components/header/header.tsx (100%) rename {src => packages/web/src}/components/host-list.tsx (100%) rename {src => packages/web/src}/components/input/input-container.tsx (100%) rename {src => packages/web/src}/components/input/input.module.css (100%) rename {src => packages/web/src}/components/input/input.tsx (100%) rename {src => packages/web/src}/components/input/select.tsx (100%) rename {src => packages/web/src}/components/link.tsx (100%) rename {src => packages/web/src}/components/login-form.tsx (100%) rename {src => packages/web/src}/components/page-loader.tsx (100%) rename {src => packages/web/src}/components/section.tsx (100%) rename {src => packages/web/src}/components/sharex-button.tsx (100%) rename {src => packages/web/src}/components/spinner.tsx (100%) create mode 100644 packages/web/src/components/time.tsx rename {src => packages/web/src}/components/title.tsx (100%) rename {src => packages/web/src}/components/toast/toast-wrapper.tsx (100%) rename {src => packages/web/src}/components/toast/toast.tsx (100%) rename {src => packages/web/src}/components/user-pill.tsx (100%) rename {src => packages/web/src}/data/languages.json (100%) rename {src => packages/web/src}/helpers/download.helper.ts (100%) rename {src => packages/web/src}/helpers/fetcher.helper.ts (100%) rename {src => packages/web/src}/helpers/generate-config.helper.ts (87%) rename {src => packages/web/src}/helpers/get-error-message.helper.ts (83%) rename {src => packages/web/src}/helpers/get-file-language.helper.ts (84%) rename {src => packages/web/src}/helpers/http.helper.ts (100%) create mode 100644 packages/web/src/hooks/use-config.hook.tsx rename {src => packages/web/src}/hooks/use-host.hook.tsx (100%) rename {src => packages/web/src}/hooks/use-on-click-outside.helper.tsx (100%) rename {src => packages/web/src}/hooks/use-paths.helper.tsx (100%) rename {src => packages/web/src}/hooks/use-toasts.helper.tsx (100%) rename {src => packages/web/src}/hooks/use-user.helper.tsx (92%) rename {src => packages/web/src}/pages/404.tsx (100%) rename {src => packages/web/src}/pages/500.tsx (100%) rename {src => packages/web/src}/pages/_app.tsx (100%) rename {src => packages/web/src}/pages/_error.tsx (83%) rename {src => packages/web/src}/pages/dashboard.tsx (98%) rename {src => packages/web/src}/pages/file/[fileId].tsx (89%) rename {src => packages/web/src}/pages/index.tsx (67%) rename {src => packages/web/src}/pages/invite/[inviteToken].tsx (78%) rename {src => packages/web/src}/pages/login.tsx (100%) rename {src => packages/web/src}/pages/upload.tsx (98%) rename {src => packages/web/src}/styles/globals.css (100%) rename tailwind.config.js => packages/web/tailwind.config.js (100%) create mode 100644 packages/web/tsconfig.json create mode 100644 pnpm-workspace.yaml delete mode 100644 prisma/migrations/20210403030737_init/migration.sql delete mode 100644 prisma/migrations/20210416050125_host_tags/migration.sql delete mode 100644 prisma/migrations/20210420060855_thumbnail_cascades/migration.sql delete mode 100644 prisma/migrations/20210423163121_thumbnail_mime_change/migration.sql delete mode 100644 prisma/migrations/migration_lock.toml delete mode 100644 prisma/schema.prisma delete mode 100644 src/components/time.tsx delete mode 100644 src/config.ts delete mode 100644 src/helpers/error-handler.helper.ts delete mode 100644 src/hooks/use-config.hook.tsx delete mode 100644 src/interceptors/redirect.interceptor.ts delete mode 100644 src/modules/deletion/deletion.controller.ts delete mode 100644 src/modules/deletion/deletion.module.ts delete mode 100644 src/modules/deletion/deletion.service.ts delete mode 100644 src/modules/invite/invite.controller.ts delete mode 100644 src/modules/invite/invite.service.ts delete mode 100644 src/modules/link/link.controller.ts delete mode 100644 src/modules/link/link.module.ts delete mode 100644 src/modules/link/link.service.ts delete mode 100644 src/modules/upload/upload.controller.ts delete mode 100644 src/modules/upload/upload.module.ts delete mode 100644 src/modules/user/dto/user-files-query.dto.ts delete mode 100644 src/modules/user/user.service.ts delete mode 100644 src/prisma.ts delete mode 100644 tsconfig.build.json delete mode 100644 tsconfig.server.json delete mode 100644 tsup.config.ts diff --git a/.gitignore b/.gitignore index d7d7dd3..614a1ac 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,7 @@ dist /data # nektos/act secrets file -.secrets \ No newline at end of file +.secrets + +packages/web/.next +packages/api/data \ No newline at end of file diff --git a/.pnpmfile.cjs b/.pnpmfile.cjs new file mode 100644 index 0000000..ef14505 --- /dev/null +++ b/.pnpmfile.cjs @@ -0,0 +1,12 @@ +module.exports = { + hooks: { + readPackage: (pkg, context) => { + if (pkg.name === "@mikro-orm/cli") { + delete pkg.dependencies["@mikro-orm/core"]; + pkg.peerDependencies["@mikro-orm/core"] = pkg.peerDependencies["@mikro-orm/postgresql"]; + } + + return pkg; + }, + }, +}; diff --git a/.vscode/settings.json b/.vscode/settings.json index 006a0e3..933ecf4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,5 +10,6 @@ }, "headwind.classRegex": { "typescriptreact": "className(?:s\\((?:\\s+?)?|=)[\"'`]([A-z0-9-:/ ]+)[\"'`]" - } + }, + "cSpell.words": ["xbytes"] } diff --git a/README.md b/README.md index 02cc58f..4ca01db 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,6 @@ There currently isn't an admin interface, only endpoints that let you do some ba - [ ] Redirects may be broken. Also hosts with no redirect should probably just have it set to the root host, that should allow us to strip some unnecessary code. - [ ] GIFs should probably be converted to mp4 videos to save space - Discord is currently blocking this as they handle embedding videos (and gifs) extremely poorly. Unless the url has "mp4" in it it outright won't embed most of the time. -- [ ] Drop `nest-next`, it appears to be unmaintained and has issues with passthrough paths ## discord diff --git a/docker-compose.yml b/docker-compose.yml index ff00777..fbd50fb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,6 @@ # THIS FILE IS FOR DEVELOPMENT ONLY. # If you want complete examples on how to host micro, see the /examples directory. +# Persistence is not setup for this postgres instance. version: "3" services: postgres: diff --git a/next.config.js b/next.config.js deleted file mode 100644 index 5d86338..0000000 --- a/next.config.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - async rewrites() { - return [ - { - source: "/f/:fileId", - destination: "/file/:fileId", - }, - ]; - }, -}; diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 05b452a..0000000 --- a/package-lock.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "micro", - "version": "0.0.1", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@prisma/client": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-2.27.0.tgz", - "integrity": "sha512-Sh2b1M8MGbOHbwG1FEqdWTUCrEX3p7gt2e7gpaBWou8yTIJvP1UZ4YlHgpuUcR1q4pEIR/JTZJeQk2l4iDyRBQ==", - "requires": { - "@prisma/engines-version": "2.27.0-43.cdba6ec525e0213cce26f8e4bb23cf556d1479bb" - } - }, - "@prisma/engines": { - "version": "2.27.0-43.cdba6ec525e0213cce26f8e4bb23cf556d1479bb", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-2.27.0-43.cdba6ec525e0213cce26f8e4bb23cf556d1479bb.tgz", - "integrity": "sha512-AIbIhAxmd2CHZO5XzQTPrfk+Tp/5eoNoSledOG3yc6Dk97siLvnBuSEv7prggUbedCufDwZLAvwxV4PEw3zOlQ==", - "dev": true - }, - "@prisma/engines-version": { - "version": "2.27.0-43.cdba6ec525e0213cce26f8e4bb23cf556d1479bb", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-2.27.0-43.cdba6ec525e0213cce26f8e4bb23cf556d1479bb.tgz", - "integrity": "sha512-pwOsYdzw8+cwKlUrCzasiRh96RhNuJ/QcKr0HwjxxlUWTmbEayDKjqRRz5fsUYIpSv5fW1B3SsbzHOqVtFZ6XQ==" - }, - "prisma": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-2.27.0.tgz", - "integrity": "sha512-/3H9C+IPlJmY5KArhfKHMpxKXqcZIBZ+LjM1b5FxvLCGQkq/mRC96SpHcKcLtiYgftNAX13nvlxg+cBw9Dbe8Q==", - "dev": true, - "requires": { - "@prisma/engines": "2.27.0-43.cdba6ec525e0213cce26f8e4bb23cf556d1479bb" - } - } - } -} diff --git a/package.json b/package.json index 36fed3d..eec1ed2 100644 --- a/package.json +++ b/package.json @@ -6,94 +6,21 @@ "license": "GPL-3.0", "private": true, "engine": { - "node": ">=14 <15" + "node": ">=16" }, "scripts": { - "watch": "cross-env NODE_ENV=development tsup src/main.ts --watch --onSuccess \"node .next/api/main.js\"", - "build:clean": "rimraf .next", - "build:web": "next build", - "build:api": "tsup", - "build": "pnpm build:clean && pnpm build:web && pnpm build:api", - "start": "cross-env NODE_ENV=production node .next/api/main.js", - "lint": "eslint --fix ./src/**/*.{ts,tsx,js}", - "generate": "prisma generate", - "postinstall": "pnpm run generate" - }, - "dependencies": { - "@anatine/esbuild-decorators": "^0.2.12", - "@headlessui/react": "^1.3.0", - "@nestjs/common": "^8.0.4", - "@nestjs/core": "^8.0.4", - "@nestjs/jwt": "^8.0.0", - "@nestjs/passport": "^8.0.0", - "@nestjs/platform-fastify": "^8.0.4", - "@nestjs/schedule": "^1.0.0", - "@prisma/client": "^2.27.0", - "@ryanke/venera": "^0.0.2", - "autoprefixer": "^10.3.1", - "bcrypt": "^5.0.1", - "class-transformer": "^0.4.0", - "class-validator": "^0.13.1", - "classnames": "^2.3.1", - "content-range": "^2.0.0", - "copy-to-clipboard": "^3.3.1", - "cross-env": "^7.0.3", - "escape-string-regexp": "^4.0.0", - "fastify": "3.19.2", - "fastify-cookie": "^5.3.1", - "fastify-multipart": "^4.0.7", - "file-type": "^16.5.2", - "generate-avatar": "1.4.10", - "http-status-codes": "^2.1.4", - "istextorbinary": "^5.12.0", - "luxon": "^2.0.1", - "mime-types": "^2.1.31", - "ms": "^2.1.3", - "nanoid": "^3.1.23", - "nest-next": "9.3.0-beta.0", - "next": "11.0.1", - "normalize-url": "^6.0.0", - "passport": "^0.4.1", - "passport-jwt": "^4.0.0", - "passport-local": "^1.0.0", - "postcss": "^8.3.6", - "prism-react-renderer": "^1.2.1", - "react": "17.0.2", - "react-dom": "17.0.2", - "react-feather": "^2.0.9", - "react-infinite-scroll-component": "^6.1.0", - "reflect-metadata": "^0.1.13", - "rxjs": "^7.2.0", - "sharp": "^0.28.3", - "stream-size": "^0.0.6", - "swr": "^0.5.6", - "tailwindcss": "^2.2.7", - "xbytes": "^1.7.0" + "lint": "eslint --fix ./packages/*/src/**/*.{ts,tsx,js}" }, "devDependencies": { "@commitlint/cli": "^13.1.0", "@commitlint/config-conventional": "^13.1.0", - "@ryanke/eslint-config": "^1.0.1", - "@types/bcrypt": "^5.0.0", - "@types/luxon": "^1.27.1", - "@types/mime-types": "^2.1.0", - "@types/ms": "^0.7.31", - "@types/node": "^14.17.3", - "@types/passport-jwt": "^3.0.6", - "@types/passport-local": "^1.0.34", - "@types/rc": "^1.1.0", - "@types/react": "^17.0.15", - "@types/sharp": "^0.28.4", - "@typescript-eslint/eslint-plugin": "^4.29.3", + "@tsconfig/node16": "^1.0.2", + "@typescript-eslint/eslint-plugin": "^4.31.2", "eslint": "^7.32.0", - "eslint-plugin-react": "^7.24.0", + "eslint-plugin-react": "^7.26.0", "eslint-plugin-react-hooks": "^4.2.0", "eslint-plugin-unicorn": "^35.0.0", - "husky": "^7.0.1", - "prettier": "^2.3.2", - "prisma": "^2.27.0", - "rimraf": "^3.0.0", - "tsup": "^4.12.5", - "typescript": "^4.3.5" + "husky": "^7.0.2", + "prettier": "^2.4.1" } } \ No newline at end of file diff --git a/packages/api/package.json b/packages/api/package.json new file mode 100644 index 0000000..3d63a60 --- /dev/null +++ b/packages/api/package.json @@ -0,0 +1,74 @@ +{ + "name": "@micro/api", + "version": "0.0.1", + "repository": "https://github.com/sylv/micro.git", + "author": "Ryan ", + "license": "GPL-3.0", + "private": true, + "main": "./src/types.ts", + "engine": { + "node": ">=16" + }, + "scripts": { + "watch": "nodemon --exec \"ts-eager\" ./src/main.ts" + }, + "dependencies": { + "@micro/common": "workspace:^0.0.1", + "@mikro-orm/core": "^4.5.9", + "@mikro-orm/nestjs": "^4.3.0", + "@mikro-orm/postgresql": "^4.5.9", + "@nestjs/common": "^8.0.7", + "@nestjs/core": "^8.0.7", + "@nestjs/jwt": "^8.0.0", + "@nestjs/passport": "^8.0.1", + "@nestjs/platform-fastify": "^8.0.7", + "@nestjs/schedule": "^1.0.1", + "@ryanke/venera": "^0.0.2", + "bcrypt": "^5.0.1", + "class-transformer": "^0.4.0", + "class-validator": "^0.13.1", + "content-range": "^2.0.2", + "escape-string-regexp": "^4", + "fastify": "^3.21.6", + "fastify-cookie": "^5.3.1", + "fastify-multipart": "^5.0.0", + "file-type": "^16.5.3", + "http-status-codes": "^2.1.4", + "istextorbinary": "^6.0.0", + "luxon": "^2.0.2", + "mime-types": "^2.1.32", + "ms": "^3.0.0-canary.1", + "nanoid": "^3.1.25", + "next": "^11.1.2", + "normalize-url": "^6", + "passport": "^0.5.0", + "passport-jwt": "^4.0.0", + "passport-local": "^1.0.0", + "rxjs": "^7.3.0", + "sharp": "^0.29.1", + "stream-size": "^0.0.6", + "xbytes": "^1.7.0" + }, + "devDependencies": { + "@mikro-orm/cli": "^4.5.9", + "@mikro-orm/migrations": "^4.5.9", + "@tsconfig/node16": "^1.0.2", + "@types/bcrypt": "^5.0.0", + "@types/luxon": "^2.0.4", + "@types/mime-types": "^2.1.1", + "@types/node": "^16.10.1", + "@types/passport-jwt": "^3.0.6", + "@types/passport-local": "^1.0.34", + "@types/sharp": "^0.29.2", + "nodemon": "^2.0.13", + "ts-eager": "^2.0.2", + "ts-node": "^10.2.1" + }, + "mikro-orm": { + "useTsNode": true, + "configPaths": [ + "./src/mikro-orm.config.ts", + "./dist/mikro-orm.config.js" + ] + } +} \ No newline at end of file diff --git a/src/data/blocklist.json b/packages/api/src/blocklist.json similarity index 100% rename from src/data/blocklist.json rename to packages/api/src/blocklist.json diff --git a/src/classes/ExifTransformer.ts b/packages/api/src/classes/ExifTransformer.ts similarity index 100% rename from src/classes/ExifTransformer.ts rename to packages/api/src/classes/ExifTransformer.ts diff --git a/src/classes/MicroConfig.ts b/packages/api/src/classes/MicroConfig.ts similarity index 100% rename from src/classes/MicroConfig.ts rename to packages/api/src/classes/MicroConfig.ts diff --git a/src/classes/MicroConfigPurge.ts b/packages/api/src/classes/MicroConfigPurge.ts similarity index 100% rename from src/classes/MicroConfigPurge.ts rename to packages/api/src/classes/MicroConfigPurge.ts diff --git a/src/classes/MicroHost.ts b/packages/api/src/classes/MicroHost.ts similarity index 95% rename from src/classes/MicroHost.ts rename to packages/api/src/classes/MicroHost.ts index 1a0d4df..5caff00 100644 --- a/src/classes/MicroHost.ts +++ b/packages/api/src/classes/MicroHost.ts @@ -34,6 +34,6 @@ export class MicroHost { // using pattern.test. we should cache this or create it once during the transform. const escaped = escapeString(this.key); const pattern = escaped.replace("\\{\\{username\\}\\}", "(?[a-z0-9-{}]+?)"); - return new RegExp(`^(https?:\\/\\/)?${pattern}\\/?$`); + return new RegExp(`^(https?:\\/\\/)?${pattern}\\/?`); } } diff --git a/packages/api/src/config.ts b/packages/api/src/config.ts new file mode 100644 index 0000000..9eb60a4 --- /dev/null +++ b/packages/api/src/config.ts @@ -0,0 +1,14 @@ +import { loadConfig } from "@ryanke/venera"; +import { plainToClass } from "class-transformer"; +import { validateSync } from "class-validator"; +import { MicroConfig } from "./classes/MicroConfig"; + +const data = loadConfig("micro"); +const config = plainToClass(MicroConfig, data, { exposeDefaultValues: true }); +const errors = validateSync(config); +if (errors.length) throw errors; +if (config.rootHost.wildcard) { + throw new Error(`Root host cannot be a wildcard domain.`); +} + +export { config }; diff --git a/src/helpers/generate-content-id.helper.ts b/packages/api/src/helpers/generate-content-id.helper.ts similarity index 91% rename from src/helpers/generate-content-id.helper.ts rename to packages/api/src/helpers/generate-content-id.helper.ts index 837fc81..6b9acf0 100644 --- a/src/helpers/generate-content-id.helper.ts +++ b/packages/api/src/helpers/generate-content-id.helper.ts @@ -1,5 +1,5 @@ import { customAlphabet } from "nanoid"; -import blocklist from "../data/blocklist.json"; +import blocklist from "../blocklist.json"; // note: changing this will require changes to the file.service.ts regex export const contentIdLength = 6; diff --git a/packages/api/src/helpers/generate-delete-key.helper.ts b/packages/api/src/helpers/generate-delete-key.helper.ts new file mode 100644 index 0000000..cdd4fb5 --- /dev/null +++ b/packages/api/src/helpers/generate-delete-key.helper.ts @@ -0,0 +1,5 @@ +import { randomBytes } from "crypto"; + +export function generateDeleteKey() { + return randomBytes(16).toString("hex"); +} diff --git a/src/helpers/get-stream-type.helper.ts b/packages/api/src/helpers/get-stream-type.helper.ts similarity index 100% rename from src/helpers/get-stream-type.helper.ts rename to packages/api/src/helpers/get-stream-type.helper.ts diff --git a/src/helpers/is-image-scraper.helper.ts b/packages/api/src/helpers/is-image-scraper.helper.ts similarity index 100% rename from src/helpers/is-image-scraper.helper.ts rename to packages/api/src/helpers/is-image-scraper.helper.ts diff --git a/src/helpers/random-item.helper.ts b/packages/api/src/helpers/random-item.helper.ts similarity index 100% rename from src/helpers/random-item.helper.ts rename to packages/api/src/helpers/random-item.helper.ts diff --git a/src/main.ts b/packages/api/src/main.ts similarity index 65% rename from src/main.ts rename to packages/api/src/main.ts index 595a1d7..45cbafb 100644 --- a/src/main.ts +++ b/packages/api/src/main.ts @@ -3,11 +3,8 @@ import { NestFactory, Reflector } from "@nestjs/core"; import { FastifyAdapter, NestFastifyApplication } from "@nestjs/platform-fastify"; import cookie from "fastify-cookie"; import multipart, { FastifyMultipartOptions } from "fastify-multipart"; -import { RenderService } from "nest-next"; -import { config } from "./config"; -import { errorHandler } from "./helpers/error-handler.helper"; -import { RedirectInterceptor } from "./interceptors/redirect.interceptor"; import { AppModule } from "./modules/app.module"; +import { HostsGuard } from "./modules/hosts/hosts.guard"; const limits: FastifyMultipartOptions = { limits: { @@ -24,15 +21,24 @@ async function bootstrap(): Promise { const logger = new Logger("bootstrap"); const app = await NestFactory.create(AppModule, adapter); app.useGlobalInterceptors(new ClassSerializerInterceptor(new Reflector(), {})); - app.useGlobalInterceptors(new RedirectInterceptor()); - app.useGlobalPipes(new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, forbidUnknownValues: true })); + app.useGlobalGuards(new HostsGuard()); + app.useGlobalPipes( + new ValidationPipe({ + whitelist: true, + forbidNonWhitelisted: true, + forbidUnknownValues: true, + transformOptions: { + enableImplicitConversion: true, + }, + }) + ); + app.register(cookie as any); app.register(multipart as any, limits); - const service = app.get(RenderService); - service.setErrorHandler(errorHandler); await app.listen(8080, "0.0.0.0", (error, address) => { - logger.log(`Listing on ${address} (${config.rootHost.url})`); + if (error) throw error; + logger.log(`Listening at ${address}`); }); } diff --git a/packages/api/src/mikro-orm.config.ts b/packages/api/src/mikro-orm.config.ts new file mode 100644 index 0000000..423a205 --- /dev/null +++ b/packages/api/src/mikro-orm.config.ts @@ -0,0 +1,12 @@ +import { MikroOrmModuleSyncOptions } from "@mikro-orm/nestjs"; +import { config } from "./config"; +import { File } from "./modules/file/file.entity"; +import { Invite } from "./modules/invite/invite.entity"; +import { Thumbnail } from "./modules/thumbnail/thumbnail.entity"; +import { User } from "./modules/user/user.entity"; + +export default { + type: "postgresql", + entities: [File, Thumbnail, User, Invite], + clientUrl: config.database, +} as MikroOrmModuleSyncOptions; diff --git a/src/modules/app.controller.ts b/packages/api/src/modules/app.controller.ts similarity index 77% rename from src/modules/app.controller.ts rename to packages/api/src/modules/app.controller.ts index 8e368ca..72b9d96 100644 --- a/src/modules/app.controller.ts +++ b/packages/api/src/modules/app.controller.ts @@ -7,20 +7,14 @@ import { HostsService } from "./hosts/hosts.service"; export class AppController { constructor(private hostsService: HostsService) {} - @Get() - @Render("index") - getHome() { - return this.getConfig(); - } - - @Get("api/config") + @Get("config") async getConfig() { const hosts = this.hostsService.getHosts([]); return { inquiries: config.inquiries, uploadLimit: config.uploadLimit, allowTypes: config.allowTypes, - hosts: classToPlain(hosts) as typeof hosts, + hosts: hosts, }; } } diff --git a/src/modules/app.module.ts b/packages/api/src/modules/app.module.ts similarity index 58% rename from src/modules/app.module.ts rename to packages/api/src/modules/app.module.ts index 89228a0..36c3a9a 100644 --- a/src/modules/app.module.ts +++ b/packages/api/src/modules/app.module.ts @@ -1,45 +1,31 @@ +import { MikroOrmModule } from "@mikro-orm/nestjs"; import { Module } from "@nestjs/common"; import { PassportModule } from "@nestjs/passport"; -import { RenderModule } from "nest-next"; -import next from "next"; -import { IS_DEV } from "../constants"; -import { JWTStrategy } from "../strategies/jwt.strategy"; -import { PasswordStrategy } from "../strategies/password.strategy"; +import { ScheduleModule } from "@nestjs/schedule"; import { AppController } from "./app.controller"; import { AuthModule } from "./auth/auth.module"; -import { DeletionModule } from "./deletion/deletion.module"; import { FileModule } from "./file/file.module"; import { HostsModule } from "./hosts/hosts.module"; import { InviteModule } from "./invite/invite.module"; -import { LinkModule } from "./link/link.module"; -import { UploadModule } from "./upload/upload.module"; import { StorageModule } from "./storage/storage.module"; import { ThumbnailModule } from "./thumbnail/thumbnail.module"; import { UserModule } from "./user/user.module"; -import { ScheduleModule } from "@nestjs/schedule"; +import MikroOrmOptions from "../mikro-orm.config"; @Module({ controllers: [AppController], providers: [], imports: [ PassportModule, - JWTStrategy, StorageModule, HostsModule, - PasswordStrategy, - DeletionModule, AuthModule, FileModule, ThumbnailModule, InviteModule, - LinkModule, - UploadModule, UserModule, + MikroOrmModule.forRoot(MikroOrmOptions), ScheduleModule.forRoot(), - RenderModule.forRootAsync(next({ dev: IS_DEV }), { - passthrough404: true, - viewsDir: null, - }), ], }) export class AppModule {} diff --git a/src/modules/auth/auth.controller.ts b/packages/api/src/modules/auth/auth.controller.ts similarity index 88% rename from src/modules/auth/auth.controller.ts rename to packages/api/src/modules/auth/auth.controller.ts index 298d200..9a5be0f 100644 --- a/src/modules/auth/auth.controller.ts +++ b/packages/api/src/modules/auth/auth.controller.ts @@ -1,10 +1,10 @@ import { Controller, Post, Req, Res, UseGuards } from "@nestjs/common"; import { FastifyReply, FastifyRequest } from "fastify"; import { config } from "../../config"; -import { PasswordAuthGuard } from "../../guards/password.guard"; -import { JWTPayloadUser } from "../../strategies/jwt.strategy"; +import { JWTPayloadUser } from "./strategies/jwt.strategy"; import { AuthService, TokenType } from "./auth.service"; import ms from "ms"; +import { PasswordAuthGuard } from "./guards/password.guard"; @Controller() export class AuthController { @@ -18,7 +18,7 @@ export class AuthController { constructor(private authService: AuthService) {} - @Post("api/auth/login") + @Post("auth/login") @UseGuards(PasswordAuthGuard) async login(@Req() request: FastifyRequest, @Res() reply: FastifyReply) { const payload: JWTPayloadUser = { name: request.user.username, id: request.user.id, secret: request.user.secret }; @@ -32,7 +32,7 @@ export class AuthController { .send({ ok: true }); } - @Post("api/auth/logout") + @Post("auth/logout") async logout(@Res() reply: FastifyReply) { return reply .setCookie("token", "", { diff --git a/src/modules/auth/auth.decorators.ts b/packages/api/src/modules/auth/auth.decorators.ts similarity index 78% rename from src/modules/auth/auth.decorators.ts rename to packages/api/src/modules/auth/auth.decorators.ts index 791f627..6565a5b 100644 --- a/src/modules/auth/auth.decorators.ts +++ b/packages/api/src/modules/auth/auth.decorators.ts @@ -1,8 +1,8 @@ import { applyDecorators, createParamDecorator, ExecutionContext, SetMetadata, UseGuards } from "@nestjs/common"; import { FastifyRequest } from "fastify"; -import { Permission } from "../../constants"; -import { JWTAuthGuard } from "../../guards/jwt.guard"; -import { PermissionGuard } from "../../guards/permission.guard"; +import { Permission } from "@micro/common"; +import { JWTAuthGuard } from "./guards/jwt.guard"; +import { PermissionGuard } from "./guards/permission.guard"; export const RequirePermissions = (...permissions: Permission[]) => { let aggregate = 0; diff --git a/src/modules/auth/auth.module.ts b/packages/api/src/modules/auth/auth.module.ts similarity index 55% rename from src/modules/auth/auth.module.ts rename to packages/api/src/modules/auth/auth.module.ts index 8f88f78..ea6e1d8 100644 --- a/src/modules/auth/auth.module.ts +++ b/packages/api/src/modules/auth/auth.module.ts @@ -1,14 +1,19 @@ +import { MikroOrmModule } from "@mikro-orm/nestjs"; import { Module } from "@nestjs/common"; import { JwtModule } from "@nestjs/jwt"; import { config } from "../../config"; import { AuthController } from "./auth.controller"; import { AuthService } from "./auth.service"; +import { JWTStrategy } from "./strategies/jwt.strategy"; +import { PasswordStrategy } from "./strategies/password.strategy"; +import { User } from "../user/user.entity"; @Module({ controllers: [AuthController], - providers: [AuthService], + providers: [AuthService, PasswordStrategy, JWTStrategy], exports: [AuthService], imports: [ + MikroOrmModule.forFeature([User]), JwtModule.register({ secret: config.secret, }), diff --git a/src/modules/auth/auth.service.ts b/packages/api/src/modules/auth/auth.service.ts similarity index 100% rename from src/modules/auth/auth.service.ts rename to packages/api/src/modules/auth/auth.service.ts diff --git a/src/guards/jwt.guard.ts b/packages/api/src/modules/auth/guards/jwt.guard.ts similarity index 100% rename from src/guards/jwt.guard.ts rename to packages/api/src/modules/auth/guards/jwt.guard.ts diff --git a/src/guards/password.guard.ts b/packages/api/src/modules/auth/guards/password.guard.ts similarity index 100% rename from src/guards/password.guard.ts rename to packages/api/src/modules/auth/guards/password.guard.ts diff --git a/src/guards/permission.guard.ts b/packages/api/src/modules/auth/guards/permission.guard.ts similarity index 90% rename from src/guards/permission.guard.ts rename to packages/api/src/modules/auth/guards/permission.guard.ts index 8f36cc3..45d0365 100644 --- a/src/guards/permission.guard.ts +++ b/packages/api/src/modules/auth/guards/permission.guard.ts @@ -1,8 +1,8 @@ import { CanActivate, ExecutionContext, Injectable } from "@nestjs/common"; import { Reflector } from "@nestjs/core"; import { FastifyRequest } from "fastify"; -import { Permission } from "../constants"; -import { UserService } from "../modules/user/user.service"; +import { Permission } from "@micro/common"; +import { UserService } from "../../user/user.service"; @Injectable() export class PermissionGuard implements CanActivate { diff --git a/src/strategies/jwt.strategy.ts b/packages/api/src/modules/auth/strategies/jwt.strategy.ts similarity index 74% rename from src/strategies/jwt.strategy.ts rename to packages/api/src/modules/auth/strategies/jwt.strategy.ts index ab74126..f2dfd61 100644 --- a/src/strategies/jwt.strategy.ts +++ b/packages/api/src/modules/auth/strategies/jwt.strategy.ts @@ -1,11 +1,13 @@ /* eslint-disable @typescript-eslint/no-unnecessary-condition */ +import { EntityRepository } from "@mikro-orm/core"; +import { InjectRepository } from "@mikro-orm/nestjs"; import { ForbiddenException, Injectable } from "@nestjs/common"; import { PassportStrategy } from "@nestjs/passport"; import { FastifyRequest } from "fastify"; import { Strategy } from "passport-jwt"; -import { config } from "../config"; -import { TokenType } from "../modules/auth/auth.service"; -import { prisma } from "../prisma"; +import { config } from "../../../config"; +import { User } from "../../user/user.entity"; +import { TokenType } from "../auth.service"; export interface JWTPayloadUser { id: string; @@ -15,7 +17,7 @@ export interface JWTPayloadUser { @Injectable() export class JWTStrategy extends PassportStrategy(Strategy) { - constructor() { + constructor(@InjectRepository(User) private userRepo: EntityRepository) { super({ audience: TokenType.USER, ignoreExpiration: false, @@ -30,7 +32,7 @@ export class JWTStrategy extends PassportStrategy(Strategy) { // but they're convenient so why not keep them, in the future this requirement // might be removed. if (!payload.secret) throw new ForbiddenException("Outdated JWT - refresh your sesion."); - const user = await prisma.user.findFirst({ where: { secret: payload.secret } }); + const user = await this.userRepo.findOne({ secret: payload.secret }); if (!user) throw new ForbiddenException("Invalid token secret."); return user; } diff --git a/src/strategies/password.strategy.ts b/packages/api/src/modules/auth/strategies/password.strategy.ts similarity index 67% rename from src/strategies/password.strategy.ts rename to packages/api/src/modules/auth/strategies/password.strategy.ts index 1142cfe..e076eba 100644 --- a/src/strategies/password.strategy.ts +++ b/packages/api/src/modules/auth/strategies/password.strategy.ts @@ -1,16 +1,22 @@ +import { EntityRepository } from "@mikro-orm/core"; +import { InjectRepository } from "@mikro-orm/nestjs"; import { Injectable, UnauthorizedException } from "@nestjs/common"; import { PassportStrategy } from "@nestjs/passport"; import bcrypt from "bcrypt"; -import { Strategy } from "passport-local"; import { FastifyRequest } from "fastify"; -import { prisma } from "../prisma"; +import { Strategy } from "passport-local"; +import { User } from "../../user/user.entity"; @Injectable() export class PasswordStrategy extends PassportStrategy(Strategy) { + constructor(@InjectRepository(User) private userRepo: EntityRepository) { + super(); + } + async validate(username: string, password: string): Promise { const lowerUsername = username.toLowerCase(); - const user = await prisma.user.findFirst({ - where: { username: lowerUsername }, + const user = await this.userRepo.findOne({ + username: lowerUsername, }); if (!user) throw new UnauthorizedException(); diff --git a/types/fastify/index.d.ts b/packages/api/src/modules/fastify.d.ts similarity index 55% rename from types/fastify/index.d.ts rename to packages/api/src/modules/fastify.d.ts index b7f39c4..48eeb5c 100644 --- a/types/fastify/index.d.ts +++ b/packages/api/src/modules/fastify.d.ts @@ -1,5 +1,5 @@ -import { User } from "@prisma/client"; -import { MicroHost } from "../../src/classes/MicroHost"; +import { MicroHost } from "../classes/MicroHost"; +import { User } from "./user/user.entity"; import "fastify"; declare module "fastify" { diff --git a/src/modules/file/file.controller.ts b/packages/api/src/modules/file/file.controller.ts similarity index 52% rename from src/modules/file/file.controller.ts rename to packages/api/src/modules/file/file.controller.ts index 4e339ee..67c5be2 100644 --- a/src/modules/file/file.controller.ts +++ b/packages/api/src/modules/file/file.controller.ts @@ -13,73 +13,64 @@ import { Res, UseGuards, } from "@nestjs/common"; -import { FastifyRequest } from "fastify"; +import { classToPlain } from "class-transformer"; +import { FastifyReply, FastifyRequest } from "fastify"; import { MultipartFile } from "fastify-multipart"; +import mime from "mime-types"; import { config } from "../../config"; -import { JWTAuthGuard } from "../../guards/jwt.guard"; import { isImageScraper } from "../../helpers/is-image-scraper.helper"; -import { RenderableReply } from "../../types"; import { UserId } from "../auth/auth.decorators"; -import { ContentType, DeletionService } from "../deletion/deletion.service"; +import { JWTAuthGuard } from "../auth/guards/jwt.guard"; import { HostsService } from "../hosts/hosts.service"; import { UserService } from "../user/user.service"; import { FileService } from "./file.service"; @Controller() export class FileController { - constructor( - private fileService: FileService, - private deletionService: DeletionService, - private userService: UserService, - private hostsService: HostsService - ) {} + constructor(private fileService: FileService, private userService: UserService, private hostsService: HostsService) {} - @Get(["file/:key", "f/:key"]) - async getFilePage(@Res() reply: RenderableReply, @Req() request: FastifyRequest, @Param("key") key: string) { + @Get("file/:key") + async getFile(@Res() reply: FastifyReply, @Param("key") key: string, @Request() request: FastifyRequest) { const clean = this.fileService.cleanFileKey(key); - const file = await this.getFile(clean.id, request); + const file = await this.fileService.getFile(clean.id, request.host); + if (!file) throw new NotFoundException("File not found."); if (!this.hostsService.checkHostCanSendFile(file, request.host)) { - throw new NotFoundException("Your file is in another castle."); + throw new ForbiddenException("That file is not available on this host."); + } + + if (clean.ext) { + const mimeType = mime.lookup(clean.ext); + if (!mimeType) throw new BadRequestException("Unknown file extension."); + if (file.type !== mimeType) { + throw new BadRequestException("File extension does not match file type."); + } } const scraper = isImageScraper(request.headers["user-agent"]); - const directOverride = scraper && (!scraper.types || scraper.types.includes(file.type)); - if (clean.ext || directOverride) { + const isDirect = (scraper && (!scraper.types || scraper.types.includes(file.type))) || !!clean.ext; + if (isDirect) { return this.fileService.sendFile(clean.id, request, reply); } - return reply.render("file/[fileId]", { - fileId: clean.id, - file: JSON.stringify(file), - }); + return reply.send(classToPlain(file)); } - @Get("api/file/:id") - async getFile(@Param("id") id: string, @Request() request: FastifyRequest) { - return this.fileService.getFile(id, request.host); - } - - @Delete("api/file/:id") + @Delete("file/:id") @UseGuards(JWTAuthGuard) async deleteFile(@Param("id") id: string, @UserId() userId: string) { await this.fileService.deleteFile(id, userId); return { deleted: true }; } - @Post("api/file") + @Post("file") @UseGuards(JWTAuthGuard) async createFile(@UserId() userId: string, @Req() request: FastifyRequest, @Headers("x-micro-host") hosts = config.rootHost.url) { const user = await this.userService.getUser(userId); if (!user) throw new ForbiddenException("Unknown user."); - // todo: invalid type or maybe not because im a dumbass and forgot to leave a comment. - // also an issue in upload.controller.ts, see there for more info with this same issue. const upload = (await request.file()) as MultipartFile | undefined; if (!upload) throw new BadRequestException("Missing upload."); const host = await this.hostsService.resolveHost(hosts, user.tags, true); const file = await this.fileService.createFile(upload, request, user, host); - const deletionUrl = this.deletionService.createToken(ContentType.FILE, file.id); - return Object.assign(this.fileService.getFileUrls(file), { - delete: deletionUrl, - }); + return file; } } diff --git a/packages/api/src/modules/file/file.entity.ts b/packages/api/src/modules/file/file.entity.ts new file mode 100644 index 0000000..b606946 --- /dev/null +++ b/packages/api/src/modules/file/file.entity.ts @@ -0,0 +1,70 @@ +import { EMBEDDABLE_IMAGE_TYPES } from "@micro/common"; +import { Entity, ManyToOne, OneToOne, PrimaryKey, Property } from "@mikro-orm/core"; +import { Expose } from "class-transformer"; +import mimeType from "mime-types"; +import { generateDeleteKey } from "../../helpers/generate-delete-key.helper"; +import { TimestampType } from "../../timestamp.type"; +import { Thumbnail } from "../thumbnail/thumbnail.entity"; +import { User } from "../user/user.entity"; + +@Entity({ tableName: "files" }) +export class File { + @PrimaryKey() + id!: string; + + @Property() + type!: string; + + @Property() + size!: number; + + @Property() + hash!: string; + + @Property({ nullable: true }) + host?: string; + + @Property({ type: String, lazy: true }) + deleteKey = generateDeleteKey(); + + @Property({ nullable: true }) + name?: string; + + @OneToOne({ entity: () => Thumbnail, inversedBy: "file", nullable: true, orphanRemoval: true }) + thumbnail?: Thumbnail; + + @ManyToOne(() => User) + owner!: User; + + @Property({ type: TimestampType }) + createdAt = new Date(); + + @Property({ persist: false }) + @Expose() + get displayName() { + const extension = mimeType.extension(this.type); + return this.name ? this.name : extension ? `${this.id}.${extension}` : this.id; + } + + @Property({ persist: false }) + @Expose() + get urls() { + const extension = mimeType.extension(this.type); + const supportsThumbnail = EMBEDDABLE_IMAGE_TYPES.includes(this.type); + const viewUrl = `/f/${this.id}`; + const directUrl = `/f/${this.id}.${extension}`; + const metadataUrl = `/api/file/${this.id}`; + const thumbnailUrl = supportsThumbnail ? `/t/${this.id}` : null; + // todo: this.deleteKey is lazy which means the only time it should be present + // is when the file is created or its explicitly asked for. that said, we should + // still make sure we aren't leaking delete keys by accident. + const deleteUrl = this.deleteKey ? `/f/${this.id}/delete?key=${this.deleteKey}` : null; + return { + view: viewUrl, + direct: directUrl, + metadata: metadataUrl, + thumbnail: thumbnailUrl, + delete: deleteUrl, + }; + } +} diff --git a/src/modules/file/file.module.ts b/packages/api/src/modules/file/file.module.ts similarity index 63% rename from src/modules/file/file.module.ts rename to packages/api/src/modules/file/file.module.ts index efc7eb6..3b64bd8 100644 --- a/src/modules/file/file.module.ts +++ b/packages/api/src/modules/file/file.module.ts @@ -1,13 +1,14 @@ -import { forwardRef, Module } from "@nestjs/common"; -import { DeletionModule } from "../deletion/deletion.module"; +import { MikroOrmModule } from "@mikro-orm/nestjs"; +import { Module } from "@nestjs/common"; import { HostsModule } from "../hosts/hosts.module"; import { StorageModule } from "../storage/storage.module"; import { UserModule } from "../user/user.module"; import { FileController } from "./file.controller"; +import { File } from "./file.entity"; import { FileService } from "./file.service"; @Module({ - imports: [forwardRef(() => DeletionModule), StorageModule, HostsModule, UserModule], + imports: [StorageModule, HostsModule, UserModule, MikroOrmModule.forFeature([File])], controllers: [FileController], providers: [FileService], exports: [FileService], diff --git a/src/modules/file/file.service.ts b/packages/api/src/modules/file/file.service.ts similarity index 65% rename from src/modules/file/file.service.ts rename to packages/api/src/modules/file/file.service.ts index ab1e852..a4941ab 100644 --- a/src/modules/file/file.service.ts +++ b/packages/api/src/modules/file/file.service.ts @@ -1,3 +1,5 @@ +import { EntityRepository } from "@mikro-orm/core"; +import { InjectRepository } from "@mikro-orm/nestjs"; import { BadRequestException, Injectable, @@ -8,28 +10,29 @@ import { UnauthorizedException, } from "@nestjs/common"; import { Cron, CronExpression } from "@nestjs/schedule"; -import { File } from "@prisma/client"; import contentRange from "content-range"; import { FastifyReply, FastifyRequest } from "fastify"; import { Multipart } from "fastify-multipart"; import { DateTime } from "luxon"; -import mimeType from "mime-types"; import { PassThrough } from "stream"; import xbytes from "xbytes"; import { MicroHost } from "../../classes/MicroHost"; import { config } from "../../config"; -import { EMBEDDABLE_IMAGE_TYPES } from "../../constants"; import { contentIdLength, generateContentId } from "../../helpers/generate-content-id.helper"; import { getStreamType } from "../../helpers/get-stream-type.helper"; -import { prisma } from "../../prisma"; import { HostsService } from "../hosts/hosts.service"; import { StorageService } from "../storage/storage.service"; +import { File } from "./file.entity"; @Injectable() export class FileService implements OnApplicationBootstrap { private static readonly FILE_KEY_REGEX = new RegExp(`^(?.{${contentIdLength}})(?\\.[A-z0-9]{2,})?$`); private readonly logger = new Logger(FileService.name); - constructor(private storageService: StorageService, private hostsService: HostsService) {} + constructor( + @InjectRepository(File) private fileRepo: EntityRepository, + private storageService: StorageService, + private hostsService: HostsService + ) {} cleanFileKey(key: string): { id: string; ext?: string } { const groups = FileService.FILE_KEY_REGEX.exec(key)?.groups; @@ -38,35 +41,30 @@ export class FileService implements OnApplicationBootstrap { } async getFile(id: string, host: MicroHost) { - const file = await prisma.file.findFirst({ where: { id } }); - if (!file) throw new NotFoundException("Unknown file."); + const file = await this.fileRepo.findOne(id); + if (!file) throw new NotFoundException(`Unknown file "${id}"`); if (!this.hostsService.checkHostCanSendFile(file, host)) { throw new NotFoundException("Your file is in another castle."); } - return Object.assign(file, { - displayName: this.getFileDisplayName(file), - urls: this.getFileUrls(file), - }); + return file; } async deleteFile(id: string, ownerId: string | null) { - const file = await prisma.file.findFirst({ where: { id } }); + const file = await this.fileRepo.findOne(id); if (!file) throw new NotFoundException(); - if (ownerId && file.ownerId !== ownerId) { + if (ownerId && file.owner.id !== ownerId) { throw new UnauthorizedException("You cannot delete other users files."); } - const filesWithHash = await prisma.file.count({ where: { hash: file.hash } }); + // todo: this should use a subscriber for file delete events, should also do + // the same for thumbnails or something ig + const filesWithHash = await this.fileRepo.count({ hash: file.hash }); if (filesWithHash === 1) { await this.storageService.delete(file.hash); } - // await prisma.file.delete({ where: { id: file.id } }); - // todo: https://github.com/prisma/prisma/issues/2057 - // prisma doesnt support cascade deletes, so we have to have our own migration - // that adds them then call this directly so prisma doesnt think it will fail - await prisma.$executeRaw`DELETE FROM files WHERE id = ${file.id}`; + await this.fileRepo.removeAndFlush(file); } async createFile( @@ -92,63 +90,47 @@ export class FileService implements OnApplicationBootstrap { const fileId = generateContentId(); const { hash, size } = await this.storageService.create(uploadStream); - const file = await prisma.file.create({ - data: { - id: fileId, - type: type, - name: multipart.filename, - ownerId: owner.id, - host: host?.key, - hash: hash, - size: size, - }, + const file = this.fileRepo.create({ + id: fileId, + type: type, + name: multipart.filename, + owner: owner.id, + host: host?.key, + hash: hash, + size: size, }); + await this.fileRepo.persistAndFlush(file); return file; } async sendFile(fileId: string, request: FastifyRequest, reply: FastifyReply) { const file = await this.getFile(fileId, request.host); const range = request.headers["content-range"] ? contentRange.parse(request.headers["content-range"]) : null; - const displayName = this.getFileDisplayName(file); const stream = this.storageService.createReadStream(file.hash, range); if (range) reply.header("Content-Range", contentRange.format(range)); + const type = file.type.startsWith("text") ? `${file.type}; charset=UTF-8` : file.type; return reply .header("ETag", `"${file.hash}"`) .header("Accept-Ranges", "bytes") - .header("Content-Type", file.type) + .header("Content-Type", type) .header("Content-Length", file.size) .header("Last-Modified", file.createdAt) - .header("Content-Disposition", `inline; filename="${displayName}"`) + .header("Content-Disposition", `inline; filename="${file.displayName}"`) .send(stream); } - getFileDisplayName(file: Pick) { - if (!file.id) throw new Error("Missing file ID"); - const extension = mimeType.extension(file.type); - return file.name ? file.name : extension ? `${file.id}.${extension}` : file.id; - } - - getFileUrls(file: Pick) { - const extension = mimeType.extension(file.type); - const supportsThumbnail = EMBEDDABLE_IMAGE_TYPES.includes(file.type); - const view = `/f/${file.id}`; - const direct = `/f/${file.id}.${extension}`; - const metadata = `/api/file/${file.id}`; - const thumbnail = supportsThumbnail ? `/t/${file.id}` : null; - return { view, direct, metadata, thumbnail }; - } - @Cron(CronExpression.EVERY_HOUR) async purgeFiles() { if (!config.purge) return; const createdBefore = new Date(Date.now() - config.purge.afterTime); - const files = await prisma.file.findMany({ - where: { - size: { gte: config.purge.overLimit }, - createdAt: { - lte: createdBefore, - }, + + const files = await this.fileRepo.find({ + size: { + $gte: config.purge.overLimit, + }, + createdAt: { + $lte: createdBefore, }, }); @@ -167,6 +149,7 @@ export class FileService implements OnApplicationBootstrap { onApplicationBootstrap() { if (config.purge) { const size = xbytes(config.purge.overLimit, { space: false }); + // todo: swap out luxon for dayjs const age = DateTime.local().minus(config.purge.afterTime).toRelative(); this.logger.warn(`Purging files is enabled for files over ${size} uploaded more than ${age}.`); } diff --git a/src/modules/hosts/hosts.controller.ts b/packages/api/src/modules/hosts/hosts.controller.ts similarity index 89% rename from src/modules/hosts/hosts.controller.ts rename to packages/api/src/modules/hosts/hosts.controller.ts index 75ca6e1..00d338a 100644 --- a/src/modules/hosts/hosts.controller.ts +++ b/packages/api/src/modules/hosts/hosts.controller.ts @@ -1,11 +1,11 @@ import { Controller, ForbiddenException, Get, UseGuards } from "@nestjs/common"; import { classToPlain } from "class-transformer"; -import { JWTAuthGuard } from "../../guards/jwt.guard"; import { UserId } from "../auth/auth.decorators"; +import { JWTAuthGuard } from "../auth/guards/jwt.guard"; import { UserService } from "../user/user.service"; import { HostsService } from "./hosts.service"; -@Controller("api/hosts") +@Controller("hosts") export class HostsController { constructor(private userService: UserService, private hostsService: HostsService) {} diff --git a/packages/api/src/modules/hosts/hosts.guard.ts b/packages/api/src/modules/hosts/hosts.guard.ts new file mode 100644 index 0000000..45710db --- /dev/null +++ b/packages/api/src/modules/hosts/hosts.guard.ts @@ -0,0 +1,20 @@ +import { BadRequestException, CallHandler, CanActivate, ExecutionContext, Injectable } from "@nestjs/common"; +import { FastifyRequest } from "fastify"; +import { config } from "../../config"; + +@Injectable() +export class HostsGuard implements CanActivate { + canActivate(context: ExecutionContext) { + const request = context.switchToHttp().getRequest(); + const referer = request.headers["referer"]; + if (!referer) { + request.host = config.hosts[0]; + return true; + } + + const host = config.hosts.find((host) => host.pattern.test(referer)); + if (!host) throw new BadRequestException('Invalid "referer" header.'); + request.host = host; + return true; + } +} diff --git a/src/modules/hosts/hosts.module.ts b/packages/api/src/modules/hosts/hosts.module.ts similarity index 100% rename from src/modules/hosts/hosts.module.ts rename to packages/api/src/modules/hosts/hosts.module.ts diff --git a/src/modules/hosts/hosts.service.ts b/packages/api/src/modules/hosts/hosts.service.ts similarity index 96% rename from src/modules/hosts/hosts.service.ts rename to packages/api/src/modules/hosts/hosts.service.ts index f99ac88..9b401b8 100644 --- a/src/modules/hosts/hosts.service.ts +++ b/packages/api/src/modules/hosts/hosts.service.ts @@ -40,7 +40,7 @@ export class HostsService { return parsed; } - checkHostCanSendFile(file: { host: string | null }, host: MicroHost) { + checkHostCanSendFile(file: { host?: string }, host: MicroHost) { // todo: if host.wildcard, we should check to make sure the file owner // matches the given username in the request url. so uploads to // sylver.is-fucking.gay can't be accessed on cyk.is-fucking.gay and vice versa diff --git a/packages/api/src/modules/invite/invite.controller.ts b/packages/api/src/modules/invite/invite.controller.ts new file mode 100644 index 0000000..3e4efa9 --- /dev/null +++ b/packages/api/src/modules/invite/invite.controller.ts @@ -0,0 +1,25 @@ +import { Controller, Get, NotFoundException, Param, Post, UseGuards } from "@nestjs/common"; +import { Permission } from "@micro/common"; +import { RequirePermissions, UserId } from "../auth/auth.decorators"; +import { InviteService } from "./invite.service"; +import { JWTAuthGuard } from "../auth/guards/jwt.guard"; + +@Controller() +export class InviteController { + constructor(private inviteService: InviteService) {} + + @Get("invite/:id") + async getInvite(@Param("id") inviteId: string) { + const invite = await this.inviteService.get(inviteId); + if (!invite) throw new NotFoundException(); + return invite; + } + + @Get("invite") + @Post("invite") + @RequirePermissions(Permission.CREATE_INVITE) + @UseGuards(JWTAuthGuard) + async createInvite(@UserId() userId: string) { + return this.inviteService.create(userId, null); + } +} diff --git a/packages/api/src/modules/invite/invite.entity.ts b/packages/api/src/modules/invite/invite.entity.ts new file mode 100644 index 0000000..897ecaf --- /dev/null +++ b/packages/api/src/modules/invite/invite.entity.ts @@ -0,0 +1,38 @@ +import { Entity, ManyToOne, OneToOne, PrimaryKey, Property } from "@mikro-orm/core"; +import { Expose } from "class-transformer"; +import { generateDeleteKey } from "../../helpers/generate-delete-key.helper"; +import { TimestampType } from "../../timestamp.type"; +import { User } from "../user/user.entity"; + +@Entity() +export class Invite { + @PrimaryKey({ type: String }) + id = generateDeleteKey(); + + @Property({ nullable: true }) + permissions?: number; + + @ManyToOne({ entity: () => User, nullable: true }) + inviter?: User; + + @OneToOne({ entity: () => User, nullable: true }) + invited?: User; + + @Property({ type: TimestampType }) + createdAt = new Date(); + + @Property({ type: TimestampType, nullable: true }) + expiresAt?: Date; + + @Property({ persist: false }) + @Expose() + get expired() { + return this.expiresAt && this.expiresAt.getTime() < Date.now(); + } + + @Property({ persist: false }) + @Expose() + get url() { + return `/invite/${this.id}`; + } +} diff --git a/src/modules/invite/invite.module.ts b/packages/api/src/modules/invite/invite.module.ts similarity index 62% rename from src/modules/invite/invite.module.ts rename to packages/api/src/modules/invite/invite.module.ts index 923ffa3..dfca1d5 100644 --- a/src/modules/invite/invite.module.ts +++ b/packages/api/src/modules/invite/invite.module.ts @@ -1,11 +1,14 @@ +import { MikroOrmModule } from "@mikro-orm/nestjs"; import { forwardRef, Module } from "@nestjs/common"; +import { User } from "../user/user.entity"; import { AuthModule } from "../auth/auth.module"; import { UserModule } from "../user/user.module"; import { InviteController } from "./invite.controller"; import { InviteService } from "./invite.service"; +import { Invite } from "./invite.entity"; @Module({ - imports: [forwardRef(() => UserModule), AuthModule], + imports: [forwardRef(() => UserModule), AuthModule, MikroOrmModule.forFeature([User, Invite])], controllers: [InviteController], providers: [InviteService], exports: [InviteService], diff --git a/packages/api/src/modules/invite/invite.service.ts b/packages/api/src/modules/invite/invite.service.ts new file mode 100644 index 0000000..e0cc630 --- /dev/null +++ b/packages/api/src/modules/invite/invite.service.ts @@ -0,0 +1,54 @@ +import { Permission } from "@micro/common"; +import { EntityRepository } from "@mikro-orm/core"; +import { InjectRepository } from "@mikro-orm/nestjs"; +import { Injectable, Logger, OnApplicationBootstrap } from "@nestjs/common"; +import { config } from "../../config"; +import { User } from "../user/user.entity"; +import { Invite } from "./invite.entity"; + +export interface JWTPayloadInvite { + id: string; + inviter?: string; + permissions?: number; +} + +@Injectable() +export class InviteService implements OnApplicationBootstrap { + private readonly logger = new Logger(InviteService.name); + constructor( + @InjectRepository(User) private userRepo: EntityRepository, + @InjectRepository(Invite) private inviteRepo: EntityRepository + ) {} + + async create(inviterId: string | null, permissions: Permission | null) { + const invite = this.inviteRepo.create({ + inviter: inviterId, + permissions: permissions, + }); + + await this.inviteRepo.persistAndFlush(invite); + return invite; + } + + async get(inviteId: string) { + return this.inviteRepo.findOne(inviteId); + } + + async consume(invite: Invite) { + this.inviteRepo.remove(invite); + await this.inviteRepo.flush(); + } + + async onApplicationBootstrap() { + const users = await this.userRepo.count(); + if (users >= 1) return; + const existing = await this.inviteRepo.findOne({ inviter: null, permissions: Permission.ADMINISTRATOR }); + if (existing) { + this.logger.log(`Go to ${config.rootHost.url}${existing.url} to create the first account.`); + return; + } + + const invite = await this.create(null, Permission.ADMINISTRATOR); + this.logger.log(`Go to ${config.rootHost.url}${invite.url} to create the first account.`); + } +} diff --git a/src/modules/storage/storage.module.ts b/packages/api/src/modules/storage/storage.module.ts similarity index 100% rename from src/modules/storage/storage.module.ts rename to packages/api/src/modules/storage/storage.module.ts diff --git a/src/modules/storage/storage.service.ts b/packages/api/src/modules/storage/storage.service.ts similarity index 97% rename from src/modules/storage/storage.service.ts rename to packages/api/src/modules/storage/storage.service.ts index 2a62e01..9e190d3 100644 --- a/src/modules/storage/storage.service.ts +++ b/packages/api/src/modules/storage/storage.service.ts @@ -8,7 +8,7 @@ import getSizeTransform from "stream-size"; import { promisify } from "util"; import { ExifTransformer } from "../../classes/ExifTransformer"; import { config } from "../../config"; -import { isObject } from "../../helpers/is-object.helper"; +import { isObject } from "../../../../common/src/helpers/is-object.helper"; const pipeline = promisify(stream.pipeline); diff --git a/src/modules/thumbnail/thumbnail.controller.ts b/packages/api/src/modules/thumbnail/thumbnail.controller.ts similarity index 62% rename from src/modules/thumbnail/thumbnail.controller.ts rename to packages/api/src/modules/thumbnail/thumbnail.controller.ts index d94fe5a..6abaf4e 100644 --- a/src/modules/thumbnail/thumbnail.controller.ts +++ b/packages/api/src/modules/thumbnail/thumbnail.controller.ts @@ -7,13 +7,7 @@ import { ThumbnailService } from "./thumbnail.service"; export class ThumbnailController { constructor(private fileService: FileService, private thumbnailService: ThumbnailService) {} - @Get("t/:key") - async getThumbnailPage(@Param("key") key: string, @Req() request: FastifyRequest, @Res() reply: FastifyReply) { - const clean = this.fileService.cleanFileKey(key); - return this.thumbnailService.sendThumbnail(clean.id, request, reply); - } - - @Get("api/thumbnail/:id") + @Get("thumbnail/:id") async getThumbnail(@Param("id") id: string) { return this.thumbnailService.getThumbnail(id); } diff --git a/packages/api/src/modules/thumbnail/thumbnail.entity.ts b/packages/api/src/modules/thumbnail/thumbnail.entity.ts new file mode 100644 index 0000000..974a8ca --- /dev/null +++ b/packages/api/src/modules/thumbnail/thumbnail.entity.ts @@ -0,0 +1,24 @@ +import { BlobType, Entity, OneToOne, PrimaryKey, Property } from "@mikro-orm/core"; +import { TimestampType } from "../../timestamp.type"; +import { File } from "../file/file.entity"; + +@Entity({ tableName: "thumbnails" }) +export class Thumbnail { + @PrimaryKey() + id!: string; + + @Property() + size!: number; + + @Property() + duration!: number; + + @Property({ type: BlobType, lazy: true }) + data!: Buffer; + + @OneToOne({ entity: () => File, mappedBy: "thumbnail" }) + file!: File; + + @Property({ type: TimestampType }) + createdAt = new Date(); +} diff --git a/src/modules/thumbnail/thumbnail.module.ts b/packages/api/src/modules/thumbnail/thumbnail.module.ts similarity index 69% rename from src/modules/thumbnail/thumbnail.module.ts rename to packages/api/src/modules/thumbnail/thumbnail.module.ts index 15e1aeb..258fda1 100644 --- a/src/modules/thumbnail/thumbnail.module.ts +++ b/packages/api/src/modules/thumbnail/thumbnail.module.ts @@ -3,9 +3,11 @@ import { FileModule } from "../file/file.module"; import { StorageModule } from "../storage/storage.module"; import { ThumbnailController } from "./thumbnail.controller"; import { ThumbnailService } from "./thumbnail.service"; +import { Thumbnail } from "./thumbnail.entity"; +import { MikroOrmModule } from "@mikro-orm/nestjs"; @Module({ - imports: [StorageModule, FileModule], + imports: [StorageModule, FileModule, MikroOrmModule.forFeature([Thumbnail])], controllers: [ThumbnailController], providers: [ThumbnailService], exports: [ThumbnailService], diff --git a/src/modules/thumbnail/thumbnail.service.ts b/packages/api/src/modules/thumbnail/thumbnail.service.ts similarity index 68% rename from src/modules/thumbnail/thumbnail.service.ts rename to packages/api/src/modules/thumbnail/thumbnail.service.ts index d42f1b9..67c9b5c 100644 --- a/src/modules/thumbnail/thumbnail.service.ts +++ b/packages/api/src/modules/thumbnail/thumbnail.service.ts @@ -1,20 +1,26 @@ -import { Injectable, NotFoundException, BadRequestException } from "@nestjs/common"; +import { EntityRepository } from "@mikro-orm/core"; +import { InjectRepository } from "@mikro-orm/nestjs"; +import { BadRequestException, Injectable, NotFoundException } from "@nestjs/common"; import { FastifyReply, FastifyRequest } from "fastify"; import sharp from "sharp"; -import { EMBEDDABLE_IMAGE_TYPES } from "../../constants"; -import { prisma } from "../../prisma"; +import { EMBEDDABLE_IMAGE_TYPES } from "@micro/common"; +import { File } from "../file/file.entity"; +import { Thumbnail } from "./thumbnail.entity"; import { FileService } from "../file/file.service"; -import { File } from "@prisma/client"; import { StorageService } from "../storage/storage.service"; @Injectable() export class ThumbnailService { private static readonly THUMBNAIL_SIZE = 200; private static readonly THUMBNAIL_TYPE = "image/webp"; - constructor(private storageService: StorageService, private fileService: FileService) {} + constructor( + @InjectRepository(Thumbnail) private thumbnailRepo: EntityRepository, + private storageService: StorageService, + private fileService: FileService + ) {} async getThumbnail(fileId: string) { - const thumbnail = await prisma.thumbnail.findFirst({ where: { id: fileId } }); + const thumbnail = await this.thumbnailRepo.findOne(fileId); if (!thumbnail) throw new NotFoundException(); return thumbnail; } @@ -30,25 +36,20 @@ export class ThumbnailService { const transformer = sharp().resize(ThumbnailService.THUMBNAIL_SIZE).webp({ quality: 40 }); const data = await stream.pipe(transformer).toBuffer(); const duration = Date.now() - start; - const thumbnail = prisma.thumbnail.create({ - data: { - id: file.id, - data: data, - duration: duration, - size: data.length, - file: { - connect: { - id: file.id, - }, - }, - }, + const thumbnail = this.thumbnailRepo.create({ + id: file.id, + data: data, + duration: duration, + size: data.length, + file: file, }); + await this.thumbnailRepo.persistAndFlush(thumbnail); return thumbnail; } async sendThumbnail(fileId: string, request: FastifyRequest, reply: FastifyReply) { - const existing = await prisma.thumbnail.findFirst({ where: { id: fileId } }); + const existing = await this.thumbnailRepo.findOne(fileId); if (existing) { return reply.header("X-Micro-Generated", "false").header("Content-Type", ThumbnailService.THUMBNAIL_TYPE).send(existing.data); } diff --git a/src/modules/user/dto/create-user.dto.ts b/packages/api/src/modules/user/dto/create-user.dto.ts similarity index 87% rename from src/modules/user/dto/create-user.dto.ts rename to packages/api/src/modules/user/dto/create-user.dto.ts index b6b0a56..fba5e44 100644 --- a/src/modules/user/dto/create-user.dto.ts +++ b/packages/api/src/modules/user/dto/create-user.dto.ts @@ -1,5 +1,5 @@ import { IsLowercase, IsNotIn, IsString, MaxLength, MinLength } from "class-validator"; -import blocklist from "../../../data/blocklist.json"; +import blocklist from "../../../blocklist.json"; export class CreateUserDto { @MaxLength(20) diff --git a/packages/api/src/modules/user/dto/pagination.dto.ts b/packages/api/src/modules/user/dto/pagination.dto.ts new file mode 100644 index 0000000..ce570bd --- /dev/null +++ b/packages/api/src/modules/user/dto/pagination.dto.ts @@ -0,0 +1,17 @@ +import { Type } from "class-transformer"; +import { IsNumber, IsOptional, Max, Min } from "class-validator"; + +export class Pagination { + @IsNumber() + @Min(0) + @IsOptional() + @Type(() => Number) + offset = 0; + + @IsNumber() + @Min(1) + @Max(100) + @IsOptional() + @Type(() => Number) + limit = 50; +} diff --git a/src/modules/user/user.controller.ts b/packages/api/src/modules/user/user.controller.ts similarity index 64% rename from src/modules/user/user.controller.ts rename to packages/api/src/modules/user/user.controller.ts index 3aba28e..2d01820 100644 --- a/src/modules/user/user.controller.ts +++ b/packages/api/src/modules/user/user.controller.ts @@ -1,27 +1,40 @@ -import { BadRequestException, Body, Controller, ForbiddenException, Get, Param, Post, Put, Query, UseGuards } from "@nestjs/common"; +import { EntityRepository } from "@mikro-orm/core"; +import { InjectRepository } from "@mikro-orm/nestjs"; +import { + BadRequestException, + Body, + Controller, + ForbiddenException, + Get, + Param, + Post, + Put, + Query, + UnauthorizedException, + UseGuards, +} from "@nestjs/common"; import { nanoid } from "nanoid"; -import { Permission } from "../../constants"; -import { JWTAuthGuard } from "../../guards/jwt.guard"; -import { prisma } from "../../prisma"; -import { JWTPayloadUser } from "../../strategies/jwt.strategy"; +import { Permission } from "@micro/common"; +import { User } from "./user.entity"; import { RequirePermissions, UserId } from "../auth/auth.decorators"; import { AuthService, TokenType } from "../auth/auth.service"; -import { FileService } from "../file/file.service"; +import { JWTPayloadUser } from "../auth/strategies/jwt.strategy"; import { InviteService } from "../invite/invite.service"; -import { CreateUserDto } from "./dto/create-user.dto"; -import { UserFilesQueryDto } from "./dto/user-files-query.dto"; import { UserService } from "./user.service"; +import { JWTAuthGuard } from "../auth/guards/jwt.guard"; +import { Pagination } from "./dto/pagination.dto"; +import { CreateUserDto } from "./dto/create-user.dto"; @Controller() export class UserController { constructor( + @InjectRepository(User) private userRepo: EntityRepository, private userService: UserService, private inviteService: InviteService, - private fileService: FileService, private authService: AuthService ) {} - @Get("api/user") + @Get("user") @UseGuards(JWTAuthGuard) async getUser(@UserId() userId: string) { const user = await this.userService.getUser(userId); @@ -29,28 +42,23 @@ export class UserController { return user; } - @Post("/api/user") + @Post("user") async createUser(@Body() data: CreateUserDto) { - const invite = await this.inviteService.verifyToken(data.invite); + const invite = await this.inviteService.get(data.invite); + if (!invite) throw new UnauthorizedException("Invalid invite."); return this.userService.createUser(data, invite); } - @Get("api/user/files") + @Get("user/files") @UseGuards(JWTAuthGuard) - async getUserFiles(@UserId() userId: string, @Query() dto?: UserFilesQueryDto) { - const files = await this.userService.getUserFiles(userId, dto); - return files.map((file) => - Object.assign(file, { - displayName: this.fileService.getFileDisplayName(file), - urls: this.fileService.getFileUrls(file), - }) - ); + async getUserFiles(@UserId() userId: string, @Query() pagination: Pagination) { + return this.userService.getUserFiles(userId, pagination); } - @Get("api/user/token") + @Get("user/token") @UseGuards(JWTAuthGuard) async getUserToken(@UserId() userId: string) { - const user = await this.userService.getUser(userId, true); + const user = await this.userService.getUser(userId); if (!user) throw new ForbiddenException("Unknown user."); const token = await this.authService.signToken(TokenType.USER, { name: user.username, @@ -61,16 +69,18 @@ export class UserController { return { token }; } - @Put("api/user/token") + @Put("user/token") @UseGuards(JWTAuthGuard) async resetUserToken(@UserId() userId: string) { const secret = nanoid(); - await prisma.user.update({ where: { id: userId }, data: { secret } }); + const reference = this.userRepo.getReference(userId); + reference.secret = secret; + await this.userRepo.persistAndFlush(reference); return this.getUserToken(userId); } // temporary until admin UI - @Get("api/user/:id/delete") + @Get("user/:id/delete") @RequirePermissions(Permission.DELETE_USERS) @UseGuards(JWTAuthGuard) async deleteUser(@Param("id") targetId: string) { @@ -85,7 +95,7 @@ export class UserController { } // temporary until admin UI - @Get("api/user/:id/tags/add/:tag") + @Get("user/:id/tags/add/:tag") @RequirePermissions(Permission.ADD_USER_TAGS) @UseGuards(JWTAuthGuard) async addTagToUser(@Param("id") targetId: string, @Param("tag") tag: string) { @@ -95,18 +105,12 @@ export class UserController { throw new BadRequestException("User already has that tag."); } - await prisma.user.update({ - where: { id: target.id }, - data: { - tags: [...target.tags, tag.toLowerCase()], - }, - }); - + target.tags.push(tag.toLowerCase()); return { added: true, tag }; } // temporary until admin UI - @Get("api/user/:id/tags/remove/:tag") + @Get("user/:id/tags/remove/:tag") @RequirePermissions(Permission.ADD_USER_TAGS) @UseGuards(JWTAuthGuard) async removeTagFromUser(@Param("id") targetId: string, @Param("tag") tag: string) { @@ -116,13 +120,7 @@ export class UserController { throw new BadRequestException("User does not have that tag."); } - await prisma.user.update({ - where: { id: target.id }, - data: { - tags: target.tags.filter((existing) => existing !== tag), - }, - }); - + target.tags = target.tags.filter((existing) => existing !== tag); return { removed: true, tag }; } } diff --git a/packages/api/src/modules/user/user.entity.ts b/packages/api/src/modules/user/user.entity.ts new file mode 100644 index 0000000..5864d39 --- /dev/null +++ b/packages/api/src/modules/user/user.entity.ts @@ -0,0 +1,34 @@ +import { Collection, Entity, OneToMany, OneToOne, PrimaryKey, Property } from "@mikro-orm/core"; +import { File } from "../file/file.entity"; +import { generateContentId } from "../../helpers/generate-content-id.helper"; +import { Invite } from "../invite/invite.entity"; +import { Exclude } from "class-transformer"; + +@Entity({ tableName: "users" }) +export class User { + @PrimaryKey({ type: String }) + id = generateContentId(); + + @Property({ unique: true, index: true }) + username!: string; + + @Property({ type: Number }) + permissions = 0; + + @Property() + @Exclude() + password!: string; + + @Property() + secret!: string; + + @OneToOne() + invite!: Invite; + + @Property() + tags: string[] = []; + + @OneToMany(() => File, (file) => file.owner, { orphanRemoval: true }) + @Exclude() + files = new Collection(this); +} diff --git a/src/modules/user/user.module.ts b/packages/api/src/modules/user/user.module.ts similarity index 71% rename from src/modules/user/user.module.ts rename to packages/api/src/modules/user/user.module.ts index fa58b41..20aae1a 100644 --- a/src/modules/user/user.module.ts +++ b/packages/api/src/modules/user/user.module.ts @@ -1,4 +1,7 @@ +import { MikroOrmModule } from "@mikro-orm/nestjs"; import { forwardRef, Module } from "@nestjs/common"; +import { File } from "../file/file.entity"; +import { User } from "./user.entity"; import { AuthModule } from "../auth/auth.module"; import { FileModule } from "../file/file.module"; import { InviteModule } from "../invite/invite.module"; @@ -6,7 +9,7 @@ import { UserController } from "./user.controller"; import { UserService } from "./user.service"; @Module({ - imports: [forwardRef(() => InviteModule), AuthModule, forwardRef(() => FileModule)], + imports: [forwardRef(() => InviteModule), AuthModule, forwardRef(() => FileModule), MikroOrmModule.forFeature([User, File])], controllers: [UserController], providers: [UserService], exports: [UserService], diff --git a/packages/api/src/modules/user/user.service.ts b/packages/api/src/modules/user/user.service.ts new file mode 100644 index 0000000..2699f46 --- /dev/null +++ b/packages/api/src/modules/user/user.service.ts @@ -0,0 +1,75 @@ +import { Permission } from "@micro/common"; +import { EntityRepository, QueryOrder } from "@mikro-orm/core"; +import { InjectRepository } from "@mikro-orm/nestjs"; +import { ConflictException, Injectable } from "@nestjs/common"; +import bcrypt from "bcrypt"; +import { nanoid } from "nanoid"; +import { generateContentId } from "../../helpers/generate-content-id.helper"; +import { File } from "../file/file.entity"; +import { Invite } from "../invite/invite.entity"; +import { InviteService } from "../invite/invite.service"; +import { CreateUserDto } from "./dto/create-user.dto"; +import { Pagination } from "./dto/pagination.dto"; +import { User } from "./user.entity"; + +@Injectable() +export class UserService { + constructor( + @InjectRepository(User) private userRepo: EntityRepository, + @InjectRepository(File) private fileRepo: EntityRepository, + private inviteService: InviteService + ) {} + + getUser(id: string) { + return this.userRepo.findOne(id); + } + + getUserFiles(userId: string, pagination: Pagination) { + return this.fileRepo.find( + { + owner: userId, + }, + { + limit: pagination.limit, + orderBy: { + createdAt: QueryOrder.DESC, + }, + } + ); + } + + async deleteUser(id: string) { + const user = this.userRepo.getReference(id); + this.userRepo.remove(user); + } + + async createUser(data: CreateUserDto, invite: Invite) { + const hashedPassword = await bcrypt.hash(data.password, 10); + const existing = await this.userRepo.findOne({ username: data.username }); + if (existing) throw new ConflictException("A user with that username already exists."); + const user = this.userRepo.create({ + id: generateContentId(), + secret: nanoid(), + password: hashedPassword, + username: data.username, + invite: invite.id, + permissions: invite.permissions, + }); + + await this.inviteService.consume(invite); + await this.userRepo.persistAndFlush(user); + return user; + } + + checkPermissions(permissions: Permission | number, permission: Permission | number) { + return (permissions & permission) === permission; + } + + addPermissions(permissions: Permission | number, permission: Permission | number) { + permissions |= permission; + } + + clearPermissions(permissions: Permission | number, permission: Permission | number) { + permissions &= ~permission; + } +} diff --git a/packages/api/src/timestamp.type.ts b/packages/api/src/timestamp.type.ts new file mode 100644 index 0000000..9c55499 --- /dev/null +++ b/packages/api/src/timestamp.type.ts @@ -0,0 +1,17 @@ +import { Type } from "@mikro-orm/core"; + +export class TimestampType extends Type { + convertToDatabaseValue(value: Date | undefined): number | undefined { + if (!value) return value; + return value.getTime(); + } + + convertToJSValue(value: number | undefined): Date | undefined { + if (value == null) return value; + return new Date(+value); + } + + getColumnType() { + return "bigint"; + } +} diff --git a/src/types.ts b/packages/api/src/types.ts similarity index 64% rename from src/types.ts rename to packages/api/src/types.ts index ef346f2..2bc3fa1 100644 --- a/src/types.ts +++ b/packages/api/src/types.ts @@ -1,15 +1,12 @@ -import type { File, Link, User } from "@prisma/client"; -import type { FastifyReply } from "fastify"; -import type { RenderableResponse } from "nest-next"; +import type { File } from "./modules/file/file.entity"; +import type { User } from "./modules/user/user.entity"; import type { AppController } from "./modules/app.controller"; import type { FileController } from "./modules/file/file.controller"; -import { HostsController } from "./modules/hosts/hosts.controller"; +import type { HostsController } from "./modules/hosts/hosts.controller"; import type { InviteController } from "./modules/invite/invite.controller"; -import type { LinkController } from "./modules/link/link.controller"; import type { UserController } from "./modules/user/user.controller"; -export type { File, User, Link }; -export type RenderableReply = RenderableResponse & FastifyReply; +export type { File, User }; export type Await = T extends { then: (onfulfilled?: (value: infer U) => unknown) => unknown; } @@ -26,10 +23,7 @@ export type GetUploadTokenData = Await>; // file -export type GetFileData = Await>; - -// link -export type GetLinkData = Await>; +export type GetFileData = File; // app export type GetServerConfigData = Await>; diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json new file mode 100644 index 0000000..a0b317c --- /dev/null +++ b/packages/api/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.json", + "include": ["./src/**/*.ts", "./src/data/blocklist.json"] +} diff --git a/packages/common/package.json b/packages/common/package.json new file mode 100644 index 0000000..0d91704 --- /dev/null +++ b/packages/common/package.json @@ -0,0 +1,12 @@ +{ + "name": "@micro/common", + "version": "0.0.1", + "repository": "https://github.com/sylv/micro.git", + "author": "Ryan ", + "license": "GPL-3.0", + "private": true, + "main": "./src/index.ts", + "engine": { + "node": ">=16" + } +} \ No newline at end of file diff --git a/src/constants.ts b/packages/common/src/constants.ts similarity index 96% rename from src/constants.ts rename to packages/common/src/constants.ts index 367c51b..6a9a5c1 100644 --- a/src/constants.ts +++ b/packages/common/src/constants.ts @@ -6,7 +6,7 @@ export const Endpoints = { CONFIG: "/api/config", HOSTS: "/api/hosts", USER: "/api/user", - UPLOAD: "/api/upload", + UPLOAD: "/api/file", USER_FILES: "/api/user/files", USER_TOKEN: "/api/user/token", FILE: (fileId: string) => `/api/file/${fileId}`, diff --git a/src/helpers/is-object.helper.ts b/packages/common/src/helpers/is-object.helper.ts similarity index 100% rename from src/helpers/is-object.helper.ts rename to packages/common/src/helpers/is-object.helper.ts diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts new file mode 100644 index 0000000..22156d8 --- /dev/null +++ b/packages/common/src/index.ts @@ -0,0 +1,2 @@ +export * from "./constants"; +export * from "./helpers/is-object.helper"; diff --git a/next-env.d.ts b/packages/web/next-env.d.ts similarity index 100% rename from next-env.d.ts rename to packages/web/next-env.d.ts diff --git a/packages/web/next.config.js b/packages/web/next.config.js new file mode 100644 index 0000000..4b5a1e6 --- /dev/null +++ b/packages/web/next.config.js @@ -0,0 +1,19 @@ +const withTM = require("next-transpile-modules")(["@micro/common"]); +module.exports = withTM({ + async rewrites() { + return [ + { + source: "/(f|file)/:fileId.:extension", + destination: "http://localhost:8080/file/:fileId.:extension*", + }, + { + source: "/f/:fileId", + destination: "/file/:fileId", + }, + { + source: "/api/:path*", + destination: "http://localhost:8080/:path*", + }, + ]; + }, +}); diff --git a/packages/web/package.json b/packages/web/package.json new file mode 100644 index 0000000..2673059 --- /dev/null +++ b/packages/web/package.json @@ -0,0 +1,42 @@ +{ + "name": "@micro/web", + "version": "0.0.1", + "repository": "https://github.com/sylv/micro.git", + "author": "Ryan ", + "license": "GPL-3.0", + "private": true, + "engine": { + "node": ">=16" + }, + "scripts": { + "watch": "next dev", + "start": "next start", + "build": "next build" + }, + "dependencies": { + "@headlessui/react": "^1.4.1", + "@micro/api": "workspace:^0.0.1", + "@micro/common": "workspace:^0.0.1", + "autoprefixer": "^10.3.5", + "classnames": "^2.3.1", + "copy-to-clipboard": "^3.3.1", + "dayjs": "^1.10.7", + "generate-avatar": "1.4.10", + "http-status-codes": "^2.1.4", + "nanoid": "^3.1.25", + "next": "11.0.1", + "next-transpile-modules": "^8.0.0", + "postcss": "^8.3.7", + "prism-react-renderer": "^1.2.1", + "react": "17.0.2", + "react-dom": "^17.0.2", + "react-feather": "^2.0.9", + "react-infinite-scroll-component": "^6.1.0", + "swr": "^1.0.1", + "tailwindcss": "^2.2.15" + }, + "devDependencies": { + "@types/react": "^17.0.24", + "typescript": "^4.4.3" + } +} \ No newline at end of file diff --git a/postcss.config.js b/packages/web/postcss.config.js similarity index 100% rename from postcss.config.js rename to packages/web/postcss.config.js diff --git a/public/favicon.svg b/packages/web/public/favicon.svg similarity index 100% rename from public/favicon.svg rename to packages/web/public/favicon.svg diff --git a/public/robots.txt b/packages/web/public/robots.txt similarity index 100% rename from public/robots.txt rename to packages/web/public/robots.txt diff --git a/src/components/avatar/avatar.module.css b/packages/web/src/components/avatar/avatar.module.css similarity index 100% rename from src/components/avatar/avatar.module.css rename to packages/web/src/components/avatar/avatar.module.css diff --git a/src/components/avatar/avatar.tsx b/packages/web/src/components/avatar/avatar.tsx similarity index 100% rename from src/components/avatar/avatar.tsx rename to packages/web/src/components/avatar/avatar.tsx diff --git a/src/components/button/button.module.css b/packages/web/src/components/button/button.module.css similarity index 100% rename from src/components/button/button.module.css rename to packages/web/src/components/button/button.module.css diff --git a/src/components/button/button.tsx b/packages/web/src/components/button/button.tsx similarity index 100% rename from src/components/button/button.tsx rename to packages/web/src/components/button/button.tsx diff --git a/src/components/card.tsx b/packages/web/src/components/card.tsx similarity index 100% rename from src/components/card.tsx rename to packages/web/src/components/card.tsx diff --git a/src/components/container.tsx b/packages/web/src/components/container.tsx similarity index 100% rename from src/components/container.tsx rename to packages/web/src/components/container.tsx diff --git a/src/components/dropdown/dropdown-divider.tsx b/packages/web/src/components/dropdown/dropdown-divider.tsx similarity index 100% rename from src/components/dropdown/dropdown-divider.tsx rename to packages/web/src/components/dropdown/dropdown-divider.tsx diff --git a/src/components/dropdown/dropdown-tab.tsx b/packages/web/src/components/dropdown/dropdown-tab.tsx similarity index 100% rename from src/components/dropdown/dropdown-tab.tsx rename to packages/web/src/components/dropdown/dropdown-tab.tsx diff --git a/src/components/dropdown/dropdown.module.css b/packages/web/src/components/dropdown/dropdown.module.css similarity index 100% rename from src/components/dropdown/dropdown.module.css rename to packages/web/src/components/dropdown/dropdown.module.css diff --git a/src/components/dropdown/dropdown.tsx b/packages/web/src/components/dropdown/dropdown.tsx similarity index 100% rename from src/components/dropdown/dropdown.tsx rename to packages/web/src/components/dropdown/dropdown.tsx diff --git a/src/components/file-embed/file-embed-container.tsx b/packages/web/src/components/file-embed/file-embed-container.tsx similarity index 93% rename from src/components/file-embed/file-embed-container.tsx rename to packages/web/src/components/file-embed/file-embed-container.tsx index f3962c0..33b7a80 100644 --- a/src/components/file-embed/file-embed-container.tsx +++ b/packages/web/src/components/file-embed/file-embed-container.tsx @@ -1,6 +1,6 @@ import Head from "next/head"; import { FunctionComponent } from "react"; -import { GetFileData } from "../../types"; +import { GetFileData } from "@micro/api"; export const FileEmbedContainer: FunctionComponent<{ file: GetFileData; children: React.ReactChild }> = (props) => { return ( diff --git a/src/components/file-embed/file-embed-default.tsx b/packages/web/src/components/file-embed/file-embed-default.tsx similarity index 89% rename from src/components/file-embed/file-embed-default.tsx rename to packages/web/src/components/file-embed/file-embed-default.tsx index 0d8a7e4..0f4fb4d 100644 --- a/src/components/file-embed/file-embed-default.tsx +++ b/packages/web/src/components/file-embed/file-embed-default.tsx @@ -1,4 +1,4 @@ -import { GetFileData } from "../../types"; +import { GetFileData } from "@micro/api"; export const FileEmbedDefault = ({ file }: { file: GetFileData }) => { return ( diff --git a/src/components/file-embed/file-embed-image.tsx b/packages/web/src/components/file-embed/file-embed-image.tsx similarity index 82% rename from src/components/file-embed/file-embed-image.tsx rename to packages/web/src/components/file-embed/file-embed-image.tsx index 1fa6be6..a922a2b 100644 --- a/src/components/file-embed/file-embed-image.tsx +++ b/packages/web/src/components/file-embed/file-embed-image.tsx @@ -1,6 +1,6 @@ import Head from "next/head"; -import { EMBEDDABLE_IMAGE_TYPES } from "../../constants"; -import { GetFileData } from "../../types"; +import { EMBEDDABLE_IMAGE_TYPES } from "@micro/common"; +import { GetFileData } from "@micro/api"; export const FileEmbedImage = ({ file }: { file: GetFileData }) => { return ( diff --git a/src/components/file-embed/file-embed-text/file-embed-text-container.tsx b/packages/web/src/components/file-embed/file-embed-text/file-embed-text-container.tsx similarity index 98% rename from src/components/file-embed/file-embed-text/file-embed-text-container.tsx rename to packages/web/src/components/file-embed/file-embed-text/file-embed-text-container.tsx index 4253fa6..2a98cdb 100644 --- a/src/components/file-embed/file-embed-text/file-embed-text-container.tsx +++ b/packages/web/src/components/file-embed/file-embed-text/file-embed-text-container.tsx @@ -7,7 +7,7 @@ import languages from "../../../data/languages.json"; import { getFileLanguage } from "../../../helpers/get-file-language.helper"; import { http } from "../../../helpers/http.helper"; import { useToasts } from "../../../hooks/use-toasts.helper"; -import { GetFileData } from "../../../types"; +import { GetFileData } from "@micro/api"; import { Button } from "../../button/button"; import { Dropdown } from "../../dropdown/dropdown"; import { DropdownTab } from "../../dropdown/dropdown-tab"; diff --git a/src/components/file-embed/file-embed-text/file-embed-text.tsx b/packages/web/src/components/file-embed/file-embed-text/file-embed-text.tsx similarity index 97% rename from src/components/file-embed/file-embed-text/file-embed-text.tsx rename to packages/web/src/components/file-embed/file-embed-text/file-embed-text.tsx index dbceb18..6665341 100644 --- a/src/components/file-embed/file-embed-text/file-embed-text.tsx +++ b/packages/web/src/components/file-embed/file-embed-text/file-embed-text.tsx @@ -2,7 +2,7 @@ import classNames from "classnames"; import Highlight, { defaultProps } from "prism-react-renderer"; import React from "react"; import { getFileLanguage } from "../../../helpers/get-file-language.helper"; -import { GetFileData } from "../../../types"; +import { GetFileData } from "@micro/api"; import { FileEmbedTextContainer } from "./file-embed-text-container"; import { theme } from "./prism-theme"; diff --git a/src/components/file-embed/file-embed-text/prism-theme.ts b/packages/web/src/components/file-embed/file-embed-text/prism-theme.ts similarity index 100% rename from src/components/file-embed/file-embed-text/prism-theme.ts rename to packages/web/src/components/file-embed/file-embed-text/prism-theme.ts diff --git a/src/components/file-embed/file-embed-video.tsx b/packages/web/src/components/file-embed/file-embed-video.tsx similarity index 75% rename from src/components/file-embed/file-embed-video.tsx rename to packages/web/src/components/file-embed/file-embed-video.tsx index e3f8b7f..1a289f8 100644 --- a/src/components/file-embed/file-embed-video.tsx +++ b/packages/web/src/components/file-embed/file-embed-video.tsx @@ -1,5 +1,5 @@ -import { EMBEDDABLE_VIDEO_TYPES } from "../../constants"; -import { GetFileData } from "../../types"; +import { EMBEDDABLE_VIDEO_TYPES } from "@micro/common"; +import { GetFileData } from "@micro/api"; export const FileEmbedVideo = ({ file }: { file: GetFileData }) => { return ( diff --git a/src/components/file-embed/file-embed.tsx b/packages/web/src/components/file-embed/file-embed.tsx similarity index 96% rename from src/components/file-embed/file-embed.tsx rename to packages/web/src/components/file-embed/file-embed.tsx index 84fd447..e792f02 100644 --- a/src/components/file-embed/file-embed.tsx +++ b/packages/web/src/components/file-embed/file-embed.tsx @@ -1,5 +1,5 @@ import { FunctionComponent, useMemo } from "react"; -import { GetFileData } from "../../types"; +import { GetFileData } from "@micro/api"; import { FileEmbedDefault } from "./file-embed-default"; import { FileEmbedContainer } from "./file-embed-container"; import { FileEmbedText } from "./file-embed-text/file-embed-text"; diff --git a/src/components/file-list/file-list-card-content.tsx b/packages/web/src/components/file-list/file-list-card-content.tsx similarity index 100% rename from src/components/file-list/file-list-card-content.tsx rename to packages/web/src/components/file-list/file-list-card-content.tsx diff --git a/src/components/file-list/file-list-card.tsx b/packages/web/src/components/file-list/file-list-card.tsx similarity index 92% rename from src/components/file-list/file-list-card.tsx rename to packages/web/src/components/file-list/file-list-card.tsx index 22ef08d..dd4dc3c 100644 --- a/src/components/file-list/file-list-card.tsx +++ b/packages/web/src/components/file-list/file-list-card.tsx @@ -1,5 +1,5 @@ import { FunctionComponent } from "react"; -import { GetFileData } from "../../types"; +import { GetFileData } from "@micro/api"; import { Link } from "../link"; import { FileListCardContent } from "./file-list-card-content"; diff --git a/src/components/file-list/file-list.tsx b/packages/web/src/components/file-list/file-list.tsx similarity index 67% rename from src/components/file-list/file-list.tsx rename to packages/web/src/components/file-list/file-list.tsx index 800e2fd..7bb9851 100644 --- a/src/components/file-list/file-list.tsx +++ b/packages/web/src/components/file-list/file-list.tsx @@ -1,30 +1,34 @@ import { FunctionComponent, useEffect, useState } from "react"; import InfiniteScroll from "react-infinite-scroll-component"; -import { Endpoints } from "../../constants"; +import { Endpoints } from "@micro/common"; import { http } from "../../helpers/http.helper"; -import { GetUserFilesData } from "../../types"; +import { GetUserFilesData } from "@micro/api"; import { Card } from "../card"; import { Spinner } from "../spinner"; import { FileListCard } from "./file-list-card"; +import Error from "../../pages/_error"; const PER_PAGE = 24; export const FileList: FunctionComponent = () => { const [files, setFiles] = useState([]); - const [loading, setLoading] = useState(true); - const [cursor, setCursor] = useState(); - const hasMore = cursor !== null; + const [loading, setLoading] = useState(false); + const [hasMore, setHasMore] = useState(true); + const [error, setError] = useState(null); + const [offset, setOffset] = useState(0); const fetchData = async () => { try { - if (cursor === null) return; + if (error || loading || !hasMore) return; setLoading(true); - let url = Endpoints.USER_FILES + `?take=${PER_PAGE}`; - if (cursor) url += `&cursor=${cursor}`; + let url = Endpoints.USER_FILES + `?offset=${offset}&limit=${PER_PAGE}`; const response = await http(url.toString()); const body = (await response.json()) as GetUserFilesData; const isFullPage = body.length === PER_PAGE; - setCursor(body[0] && isFullPage ? body[body.length - 1].id : null); - setFiles((files) => [...files, ...body]); + setHasMore(isFullPage); + setOffset(offset + PER_PAGE); + setFiles(files.concat(body)); + } catch (error) { + setError(error); } finally { setLoading(false); } @@ -32,12 +36,16 @@ export const FileList: FunctionComponent = () => { useEffect(() => { fetchData(); - }); + }, []); if (!files[0] && !loading) { return You have not uploaded anything yet. Once you do, files will appear here.; } + if (error) { + return ; + } + return ( = (props) => { + const date = useMemo(() => new Date(props.date), [props.date]); + const relative = useMemo(() => dayjs().to(date), [date]); + const iso = date.toISOString(); + + return ( + + ); +}; diff --git a/src/components/title.tsx b/packages/web/src/components/title.tsx similarity index 100% rename from src/components/title.tsx rename to packages/web/src/components/title.tsx diff --git a/src/components/toast/toast-wrapper.tsx b/packages/web/src/components/toast/toast-wrapper.tsx similarity index 100% rename from src/components/toast/toast-wrapper.tsx rename to packages/web/src/components/toast/toast-wrapper.tsx diff --git a/src/components/toast/toast.tsx b/packages/web/src/components/toast/toast.tsx similarity index 100% rename from src/components/toast/toast.tsx rename to packages/web/src/components/toast/toast.tsx diff --git a/src/components/user-pill.tsx b/packages/web/src/components/user-pill.tsx similarity index 100% rename from src/components/user-pill.tsx rename to packages/web/src/components/user-pill.tsx diff --git a/src/data/languages.json b/packages/web/src/data/languages.json similarity index 100% rename from src/data/languages.json rename to packages/web/src/data/languages.json diff --git a/src/helpers/download.helper.ts b/packages/web/src/helpers/download.helper.ts similarity index 100% rename from src/helpers/download.helper.ts rename to packages/web/src/helpers/download.helper.ts diff --git a/src/helpers/fetcher.helper.ts b/packages/web/src/helpers/fetcher.helper.ts similarity index 100% rename from src/helpers/fetcher.helper.ts rename to packages/web/src/helpers/fetcher.helper.ts diff --git a/src/helpers/generate-config.helper.ts b/packages/web/src/helpers/generate-config.helper.ts similarity index 87% rename from src/helpers/generate-config.helper.ts rename to packages/web/src/helpers/generate-config.helper.ts index dca758f..332e5f8 100644 --- a/src/helpers/generate-config.helper.ts +++ b/packages/web/src/helpers/generate-config.helper.ts @@ -12,7 +12,7 @@ export function generateConfig(token: string, hosts: string[], direct: boolean): const content = { Version: "13.2.1", Name: `micro - ${joined}`, - DestinationType: "ImageUploader, TextUploader, FileUploader, URLShortener", + DestinationType: "ImageUploader, TextUploader, FileUploader", RequestMethod: "POST", RequestURL: upload, Body: "MultipartFormData", @@ -20,9 +20,6 @@ export function generateConfig(token: string, hosts: string[], direct: boolean): URL: direct ? "$json:links.direct$" : "$json:links.view$", ThumbnailURL: "$json:links.thumbnail$", DeletionURL: "$json:links.delete$", - Parameters: { - input: "$input$", - }, Headers: { Authorization: token, "X-Micro-Host": joined, diff --git a/src/helpers/get-error-message.helper.ts b/packages/web/src/helpers/get-error-message.helper.ts similarity index 83% rename from src/helpers/get-error-message.helper.ts rename to packages/web/src/helpers/get-error-message.helper.ts index f99ebd2..7ecb546 100644 --- a/src/helpers/get-error-message.helper.ts +++ b/packages/web/src/helpers/get-error-message.helper.ts @@ -1,4 +1,4 @@ -import { isObject } from "./is-object.helper"; +import { isObject } from "@micro/common"; export function getErrorMessage(error: unknown): string | undefined { if (typeof error === "string") return error; diff --git a/src/helpers/get-file-language.helper.ts b/packages/web/src/helpers/get-file-language.helper.ts similarity index 84% rename from src/helpers/get-file-language.helper.ts rename to packages/web/src/helpers/get-file-language.helper.ts index a4d413f..ef0a94f 100644 --- a/src/helpers/get-file-language.helper.ts +++ b/packages/web/src/helpers/get-file-language.helper.ts @@ -2,7 +2,8 @@ import languages from "../data/languages.json"; export type Language = typeof languages[number]; -export function getFileLanguage(fileName: string): Language | undefined { +export function getFileLanguage(fileName?: string): Language | undefined { + if (!fileName) return; const extensionIndex = fileName.lastIndexOf("."); if (extensionIndex !== -1) { const extension = fileName.slice(extensionIndex + 1); diff --git a/src/helpers/http.helper.ts b/packages/web/src/helpers/http.helper.ts similarity index 100% rename from src/helpers/http.helper.ts rename to packages/web/src/helpers/http.helper.ts diff --git a/packages/web/src/hooks/use-config.hook.tsx b/packages/web/src/hooks/use-config.hook.tsx new file mode 100644 index 0000000..2e2df59 --- /dev/null +++ b/packages/web/src/hooks/use-config.hook.tsx @@ -0,0 +1,12 @@ +import useSWR from "swr"; +import { Endpoints } from "@micro/common"; +import { GetServerConfigData } from "@micro/api"; + +export const useConfig = (removeInaccessibleHosts: boolean) => { + const config = useSWR(Endpoints.CONFIG); + if (config.data && removeInaccessibleHosts) { + config.data.hosts = config.data.hosts.filter((host) => host.authorised); + } + + return config; +}; diff --git a/src/hooks/use-host.hook.tsx b/packages/web/src/hooks/use-host.hook.tsx similarity index 100% rename from src/hooks/use-host.hook.tsx rename to packages/web/src/hooks/use-host.hook.tsx diff --git a/src/hooks/use-on-click-outside.helper.tsx b/packages/web/src/hooks/use-on-click-outside.helper.tsx similarity index 100% rename from src/hooks/use-on-click-outside.helper.tsx rename to packages/web/src/hooks/use-on-click-outside.helper.tsx diff --git a/src/hooks/use-paths.helper.tsx b/packages/web/src/hooks/use-paths.helper.tsx similarity index 100% rename from src/hooks/use-paths.helper.tsx rename to packages/web/src/hooks/use-paths.helper.tsx diff --git a/src/hooks/use-toasts.helper.tsx b/packages/web/src/hooks/use-toasts.helper.tsx similarity index 100% rename from src/hooks/use-toasts.helper.tsx rename to packages/web/src/hooks/use-toasts.helper.tsx diff --git a/src/hooks/use-user.helper.tsx b/packages/web/src/hooks/use-user.helper.tsx similarity index 92% rename from src/hooks/use-user.helper.tsx rename to packages/web/src/hooks/use-user.helper.tsx index ccccb71..ce5fb73 100644 --- a/src/hooks/use-user.helper.tsx +++ b/packages/web/src/hooks/use-user.helper.tsx @@ -1,9 +1,9 @@ import Router from "next/router"; import useSWR, { mutate } from "swr"; import { LoginData } from "../components/login-form"; -import { Endpoints } from "../constants"; +import { Endpoints } from "@micro/common"; import { http } from "../helpers/http.helper"; -import { GetUserData } from "../types"; +import { GetUserData } from "@micro/api"; /** * Sign the user in with a username/password combo. diff --git a/src/pages/404.tsx b/packages/web/src/pages/404.tsx similarity index 100% rename from src/pages/404.tsx rename to packages/web/src/pages/404.tsx diff --git a/src/pages/500.tsx b/packages/web/src/pages/500.tsx similarity index 100% rename from src/pages/500.tsx rename to packages/web/src/pages/500.tsx diff --git a/src/pages/_app.tsx b/packages/web/src/pages/_app.tsx similarity index 100% rename from src/pages/_app.tsx rename to packages/web/src/pages/_app.tsx diff --git a/src/pages/_error.tsx b/packages/web/src/pages/_error.tsx similarity index 83% rename from src/pages/_error.tsx rename to packages/web/src/pages/_error.tsx index 63c70cf..0e5ffdc 100644 --- a/src/pages/_error.tsx +++ b/packages/web/src/pages/_error.tsx @@ -1,5 +1,4 @@ import { getReasonPhrase, StatusCodes } from "http-status-codes"; -import { GetServerSideProps } from "next"; import { useRouter } from "next/router"; import { Container } from "../components/container"; import { Link } from "../components/link"; @@ -30,12 +29,3 @@ export default function Error(props: ErrorProps) { ); } - -export const getServerSideProps: GetServerSideProps = async (context) => { - return { - props: { - status: context.query.status, - message: context.query.message, - }, - }; -}; diff --git a/src/pages/dashboard.tsx b/packages/web/src/pages/dashboard.tsx similarity index 98% rename from src/pages/dashboard.tsx rename to packages/web/src/pages/dashboard.tsx index 680f960..7bc145d 100644 --- a/src/pages/dashboard.tsx +++ b/packages/web/src/pages/dashboard.tsx @@ -10,12 +10,12 @@ import { PageLoader } from "../components/page-loader"; import { Section } from "../components/section"; import { ShareXButton } from "../components/sharex-button"; import { Title } from "../components/title"; -import { Endpoints } from "../constants"; +import { Endpoints } from "@micro/common"; import { getErrorMessage } from "../helpers/get-error-message.helper"; import { http } from "../helpers/http.helper"; import { useToasts } from "../hooks/use-toasts.helper"; import { useUser } from "../hooks/use-user.helper"; -import { GetHostsData, GetUploadTokenData, PutUploadTokenData } from "../types"; +import { GetHostsData, GetUploadTokenData, PutUploadTokenData } from "@micro/api"; // todo: subdomain validation (bad characters, too long, etc) with usernames and inputs export default function Dashboard() { diff --git a/src/pages/file/[fileId].tsx b/packages/web/src/pages/file/[fileId].tsx similarity index 89% rename from src/pages/file/[fileId].tsx rename to packages/web/src/pages/file/[fileId].tsx index f8ba8ee..61dd622 100644 --- a/src/pages/file/[fileId].tsx +++ b/packages/web/src/pages/file/[fileId].tsx @@ -1,3 +1,5 @@ +import { GetFileData } from "@micro/api"; +import { Endpoints } from "@micro/common"; import copyToClipboard from "copy-to-clipboard"; import { useRouter } from "next/router"; import { useState } from "react"; @@ -8,19 +10,16 @@ import { FileEmbed } from "../../components/file-embed/file-embed"; import { PageLoader } from "../../components/page-loader"; import { Spinner } from "../../components/spinner"; import { Title } from "../../components/title"; -import { Endpoints } from "../../constants"; import { downloadUrl } from "../../helpers/download.helper"; import { getErrorMessage } from "../../helpers/get-error-message.helper"; import { useToasts } from "../../hooks/use-toasts.helper"; import { useUser } from "../../hooks/use-user.helper"; -import { GetFileData } from "../../types"; import Error from "../_error"; export default function File() { const router = useRouter(); const fileId = router.query.fileId as string; - const initialData = router.query.file && JSON.parse(router.query.file as string); - const file = useSWR(Endpoints.FILE(fileId), { initialData }); + const file = useSWR(Endpoints.FILE(fileId)); const user = useUser(); const [confirm, setConfirm] = useState(false); const [deleting, setDeleting] = useState(false); @@ -96,7 +95,7 @@ export default function File() { > Download - {user.data?.id === file.data.ownerId && ( + {user.data?.id === file.data.owner?.id && ( ); } - -// without this router.query.file does not exist -export const getServerSideProps = () => { - return { - props: {}, - }; -}; diff --git a/src/pages/index.tsx b/packages/web/src/pages/index.tsx similarity index 67% rename from src/pages/index.tsx rename to packages/web/src/pages/index.tsx index 0d655ae..2a28567 100644 --- a/src/pages/index.tsx +++ b/packages/web/src/pages/index.tsx @@ -1,19 +1,16 @@ -import { useRouter } from "next/router"; import { Container } from "../components/container"; import { Spinner } from "../components/spinner"; import { useConfig } from "../hooks/use-config.hook"; export default function Home() { - const router = useRouter(); - const initialData = router.query.invite && JSON.parse(router.query.invite as string); - const config = useConfig(true, initialData); + const config = useConfig(true); const hosts = config.data?.hosts ?? []; const loading = !config.data && !config.error; return (
-

Micro

+

Micro

An invite-only file sharing and paste service with vanity domains and a ShareX compatible endpoint. Sign in to download a generated ShareX configuration. You can view the source code{" "} @@ -21,11 +18,11 @@ export default function Home() { here.

-

Domains

-
    +

    Domains

    +
      {loading ? : hosts.map((host) =>
    • {host.data.key}
    • )}
    -

    Contact

    +

    Contact

    {!config.data ? ( ) : ( @@ -41,10 +38,3 @@ export default function Home() { ); } - -// without this router.query.invite does not exist -export const getServerSideProps = () => { - return { - props: {}, - }; -}; diff --git a/src/pages/invite/[inviteToken].tsx b/packages/web/src/pages/invite/[inviteToken].tsx similarity index 78% rename from src/pages/invite/[inviteToken].tsx rename to packages/web/src/pages/invite/[inviteToken].tsx index dd82613..0a5038a 100644 --- a/src/pages/invite/[inviteToken].tsx +++ b/packages/web/src/pages/invite/[inviteToken].tsx @@ -6,11 +6,11 @@ import { LoginData, LoginForm } from "../../components/login-form"; import { PageLoader } from "../../components/page-loader"; import { Time } from "../../components/time"; import { Title } from "../../components/title"; -import { Endpoints } from "../../constants"; +import { Endpoints } from "@micro/common"; import { getErrorMessage } from "../../helpers/get-error-message.helper"; import { http } from "../../helpers/http.helper"; import { useToasts } from "../../hooks/use-toasts.helper"; -import { GetInviteData } from "../../types"; +import { GetInviteData } from "@micro/api"; import Error from "../_error"; export default function Invite() { @@ -18,9 +18,8 @@ export default function Invite() { const [loading, setLoading] = useState(false); const setToast = useToasts(); const inviteToken = router.query.inviteToken; - const initialData = router.query.invite && JSON.parse(router.query.invite as string); - const invite = useSWR(`/api/invite/${inviteToken}`, { initialData }); - const expiry = invite.data ? invite.data.exp * 1000 : 0; + const invite = useSWR(`/api/invite/${inviteToken}`); + const expiresAt = invite.data?.expiresAt; useEffect(() => { Router.prefetch("/login"); @@ -46,7 +45,7 @@ export default function Invite() { Router.push("/login"); setToast({ text: "Account created successfully. Please sign in." }); } catch (error: unknown) { - const message = getErrorMessage(error) ?? "An unknown error occured."; + const message = getErrorMessage(error) ?? "An unknown error occurred."; setToast({ error: true, text: message }); } finally { setLoading(false); @@ -57,9 +56,11 @@ export default function Invite() { You're Invited

    Sign Up

    -

    - This invite will expire

    + {expiresAt && ( +

    + This invite will expire

    + )}
    @@ -70,18 +71,13 @@ export default function Invite() { You have been invited to try out micro, an invite-only file sharing service with support for ShareX. Create an account, then download the ShareX config and start uploading with your favourite vanity domain.

    -

    - This invite will expire

    + {expiresAt && ( +

    + This invite will expire

    + )}
    ); } - -// without this router.query.invite does not exist -export const getServerSideProps = () => { - return { - props: {}, - }; -}; diff --git a/src/pages/login.tsx b/packages/web/src/pages/login.tsx similarity index 100% rename from src/pages/login.tsx rename to packages/web/src/pages/login.tsx diff --git a/src/pages/upload.tsx b/packages/web/src/pages/upload.tsx similarity index 98% rename from src/pages/upload.tsx rename to packages/web/src/pages/upload.tsx index 8dd3724..71e28d7 100644 --- a/src/pages/upload.tsx +++ b/packages/web/src/pages/upload.tsx @@ -9,13 +9,13 @@ import { Select } from "../components/input/select"; import { PageLoader } from "../components/page-loader"; import { Spinner } from "../components/spinner"; import { Title } from "../components/title"; -import { Endpoints } from "../constants"; +import { Endpoints } from "@micro/common"; import { getErrorMessage } from "../helpers/get-error-message.helper"; import { http } from "../helpers/http.helper"; import { useHost } from "../hooks/use-host.hook"; import { useToasts } from "../hooks/use-toasts.helper"; import { useUser } from "../hooks/use-user.helper"; -import { GetHostsData } from "../types"; +import { GetHostsData } from "@micro/api"; export default function Upload() { const user = useUser(); diff --git a/src/styles/globals.css b/packages/web/src/styles/globals.css similarity index 100% rename from src/styles/globals.css rename to packages/web/src/styles/globals.css diff --git a/tailwind.config.js b/packages/web/tailwind.config.js similarity index 100% rename from tailwind.config.js rename to packages/web/tailwind.config.js diff --git a/packages/web/tsconfig.json b/packages/web/tsconfig.json new file mode 100644 index 0000000..7901051 --- /dev/null +++ b/packages/web/tsconfig.json @@ -0,0 +1,30 @@ +{ + "include": ["./src/**/*", "next-env.d.ts"], + "exclude": ["node_modules/*"], + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "jsx": "preserve", + "strict": true, + "pretty": true, + "noImplicitAny": true, + "alwaysStrict": true, + "noImplicitThis": true, + "outDir": ".next", + "moduleResolution": "node", + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "noUnusedLocals": true, + "sourceMap": true, + "skipLibCheck": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "lib": ["es2017", "dom"], + "baseUrl": ".", + "typeRoots": ["node_modules/@types", "./types"], + "noEmit": true, + "resolveJsonModule": true, + "isolatedModules": true, + "allowJs": true + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a24533e..76b5a20 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,165 +1,186 @@ lockfileVersion: 5.3 -specifiers: - '@anatine/esbuild-decorators': ^0.2.12 - '@commitlint/cli': ^13.1.0 - '@commitlint/config-conventional': ^13.1.0 - '@headlessui/react': ^1.3.0 - '@nestjs/common': ^8.0.4 - '@nestjs/core': ^8.0.4 - '@nestjs/jwt': ^8.0.0 - '@nestjs/passport': ^8.0.0 - '@nestjs/platform-fastify': ^8.0.4 - '@nestjs/schedule': ^1.0.0 - '@prisma/client': ^2.27.0 - '@ryanke/eslint-config': ^1.0.1 - '@ryanke/venera': ^0.0.2 - '@types/bcrypt': ^5.0.0 - '@types/luxon': ^1.27.1 - '@types/mime-types': ^2.1.0 - '@types/ms': ^0.7.31 - '@types/node': ^14.17.3 - '@types/passport-jwt': ^3.0.6 - '@types/passport-local': ^1.0.34 - '@types/rc': ^1.1.0 - '@types/react': ^17.0.15 - '@types/sharp': ^0.28.4 - '@typescript-eslint/eslint-plugin': ^4.29.3 - autoprefixer: ^10.3.1 - bcrypt: ^5.0.1 - class-transformer: ^0.4.0 - class-validator: ^0.13.1 - classnames: ^2.3.1 - content-range: ^2.0.0 - copy-to-clipboard: ^3.3.1 - cross-env: ^7.0.3 - escape-string-regexp: ^4.0.0 - eslint: ^7.32.0 - eslint-plugin-react: ^7.24.0 - eslint-plugin-react-hooks: ^4.2.0 - eslint-plugin-unicorn: ^35.0.0 - fastify: 3.19.2 - fastify-cookie: ^5.3.1 - fastify-multipart: ^4.0.7 - file-type: ^16.5.2 - generate-avatar: 1.4.10 - http-status-codes: ^2.1.4 - husky: ^7.0.1 - istextorbinary: ^5.12.0 - luxon: ^2.0.1 - mime-types: ^2.1.31 - ms: ^2.1.3 - nanoid: ^3.1.23 - nest-next: 9.3.0-beta.0 - next: 11.0.1 - normalize-url: ^6.0.0 - passport: ^0.4.1 - passport-jwt: ^4.0.0 - passport-local: ^1.0.0 - postcss: ^8.3.6 - prettier: ^2.3.2 - prism-react-renderer: ^1.2.1 - prisma: ^2.27.0 - react: 17.0.2 - react-dom: 17.0.2 - react-feather: ^2.0.9 - react-infinite-scroll-component: ^6.1.0 - reflect-metadata: ^0.1.13 - rimraf: ^3.0.0 - rxjs: ^7.2.0 - sharp: ^0.28.3 - stream-size: ^0.0.6 - swr: ^0.5.6 - tailwindcss: ^2.2.7 - tsup: ^4.12.5 - typescript: ^4.3.5 - xbytes: ^1.7.0 +importers: -dependencies: - '@anatine/esbuild-decorators': 0.2.12 - '@headlessui/react': 1.3.0_react-dom@17.0.2+react@17.0.2 - '@nestjs/common': 8.0.4_e911b02ebc86a0e92191a7b133b2fcd0 - '@nestjs/core': 8.0.4_e4988ec8350f50541cb1b028c87076a8 - '@nestjs/jwt': 8.0.0_@nestjs+common@8.0.4 - '@nestjs/passport': 8.0.0_8ffbbd1dfbd3e60a0a9ef125c15ec754 - '@nestjs/platform-fastify': 8.0.4_dbb23fa745e40b87eda38a58a66b6bd5 - '@nestjs/schedule': 1.0.0_4d72478bf80ccc07ffec9357846306a9 - '@prisma/client': 2.27.0_prisma@2.27.0 - '@ryanke/venera': 0.0.2_e9f3d709c367337f0d885b75ad90626b - autoprefixer: 10.3.1_postcss@8.3.6 - bcrypt: 5.0.1 - class-transformer: 0.4.0 - class-validator: 0.13.1 - classnames: 2.3.1 - content-range: 2.0.0 - copy-to-clipboard: 3.3.1 - cross-env: 7.0.3 - escape-string-regexp: 4.0.0 - fastify: 3.19.2 - fastify-cookie: 5.3.1 - fastify-multipart: 4.0.7 - file-type: 16.5.2 - generate-avatar: 1.4.10 - http-status-codes: 2.1.4 - istextorbinary: 5.12.0 - luxon: 2.0.1 - mime-types: 2.1.31 - ms: 2.1.3 - nanoid: 3.1.23 - nest-next: 9.3.0-beta.0_55add61a94687181d4ca049c4c373f05 - next: 11.0.1_f31b35bdaa3b7c2fce82404f09d2dac4 - normalize-url: 6.1.0 - passport: 0.4.1 - passport-jwt: 4.0.0 - passport-local: 1.0.0 - postcss: 8.3.6 - prism-react-renderer: 1.2.1_react@17.0.2 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - react-feather: 2.0.9_react@17.0.2 - react-infinite-scroll-component: 6.1.0_react@17.0.2 - reflect-metadata: 0.1.13 - rxjs: 7.2.0 - sharp: 0.28.3 - stream-size: 0.0.6 - swr: 0.5.6_react@17.0.2 - tailwindcss: 2.2.7_7b69a43ec4689fa7484dee35f79a7806 - xbytes: 1.7.0 + .: + specifiers: + '@commitlint/cli': ^13.1.0 + '@commitlint/config-conventional': ^13.1.0 + '@tsconfig/node16': ^1.0.2 + '@typescript-eslint/eslint-plugin': ^4.31.2 + eslint: ^7.32.0 + eslint-plugin-react: ^7.26.0 + eslint-plugin-react-hooks: ^4.2.0 + eslint-plugin-unicorn: ^35.0.0 + husky: ^7.0.2 + prettier: ^2.4.1 + devDependencies: + '@commitlint/cli': 13.1.0 + '@commitlint/config-conventional': 13.1.0 + '@tsconfig/node16': 1.0.2 + '@typescript-eslint/eslint-plugin': 4.31.2_eslint@7.32.0 + eslint: 7.32.0 + eslint-plugin-react: 7.26.0_eslint@7.32.0 + eslint-plugin-react-hooks: 4.2.0_eslint@7.32.0 + eslint-plugin-unicorn: 35.0.0_eslint@7.32.0 + husky: 7.0.2 + prettier: 2.4.1 -devDependencies: - '@commitlint/cli': 13.1.0 - '@commitlint/config-conventional': 13.1.0 - '@ryanke/eslint-config': 1.0.1_8ad29308127fedc8195f7a9fb78cb9ae - '@types/bcrypt': 5.0.0 - '@types/luxon': 1.27.1 - '@types/mime-types': 2.1.0 - '@types/ms': 0.7.31 - '@types/node': 14.17.5 - '@types/passport-jwt': 3.0.6 - '@types/passport-local': 1.0.34 - '@types/rc': 1.1.0 - '@types/react': 17.0.15 - '@types/sharp': 0.28.4 - '@typescript-eslint/eslint-plugin': 4.29.3_eslint@7.32.0+typescript@4.3.5 - eslint: 7.32.0 - eslint-plugin-react: 7.24.0_eslint@7.32.0 - eslint-plugin-react-hooks: 4.2.0_eslint@7.32.0 - eslint-plugin-unicorn: 35.0.0_eslint@7.32.0 - husky: 7.0.1 - prettier: 2.3.2 - prisma: 2.27.0 - rimraf: 3.0.2 - tsup: 4.12.5_typescript@4.3.5 - typescript: 4.3.5 + packages/api: + specifiers: + '@micro/common': workspace:^0.0.1 + '@mikro-orm/cli': ^4.5.9 + '@mikro-orm/core': ^4.5.9 + '@mikro-orm/migrations': ^4.5.9 + '@mikro-orm/nestjs': ^4.3.0 + '@mikro-orm/postgresql': ^4.5.9 + '@nestjs/common': ^8.0.7 + '@nestjs/core': ^8.0.7 + '@nestjs/jwt': ^8.0.0 + '@nestjs/passport': ^8.0.1 + '@nestjs/platform-fastify': ^8.0.7 + '@nestjs/schedule': ^1.0.1 + '@ryanke/venera': ^0.0.2 + '@tsconfig/node16': ^1.0.2 + '@types/bcrypt': ^5.0.0 + '@types/luxon': ^2.0.4 + '@types/mime-types': ^2.1.1 + '@types/node': ^16.10.1 + '@types/passport-jwt': ^3.0.6 + '@types/passport-local': ^1.0.34 + '@types/sharp': ^0.29.2 + bcrypt: ^5.0.1 + class-transformer: ^0.4.0 + class-validator: ^0.13.1 + content-range: ^2.0.2 + escape-string-regexp: ^4 + fastify: ^3.21.6 + fastify-cookie: ^5.3.1 + fastify-multipart: ^5.0.0 + file-type: ^16.5.3 + http-status-codes: ^2.1.4 + istextorbinary: ^6.0.0 + luxon: ^2.0.2 + mime-types: ^2.1.32 + ms: ^3.0.0-canary.1 + nanoid: ^3.1.25 + next: ^11.1.2 + nodemon: ^2.0.13 + normalize-url: ^6 + passport: ^0.5.0 + passport-jwt: ^4.0.0 + passport-local: ^1.0.0 + rxjs: ^7.3.0 + sharp: ^0.29.1 + stream-size: ^0.0.6 + ts-eager: ^2.0.2 + ts-node: ^10.2.1 + xbytes: ^1.7.0 + dependencies: + '@micro/common': link:../common + '@mikro-orm/core': 4.5.9_40bc058361f12b4a6a81884bbe496c64 + '@mikro-orm/nestjs': 4.3.0_f22e743cdc173850f1d406f48d8cf837 + '@mikro-orm/postgresql': 4.5.9_c5924a60946be4b9f3a0784c71d54059 + '@nestjs/common': 8.0.7_901c84031ef2d280d7bac34f7c776879 + '@nestjs/core': 8.0.7_@nestjs+common@8.0.7+rxjs@7.3.0 + '@nestjs/jwt': 8.0.0_@nestjs+common@8.0.7 + '@nestjs/passport': 8.0.1_38aa9bfad4b7f471d8e32e88cc96339b + '@nestjs/platform-fastify': 8.0.7_6ccd7f020aae0bb10815f91d7f482355 + '@nestjs/schedule': 1.0.1_6ccd7f020aae0bb10815f91d7f482355 + '@ryanke/venera': 0.0.2_class-validator@0.13.1 + bcrypt: 5.0.1 + class-transformer: 0.4.0 + class-validator: 0.13.1 + content-range: 2.0.2 + escape-string-regexp: 4.0.0 + fastify: 3.21.6 + fastify-cookie: 5.3.1 + fastify-multipart: 5.0.0 + file-type: 16.5.3 + http-status-codes: 2.1.4 + istextorbinary: 6.0.0 + luxon: 2.0.2 + mime-types: 2.1.32 + ms: 3.0.0-canary.1 + nanoid: 3.1.25 + next: 11.1.2 + normalize-url: 6.1.0 + passport: 0.5.0 + passport-jwt: 4.0.0 + passport-local: 1.0.0 + rxjs: 7.3.0 + sharp: 0.29.1 + stream-size: 0.0.6 + xbytes: 1.7.0 + devDependencies: + '@mikro-orm/cli': 4.5.9_befbc5d70fc06112c68f19bb2856890b + '@mikro-orm/migrations': 4.5.9_@mikro-orm+core@4.5.9 + '@tsconfig/node16': 1.0.2 + '@types/bcrypt': 5.0.0 + '@types/luxon': 2.0.4 + '@types/mime-types': 2.1.1 + '@types/node': 16.10.1 + '@types/passport-jwt': 3.0.6 + '@types/passport-local': 1.0.34 + '@types/sharp': 0.29.2 + nodemon: 2.0.13 + ts-eager: 2.0.2 + ts-node: 10.2.1_@types+node@16.10.1 + + packages/common: + specifiers: {} + + packages/web: + specifiers: + '@headlessui/react': ^1.4.1 + '@micro/api': workspace:^0.0.1 + '@micro/common': workspace:^0.0.1 + '@types/react': ^17.0.24 + autoprefixer: ^10.3.5 + classnames: ^2.3.1 + copy-to-clipboard: ^3.3.1 + dayjs: ^1.10.7 + generate-avatar: 1.4.10 + http-status-codes: ^2.1.4 + nanoid: ^3.1.25 + next: 11.0.1 + next-transpile-modules: ^8.0.0 + postcss: ^8.3.7 + prism-react-renderer: ^1.2.1 + react: 17.0.2 + react-dom: ^17.0.2 + react-feather: ^2.0.9 + react-infinite-scroll-component: ^6.1.0 + swr: ^1.0.1 + tailwindcss: ^2.2.15 + typescript: ^4.4.3 + dependencies: + '@headlessui/react': 1.4.1_react-dom@17.0.2+react@17.0.2 + '@micro/api': link:../api + '@micro/common': link:../common + autoprefixer: 10.3.5_postcss@8.3.7 + classnames: 2.3.1 + copy-to-clipboard: 3.3.1 + dayjs: 1.10.7 + generate-avatar: 1.4.10 + http-status-codes: 2.1.4 + nanoid: 3.1.25 + next: 11.0.1_bd7797d63db473de6e2318609a63c933 + next-transpile-modules: 8.0.0 + postcss: 8.3.7 + prism-react-renderer: 1.2.1_react@17.0.2 + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 + react-feather: 2.0.9_react@17.0.2 + react-infinite-scroll-component: 6.1.0_react@17.0.2 + swr: 1.0.1_react@17.0.2 + tailwindcss: 2.2.15_dd4850c39760d2665af3f9e21d00faf4 + devDependencies: + '@types/react': 17.0.24 + typescript: 4.4.3 packages: - /@anatine/esbuild-decorators/0.2.12: - resolution: {integrity: sha512-meUjcLY0Rp1rsNidvHsI17kI33Y8EotL/H9am3Q0ETdfO/ZB5QYeh1zcmqecuI/+wlwdINn6CRSmUFPAFlIvMg==} - peerDependencies: - esbuild: ~0.12.12 - dev: false - /@babel/code-frame/7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: @@ -171,29 +192,23 @@ packages: dependencies: '@babel/highlight': 7.14.5 - /@babel/compat-data/7.14.7: - resolution: {integrity: sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==} - engines: {node: '>=6.9.0'} - dev: false - /@babel/compat-data/7.15.0: resolution: {integrity: sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==} engines: {node: '>=6.9.0'} - dev: true - /@babel/core/7.14.8: - resolution: {integrity: sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q==} + /@babel/core/7.15.5: + resolution: {integrity: sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.14.5 - '@babel/generator': 7.14.8 - '@babel/helper-compilation-targets': 7.14.5_@babel+core@7.14.8 - '@babel/helper-module-transforms': 7.14.8 - '@babel/helpers': 7.14.8 - '@babel/parser': 7.14.8 - '@babel/template': 7.14.5 - '@babel/traverse': 7.14.8 - '@babel/types': 7.14.8 + '@babel/generator': 7.15.4 + '@babel/helper-compilation-targets': 7.15.4_@babel+core@7.15.5 + '@babel/helper-module-transforms': 7.15.7 + '@babel/helpers': 7.15.4 + '@babel/parser': 7.15.7 + '@babel/template': 7.15.4 + '@babel/traverse': 7.15.4 + '@babel/types': 7.15.6 convert-source-map: 1.8.0 debug: 4.3.2 gensync: 1.0.0-beta.2 @@ -202,380 +217,281 @@ packages: source-map: 0.5.7 transitivePeerDependencies: - supports-color - dev: false - /@babel/core/7.15.0: - resolution: {integrity: sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.14.5 - '@babel/generator': 7.15.0 - '@babel/helper-compilation-targets': 7.15.0_@babel+core@7.15.0 - '@babel/helper-module-transforms': 7.15.0 - '@babel/helpers': 7.15.3 - '@babel/parser': 7.15.3 - '@babel/template': 7.14.5 - '@babel/traverse': 7.15.0 - '@babel/types': 7.15.0 - convert-source-map: 1.8.0 - debug: 4.3.2 - gensync: 1.0.0-beta.2 - json5: 2.2.0 - semver: 6.3.0 - source-map: 0.5.7 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/eslint-parser/7.15.0_@babel+core@7.15.0+eslint@7.32.0: - resolution: {integrity: sha512-+gSPtjSBxOZz4Uh8Ggqu7HbfpB8cT1LwW0DnVVLZEJvzXauiD0Di3zszcBkRmfGGrLdYeHUwcflG7i3tr9kQlw==} + /@babel/eslint-parser/7.15.7_@babel+core@7.15.5+eslint@7.32.0: + resolution: {integrity: sha512-yJkHyomClm6A2Xzb8pdAo4HzYMSXFn1O5zrCYvbFP0yQFvHueLedV8WiEno8yJOKStjUXzBZzJFeWQ7b3YMsqQ==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': '>=7.11.0' eslint: '>=7.5.0' dependencies: - '@babel/core': 7.15.0 + '@babel/core': 7.15.5 eslint: 7.32.0 eslint-scope: 5.1.1 eslint-visitor-keys: 2.1.0 semver: 6.3.0 dev: true - /@babel/generator/7.14.8: - resolution: {integrity: sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==} + /@babel/generator/7.15.4: + resolution: {integrity: sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.14.8 + '@babel/types': 7.15.6 jsesc: 2.5.2 source-map: 0.5.7 - dev: false - /@babel/generator/7.15.0: - resolution: {integrity: sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.15.0 - jsesc: 2.5.2 - source-map: 0.5.7 - dev: true - - /@babel/helper-compilation-targets/7.14.5_@babel+core@7.14.8: - resolution: {integrity: sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.14.7 - '@babel/core': 7.14.8 - '@babel/helper-validator-option': 7.14.5 - browserslist: 4.16.6 - semver: 6.3.0 - dev: false - - /@babel/helper-compilation-targets/7.15.0_@babel+core@7.15.0: - resolution: {integrity: sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==} + /@babel/helper-compilation-targets/7.15.4_@babel+core@7.15.5: + resolution: {integrity: sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/compat-data': 7.15.0 - '@babel/core': 7.15.0 + '@babel/core': 7.15.5 '@babel/helper-validator-option': 7.14.5 - browserslist: 4.16.8 + browserslist: 4.17.1 semver: 6.3.0 - dev: true - /@babel/helper-function-name/7.14.5: - resolution: {integrity: sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==} + /@babel/helper-function-name/7.15.4: + resolution: {integrity: sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-get-function-arity': 7.14.5 - '@babel/template': 7.14.5 - '@babel/types': 7.14.8 + '@babel/helper-get-function-arity': 7.15.4 + '@babel/template': 7.15.4 + '@babel/types': 7.15.6 - /@babel/helper-get-function-arity/7.14.5: - resolution: {integrity: sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==} + /@babel/helper-get-function-arity/7.15.4: + resolution: {integrity: sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.14.8 + '@babel/types': 7.15.6 - /@babel/helper-hoist-variables/7.14.5: - resolution: {integrity: sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==} + /@babel/helper-hoist-variables/7.15.4: + resolution: {integrity: sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.14.8 + '@babel/types': 7.15.6 - /@babel/helper-member-expression-to-functions/7.14.7: - resolution: {integrity: sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==} + /@babel/helper-member-expression-to-functions/7.15.4: + resolution: {integrity: sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.14.8 - dev: false + '@babel/types': 7.15.6 - /@babel/helper-member-expression-to-functions/7.15.0: - resolution: {integrity: sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==} + /@babel/helper-module-imports/7.15.4: + resolution: {integrity: sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.15.0 - dev: true + '@babel/types': 7.15.6 - /@babel/helper-module-imports/7.14.5: - resolution: {integrity: sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==} + /@babel/helper-module-transforms/7.15.7: + resolution: {integrity: sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.14.8 - - /@babel/helper-module-transforms/7.14.8: - resolution: {integrity: sha512-RyE+NFOjXn5A9YU1dkpeBaduagTlZ0+fccnIcAGbv1KGUlReBj7utF7oEth8IdIBQPcux0DDgW5MFBH2xu9KcA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-module-imports': 7.14.5 - '@babel/helper-replace-supers': 7.14.5 - '@babel/helper-simple-access': 7.14.8 - '@babel/helper-split-export-declaration': 7.14.5 - '@babel/helper-validator-identifier': 7.14.8 - '@babel/template': 7.14.5 - '@babel/traverse': 7.14.8 - '@babel/types': 7.14.8 + '@babel/helper-module-imports': 7.15.4 + '@babel/helper-replace-supers': 7.15.4 + '@babel/helper-simple-access': 7.15.4 + '@babel/helper-split-export-declaration': 7.15.4 + '@babel/helper-validator-identifier': 7.15.7 + '@babel/template': 7.15.4 + '@babel/traverse': 7.15.4 + '@babel/types': 7.15.6 transitivePeerDependencies: - supports-color - dev: false - /@babel/helper-module-transforms/7.15.0: - resolution: {integrity: sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==} + /@babel/helper-optimise-call-expression/7.15.4: + resolution: {integrity: sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-module-imports': 7.14.5 - '@babel/helper-replace-supers': 7.15.0 - '@babel/helper-simple-access': 7.14.8 - '@babel/helper-split-export-declaration': 7.14.5 - '@babel/helper-validator-identifier': 7.14.9 - '@babel/template': 7.14.5 - '@babel/traverse': 7.15.0 - '@babel/types': 7.15.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-optimise-call-expression/7.14.5: - resolution: {integrity: sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.14.8 + '@babel/types': 7.15.6 /@babel/helper-plugin-utils/7.14.5: resolution: {integrity: sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==} engines: {node: '>=6.9.0'} dev: false - /@babel/helper-replace-supers/7.14.5: - resolution: {integrity: sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==} + /@babel/helper-replace-supers/7.15.4: + resolution: {integrity: sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-member-expression-to-functions': 7.14.7 - '@babel/helper-optimise-call-expression': 7.14.5 - '@babel/traverse': 7.14.8 - '@babel/types': 7.14.8 + '@babel/helper-member-expression-to-functions': 7.15.4 + '@babel/helper-optimise-call-expression': 7.15.4 + '@babel/traverse': 7.15.4 + '@babel/types': 7.15.6 transitivePeerDependencies: - supports-color - dev: false - /@babel/helper-replace-supers/7.15.0: - resolution: {integrity: sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==} + /@babel/helper-simple-access/7.15.4: + resolution: {integrity: sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-member-expression-to-functions': 7.15.0 - '@babel/helper-optimise-call-expression': 7.14.5 - '@babel/traverse': 7.15.0 - '@babel/types': 7.15.0 - transitivePeerDependencies: - - supports-color - dev: true + '@babel/types': 7.15.6 - /@babel/helper-simple-access/7.14.8: - resolution: {integrity: sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==} + /@babel/helper-split-export-declaration/7.15.4: + resolution: {integrity: sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.14.8 + '@babel/types': 7.15.6 - /@babel/helper-split-export-declaration/7.14.5: - resolution: {integrity: sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.14.8 - - /@babel/helper-validator-identifier/7.14.8: - resolution: {integrity: sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==} - engines: {node: '>=6.9.0'} - - /@babel/helper-validator-identifier/7.14.9: - resolution: {integrity: sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==} + /@babel/helper-validator-identifier/7.15.7: + resolution: {integrity: sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==} engines: {node: '>=6.9.0'} /@babel/helper-validator-option/7.14.5: resolution: {integrity: sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==} engines: {node: '>=6.9.0'} - /@babel/helpers/7.14.8: - resolution: {integrity: sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==} + /@babel/helpers/7.15.4: + resolution: {integrity: sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.14.5 - '@babel/traverse': 7.14.8 - '@babel/types': 7.14.8 + '@babel/template': 7.15.4 + '@babel/traverse': 7.15.4 + '@babel/types': 7.15.6 transitivePeerDependencies: - supports-color - dev: false - - /@babel/helpers/7.15.3: - resolution: {integrity: sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.14.5 - '@babel/traverse': 7.15.0 - '@babel/types': 7.15.0 - transitivePeerDependencies: - - supports-color - dev: true /@babel/highlight/7.14.5: resolution: {integrity: sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.14.9 + '@babel/helper-validator-identifier': 7.15.7 chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser/7.14.8: - resolution: {integrity: sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==} + /@babel/parser/7.15.7: + resolution: {integrity: sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==} engines: {node: '>=6.0.0'} hasBin: true - /@babel/parser/7.15.3: - resolution: {integrity: sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==} - engines: {node: '>=6.0.0'} - hasBin: true - dev: true - - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.14.8: + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.15.5: resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.14.8 + '@babel/core': 7.15.5 '@babel/helper-plugin-utils': 7.14.5 dev: false - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.14.8: + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.15.5: resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.14.8 + '@babel/core': 7.15.5 '@babel/helper-plugin-utils': 7.14.5 dev: false - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.14.8: + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.15.5: resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.14.8 + '@babel/core': 7.15.5 '@babel/helper-plugin-utils': 7.14.5 dev: false - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.14.8: + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.15.5: resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.14.8 + '@babel/core': 7.15.5 '@babel/helper-plugin-utils': 7.14.5 dev: false - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.14.8: + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.15.5: resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.14.8 + '@babel/core': 7.15.5 '@babel/helper-plugin-utils': 7.14.5 dev: false - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.14.8: + /@babel/plugin-syntax-jsx/7.14.5: + resolution: {integrity: sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/helper-plugin-utils': 7.14.5 + dev: false + + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.15.5: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.14.8 + '@babel/core': 7.15.5 '@babel/helper-plugin-utils': 7.14.5 dev: false - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.14.8: + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.15.5: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.14.8 + '@babel/core': 7.15.5 '@babel/helper-plugin-utils': 7.14.5 dev: false - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.14.8: + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.15.5: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.14.8 + '@babel/core': 7.15.5 '@babel/helper-plugin-utils': 7.14.5 dev: false - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.14.8: + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.15.5: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.14.8 + '@babel/core': 7.15.5 '@babel/helper-plugin-utils': 7.14.5 dev: false - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.14.8: + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.15.5: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.14.8 + '@babel/core': 7.15.5 '@babel/helper-plugin-utils': 7.14.5 dev: false - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.14.8: + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.15.5: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.14.8 + '@babel/core': 7.15.5 '@babel/helper-plugin-utils': 7.14.5 dev: false - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.14.8: + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.15.5: resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.14.8 + '@babel/core': 7.15.5 '@babel/helper-plugin-utils': 7.14.5 dev: false - /@babel/plugin-transform-modules-commonjs/7.14.5_@babel+core@7.14.8: - resolution: {integrity: sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==} + /@babel/plugin-transform-modules-commonjs/7.15.4_@babel+core@7.15.5: + resolution: {integrity: sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.14.8 - '@babel/helper-module-transforms': 7.14.8 + '@babel/core': 7.15.5 + '@babel/helper-module-transforms': 7.15.7 '@babel/helper-plugin-utils': 7.14.5 - '@babel/helper-simple-access': 7.14.8 + '@babel/helper-simple-access': 7.15.4 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color @@ -584,65 +500,54 @@ packages: /@babel/runtime/7.12.5: resolution: {integrity: sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==} dependencies: - regenerator-runtime: 0.13.7 + regenerator-runtime: 0.13.9 dev: false - /@babel/template/7.14.5: - resolution: {integrity: sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==} + /@babel/runtime/7.15.3: + resolution: {integrity: sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.14.5 - '@babel/parser': 7.14.8 - '@babel/types': 7.14.8 + regenerator-runtime: 0.13.9 + dev: false - /@babel/traverse/7.14.8: - resolution: {integrity: sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg==} + /@babel/template/7.15.4: + resolution: {integrity: sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.14.5 - '@babel/generator': 7.14.8 - '@babel/helper-function-name': 7.14.5 - '@babel/helper-hoist-variables': 7.14.5 - '@babel/helper-split-export-declaration': 7.14.5 - '@babel/parser': 7.14.8 - '@babel/types': 7.14.8 + '@babel/parser': 7.15.7 + '@babel/types': 7.15.6 + + /@babel/traverse/7.15.4: + resolution: {integrity: sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.14.5 + '@babel/generator': 7.15.4 + '@babel/helper-function-name': 7.15.4 + '@babel/helper-hoist-variables': 7.15.4 + '@babel/helper-split-export-declaration': 7.15.4 + '@babel/parser': 7.15.7 + '@babel/types': 7.15.6 debug: 4.3.2 globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: false - - /@babel/traverse/7.15.0: - resolution: {integrity: sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.14.5 - '@babel/generator': 7.15.0 - '@babel/helper-function-name': 7.14.5 - '@babel/helper-hoist-variables': 7.14.5 - '@babel/helper-split-export-declaration': 7.14.5 - '@babel/parser': 7.15.3 - '@babel/types': 7.15.0 - debug: 4.3.2 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/types/7.14.8: - resolution: {integrity: sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.14.8 - to-fast-properties: 2.0.0 /@babel/types/7.15.0: resolution: {integrity: sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.14.9 + '@babel/helper-validator-identifier': 7.15.7 + to-fast-properties: 2.0.0 + dev: false + + /@babel/types/7.15.6: + resolution: {integrity: sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.15.7 to-fast-properties: 2.0.0 - dev: true /@babel/types/7.8.3: resolution: {integrity: sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==} @@ -674,14 +579,14 @@ packages: lodash: 4.17.21 resolve-from: 5.0.0 resolve-global: 1.0.0 - yargs: 17.0.1 + yargs: 17.2.0 dev: true /@commitlint/config-conventional/13.1.0: resolution: {integrity: sha512-zukJXqdr6jtMiVRy3tTHmwgKcUMGfqKDEskRigc5W3k2aYF4gBAtCEjMAJGZgSQE4DMcHeok0pEV2ANmTpb0cw==} engines: {node: '>=v12'} dependencies: - conventional-changelog-conventionalcommits: 4.6.0 + conventional-changelog-conventionalcommits: 4.6.1 dev: true /@commitlint/ensure/13.1.0: @@ -702,7 +607,7 @@ packages: engines: {node: '>=v12'} dependencies: '@commitlint/types': 13.1.0 - chalk: 4.1.1 + chalk: 4.1.2 dev: true /@commitlint/is-ignored/13.1.0: @@ -730,8 +635,8 @@ packages: '@commitlint/execute-rule': 13.0.0 '@commitlint/resolve-extends': 13.0.0 '@commitlint/types': 13.1.0 - chalk: 4.1.1 - cosmiconfig: 7.0.0 + chalk: 4.1.2 + cosmiconfig: 7.0.1 lodash: 4.17.21 resolve-from: 5.0.0 dev: true @@ -746,8 +651,8 @@ packages: engines: {node: '>=v12'} dependencies: '@commitlint/types': 13.1.0 - conventional-changelog-angular: 5.0.12 - conventional-commits-parser: 3.2.1 + conventional-changelog-angular: 5.0.13 + conventional-commits-parser: 3.2.2 dev: true /@commitlint/read/13.1.0: @@ -797,7 +702,19 @@ packages: resolution: {integrity: sha512-zcVjuT+OfKt8h91vhBxt05RMcTGEx6DM7Q9QZeuMbXFk6xgbsSEDMMapbJPA1bCZ81fa/1OQBijSYPrKvtt06g==} engines: {node: '>=v12'} dependencies: - chalk: 4.1.1 + chalk: 4.1.2 + dev: true + + /@cspotcode/source-map-consumer/0.8.0: + resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} + engines: {node: '>= 12'} + dev: true + + /@cspotcode/source-map-support/0.6.1: + resolution: {integrity: sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==} + engines: {node: '>=12'} + dependencies: + '@cspotcode/source-map-consumer': 0.8.0 dev: true /@eslint/eslintrc/0.4.3: @@ -826,12 +743,12 @@ packages: /@hapi/accept/5.0.2: resolution: {integrity: sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw==} dependencies: - '@hapi/boom': 9.1.3 + '@hapi/boom': 9.1.4 '@hapi/hoek': 9.2.0 dev: false - /@hapi/boom/9.1.3: - resolution: {integrity: sha512-RlrGyZ603hE/eRTZtTltocRm50HHmrmL3kGOP0SQ9MasazlW1mt/fkv4C5P/6rnpFXjwld/POFX1C8tMZE3ldg==} + /@hapi/boom/9.1.4: + resolution: {integrity: sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==} dependencies: '@hapi/hoek': 9.2.0 dev: false @@ -840,8 +757,8 @@ packages: resolution: {integrity: sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug==} dev: false - /@headlessui/react/1.3.0_react-dom@17.0.2+react@17.0.2: - resolution: {integrity: sha512-2gqTO6BQ3Jr8vDX1B67n1gl6MGKTt6DBmR+H0qxwj0gTMnR2+Qpktj8alRWxsZBODyOiBb77QSQpE/6gG3MX4Q==} + /@headlessui/react/1.4.1_react-dom@17.0.2+react@17.0.2: + resolution: {integrity: sha512-gL6Ns5xQM57cZBzX6IVv6L7nsam8rDEpRhs5fg28SN64ikfmuuMgunc+Rw5C1cMScnvFM+cz32ueVrlSFEVlSg==} engines: {node: '>=10'} peerDependencies: react: ^16 || ^17 || ^18 @@ -886,13 +803,13 @@ packages: resolution: {integrity: sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/core': 7.14.8 + '@babel/core': 7.15.5 '@jest/types': 26.6.2 babel-plugin-istanbul: 6.0.0 - chalk: 4.1.1 + chalk: 4.1.2 convert-source-map: 1.8.0 fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.6 + graceful-fs: 4.2.8 jest-haste-map: 26.6.2 jest-regex-util: 26.0.0 jest-util: 26.6.2 @@ -911,9 +828,9 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.3 '@types/istanbul-reports': 3.0.1 - '@types/node': 14.17.6 + '@types/node': 16.9.6 '@types/yargs': 15.0.14 - chalk: 4.1.1 + chalk: 4.1.2 dev: false /@mapbox/node-pre-gyp/1.0.5: @@ -923,18 +840,313 @@ packages: detect-libc: 1.0.3 https-proxy-agent: 5.0.0 make-dir: 3.1.0 - node-fetch: 2.6.1 + node-fetch: 2.6.5 nopt: 5.0.0 npmlog: 4.1.2 rimraf: 3.0.2 semver: 7.3.5 - tar: 6.1.0 + tar: 6.1.11 transitivePeerDependencies: - supports-color dev: false - /@nestjs/common/8.0.4_e911b02ebc86a0e92191a7b133b2fcd0: - resolution: {integrity: sha512-qgQTHH+0y64btdnqSuQSo8Ou7Okb6+8l2StjDOlzaPK36Ln1uBLoa6jQnwqxlAHUHqEocmraL1V5+wnSYz2CRA==} + /@mikro-orm/cli/4.5.9_befbc5d70fc06112c68f19bb2856890b: + resolution: {integrity: sha512-UiT82KezvYw2J87t19NvIGgtwVZfCJJLoCCuiHcE0VejptnFDpigAYP4iGZULCDdW1kVr2SJYEbwOqcUQIZ+jw==} + engines: {node: '>= 10.13.0'} + hasBin: true + peerDependencies: + '@mikro-orm/core': ^4.0.0 + '@mikro-orm/mariadb': ^4.0.0 + '@mikro-orm/mongodb': ^4.0.0 + '@mikro-orm/mysql': ^4.0.0 + '@mikro-orm/postgresql': ^4.0.0 + '@mikro-orm/sqlite': ^4.0.0 + peerDependenciesMeta: + '@mikro-orm/mariadb': + optional: true + '@mikro-orm/mongodb': + optional: true + '@mikro-orm/mysql': + optional: true + '@mikro-orm/postgresql': + optional: true + '@mikro-orm/sqlite': + optional: true + dependencies: + '@mikro-orm/core': 4.5.9_40bc058361f12b4a6a81884bbe496c64 + '@mikro-orm/entity-generator': 4.5.9_c5924a60946be4b9f3a0784c71d54059 + '@mikro-orm/knex': 4.5.9_c83947ec43c319be4518f424aba30af0 + '@mikro-orm/migrations': 4.5.9_d0d358c2e5be95607e9d3bd64a1ffd2d + '@mikro-orm/postgresql': 4.5.9_c5924a60946be4b9f3a0784c71d54059 + ansi-colors: 4.1.1 + cli-table3: 0.6.0 + fs-extra: 9.1.0 + tsconfig-paths: 3.9.0 + yargonaut: 1.1.4 + yargs: 15.4.1 + transitivePeerDependencies: + - mssql + - mysql + - mysql2 + - pg + - sqlite3 + - supports-color + dev: true + + /@mikro-orm/core/4.5.9_40bc058361f12b4a6a81884bbe496c64: + resolution: {integrity: sha512-kG7nnchwhtDNjsAJ7Lau9ZsyNQo2rBqZg+6T54A/c6v4/yFRltbg3gv6eMd4vefH6PS2AKa71H5L49P105qYmQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@mikro-orm/entity-generator': ^4.0.0 + '@mikro-orm/mariadb': ^4.0.0 + '@mikro-orm/migrations': ^4.0.0 + '@mikro-orm/mongodb': ^4.0.0 + '@mikro-orm/mysql': ^4.0.0 + '@mikro-orm/postgresql': ^4.0.0 + '@mikro-orm/sqlite': ^4.0.0 + peerDependenciesMeta: + '@mikro-orm/entity-generator': + optional: true + '@mikro-orm/mariadb': + optional: true + '@mikro-orm/migrations': + optional: true + '@mikro-orm/mongodb': + optional: true + '@mikro-orm/mysql': + optional: true + '@mikro-orm/postgresql': + optional: true + '@mikro-orm/sqlite': + optional: true + dependencies: + '@mikro-orm/migrations': 4.5.9_@mikro-orm+core@4.5.9 + '@mikro-orm/postgresql': 4.5.9_c5924a60946be4b9f3a0784c71d54059 + ansi-colors: 4.1.1 + clone: 2.1.2 + dotenv: 8.2.0 + escaya: 0.0.61 + fs-extra: 9.1.0 + globby: 11.0.3 + reflect-metadata: 0.1.13 + strip-json-comments: 3.1.1 + dev: false + + /@mikro-orm/entity-generator/4.5.9_c5924a60946be4b9f3a0784c71d54059: + resolution: {integrity: sha512-KWf7ZE4eFaGGjtHUiqGXTrbTB7IUJF0bKudqUaIK0YM/bu3fG4nFaF++EFe85tgerXLIzWO2aAuix+24AFC2Bw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@mikro-orm/core': ^4.0.0 + dependencies: + '@mikro-orm/core': 4.5.9_40bc058361f12b4a6a81884bbe496c64 + '@mikro-orm/knex': 4.5.9_c83947ec43c319be4518f424aba30af0 + fs-extra: 9.1.0 + transitivePeerDependencies: + - '@mikro-orm/migrations' + - mssql + - mysql + - mysql2 + - pg + - sqlite3 + - supports-color + dev: true + + /@mikro-orm/knex/4.5.9_c5924a60946be4b9f3a0784c71d54059: + resolution: {integrity: sha512-6dVwTKV3LMsEWDdYu5AlBSS4/0BaqEXTgAu4Ryyl95r7G+Y717RXI3fE9snRNE3uJU44Pi0O3TuhFYhdCb9arw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@mikro-orm/core': ^4.0.0 + '@mikro-orm/entity-generator': ^4.0.0 + '@mikro-orm/migrations': ^4.0.0 + mssql: ^7.0.0 + mysql: ^2.18.1 + mysql2: ^2.1.0 + pg: ^8.0.3 + sqlite3: ^5.0.0 + peerDependenciesMeta: + '@mikro-orm/entity-generator': + optional: true + '@mikro-orm/migrations': + optional: true + mssql: + optional: true + mysql: + optional: true + mysql2: + optional: true + pg: + optional: true + sqlite3: + optional: true + dependencies: + '@mikro-orm/core': 4.5.9_40bc058361f12b4a6a81884bbe496c64 + '@mikro-orm/migrations': 4.5.9_@mikro-orm+core@4.5.9 + fs-extra: 9.1.0 + knex: 0.21.19 + sqlstring: 2.3.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@mikro-orm/knex/4.5.9_c83947ec43c319be4518f424aba30af0: + resolution: {integrity: sha512-6dVwTKV3LMsEWDdYu5AlBSS4/0BaqEXTgAu4Ryyl95r7G+Y717RXI3fE9snRNE3uJU44Pi0O3TuhFYhdCb9arw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@mikro-orm/core': ^4.0.0 + '@mikro-orm/entity-generator': ^4.0.0 + '@mikro-orm/migrations': ^4.0.0 + mssql: ^7.0.0 + mysql: ^2.18.1 + mysql2: ^2.1.0 + pg: ^8.0.3 + sqlite3: ^5.0.0 + peerDependenciesMeta: + '@mikro-orm/entity-generator': + optional: true + '@mikro-orm/migrations': + optional: true + mssql: + optional: true + mysql: + optional: true + mysql2: + optional: true + pg: + optional: true + sqlite3: + optional: true + dependencies: + '@mikro-orm/core': 4.5.9_40bc058361f12b4a6a81884bbe496c64 + '@mikro-orm/entity-generator': 4.5.9_c5924a60946be4b9f3a0784c71d54059 + '@mikro-orm/migrations': 4.5.9_d0d358c2e5be95607e9d3bd64a1ffd2d + fs-extra: 9.1.0 + knex: 0.21.19 + sqlstring: 2.3.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@mikro-orm/knex/4.5.9_d03aa2ba3badef4bd7cda1ae748ed3e9: + resolution: {integrity: sha512-6dVwTKV3LMsEWDdYu5AlBSS4/0BaqEXTgAu4Ryyl95r7G+Y717RXI3fE9snRNE3uJU44Pi0O3TuhFYhdCb9arw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@mikro-orm/core': ^4.0.0 + '@mikro-orm/entity-generator': ^4.0.0 + '@mikro-orm/migrations': ^4.0.0 + mssql: ^7.0.0 + mysql: ^2.18.1 + mysql2: ^2.1.0 + pg: ^8.0.3 + sqlite3: ^5.0.0 + peerDependenciesMeta: + '@mikro-orm/entity-generator': + optional: true + '@mikro-orm/migrations': + optional: true + mssql: + optional: true + mysql: + optional: true + mysql2: + optional: true + pg: + optional: true + sqlite3: + optional: true + dependencies: + '@mikro-orm/core': 4.5.9_40bc058361f12b4a6a81884bbe496c64 + '@mikro-orm/migrations': 4.5.9_@mikro-orm+core@4.5.9 + fs-extra: 9.1.0 + knex: 0.21.19_pg@8.6.0 + pg: 8.6.0 + sqlstring: 2.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@mikro-orm/migrations/4.5.9_@mikro-orm+core@4.5.9: + resolution: {integrity: sha512-lOCPkhc4V+HzVtTfKUVqX5msdfxvmY9wvPTMbhdIJ0Wp4C78T/YrXy9FD9EUzrY4Sfu6QKgTG7A509GjPjhgoQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@mikro-orm/core': ^4.0.0 + dependencies: + '@mikro-orm/core': 4.5.9_40bc058361f12b4a6a81884bbe496c64 + '@mikro-orm/knex': 4.5.9_c5924a60946be4b9f3a0784c71d54059 + '@types/umzug': 2.3.0 + fs-extra: 9.1.0 + knex: 0.21.19 + umzug: 2.3.0 + transitivePeerDependencies: + - '@mikro-orm/entity-generator' + - mssql + - mysql + - mysql2 + - pg + - sqlite3 + - supports-color + dev: true + + /@mikro-orm/migrations/4.5.9_d0d358c2e5be95607e9d3bd64a1ffd2d: + resolution: {integrity: sha512-lOCPkhc4V+HzVtTfKUVqX5msdfxvmY9wvPTMbhdIJ0Wp4C78T/YrXy9FD9EUzrY4Sfu6QKgTG7A509GjPjhgoQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@mikro-orm/core': ^4.0.0 + dependencies: + '@mikro-orm/core': 4.5.9_40bc058361f12b4a6a81884bbe496c64 + '@mikro-orm/knex': 4.5.9_c83947ec43c319be4518f424aba30af0 + '@types/umzug': 2.3.0 + fs-extra: 9.1.0 + knex: 0.21.19 + umzug: 2.3.0 + transitivePeerDependencies: + - '@mikro-orm/entity-generator' + - mssql + - mysql + - mysql2 + - pg + - sqlite3 + - supports-color + dev: true + + /@mikro-orm/nestjs/4.3.0_f22e743cdc173850f1d406f48d8cf837: + resolution: {integrity: sha512-YEy3Oe0cKNPbRBujQT/JBpHKo05u0ns25lbOeBEvjWhs7/6+S5G5NGruebaRrVbzqe6mBn9fQNCBsyeRpAogKQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@mikro-orm/core': ^4.0.0 + '@nestjs/common': ^7.0.0||^8.0.0 + '@nestjs/core': ^7.0.0||^8.0.0 + dependencies: + '@mikro-orm/core': 4.5.9_40bc058361f12b4a6a81884bbe496c64 + '@nestjs/common': 8.0.7_901c84031ef2d280d7bac34f7c776879 + '@nestjs/core': 8.0.7_@nestjs+common@8.0.7+rxjs@7.3.0 + dev: false + + /@mikro-orm/postgresql/4.5.9_c5924a60946be4b9f3a0784c71d54059: + resolution: {integrity: sha512-hIXJlPTmf1NUqK8kqeo33qdaXeVlQQOQI03wm8Mfv+mQ0efNZ6VtQnx27tSi5rIJHhVXEzq4ap0CUMxgj/5EQA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@mikro-orm/core': ^4.0.0 + dependencies: + '@mikro-orm/core': 4.5.9_40bc058361f12b4a6a81884bbe496c64 + '@mikro-orm/knex': 4.5.9_d03aa2ba3badef4bd7cda1ae748ed3e9 + pg: 8.6.0 + transitivePeerDependencies: + - '@mikro-orm/entity-generator' + - '@mikro-orm/migrations' + - mssql + - mysql + - mysql2 + - pg-native + - sqlite3 + - supports-color + dev: false + + /@napi-rs/triples/1.0.3: + resolution: {integrity: sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA==} + dev: false + + /@nestjs/common/8.0.7_901c84031ef2d280d7bac34f7c776879: + resolution: {integrity: sha512-p9dF6rFE8SYIUphzTCtQ2FoE1NVsAnX5jOPsmRvP0DlleKSfE/SizzkM6YmVUM98yyOvlGuHGV1X0NoSP3azCg==} peerDependencies: cache-manager: '*' class-transformer: '*' @@ -949,20 +1161,19 @@ packages: class-validator: optional: true dependencies: - axios: 0.21.1 + axios: 0.21.4 class-transformer: 0.4.0 class-validator: 0.13.1 iterare: 1.2.1 - reflect-metadata: 0.1.13 - rxjs: 7.2.0 - tslib: 2.3.0 + rxjs: 7.3.0 + tslib: 2.3.1 uuid: 8.3.2 transitivePeerDependencies: - debug dev: false - /@nestjs/core/8.0.4_e4988ec8350f50541cb1b028c87076a8: - resolution: {integrity: sha512-1clCaGtVZTE7/tEvVj1FLwgFTHIlaCvwfPSMgxhGalTrx+cM8MoqEGLWklqS5bS+YfQscI1+Gn3OLdWlRcGbRQ==} + /@nestjs/core/8.0.7_@nestjs+common@8.0.7+rxjs@7.3.0: + resolution: {integrity: sha512-A8n+rw8C3yp5hpvmHeQ+x7NjPOe+m/8ITI2tiv8cJeOjPaXn2nhViSB7uwKaNUP1MBgh/7y0HVafFBHzPBZj3g==} requiresBuild: true peerDependencies: '@nestjs/common': ^8.0.0 @@ -979,66 +1190,66 @@ packages: '@nestjs/websockets': optional: true dependencies: - '@nestjs/common': 8.0.4_e911b02ebc86a0e92191a7b133b2fcd0 + '@nestjs/common': 8.0.7_901c84031ef2d280d7bac34f7c776879 '@nuxtjs/opencollective': 0.3.2 fast-safe-stringify: 2.0.8 iterare: 1.2.1 object-hash: 2.2.0 path-to-regexp: 3.2.0 - reflect-metadata: 0.1.13 - rxjs: 7.2.0 - tslib: 2.3.0 + rxjs: 7.3.0 + tslib: 2.3.1 uuid: 8.3.2 dev: false - /@nestjs/jwt/8.0.0_@nestjs+common@8.0.4: + /@nestjs/jwt/8.0.0_@nestjs+common@8.0.7: resolution: {integrity: sha512-fz2LQgYY2zmuD8S+8UE215anwKyXlnB/1FwJQLVR47clNfMeFMK8WCxmn6xdPhF5JKuV1crO6FVabb1qWzDxqQ==} peerDependencies: '@nestjs/common': ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@nestjs/common': 8.0.4_e911b02ebc86a0e92191a7b133b2fcd0 + '@nestjs/common': 8.0.7_901c84031ef2d280d7bac34f7c776879 '@types/jsonwebtoken': 8.5.4 jsonwebtoken: 8.5.1 dev: false - /@nestjs/passport/8.0.0_8ffbbd1dfbd3e60a0a9ef125c15ec754: - resolution: {integrity: sha512-pIuOA+dEgOW0hg/qVV9uegitUHN1dKY8nEZhOtwj9FErJfCVZpQce8OH06n7yngqGTzvkkjjr/TzfuA1o8/A5A==} + /@nestjs/passport/8.0.1_38aa9bfad4b7f471d8e32e88cc96339b: + resolution: {integrity: sha512-vn/ZJLXQKvSf9D0BvEoNFJLfzl9AVqfGtDyQMfWDLbaNpoEB2FyeaHGxdiX6H71oLSrQV78c/yuhfantzwdjdg==} peerDependencies: '@nestjs/common': ^6.0.0 || ^7.0.0 || ^8.0.0 passport: ^0.4.0 dependencies: - '@nestjs/common': 8.0.4_e911b02ebc86a0e92191a7b133b2fcd0 - passport: 0.4.1 + '@nestjs/common': 8.0.7_901c84031ef2d280d7bac34f7c776879 + passport: 0.5.0 dev: false - /@nestjs/platform-fastify/8.0.4_dbb23fa745e40b87eda38a58a66b6bd5: - resolution: {integrity: sha512-fseMiMf2eDYdREFRzZnVwIPrhvVHG42UnsX5FSqQlWfECe5NZ7ErOnKh537QgPS+VOQhuhsyiQkArPWrBDbNSg==} + /@nestjs/platform-fastify/8.0.7_6ccd7f020aae0bb10815f91d7f482355: + resolution: {integrity: sha512-Ix1RoLJkR+jckeyTohZgt034ItM24G4LHlIhcNTZl893OXoo5cJEiWw22kvC7V9JG485h21eXPcL2ksnhZDKkg==} peerDependencies: '@nestjs/common': ^8.0.0 '@nestjs/core': ^8.0.0 dependencies: - '@nestjs/common': 8.0.4_e911b02ebc86a0e92191a7b133b2fcd0 - '@nestjs/core': 8.0.4_e4988ec8350f50541cb1b028c87076a8 - fastify: 3.19.1 + '@nestjs/common': 8.0.7_901c84031ef2d280d7bac34f7c776879 + '@nestjs/core': 8.0.7_@nestjs+common@8.0.7+rxjs@7.3.0 + fastify: 3.20.2 fastify-cors: 6.0.2 - fastify-formbody: 5.0.0 - light-my-request: 4.4.1 + fastify-formbody: 5.1.0 + light-my-request: 4.4.4 middie: 5.3.0 path-to-regexp: 3.2.0 - tslib: 2.3.0 + tslib: 2.3.1 transitivePeerDependencies: - supports-color dev: false - /@nestjs/schedule/1.0.0_4d72478bf80ccc07ffec9357846306a9: - resolution: {integrity: sha512-9eF3Lv5youQr3iRmRkC859CYy3wbbiFNJlqH6W589TweHdpO5GfwlanEoMTrwDYvo1QMXjIvxtK7ROOf5XWJgw==} + /@nestjs/schedule/1.0.1_6ccd7f020aae0bb10815f91d7f482355: + resolution: {integrity: sha512-EU2tB4rxuEgum8JlorAFvXkU982EYZm/IBa7n6kgkyps5BbxQSFf7iR1CLkP9zODO9ApZTWk5z3q9L3O7vrkoQ==} peerDependencies: '@nestjs/common': ^6.10.11 || ^7.0.0 || ^8.0.0 + '@nestjs/core': ^7.0.0 || ^8.0.0 reflect-metadata: ^0.1.12 dependencies: - '@nestjs/common': 8.0.4_e911b02ebc86a0e92191a7b133b2fcd0 + '@nestjs/common': 8.0.7_901c84031ef2d280d7bac34f7c776879 + '@nestjs/core': 8.0.7_@nestjs+common@8.0.7+rxjs@7.3.0 cron: 1.7.2 - reflect-metadata: 0.1.13 uuid: 8.3.2 dev: false @@ -1046,10 +1257,18 @@ packages: resolution: {integrity: sha512-yZfKh2U6R9tEYyNUrs2V3SBvCMufkJ07xMH5uWy8wqcl5gAXoEw6A/1LDqwX3j7pUutF9d1ZxpdGDA3Uag+aQQ==} dev: false + /@next/env/11.1.2: + resolution: {integrity: sha512-+fteyVdQ7C/OoulfcF6vd1Yk0FEli4453gr8kSFbU8sKseNSizYq6df5MKz/AjwLptsxrUeIkgBdAzbziyJ3mA==} + dev: false + /@next/polyfill-module/11.0.1: resolution: {integrity: sha512-Cjs7rrKCg4CF4Jhri8PCKlBXhszTfOQNl9AjzdNy4K5jXFyxyoSzuX2rK4IuoyE+yGp5A3XJCBEmOQ4xbUp9Mg==} dev: false + /@next/polyfill-module/11.1.2: + resolution: {integrity: sha512-xZmixqADM3xxtqBV0TpAwSFzWJP0MOQzRfzItHXf1LdQHWb0yofHHC+7eOrPFic8+ZGz5y7BdPkkgR1S25OymA==} + dev: false + /@next/react-dev-overlay/11.0.1_react-dom@17.0.2+react@17.0.2: resolution: {integrity: sha512-lvUjMVpLsgzADs9Q8wtC5LNqvfdN+M0BDMSrqr04EDWAyyX0vURHC9hkvLbyEYWyh+WW32pwjKBXdkMnJhoqMg==} peerDependencies: @@ -1071,6 +1290,25 @@ packages: strip-ansi: 6.0.0 dev: false + /@next/react-dev-overlay/11.1.2: + resolution: {integrity: sha512-rDF/mGY2NC69mMg2vDqzVpCOlWqnwPUXB2zkARhvknUHyS6QJphPYv9ozoPJuoT/QBs49JJd9KWaAzVBvq920A==} + peerDependencies: + react: ^17.0.2 + react-dom: ^17.0.2 + dependencies: + '@babel/code-frame': 7.12.11 + anser: 1.4.9 + chalk: 4.0.0 + classnames: 2.2.6 + css.escape: 1.5.1 + data-uri-to-buffer: 3.0.1 + platform: 1.3.6 + shell-quote: 1.7.2 + source-map: 0.8.0-beta.0 + stacktrace-parser: 0.1.10 + strip-ansi: 6.0.0 + dev: false + /@next/react-refresh-utils/11.0.1_react-refresh@0.8.3: resolution: {integrity: sha512-K347DM6Z7gBSE+TfUaTTceWvbj0B6iNAsFZXbFZOlfg3uyz2sbKpzPYYFocCc27yjLaS8OfR8DEdS2mZXi8Saw==} peerDependencies: @@ -1083,6 +1321,56 @@ packages: react-refresh: 0.8.3 dev: false + /@next/react-refresh-utils/11.1.2_react-refresh@0.8.3: + resolution: {integrity: sha512-hsoJmPfhVqjZ8w4IFzoo8SyECVnN+8WMnImTbTKrRUHOVJcYMmKLL7xf7T0ft00tWwAl/3f3Q3poWIN2Ueql/Q==} + peerDependencies: + react-refresh: 0.8.3 + webpack: ^4 || ^5 + peerDependenciesMeta: + webpack: + optional: true + dependencies: + react-refresh: 0.8.3 + dev: false + + /@next/swc-darwin-arm64/11.1.2: + resolution: {integrity: sha512-hZuwOlGOwBZADA8EyDYyjx3+4JGIGjSHDHWrmpI7g5rFmQNltjlbaefAbiU5Kk7j3BUSDwt30quJRFv3nyJQ0w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + dev: false + optional: true + + /@next/swc-darwin-x64/11.1.2: + resolution: {integrity: sha512-PGOp0E1GisU+EJJlsmJVGE+aPYD0Uh7zqgsrpD3F/Y3766Ptfbe1lEPPWnRDl+OzSSrSrX1lkyM/Jlmh5OwNvA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + dev: false + optional: true + + /@next/swc-linux-x64-gnu/11.1.2: + resolution: {integrity: sha512-YcDHTJjn/8RqvyJVB6pvEKXihDcdrOwga3GfMv/QtVeLphTouY4BIcEUfrG5+26Nf37MP1ywN3RRl1TxpurAsQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + dev: false + optional: true + + /@next/swc-win32-x64-msvc/11.1.2: + resolution: {integrity: sha512-e/pIKVdB+tGQYa1cW3sAeHm8gzEri/HYLZHT4WZojrUxgWXqx8pk7S7Xs47uBcFTqBDRvK3EcQpPLf3XdVsDdg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + dev: false + optional: true + + /@node-rs/helper/1.2.1: + resolution: {integrity: sha512-R5wEmm8nbuQU0YGGmYVjEc0OHtYsuXdpRG+Ut/3wZ9XAvQWyThN08bTh2cBJgoZxHQUPtvRfeQuxcAgLuiBISg==} + dependencies: + '@napi-rs/triples': 1.0.3 + dev: false + /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1099,64 +1387,19 @@ packages: engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.11.1 + fastq: 1.13.0 /@nuxtjs/opencollective/0.3.2: resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} engines: {node: '>=8.0.0', npm: '>=5.0.0'} hasBin: true dependencies: - chalk: 4.1.1 + chalk: 4.1.2 consola: 2.15.3 - node-fetch: 2.6.1 + node-fetch: 2.6.5 dev: false - /@prisma/client/2.27.0_prisma@2.27.0: - resolution: {integrity: sha512-Sh2b1M8MGbOHbwG1FEqdWTUCrEX3p7gt2e7gpaBWou8yTIJvP1UZ4YlHgpuUcR1q4pEIR/JTZJeQk2l4iDyRBQ==} - engines: {node: '>=12.2'} - requiresBuild: true - peerDependencies: - prisma: '*' - peerDependenciesMeta: - prisma: - optional: true - dependencies: - '@prisma/engines-version': 2.27.0-43.cdba6ec525e0213cce26f8e4bb23cf556d1479bb - prisma: 2.27.0 - dev: false - - /@prisma/engines-version/2.27.0-43.cdba6ec525e0213cce26f8e4bb23cf556d1479bb: - resolution: {integrity: sha512-pwOsYdzw8+cwKlUrCzasiRh96RhNuJ/QcKr0HwjxxlUWTmbEayDKjqRRz5fsUYIpSv5fW1B3SsbzHOqVtFZ6XQ==} - dev: false - - /@prisma/engines/2.27.0-43.cdba6ec525e0213cce26f8e4bb23cf556d1479bb: - resolution: {integrity: sha512-AIbIhAxmd2CHZO5XzQTPrfk+Tp/5eoNoSledOG3yc6Dk97siLvnBuSEv7prggUbedCufDwZLAvwxV4PEw3zOlQ==} - requiresBuild: true - dev: true - - /@ryanke/eslint-config/1.0.1_8ad29308127fedc8195f7a9fb78cb9ae: - resolution: {integrity: sha512-P2mMdVdOrt+nSiGxARuZVaSMJ2etmqrxwwNyO87J8APBooPRQWsP5LtQ1liD2g8lI0c2tXL8C11zaey6yf9+vA==} - peerDependencies: - '@typescript-eslint/eslint-plugin': '>=4' - eslint: '>=7' - eslint-plugin-react: '>=7' - eslint-plugin-react-hooks: '>=4' - eslint-plugin-unicorn: '>=35' - typescript: '>=4' - dependencies: - '@typescript-eslint/eslint-plugin': 4.29.3_eslint@7.32.0+typescript@4.3.5 - '@typescript-eslint/parser': 4.29.3_eslint@7.32.0+typescript@4.3.5 - eslint: 7.32.0 - eslint-config-prettier: 8.3.0_eslint@7.32.0 - eslint-plugin-react: 7.24.0_eslint@7.32.0 - eslint-plugin-react-hooks: 4.2.0_eslint@7.32.0 - eslint-plugin-unicorn: 35.0.0_eslint@7.32.0 - typescript: 4.3.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@ryanke/venera/0.0.2_e9f3d709c367337f0d885b75ad90626b: + /@ryanke/venera/0.0.2_class-validator@0.13.1: resolution: {integrity: sha512-EfT55TubMsI3SDLH9S8nDGPsuZlWom0DB9jn+AUdBYQWqZJVKRs5xXtePGo8NDPJ6Jk31q+AM3uNXFkKZXFTHw==} peerDependencies: class-validator: ^0.13.1 @@ -1165,29 +1408,56 @@ packages: camel-case: 4.1.2 class-transformer: 0.4.0 class-validator: 0.13.1 - comment-json: 4.1.0 + comment-json: 4.1.1 constant-case: 3.0.4 esbuild-jest: 0.5.0 find-up: 5.0.0 flat: 5.0.2 merge: 2.1.1 minimist: 1.2.5 - reflect-metadata: 0.1.13 yaml: 1.10.2 transitivePeerDependencies: - esbuild - supports-color dev: false - /@tokenizer/token/0.1.1: - resolution: {integrity: sha512-XO6INPbZCxdprl+9qa/AAbFFOMzzwqYxpjPgLICrMD6C2FCw6qfJOPcBk6JqqPLSaZ/Qx87qn4rpPmPMwaAK6w==} + /@sindresorhus/is/0.14.0: + resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} + engines: {node: '>=6'} + dev: true + + /@szmarczak/http-timer/1.1.2: + resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} + engines: {node: '>=6'} + dependencies: + defer-to-connect: 1.1.3 + dev: true + + /@tokenizer/token/0.3.0: + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} dev: false - /@types/babel__core/7.1.15: - resolution: {integrity: sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew==} + /@tsconfig/node10/1.0.8: + resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==} + dev: true + + /@tsconfig/node12/1.0.9: + resolution: {integrity: sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==} + dev: true + + /@tsconfig/node14/1.0.1: + resolution: {integrity: sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==} + dev: true + + /@tsconfig/node16/1.0.2: + resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==} + dev: true + + /@types/babel__core/7.1.16: + resolution: {integrity: sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==} dependencies: - '@babel/parser': 7.14.8 - '@babel/types': 7.14.8 + '@babel/parser': 7.15.7 + '@babel/types': 7.15.6 '@types/babel__generator': 7.6.3 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.14.2 @@ -1196,45 +1466,55 @@ packages: /@types/babel__generator/7.6.3: resolution: {integrity: sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==} dependencies: - '@babel/types': 7.14.8 + '@babel/types': 7.15.6 dev: false /@types/babel__template/7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.14.8 - '@babel/types': 7.14.8 + '@babel/parser': 7.15.7 + '@babel/types': 7.15.6 dev: false /@types/babel__traverse/7.14.2: resolution: {integrity: sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==} dependencies: - '@babel/types': 7.14.8 + '@babel/types': 7.15.6 dev: false /@types/bcrypt/5.0.0: resolution: {integrity: sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw==} dependencies: - '@types/node': 14.17.5 + '@types/node': 16.10.1 + dev: true + + /@types/bluebird/3.5.36: + resolution: {integrity: sha512-HBNx4lhkxN7bx6P0++W8E289foSu8kO8GCk2unhuVggO+cE7rh9DhZUyPhUxNRG9m+5B5BTKxZQ5ZP92x/mx9Q==} dev: true /@types/body-parser/1.19.1: resolution: {integrity: sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==} dependencies: '@types/connect': 3.4.35 - '@types/node': 14.17.5 + '@types/node': 16.9.6 dev: true /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 14.17.5 + '@types/node': 16.9.6 + dev: true + + /@types/continuation-local-storage/3.2.3: + resolution: {integrity: sha512-4LYeWblV+6puK9tFGM7Zr4OLZkVXmaL7hUK6/wHwbfwM+q7v+HZyBWTXkNOiC9GqOxv7ehhi5TMCbebZWeVYtw==} + dependencies: + '@types/node': 16.10.1 dev: true /@types/express-serve-static-core/4.17.24: resolution: {integrity: sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==} dependencies: - '@types/node': 14.17.5 + '@types/node': 16.9.6 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true @@ -1251,7 +1531,7 @@ packages: /@types/graceful-fs/4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 14.17.6 + '@types/node': 16.9.6 dev: false /@types/istanbul-lib-coverage/2.0.3: @@ -1274,17 +1554,32 @@ packages: resolution: {integrity: sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==} dev: true + /@types/json5/0.0.29: + resolution: {integrity: sha1-7ihweulOEdK4J7y+UnC86n8+ce4=} + dev: true + /@types/jsonwebtoken/8.5.4: resolution: {integrity: sha512-4L8msWK31oXwdtC81RmRBAULd0ShnAHjBuKT9MRQpjP0piNrZdXyTRcKY9/UIfhGeKIT4PvF5amOOUbbT/9Wpg==} dependencies: - '@types/node': 14.17.5 + '@types/node': 16.9.6 + dev: false - /@types/luxon/1.27.1: - resolution: {integrity: sha512-cPiXpOvPFDr2edMnOXlz3UBDApwUfR+cpizvxCy0n3vp9bz/qe8BWzHPIEFcy+ogUOyjKuCISgyq77ELZPmkkg==} + /@types/jsonwebtoken/8.5.5: + resolution: {integrity: sha512-OGqtHQ7N5/Ap/TUwO6IgHDuLiAoTmHhGpNvgkCm/F4N6pKzx/RBSfr2OXZSwC6vkfnsEdb6+7DNZVtiXiwdwFw==} + dependencies: + '@types/node': 16.9.6 dev: true - /@types/mime-types/2.1.0: - resolution: {integrity: sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=} + /@types/lodash/4.14.175: + resolution: {integrity: sha512-XmdEOrKQ8a1Y/yxQFOMbC47G/V2VDO1GvMRnl4O75M4GW/abC5tnfzadQYkqEveqRM1dEJGFFegfPNA2vvx2iw==} + dev: true + + /@types/luxon/2.0.4: + resolution: {integrity: sha512-l3xuhmyF2kBldy15SeY6d6HbK2BacEcSK1qTF1ISPtPHr29JH0C1fndz9ExXLKpGl0J6pZi+dGp1i5xesMt60Q==} + dev: true + + /@types/mime-types/2.1.1: + resolution: {integrity: sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw==} dev: true /@types/mime/1.3.2: @@ -1295,20 +1590,23 @@ packages: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/ms/0.7.31: - resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + /@types/mongodb/4.0.7: + resolution: {integrity: sha512-lPUYPpzA43baXqnd36cZ9xxorprybxXDzteVKCPAdp14ppHtFJHnXYvNpmBvtMUTb5fKXVv6sVbzo1LHkWhJlw==} + deprecated: mongodb provides its own types. @types/mongodb is no longer needed. + dependencies: + mongodb: 4.1.2 dev: true /@types/node/13.13.52: resolution: {integrity: sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==} dev: false - /@types/node/14.17.5: - resolution: {integrity: sha512-bjqH2cX/O33jXT/UmReo2pM7DIJREPMnarixbQ57DOOzzFaI6D2+IcwaJQaJpv0M1E9TIhPCYVxrkcityLjlqA==} + /@types/node/16.10.1: + resolution: {integrity: sha512-4/Z9DMPKFexZj/Gn3LylFgamNKHm4K3QDi0gz9B26Uk0c8izYf97B5fxfpspMNkWlFupblKM/nV8+NA9Ffvr+w==} + dev: true - /@types/node/14.17.6: - resolution: {integrity: sha512-iBxsxU7eswQDGhlr3AiamBxOssaYxbM+NKXVil8jg9yFXvrfEFbDumLD/2dMTB+zYyg7w+Xjt8yuxfdbUHAtcQ==} - dev: false + /@types/node/16.9.6: + resolution: {integrity: sha512-YHUZhBOMTM3mjFkXVcK+WwAcYmyhe1wL4lfqNtzI0b3qAy7yuSetnM7QJazgE5PFmgVTNGiLOgRFfJMqW7XpSQ==} /@types/normalize-package-data/2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -1321,7 +1619,7 @@ packages: resolution: {integrity: sha512-cmAAMIRTaEwpqxlrZyiEY9kdibk94gP5KTF8AT1Ra4rWNZYHNMreqhKUEeC5WJtuN5SJZjPQmV+XO2P5PlnvNQ==} dependencies: '@types/express': 4.17.13 - '@types/jsonwebtoken': 8.5.4 + '@types/jsonwebtoken': 8.5.5 '@types/passport-strategy': 0.2.35 dev: true @@ -1358,38 +1656,60 @@ packages: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} dev: true - /@types/rc/1.1.0: - resolution: {integrity: sha512-qw1q31xPnaeExbOA1daA3nfeKW2uZQN4Xg8QqZDM3vsXPHK/lyDpjWXJQIcrByRDcBzZJ3ccchSMMTDtCWgFpA==} - dev: true - - /@types/react/17.0.15: - resolution: {integrity: sha512-uTKHDK9STXFHLaKv6IMnwp52fm0hwU+N89w/p9grdUqcFA6WuqDyPhaWopbNyE1k/VhgzmHl8pu1L4wITtmlLw==} + /@types/react/17.0.24: + resolution: {integrity: sha512-eIpyco99gTH+FTI3J7Oi/OH8MZoFMJuztNRimDOJwH4iGIsKV2qkGnk4M9VzlaVWeEEWLWSQRy0FEA0Kz218cg==} dependencies: '@types/prop-types': 15.7.4 '@types/scheduler': 0.16.2 - csstype: 3.0.8 + csstype: 3.0.9 dev: true /@types/scheduler/0.16.2: resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} dev: true + /@types/sequelize/4.28.10: + resolution: {integrity: sha512-GKbEbl6uyEYTPvU2JZvmqZHfpwTTjaZvNSd2gFJrhcxUL1bcyG7i+S8Od2L0/+skrk2bBINl7J1Sugo0mgIY3g==} + dependencies: + '@types/bluebird': 3.5.36 + '@types/continuation-local-storage': 3.2.3 + '@types/lodash': 4.14.175 + '@types/validator': 13.6.3 + dev: true + /@types/serve-static/1.13.10: resolution: {integrity: sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==} dependencies: '@types/mime': 1.3.2 - '@types/node': 14.17.5 + '@types/node': 16.9.6 dev: true - /@types/sharp/0.28.4: - resolution: {integrity: sha512-vfz+RlJU5FgXyyf9w8wc+JwwT8MFI98NZr0272umQegrggAQhTwwb8pKZn0PTtd+j0crXkZDWw5ABG/i6Lu/Lw==} + /@types/sharp/0.29.2: + resolution: {integrity: sha512-tIbMvtPa8kMyFMKNhpsPT1HO3CgXLuiCAA8bxHAGAZLyALpYvYc4hUu3pu0+3oExQA5LwvHrWp+OilgXCYVQgg==} dependencies: - '@types/node': 14.17.5 + '@types/node': 16.10.1 + dev: true + + /@types/umzug/2.3.0: + resolution: {integrity: sha512-DUwMKFa+QmApO7I5zhqpc12n9+Mqm006+PTPKrqoZ4F38rk2+iWl8K5IjVvWemERajtkfkiBkHtH/YkOPcBQjA==} + dependencies: + '@types/mongodb': 4.0.7 + '@types/sequelize': 4.28.10 dev: true /@types/validator/13.6.3: resolution: {integrity: sha512-fWG42pMJOL4jKsDDZZREnXLjc3UE0R8LOJfARWYg6U966rxDT7TYejYzLnUF5cvSObGg34nd0+H2wHHU5Omdfw==} - dev: false + + /@types/webidl-conversions/6.1.1: + resolution: {integrity: sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==} + dev: true + + /@types/whatwg-url/8.2.1: + resolution: {integrity: sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==} + dependencies: + '@types/node': 16.10.1 + '@types/webidl-conversions': 6.1.1 + dev: true /@types/yargs-parser/20.2.1: resolution: {integrity: sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==} @@ -1401,8 +1721,8 @@ packages: '@types/yargs-parser': 20.2.1 dev: false - /@typescript-eslint/eslint-plugin/4.29.3_eslint@7.32.0+typescript@4.3.5: - resolution: {integrity: sha512-tBgfA3K/3TsZY46ROGvoRxQr1wBkclbVqRQep97MjVHJzcRBURRY3sNFqLk0/Xr//BY5hM9H2p/kp+6qim85SA==} + /@typescript-eslint/eslint-plugin/4.31.2_eslint@7.32.0: + resolution: {integrity: sha512-w63SCQ4bIwWN/+3FxzpnWrDjQRXVEGiTt9tJTRptRXeFvdZc/wLiz3FQUwNQ2CVoRGI6KUWMNUj/pk63noUfcA==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: '@typescript-eslint/parser': ^4.0.0 @@ -1412,29 +1732,28 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/experimental-utils': 4.29.3_eslint@7.32.0+typescript@4.3.5 - '@typescript-eslint/scope-manager': 4.29.3 + '@typescript-eslint/experimental-utils': 4.31.2_eslint@7.32.0 + '@typescript-eslint/scope-manager': 4.31.2 debug: 4.3.2 eslint: 7.32.0 functional-red-black-tree: 1.0.1 regexpp: 3.2.0 semver: 7.3.5 - tsutils: 3.21.0_typescript@4.3.5 - typescript: 4.3.5 + tsutils: 3.21.0 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/experimental-utils/4.29.3_eslint@7.32.0+typescript@4.3.5: - resolution: {integrity: sha512-ffIvbytTVWz+3keg+Sy94FG1QeOvmV9dP2YSdLFHw/ieLXWCa3U1TYu8IRCOpMv2/SPS8XqhM1+ou1YHsdzKrg==} + /@typescript-eslint/experimental-utils/4.31.2_eslint@7.32.0: + resolution: {integrity: sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: eslint: '*' dependencies: '@types/json-schema': 7.0.9 - '@typescript-eslint/scope-manager': 4.29.3 - '@typescript-eslint/types': 4.29.3 - '@typescript-eslint/typescript-estree': 4.29.3_typescript@4.3.5 + '@typescript-eslint/scope-manager': 4.31.2 + '@typescript-eslint/types': 4.31.2 + '@typescript-eslint/typescript-estree': 4.31.2 eslint: 7.32.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0_eslint@7.32.0 @@ -1443,41 +1762,21 @@ packages: - typescript dev: true - /@typescript-eslint/parser/4.29.3_eslint@7.32.0+typescript@4.3.5: - resolution: {integrity: sha512-jrHOV5g2u8ROghmspKoW7pN8T/qUzk0+DITun0MELptvngtMrwUJ1tv5zMI04CYVEUsSrN4jV7AKSv+I0y0EfQ==} - engines: {node: ^10.12.0 || >=12.0.0} - peerDependencies: - eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 4.29.3 - '@typescript-eslint/types': 4.29.3 - '@typescript-eslint/typescript-estree': 4.29.3_typescript@4.3.5 - debug: 4.3.2 - eslint: 7.32.0 - typescript: 4.3.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager/4.29.3: - resolution: {integrity: sha512-x+w8BLXO7iWPkG5mEy9bA1iFRnk36p/goVlYobVWHyDw69YmaH9q6eA+Fgl7kYHmFvWlebUTUfhtIg4zbbl8PA==} + /@typescript-eslint/scope-manager/4.31.2: + resolution: {integrity: sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dependencies: - '@typescript-eslint/types': 4.29.3 - '@typescript-eslint/visitor-keys': 4.29.3 + '@typescript-eslint/types': 4.31.2 + '@typescript-eslint/visitor-keys': 4.31.2 dev: true - /@typescript-eslint/types/4.29.3: - resolution: {integrity: sha512-s1eV1lKNgoIYLAl1JUba8NhULmf+jOmmeFO1G5MN/RBCyyzg4TIOfIOICVNC06lor+Xmy4FypIIhFiJXOknhIg==} + /@typescript-eslint/types/4.31.2: + resolution: {integrity: sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dev: true - /@typescript-eslint/typescript-estree/4.29.3_typescript@4.3.5: - resolution: {integrity: sha512-45oQJA0bxna4O5TMwz55/TpgjX1YrAPOI/rb6kPgmdnemRZx/dB0rsx+Ku8jpDvqTxcE1C/qEbVHbS3h0hflag==} + /@typescript-eslint/typescript-estree/4.31.2: + resolution: {integrity: sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: typescript: '*' @@ -1485,23 +1784,22 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 4.29.3 - '@typescript-eslint/visitor-keys': 4.29.3 + '@typescript-eslint/types': 4.31.2 + '@typescript-eslint/visitor-keys': 4.31.2 debug: 4.3.2 globby: 11.0.4 is-glob: 4.0.1 semver: 7.3.5 - tsutils: 3.21.0_typescript@4.3.5 - typescript: 4.3.5 + tsutils: 3.21.0 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/visitor-keys/4.29.3: - resolution: {integrity: sha512-MGGfJvXT4asUTeVs0Q2m+sY63UsfnA+C/FDgBKV3itLBmM9H0u+URcneePtkd0at1YELmZK6HSolCqM4Fzs6yA==} + /@typescript-eslint/visitor-keys/4.31.2: + resolution: {integrity: sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dependencies: - '@typescript-eslint/types': 4.29.3 + '@typescript-eslint/types': 4.31.2 eslint-visitor-keys: 2.1.0 dev: true @@ -1515,7 +1813,6 @@ packages: /abbrev/1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: false /abstract-logging/2.0.1: resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} @@ -1542,11 +1839,22 @@ packages: engines: {node: '>=0.4.0'} dev: false + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + /acorn/7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true + /acorn/8.5.0: + resolution: {integrity: sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + /agent-base/6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -1564,33 +1872,41 @@ packages: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - /ajv/8.6.2: - resolution: {integrity: sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==} + /ajv/8.6.3: + resolution: {integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==} dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: true /anser/1.4.9: resolution: {integrity: sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA==} dev: false + /ansi-align/3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 + dev: true + /ansi-colors/4.1.1: resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} engines: {node: '>=6'} - dev: true /ansi-regex/2.1.1: resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=} engines: {node: '>=0.10.0'} - dev: false - /ansi-regex/5.0.0: - resolution: {integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==} + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + /ansi-styles/2.2.1: + resolution: {integrity: sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=} + engines: {node: '>=0.10.0'} + dev: true + /ansi-styles/3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -1603,10 +1919,6 @@ packages: dependencies: color-convert: 2.0.1 - /any-promise/1.3.0: - resolution: {integrity: sha1-q8av7tzqUugJzcA3au0845Y10X8=} - dev: true - /anymatch/2.0.0: resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} dependencies: @@ -1629,15 +1941,19 @@ packages: resolution: {integrity: sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=} dev: false - /are-we-there-yet/1.1.5: - resolution: {integrity: sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==} + /are-we-there-yet/1.1.7: + resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} dependencies: delegates: 1.0.0 readable-stream: 2.3.7 dev: false - /arg/5.0.0: - resolution: {integrity: sha512-4P8Zm2H+BRS+c/xX1LrHw0qKpEhdlZjLCgWy+d78T9vqa2Z2SiD2wMrYuWIAFy5IZUD7nnNXroRttz+0RzlrzQ==} + /arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /arg/5.0.1: + resolution: {integrity: sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==} dev: false /argparse/1.0.10: @@ -1648,17 +1964,18 @@ packages: /arr-diff/4.0.0: resolution: {integrity: sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=} engines: {node: '>=0.10.0'} - dev: false /arr-flatten/1.1.0: resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} engines: {node: '>=0.10.0'} - dev: false /arr-union/3.1.0: resolution: {integrity: sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=} engines: {node: '>=0.10.0'} - dev: false + + /array-each/1.0.1: + resolution: {integrity: sha1-p5SvDAWrF1KEbudTofIRoFugxE8=} + engines: {node: '>=0.10.0'} /array-ify/1.0.0: resolution: {integrity: sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=} @@ -1670,11 +1987,15 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.5 + es-abstract: 1.18.6 get-intrinsic: 1.1.1 is-string: 1.0.7 dev: true + /array-slice/1.1.0: + resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} + engines: {node: '>=0.10.0'} + /array-timsort/1.0.3: resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} dev: false @@ -1682,12 +2003,10 @@ packages: /array-union/2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - dev: true /array-unique/0.3.2: resolution: {integrity: sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=} engines: {node: '>=0.10.0'} - dev: false /array.prototype.flatmap/1.2.4: resolution: {integrity: sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==} @@ -1695,7 +2014,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.5 + es-abstract: 1.18.6 function-bind: 1.1.1 dev: true @@ -1726,13 +2045,12 @@ packages: es6-object-assign: 1.1.0 is-nan: 1.3.2 object-is: 1.1.5 - util: 0.12.3 + util: 0.12.4 dev: false /assign-symbols/1.0.0: resolution: {integrity: sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=} engines: {node: '>=0.10.0'} - dev: false /ast-types/0.13.2: resolution: {integrity: sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==} @@ -1744,35 +2062,38 @@ packages: engines: {node: '>=8'} dev: true + /at-least-node/1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + /atob/2.1.2: resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} engines: {node: '>= 4.5.0'} hasBin: true - dev: false /atomic-sleep/1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} dev: false - /autoprefixer/10.3.1_postcss@8.3.6: - resolution: {integrity: sha512-L8AmtKzdiRyYg7BUXJTzigmhbQRCXFKz6SA1Lqo0+AR2FBbQ4aTAPFSDlOutnFkjhiz8my4agGXog1xlMjPJ6A==} + /autoprefixer/10.3.5_postcss@8.3.7: + resolution: {integrity: sha512-2H5kQSsyoOMdIehTzIt/sC9ZDIgWqlkG/dbevm9B9xQZ1TDPBHpNUDW5ENqqQQzuaBWEo75JkV0LJe+o5Lnr5g==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.16.6 - caniuse-lite: 1.0.30001245 - colorette: 1.2.2 + browserslist: 4.17.1 + caniuse-lite: 1.0.30001260 fraction.js: 4.1.1 + nanocolors: 0.1.12 normalize-range: 0.1.2 - postcss: 8.3.6 + postcss: 8.3.7 postcss-value-parser: 4.1.0 dev: false - /available-typed-arrays/1.0.4: - resolution: {integrity: sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==} + /available-typed-arrays/1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} dev: false @@ -1781,34 +2102,34 @@ packages: dependencies: archy: 1.0.0 debug: 4.3.2 - fastq: 1.11.1 + fastq: 1.13.0 queue-microtask: 1.2.3 transitivePeerDependencies: - supports-color dev: false - /axios/0.21.1: - resolution: {integrity: sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==} + /axios/0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.14.1 + follow-redirects: 1.14.4 transitivePeerDependencies: - debug dev: false - /babel-jest/26.6.3_@babel+core@7.14.8: + /babel-jest/26.6.3_@babel+core@7.15.5: resolution: {integrity: sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==} engines: {node: '>= 10.14.2'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.14.8 + '@babel/core': 7.15.5 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 - '@types/babel__core': 7.1.15 + '@types/babel__core': 7.1.16 babel-plugin-istanbul: 6.0.0 - babel-preset-jest: 26.6.2_@babel+core@7.14.8 - chalk: 4.1.1 - graceful-fs: 4.2.6 + babel-preset-jest: 26.6.2_@babel+core@7.15.5 + chalk: 4.1.2 + graceful-fs: 4.2.8 slash: 3.0.0 transitivePeerDependencies: - supports-color @@ -1837,9 +2158,9 @@ packages: resolution: {integrity: sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/template': 7.14.5 - '@babel/types': 7.14.8 - '@types/babel__core': 7.1.15 + '@babel/template': 7.15.4 + '@babel/types': 7.15.6 + '@types/babel__core': 7.1.16 '@types/babel__traverse': 7.14.2 dev: false @@ -1847,35 +2168,35 @@ packages: resolution: {integrity: sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=} dev: false - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.14.8: + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.15.5: resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.14.8 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.14.8 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.14.8 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.14.8 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.14.8 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.14.8 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.14.8 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.14.8 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.14.8 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.14.8 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.14.8 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.14.8 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.14.8 + '@babel/core': 7.15.5 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.15.5 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.15.5 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.15.5 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.15.5 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.15.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.15.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.15.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.15.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.15.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.15.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.15.5 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.15.5 dev: false - /babel-preset-jest/26.6.2_@babel+core@7.14.8: + /babel-preset-jest/26.6.2_@babel+core@7.15.5: resolution: {integrity: sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==} engines: {node: '>= 10.14.2'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.14.8 + '@babel/core': 7.15.5 babel-plugin-jest-hoist: 26.6.2 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.14.8 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.15.5 dev: false /balanced-match/1.0.2: @@ -1892,11 +2213,9 @@ packages: isobject: 3.0.1 mixin-deep: 1.3.2 pascalcase: 0.1.1 - dev: false /base64-js/1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false /bcrypt/5.0.1: resolution: {integrity: sha512-9BTgmrhZM2t1bNuDtrtIMVSmmxZBrJ71n8Wg+YgdjHuIWYF7SjjmCPZFB+/5i/o/PIeRpwVJR3P+NrpIItUjqw==} @@ -1917,8 +2236,8 @@ packages: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - /binaryextensions/4.15.0: - resolution: {integrity: sha512-MkUl3szxXolQ2scI1PM14WOT951KnaTNJ0eMKg7WzOI4kvSxyNo/Cygx4LOBNhwyINhAuSQpJW1rYD9aBSxGaw==} + /binaryextensions/4.18.0: + resolution: {integrity: sha512-PQu3Kyv9dM4FnwB7XGj1+HucW+ShvJzJqjuw1JkKVs1mWdwOKVcRjOi+pV9X52A0tNvrPCsPkbFFQb+wE1EAXw==} engines: {node: '>=0.8'} dev: false @@ -1930,6 +2249,10 @@ packages: readable-stream: 3.6.0 dev: false + /bluebird/3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: true + /bn.js/4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} dev: false @@ -1938,6 +2261,20 @@ packages: resolution: {integrity: sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==} dev: false + /boxen/5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + dependencies: + ansi-align: 3.0.1 + camelcase: 6.2.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + dev: true + /brace-expansion/1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -1958,7 +2295,6 @@ packages: snapdragon-node: 2.1.1 split-string: 3.1.0 to-regex: 3.0.2 - dev: false /braces/3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} @@ -2030,24 +2366,23 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001245 - colorette: 1.2.2 - electron-to-chromium: 1.3.776 + caniuse-lite: 1.0.30001260 + colorette: 1.4.0 + electron-to-chromium: 1.3.849 escalade: 3.1.1 - node-releases: 1.1.73 + node-releases: 1.1.76 dev: false - /browserslist/4.16.8: - resolution: {integrity: sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==} + /browserslist/4.17.1: + resolution: {integrity: sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001252 - colorette: 1.3.0 - electron-to-chromium: 1.3.818 + caniuse-lite: 1.0.30001260 + electron-to-chromium: 1.3.849 escalade: 3.1.1 - node-releases: 1.1.75 - dev: true + nanocolors: 0.1.12 + node-releases: 1.1.76 /bser/2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -2055,10 +2390,26 @@ packages: node-int64: 0.4.0 dev: false + /bson/4.5.2: + resolution: {integrity: sha512-8CEMJpwc7qlQtrn2rney38jQSEeMar847lz0LyitwRmVknAW8iHXrzW4fTjHfyWm0E3sukyD/zppdH+QU1QefA==} + engines: {node: '>=6.9.0'} + dependencies: + buffer: 5.7.1 + dev: true + /buffer-equal-constant-time/1.0.1: resolution: {integrity: sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=} dev: false + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer-writer/2.0.0: + resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} + engines: {node: '>=4'} + dev: false + /buffer-xor/1.0.3: resolution: {integrity: sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=} dev: false @@ -2083,7 +2434,6 @@ packages: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: false /builtin-modules/3.2.0: resolution: {integrity: sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==} @@ -2106,11 +2456,6 @@ packages: engines: {node: '>= 0.8'} dev: false - /cac/6.7.3: - resolution: {integrity: sha512-ECVqVZh74qgSuZG9YOt2OJPI3wGcf+EwwuF/XIOYqZBD0KZYLtgPWqFPxmDPQ6joxI1nOlvVgRV6VT53Ooyocg==} - engines: {node: '>=8'} - dev: true - /cache-base/1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} @@ -2124,7 +2469,19 @@ packages: to-object-path: 0.3.0 union-value: 1.0.1 unset-value: 1.0.0 - dev: false + + /cacheable-request/6.1.0: + resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} + engines: {node: '>=8'} + dependencies: + clone-response: 1.0.2 + get-stream: 5.2.0 + http-cache-semantics: 4.1.0 + keyv: 3.1.0 + lowercase-keys: 2.0.0 + normalize-url: 4.5.1 + responselike: 1.0.2 + dev: true /call-bind/1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} @@ -2140,7 +2497,7 @@ packages: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} dependencies: pascal-case: 3.1.2 - tslib: 2.3.0 + tslib: 2.3.1 dev: false /camelcase-css/2.0.1: @@ -2153,7 +2510,7 @@ packages: engines: {node: '>=8'} dependencies: camelcase: 5.3.1 - map-obj: 4.2.1 + map-obj: 4.3.0 quick-lru: 4.0.1 dev: true @@ -2161,14 +2518,16 @@ packages: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - /caniuse-lite/1.0.30001245: - resolution: {integrity: sha512-768fM9j1PKXpOCKws6eTo3RHmvTUsG9UrpT4WoREFeZgJBTi4/X9g565azS/rVUGtqb8nt7FjLeF5u4kukERnA==} - dev: false - - /caniuse-lite/1.0.30001252: - resolution: {integrity: sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw==} + /camelcase/6.2.0: + resolution: {integrity: sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==} + engines: {node: '>=10'} dev: true + /caniuse-lite/1.0.30001260: + resolution: {integrity: sha512-Fhjc/k8725ItmrvW5QomzxLeojewxvqiYCKeFcfFEhut28IVLdpHU19dneOmltZQIE5HNbawj1HYD+1f2bM1Dg==} + dependencies: + nanocolors: 0.1.12 + /capture-exit/2.0.0: resolution: {integrity: sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==} engines: {node: 6.* || 8.* || >= 10.*} @@ -2176,6 +2535,17 @@ packages: rsvp: 4.8.5 dev: false + /chalk/1.1.3: + resolution: {integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=} + engines: {node: '>=0.10.0'} + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + dev: true + /chalk/2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -2192,20 +2562,12 @@ packages: supports-color: 7.2.0 dev: false - /chalk/4.1.1: - resolution: {integrity: sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - /chalk/4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: true /chokidar/3.5.1: resolution: {integrity: sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==} @@ -2230,7 +2592,7 @@ packages: braces: 3.0.2 glob-parent: 5.1.2 is-binary-path: 2.1.0 - is-glob: 4.0.1 + is-glob: 4.0.2 normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: @@ -2247,7 +2609,6 @@ packages: /ci-info/2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - dev: false /ci-info/3.2.0: resolution: {integrity: sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==} @@ -2272,13 +2633,12 @@ packages: define-property: 0.2.5 isobject: 3.0.1 static-extend: 0.1.2 - dev: false /class-validator/0.13.1: resolution: {integrity: sha512-zWIeYFhUitvAHBwNhDdCRK09hWx+P0HUwFE8US8/CxFpMVzkUK8RJl7yOIE+BVu2lxyPNgeOaFv78tLE47jBIg==} dependencies: '@types/validator': 13.6.3 - libphonenumber-js: 1.9.22 + libphonenumber-js: 1.9.34 validator: 13.6.0 dev: false @@ -2297,14 +2657,48 @@ packages: escape-string-regexp: 1.0.5 dev: true + /cli-boxes/2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + dev: true + + /cli-table3/0.6.0: + resolution: {integrity: sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==} + engines: {node: 10.* || >= 12.*} + dependencies: + object-assign: 4.1.1 + string-width: 4.2.3 + optionalDependencies: + colors: 1.4.0 + dev: true + + /cliui/6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true + /cliui/7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: - string-width: 4.2.2 - strip-ansi: 6.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 wrap-ansi: 7.0.0 dev: true + /clone-response/1.0.2: + resolution: {integrity: sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=} + dependencies: + mimic-response: 1.0.1 + dev: true + + /clone/2.1.2: + resolution: {integrity: sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=} + engines: {node: '>=0.8'} + dev: false + /code-point-at/1.1.0: resolution: {integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=} engines: {node: '>=0.10.0'} @@ -2316,7 +2710,6 @@ packages: dependencies: map-visit: 1.0.0 object-visit: 1.0.1 - dev: false /color-convert/1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -2335,13 +2728,6 @@ packages: /color-name/1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /color-string/1.5.5: - resolution: {integrity: sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==} - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - dev: false - /color-string/1.6.0: resolution: {integrity: sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==} dependencies: @@ -2349,44 +2735,36 @@ packages: simple-swizzle: 0.2.2 dev: false - /color/3.1.3: - resolution: {integrity: sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==} + /color/4.0.1: + resolution: {integrity: sha512-rpZjOKN5O7naJxkH2Rx1sZzzBgaiWECc6BYXjeCE6kF0kcASJYbUq02u7JqIHwCb/j3NhV+QhRL2683aICeGZA==} dependencies: - color-convert: 1.9.3 - color-string: 1.5.5 - dev: false - - /color/3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} - dependencies: - color-convert: 1.9.3 + color-convert: 2.0.1 color-string: 1.6.0 dev: false - /colorette/1.2.2: - resolution: {integrity: sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==} + /colorette/1.2.1: + resolution: {integrity: sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==} + + /colorette/1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} dev: false - /colorette/1.3.0: - resolution: {integrity: sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==} - dev: true - - /commander/4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} + /colors/1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} dev: true + optional: true /commander/6.2.1: resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} engines: {node: '>= 6'} - dev: false - /comment-json/4.1.0: - resolution: {integrity: sha512-WEghmVYaNq9NlWbrkzQTSsya9ycLyxJxpTQfZEan6a5Jomnjw18zS3Podf8q1Zf9BvonvQd/+Z7Z39L7KKzzdQ==} + /comment-json/4.1.1: + resolution: {integrity: sha512-v8gmtPvxhBlhdRBLwdHSjGy9BgA23t9H1FctdQKyUrErPjSrJcdDMqBq9B4Irtm7w3TNYLQJNH6ARKnpyag1sA==} engines: {node: '>= 6'} dependencies: array-timsort: 1.0.3 - core-util-is: 1.0.2 + core-util-is: 1.0.3 esprima: 4.0.1 has-own-prop: 2.0.0 repeat-string: 1.6.1 @@ -2405,11 +2783,22 @@ packages: /component-emitter/1.3.0: resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} - dev: false /concat-map/0.0.1: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + /configstore/5.0.1: + resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} + engines: {node: '>=8'} + dependencies: + dot-prop: 5.3.0 + graceful-fs: 4.2.8 + make-dir: 3.1.0 + unique-string: 2.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 4.0.0 + dev: true + /consola/2.15.3: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} dev: false @@ -2426,7 +2815,7 @@ packages: resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} dependencies: no-case: 3.0.4 - tslib: 2.3.0 + tslib: 2.3.1 upper-case: 2.0.2 dev: false @@ -2434,20 +2823,20 @@ packages: resolution: {integrity: sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=} dev: false - /content-range/2.0.0: - resolution: {integrity: sha512-zTebzPhul1gn8C7DrYi0PtjhhnbAMTHDOBB8UmBmKgmd6YJ9wNYUOlAn5iq/X0TUCNzsstm+jhihYKARdy1wjg==} + /content-range/2.0.2: + resolution: {integrity: sha512-ayHd/VQMRfWFBLVXyYvNhbbR+vq5OgLJnViGV4arzQiX9odRhf1spmXF7pFEHiR8htli29Hbii0URCNfUTN4vQ==} dev: false - /conventional-changelog-angular/5.0.12: - resolution: {integrity: sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==} + /conventional-changelog-angular/5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} engines: {node: '>=10'} dependencies: compare-func: 2.0.0 q: 1.5.1 dev: true - /conventional-changelog-conventionalcommits/4.6.0: - resolution: {integrity: sha512-sj9tj3z5cnHaSJCYObA9nISf7eq/YjscLPoq6nmew4SiOjxqL2KRpK20fjnjVbpNDjJ2HR3MoVcWKXwbVvzS0A==} + /conventional-changelog-conventionalcommits/4.6.1: + resolution: {integrity: sha512-lzWJpPZhbM1R0PIzkwzGBCnAkH5RKJzJfFQZcl/D+2lsJxAwGnDKBqn/F4C1RD31GJNn8NuKWQzAZDAVXPp2Mw==} engines: {node: '>=10'} dependencies: compare-func: 2.0.0 @@ -2455,8 +2844,8 @@ packages: q: 1.5.1 dev: true - /conventional-commits-parser/3.2.1: - resolution: {integrity: sha512-OG9kQtmMZBJD/32NEw5IhN5+HnBqVjy03eC+I71I0oQRFA5rOgA4OtPOYG7mz1GkCfCNxn3gKIX8EiHJYuf1cA==} + /conventional-commits-parser/3.2.2: + resolution: {integrity: sha512-Jr9KAKgqAkwXMRHjxDwO/zOCDKod1XdAESHAGuJX38iZ7ZzVti/tvVoysO0suMsdAObp9NQ2rHSsSbnAqZ5f5g==} engines: {node: '>=10'} hasBin: true dependencies: @@ -2466,7 +2855,6 @@ packages: meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 - trim-off-newlines: 1.0.1 dev: true /convert-source-map/1.7.0: @@ -2493,7 +2881,6 @@ packages: /copy-descriptor/0.1.1: resolution: {integrity: sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=} engines: {node: '>=0.10.0'} - dev: false /copy-to-clipboard/3.3.1: resolution: {integrity: sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==} @@ -2501,12 +2888,12 @@ packages: toggle-selection: 1.0.6 dev: false - /core-util-is/1.0.2: - resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=} + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: false - /cosmiconfig/7.0.0: - resolution: {integrity: sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==} + /cosmiconfig/7.0.1: + resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} engines: {node: '>=10'} dependencies: '@types/parse-json': 4.0.0 @@ -2543,20 +2930,16 @@ packages: sha.js: 2.4.11 dev: false + /create-require/1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + /cron/1.7.2: resolution: {integrity: sha512-+SaJ2OfeRvfQqwXQ2kgr0Y5pzBR/lijf5OpnnaruwWnmI799JfWr2jN2ItOV9s3A/+TFOt6mxvKzQq5F0Jp6VQ==} dependencies: moment-timezone: 0.5.33 dev: false - /cross-env/7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true - dependencies: - cross-spawn: 7.0.3 - dev: false - /cross-spawn/6.0.5: resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} engines: {node: '>=4.8'} @@ -2575,6 +2958,7 @@ packages: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + dev: true /crypto-browserify/3.12.0: resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} @@ -2592,6 +2976,15 @@ packages: randomfill: 1.0.4 dev: false + /crypto-random-string/2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + dev: true + + /css-color-names/0.0.4: + resolution: {integrity: sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=} + dev: false + /css-unit-converter/1.1.2: resolution: {integrity: sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==} dev: false @@ -2611,10 +3004,19 @@ packages: peerDependencies: postcss: ^8.2.1 dependencies: - caniuse-lite: 1.0.30001245 + caniuse-lite: 1.0.30001260 postcss: 8.2.13 dev: false + /cssnano-preset-simple/3.0.0_postcss@8.2.15: + resolution: {integrity: sha512-vxQPeoMRqUT3c/9f0vWeVa2nKQIHFpogtoBvFdW4GQ3IvEJ6uauCP6p3Y5zQDLFcI7/+40FTgX12o7XUL0Ko+w==} + peerDependencies: + postcss: ^8.2.15 + dependencies: + caniuse-lite: 1.0.30001260 + postcss: 8.2.15 + dev: false + /cssnano-simple/2.0.0_postcss@8.2.13: resolution: {integrity: sha512-0G3TXaFxlh/szPEG/o3VcmCwl0N3E60XNb9YZZijew5eIs6fLjJuOPxQd9yEBaX2p/YfJtt49i4vYi38iH6/6w==} peerDependencies: @@ -2624,8 +3026,20 @@ packages: postcss: 8.2.13 dev: false - /csstype/3.0.8: - resolution: {integrity: sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==} + /cssnano-simple/3.0.0_postcss@8.2.15: + resolution: {integrity: sha512-oU3ueli5Dtwgh0DyeohcIEE00QVfbPR3HzyXdAl89SfnQG3y0/qcpfLVW+jPIh3/rgMZGwuW96rejZGaYE9eUg==} + peerDependencies: + postcss: ^8.2.15 + peerDependenciesMeta: + postcss: + optional: true + dependencies: + cssnano-preset-simple: 3.0.0_postcss@8.2.15 + postcss: 8.2.15 + dev: false + + /csstype/3.0.9: + resolution: {integrity: sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==} dev: true /dargs/7.0.0: @@ -2638,11 +3052,31 @@ packages: engines: {node: '>= 6'} dev: false + /dayjs/1.10.7: + resolution: {integrity: sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==} + dev: false + /debug/2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} dependencies: ms: 2.0.0 - dev: false + + /debug/3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + dependencies: + ms: 2.1.3 + dev: true + + /debug/4.3.1: + resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 /debug/4.3.2: resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==} @@ -2671,7 +3105,13 @@ packages: /decode-uri-component/0.2.0: resolution: {integrity: sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=} engines: {node: '>=0.10'} - dev: false + + /decompress-response/3.3.0: + resolution: {integrity: sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=} + engines: {node: '>=4'} + dependencies: + mimic-response: 1.0.1 + dev: true /decompress-response/4.2.1: resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} @@ -2683,10 +3123,9 @@ packages: /deep-extend/0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} - dev: false - /deep-is/0.1.3: - resolution: {integrity: sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=} + /deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true /deepmerge/4.2.2: @@ -2694,6 +3133,10 @@ packages: engines: {node: '>=0.10.0'} dev: false + /defer-to-connect/1.1.3: + resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} + dev: true + /define-properties/1.1.3: resolution: {integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==} engines: {node: '>= 0.4'} @@ -2705,14 +3148,12 @@ packages: engines: {node: '>=0.10.0'} dependencies: is-descriptor: 0.1.6 - dev: false /define-property/1.0.0: resolution: {integrity: sha1-dp66rz9KY6rTr56NMEybvnm/sOY=} engines: {node: '>=0.10.0'} dependencies: is-descriptor: 1.0.2 - dev: false /define-property/2.0.2: resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} @@ -2720,7 +3161,6 @@ packages: dependencies: is-descriptor: 1.0.2 isobject: 3.0.1 - dev: false /defined/1.0.0: resolution: {integrity: sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=} @@ -2730,6 +3170,11 @@ packages: resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=} dev: false + /denque/2.0.1: + resolution: {integrity: sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==} + engines: {node: '>=0.10'} + dev: true + /depd/1.1.2: resolution: {integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=} engines: {node: '>= 0.6'} @@ -2747,6 +3192,10 @@ packages: minimalistic-assert: 1.0.1 dev: false + /detect-file/1.0.0: + resolution: {integrity: sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=} + engines: {node: '>=0.10.0'} + /detect-libc/1.0.3: resolution: {integrity: sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=} engines: {node: '>=0.10'} @@ -2774,6 +3223,11 @@ packages: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: false + /diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + /diffie-hellman/5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} dependencies: @@ -2787,7 +3241,6 @@ packages: engines: {node: '>=8'} dependencies: path-type: 4.0.0 - dev: true /dlv/1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -2824,27 +3277,23 @@ packages: is-obj: 2.0.0 dev: true + /dotenv/8.2.0: + resolution: {integrity: sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==} + engines: {node: '>=8'} + dev: false + + /duplexer3/0.1.4: + resolution: {integrity: sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=} + dev: true + /ecdsa-sig-formatter/1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} dependencies: safe-buffer: 5.2.1 dev: false - /editions/6.2.0: - resolution: {integrity: sha512-ebq3HvvNnoGZ+2T7zlN3GOMYlWZWcyKZe+I2Bg9COPdDvocUciTtQmMpzxDDPgASUvb3e843wreVKBBkQn6J2Q==} - engines: {node: '>=4'} - dependencies: - errlop: 4.2.0 - version-range: 1.2.0 - dev: false - - /electron-to-chromium/1.3.776: - resolution: {integrity: sha512-V0w7eFSBoFPpdw4xexjVPZ770UDZIevSwkkj4W97XbE3IsCsTRFpa7/yXGZ88EOQAUEA09JMMsWK0xsw0kRAYw==} - dev: false - - /electron-to-chromium/1.3.818: - resolution: {integrity: sha512-c/Z9gIr+jDZAR9q+mn40hEc1NharBT+8ejkarjbCDnBNFviI6hvcC5j2ezkAXru//bTnQp5n6iPi0JA83Tla1Q==} - dev: true + /electron-to-chromium/1.3.849: + resolution: {integrity: sha512-RweyW60HPOqIcxoKTGr38Yvtf2aliSUqX8dB3e9geJ0Bno0YLjcOX5F7/DPVloBkJWaPZ7xOM1A0Yme2T1A34w==} /elliptic/6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} @@ -2877,6 +3326,13 @@ packages: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 + + /enhanced-resolve/5.8.3: + resolution: {integrity: sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.8 + tapable: 2.2.1 dev: false /enquirer/2.3.6: @@ -2886,46 +3342,20 @@ packages: ansi-colors: 4.1.1 dev: true - /errlop/4.2.0: - resolution: {integrity: sha512-oF4tJVrFEs3NnBwi5HuxWhBp6ubwNf+vPG4MhngBPnK93BpJqPuMnfBBAyByis4IznnEq11oceCVoOCZFwjqWg==} - engines: {node: '>=4'} - dev: false - /error-ex/1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 - /es-abstract/1.18.3: - resolution: {integrity: sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - es-to-primitive: 1.2.1 - function-bind: 1.1.1 - get-intrinsic: 1.1.1 - has: 1.0.3 - has-symbols: 1.0.2 - is-callable: 1.2.3 - is-negative-zero: 2.0.1 - is-regex: 1.1.3 - is-string: 1.0.6 - object-inspect: 1.11.0 - object-keys: 1.1.1 - object.assign: 4.1.2 - string.prototype.trimend: 1.0.4 - string.prototype.trimstart: 1.0.4 - unbox-primitive: 1.0.1 - dev: false - - /es-abstract/1.18.5: - resolution: {integrity: sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==} + /es-abstract/1.18.6: + resolution: {integrity: sha512-kAeIT4cku5eNLNuUKhlmtuk1/TRZvQoYccn6TO0cSVdf1kzB0T7+dYuVK9MWM7l+/53W2Q8M7N2c6MQvhXFcUQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 es-to-primitive: 1.2.1 function-bind: 1.1.1 get-intrinsic: 1.1.1 + get-symbol-description: 1.0.0 has: 1.0.3 has-symbols: 1.0.2 internal-slot: 1.0.3 @@ -2939,7 +3369,6 @@ packages: string.prototype.trimend: 1.0.4 string.prototype.trimstart: 1.0.4 unbox-primitive: 1.0.1 - dev: true /es-to-primitive/1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} @@ -2958,15 +3387,15 @@ packages: peerDependencies: esbuild: '>=0.8.50' dependencies: - '@babel/core': 7.14.8 - '@babel/plugin-transform-modules-commonjs': 7.14.5_@babel+core@7.14.8 - babel-jest: 26.6.3_@babel+core@7.14.8 + '@babel/core': 7.15.5 + '@babel/plugin-transform-modules-commonjs': 7.15.4_@babel+core@7.15.5 + babel-jest: 26.6.3_@babel+core@7.15.5 transitivePeerDependencies: - supports-color dev: false - /esbuild/0.12.15: - resolution: {integrity: sha512-72V4JNd2+48eOVCXx49xoSWHgC3/cCy96e7mbXKY+WOWghN00cCmlGnwVLRhRHorvv0dgCyuMYBZlM2xDM5OQw==} + /esbuild/0.11.23: + resolution: {integrity: sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q==} hasBin: true requiresBuild: true dev: true @@ -2975,6 +3404,11 @@ packages: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} + /escape-goat/2.1.1: + resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} + engines: {node: '>=8'} + dev: true + /escape-string-regexp/1.0.5: resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} engines: {node: '>=0.8.0'} @@ -2983,14 +3417,10 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /eslint-config-prettier/8.3.0_eslint@7.32.0: - resolution: {integrity: sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - dependencies: - eslint: 7.32.0 - dev: true + /escaya/0.0.61: + resolution: {integrity: sha512-WLLmvdG72Z0pCq8XUBd03GEJlAiMceXFanjdQeEzeSiuV1ZgrJqbkU7ZEe/hu0OsBlg5wLlySEeOvfzcGoO8mg==} + engines: {node: '>=6.0.0'} + dev: false /eslint-plugin-react-hooks/4.2.0_eslint@7.32.0: resolution: {integrity: sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==} @@ -3001,8 +3431,8 @@ packages: eslint: 7.32.0 dev: true - /eslint-plugin-react/7.24.0_eslint@7.32.0: - resolution: {integrity: sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==} + /eslint-plugin-react/7.26.0_eslint@7.32.0: + resolution: {integrity: sha512-dceliS5itjk4EZdQYtLMz6GulcsasguIs+VTXuiC7Q5IPIdGTkyfXVdmsQOqEhlD9MciofH4cMcT1bw1WWNxCQ==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 @@ -3011,14 +3441,16 @@ packages: array.prototype.flatmap: 1.2.4 doctrine: 2.1.0 eslint: 7.32.0 - has: 1.0.3 - jsx-ast-utils: 3.2.0 + estraverse: 5.2.0 + jsx-ast-utils: 3.2.1 minimatch: 3.0.4 object.entries: 1.1.4 object.fromentries: 2.0.4 + object.hasown: 1.0.0 object.values: 1.1.4 prop-types: 15.7.2 resolve: 2.0.0-next.3 + semver: 6.3.0 string.prototype.matchall: 4.0.5 dev: true @@ -3028,7 +3460,7 @@ packages: peerDependencies: eslint: '>=7.28.0' dependencies: - '@babel/helper-validator-identifier': 7.14.9 + '@babel/helper-validator-identifier': 7.15.7 ci-info: 3.2.0 clean-regexp: 1.0.0 eslint: 7.32.0 @@ -3038,7 +3470,7 @@ packages: lodash: 4.17.21 pluralize: 8.0.0 read-pkg-up: 7.0.1 - regexp-tree: 0.1.23 + regexp-tree: 0.1.24 safe-regex: 2.1.1 semver: 7.3.5 transitivePeerDependencies: @@ -3058,8 +3490,8 @@ packages: peerDependencies: eslint: '>=7.0.0' dependencies: - '@babel/core': 7.15.0 - '@babel/eslint-parser': 7.15.0_@babel+core@7.15.0+eslint@7.32.0 + '@babel/core': 7.15.5 + '@babel/eslint-parser': 7.15.7_@babel+core@7.15.5+eslint@7.32.0 eslint: 7.32.0 eslint-visitor-keys: 2.1.0 esquery: 1.4.0 @@ -3135,7 +3567,7 @@ packages: progress: 2.0.3 regexpp: 3.2.0 semver: 7.3.5 - strip-ansi: 6.0.0 + strip-ansi: 6.0.1 strip-json-comments: 3.1.1 table: 6.7.1 text-table: 0.2.0 @@ -3144,6 +3576,10 @@ packages: - supports-color dev: true + /esm/3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + /espree/7.3.1: resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} engines: {node: ^10.12.0 || >=12.0.0} @@ -3216,7 +3652,7 @@ packages: is-stream: 1.1.0 npm-run-path: 2.0.2 p-finally: 1.0.0 - signal-exit: 3.0.3 + signal-exit: 3.0.4 strip-eof: 1.0.0 dev: false @@ -3227,11 +3663,11 @@ packages: cross-spawn: 7.0.3 get-stream: 6.0.1 human-signals: 2.1.0 - is-stream: 2.0.0 + is-stream: 2.0.1 merge-stream: 2.0.0 npm-run-path: 4.0.1 onetime: 5.1.2 - signal-exit: 3.0.3 + signal-exit: 3.0.4 strip-final-newline: 2.0.0 dev: true @@ -3246,19 +3682,23 @@ packages: regex-not: 1.0.2 snapdragon: 0.8.2 to-regex: 3.0.2 - dev: false /expand-template/2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} dev: false + /expand-tilde/2.0.2: + resolution: {integrity: sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=} + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: 1.0.3 + /extend-shallow/2.0.1: resolution: {integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=} engines: {node: '>=0.10.0'} dependencies: is-extendable: 0.1.1 - dev: false /extend-shallow/3.0.2: resolution: {integrity: sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=} @@ -3266,7 +3706,9 @@ packages: dependencies: assign-symbols: 1.0.0 is-extendable: 1.0.1 - dev: false + + /extend/3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} /extglob/2.0.4: resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} @@ -3280,7 +3722,6 @@ packages: regex-not: 1.0.2 snapdragon: 0.8.2 to-regex: 3.0.2 - dev: false /fast-decode-uri-component/1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} @@ -3302,8 +3743,8 @@ packages: /fast-json-stable-stringify/2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - /fast-json-stringify/2.7.7: - resolution: {integrity: sha512-2kiwC/hBlK7QiGALsvj0QxtYwaReLOmAwOWJIxt5WHBB9EwXsqbsu8LCel47yh8NV8CEcFmnZYcXh4BionJcwQ==} + /fast-json-stringify/2.7.10: + resolution: {integrity: sha512-MPuVXMMueV8e3TRVLOpxxicJnSdu5mwbHrsO9IZU15zqfay6k19OqIv7N2DCeNPDOCNOmZwjvMUTwvblZsUmFw==} engines: {node: '>= 10.0.0'} dependencies: ajv: 6.12.6 @@ -3316,8 +3757,8 @@ packages: resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=} dev: true - /fast-redact/3.0.1: - resolution: {integrity: sha512-kYpn4Y/valC9MdrISg47tZOpYBNoTXKgT9GYXFpHN/jYFs+lFkPoisY+LcBODdKVMY96ATzvzsWv+ES/4Kmufw==} + /fast-redact/3.0.2: + resolution: {integrity: sha512-YN+CYfCVRVMUZOUPeinHNKgytM1wPI/C/UCLEi56EsY2dwwvI00kIJHJoI7pMVqGoMew8SMZ2SSfHKHULHXDsg==} engines: {node: '>=6'} dev: false @@ -3325,6 +3766,10 @@ packages: resolution: {integrity: sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag==} dev: false + /fast-safe-stringify/2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + dev: false + /fastify-cookie/5.3.1: resolution: {integrity: sha512-ubiC5ydvgqaXOydeg3G+SFEiTJtsyNPde6ForXi+UG66aDbsHlWNLJTQZg4BopXv+MJ0SzlShGVCWv26mgAwpw==} dependencies: @@ -3344,14 +3789,14 @@ packages: resolution: {integrity: sha512-oCfpcsDndgnDVgiI7bwFKAun2dO+4h84vBlkWsWnz/OUK9Reff5UFoFl241xTiLeHWX/vU9zkDVXqYUxjOwHcQ==} dev: false - /fastify-formbody/5.0.0: - resolution: {integrity: sha512-W79/hq6xGyV4lFsgt+qgKHPorGu4RzAhFQ5GKXI0T8DbkEMx+7gjFAD2y+q194vMMiIvMhuE7j6JyCEZVMOHYw==} + /fastify-formbody/5.1.0: + resolution: {integrity: sha512-dLFQ8gMQeLuV45J72svDbrp6CZ3hxsaiK2dd3vzoiCs9wEmCSbbJV+/afQl1cfvf19+NfCIzYVQIg1r4yO4Epw==} dependencies: - fastify-plugin: 2.3.4 + fastify-plugin: 3.0.0 dev: false - /fastify-multipart/4.0.7: - resolution: {integrity: sha512-bV6QB3mmDYdrYwIrUrkGplutQLUUSzXFXtkCL2HRw5eLXyv9+DD5Gb5GJNDtKYCiCtyaGLbJmt2rLsF6A3WCUw==} + /fastify-multipart/5.0.0: + resolution: {integrity: sha512-T0+lmisyJEKGGLWY0nOAu0hyIK2wZa5Eki+U2K6f2HE6les31CS4IxaZSG4zcBqTG6BnUXgPnhUcQ4xKsthrdA==} dependencies: busboy: 0.3.1 deepmerge: 4.2.2 @@ -3362,12 +3807,6 @@ packages: stream-wormhole: 1.1.0 dev: false - /fastify-plugin/2.3.4: - resolution: {integrity: sha512-I+Oaj6p9oiRozbam30sh39BiuiqBda7yK2nmSPVwDCfIBlKnT8YB3MY+pRQc2Fcd07bf6KPGklHJaQ2Qu81TYQ==} - dependencies: - semver: 7.3.5 - dev: false - /fastify-plugin/3.0.0: resolution: {integrity: sha512-ZdCvKEEd92DNLps5n0v231Bha8bkz1DjnPP/aEz37rz/q42Z5JVLmgnqR4DYuNn3NXAO3IDCPyRvgvxtJ4Ym4w==} dev: false @@ -3376,19 +3815,19 @@ packages: resolution: {integrity: sha512-s1EQguBw/9qtc1p/WTY4eq9WMRIACkj+HTcOIK1in4MV5aFaQC9ZCIt0dJ7pr5bIf4lPpHvAtP2ywpTNgs7hqw==} dev: false - /fastify/3.19.1: - resolution: {integrity: sha512-vyoRO/TQ+ta3OKShx5CHZ2qXXUXzBG4ZOVB0AEKlmf+DoMmP0ftuaEnzc7DPLVXtRYZ1A3Tbcn/6ja5e+sa2lw==} + /fastify/3.20.2: + resolution: {integrity: sha512-POvayPpbyvkE/wHQquQsNwIgYKVRz7HhCXYJyzUuWEN3kch7/QeI+/azQCjS6+XHiHZPWQwrBKjJB9FBdJHrgA==} dependencies: '@fastify/ajv-compiler': 1.1.0 abstract-logging: 2.0.1 avvio: 7.2.2 - fast-json-stringify: 2.7.7 + fast-json-stringify: 2.7.10 fastify-error: 0.3.1 fastify-warning: 0.2.0 find-my-way: 4.3.3 flatstr: 1.0.12 - light-my-request: 4.4.1 - pino: 6.13.0 + light-my-request: 4.4.4 + pino: 6.13.3 proxy-addr: 2.0.7 readable-stream: 3.6.0 rfdc: 1.3.0 @@ -3399,19 +3838,19 @@ packages: - supports-color dev: false - /fastify/3.19.2: - resolution: {integrity: sha512-s9naCdC0V1ynEzxMoe/0oX8XgcLk90VAnIms4z6KcF7Rpn1XiguoMyZSviTmv1x5rgy/OjGGBM45sNpMoBzCUQ==} + /fastify/3.21.6: + resolution: {integrity: sha512-PextZFavEZaqn2ZYbVGBPAI0AiElnVdfqo9sN1wlOi0mhGtYuec4KT82MHe5npCf3Lz++6i7jLl7YKyYidPrMg==} dependencies: '@fastify/ajv-compiler': 1.1.0 abstract-logging: 2.0.1 avvio: 7.2.2 - fast-json-stringify: 2.7.7 + fast-json-stringify: 2.7.10 fastify-error: 0.3.1 fastify-warning: 0.2.0 find-my-way: 4.3.3 flatstr: 1.0.12 - light-my-request: 4.4.1 - pino: 6.13.0 + light-my-request: 4.4.4 + pino: 6.13.3 proxy-addr: 2.0.7 readable-stream: 3.6.0 rfdc: 1.3.0 @@ -3422,8 +3861,8 @@ packages: - supports-color dev: false - /fastq/1.11.1: - resolution: {integrity: sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==} + /fastq/1.13.0: + resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} dependencies: reusify: 1.0.4 @@ -3433,6 +3872,11 @@ packages: bser: 2.1.1 dev: false + /figlet/1.5.2: + resolution: {integrity: sha512-WOn21V8AhyE1QqVfPIVxe3tupJacq1xGkPTB4iagT6o+P2cAgEOOwIxMftr4+ZCTI6d551ij9j61DFr0nsP2uQ==} + engines: {node: '>= 0.4.0'} + dev: true + /file-entry-cache/6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -3440,13 +3884,13 @@ packages: flat-cache: 3.0.4 dev: true - /file-type/16.5.2: - resolution: {integrity: sha512-lnHRZj2USLF3v4C5ZY7/vQQeoTVA1YV9TtD6UUCr9z5Cd0uyutqxPBJxkXzM6lufPNuSfefq/yFmnSPz0C3wNw==} + /file-type/16.5.3: + resolution: {integrity: sha512-uVsl7iFhHSOY4bEONLlTK47iAHtNsFHWP5YE4xJfZ4rnX7S1Q3wce09XgqSC7E/xh8Ncv/be1lNoyprlUH/x6A==} engines: {node: '>=10'} dependencies: readable-web-to-node-stream: 3.0.2 - strtok3: 6.1.3 - token-types: 3.1.0 + strtok3: 6.2.4 + token-types: 4.1.1 dev: false /fill-range/4.0.0: @@ -3457,7 +3901,6 @@ packages: is-number: 3.0.0 repeat-string: 1.6.1 to-regex-range: 2.1.1 - dev: false /fill-range/7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} @@ -3498,6 +3941,29 @@ packages: locate-path: 6.0.0 path-exists: 4.0.0 + /findup-sync/3.0.0: + resolution: {integrity: sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==} + engines: {node: '>= 0.10'} + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.2 + micromatch: 3.1.10 + resolve-dir: 1.0.1 + + /fined/1.2.0: + resolution: {integrity: sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==} + engines: {node: '>= 0.10'} + dependencies: + expand-tilde: 2.0.2 + is-plain-object: 2.0.4 + object.defaults: 1.1.0 + object.pick: 1.3.0 + parse-filepath: 1.0.2 + + /flagged-respawn/1.0.1: + resolution: {integrity: sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==} + engines: {node: '>= 0.10'} + /flat-cache/3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -3519,8 +3985,8 @@ packages: resolution: {integrity: sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==} dev: true - /follow-redirects/1.14.1: - resolution: {integrity: sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==} + /follow-redirects/1.14.4: + resolution: {integrity: sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -3532,7 +3998,12 @@ packages: /for-in/1.0.2: resolution: {integrity: sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=} engines: {node: '>=0.10.0'} - dev: false + + /for-own/1.0.0: + resolution: {integrity: sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 /foreach/2.0.5: resolution: {integrity: sha1-C+4AUBiusmDQo6865ljdATbsG5k=} @@ -3552,7 +4023,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: map-cache: 0.2.2 - dev: false /fs-constants/1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} @@ -3562,7 +4032,16 @@ packages: resolution: {integrity: sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==} engines: {node: '>=12'} dependencies: - graceful-fs: 4.2.6 + graceful-fs: 4.2.8 + jsonfile: 6.1.0 + universalify: 2.0.0 + + /fs-extra/9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.8 jsonfile: 6.1.0 universalify: 2.0.0 @@ -3570,7 +4049,7 @@ packages: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} dependencies: - minipass: 3.1.3 + minipass: 3.1.5 dev: false /fs.realpath/1.0.0: @@ -3596,7 +4075,7 @@ packages: console-control-strings: 1.1.0 has-unicode: 2.0.1 object-assign: 4.1.1 - signal-exit: 3.0.3 + signal-exit: 3.0.4 string-width: 1.0.2 strip-ansi: 3.0.1 wide-align: 1.1.3 @@ -3640,17 +4119,32 @@ packages: engines: {node: '>=6'} dependencies: pump: 3.0.0 - dev: false + + /get-stream/5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true /get-stream/6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} dev: true + /get-symbol-description/1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.1 + /get-value/2.0.6: resolution: {integrity: sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=} engines: {node: '>=0.10.0'} - dev: false + + /getopts/2.2.5: + resolution: {integrity: sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA==} /git-raw-commits/2.0.10: resolution: {integrity: sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ==} @@ -3672,7 +4166,7 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: - is-glob: 4.0.1 + is-glob: 4.0.2 /glob-parent/6.0.1: resolution: {integrity: sha512-kEVjS71mQazDBHKcsq4E9u/vUzaLcw1A8EtUeydawvIWQCJM0qQ08G1H7/XTjFUulla6XQiDOG6MXSaG0HDKog==} @@ -3685,19 +4179,8 @@ packages: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: false - /glob/7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.0.4 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob/7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + /glob/7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -3713,6 +4196,31 @@ packages: ini: 1.3.8 dev: true + /global-dirs/3.0.0: + resolution: {integrity: sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==} + engines: {node: '>=10'} + dependencies: + ini: 2.0.0 + dev: true + + /global-modules/1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + + /global-prefix/1.0.2: + resolution: {integrity: sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + /globals/11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -3724,6 +4232,18 @@ packages: type-fest: 0.20.2 dev: true + /globby/11.0.3: + resolution: {integrity: sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.7 + ignore: 5.1.8 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + /globby/11.0.4: resolution: {integrity: sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==} engines: {node: '>=10'} @@ -3736,14 +4256,38 @@ packages: slash: 3.0.0 dev: true - /graceful-fs/4.2.6: - resolution: {integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==} + /got/9.6.0: + resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} + engines: {node: '>=8.6'} + dependencies: + '@sindresorhus/is': 0.14.0 + '@szmarczak/http-timer': 1.1.2 + cacheable-request: 6.1.0 + decompress-response: 3.3.0 + duplexer3: 0.1.4 + get-stream: 4.1.0 + lowercase-keys: 1.0.1 + mimic-response: 1.0.1 + p-cancelable: 1.1.0 + to-readable-stream: 1.0.0 + url-parse-lax: 3.0.0 + dev: true + + /graceful-fs/4.2.8: + resolution: {integrity: sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==} /hard-rejection/2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} dev: true + /has-ansi/2.0.0: + resolution: {integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + /has-bigints/1.0.1: resolution: {integrity: sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==} @@ -3781,7 +4325,6 @@ packages: get-value: 2.0.6 has-values: 0.1.4 isobject: 2.1.0 - dev: false /has-value/1.0.0: resolution: {integrity: sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=} @@ -3790,12 +4333,10 @@ packages: get-value: 2.0.6 has-values: 1.0.0 isobject: 3.0.1 - dev: false /has-values/0.1.4: resolution: {integrity: sha1-bWHeldkd/Km5oCCJrThL/49it3E=} engines: {node: '>=0.10.0'} - dev: false /has-values/1.0.0: resolution: {integrity: sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=} @@ -3803,7 +4344,11 @@ packages: dependencies: is-number: 3.0.0 kind-of: 4.0.0 - dev: false + + /has-yarn/2.1.0: + resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} + engines: {node: '>=8'} + dev: true /has/1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} @@ -3832,6 +4377,10 @@ packages: hasBin: true dev: false + /hex-color-regex/1.1.0: + resolution: {integrity: sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==} + dev: false + /hexoid/1.0.0: resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} engines: {node: '>=8'} @@ -3845,6 +4394,12 @@ packages: minimalistic-crypto-utils: 1.0.1 dev: false + /homedir-polyfill/1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: 1.0.0 + /hosted-git-info/2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true @@ -3856,11 +4411,23 @@ packages: lru-cache: 6.0.0 dev: true + /hsl-regex/1.0.0: + resolution: {integrity: sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=} + dev: false + + /hsla-regex/1.0.0: + resolution: {integrity: sha1-wc56MWjIxmFAM6S194d/OyJfnDg=} + dev: false + /html-tags/3.1.0: resolution: {integrity: sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==} engines: {node: '>=8'} dev: false + /http-cache-semantics/4.1.0: + resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} + dev: true + /http-errors/1.7.3: resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} engines: {node: '>= 0.6'} @@ -3895,8 +4462,8 @@ packages: engines: {node: '>=10.17.0'} dev: true - /husky/7.0.1: - resolution: {integrity: sha512-gceRaITVZ+cJH9sNHqx5tFwbzlLCVxtVZcusME8JYQ8Edy5mpGDOqD8QBCdMhpyo9a+JXddnujQ4rpY2Ff9SJA==} + /husky/7.0.2: + resolution: {integrity: sha512-8yKEWNX4z2YsofXAMT7KvA1g8p+GxtB1ffV8XtpAEGuXNAbCV5wdNKH+qTpw8SM9fh4aMPDR+yQuKfgnreyZlg==} engines: {node: '>=12'} hasBin: true dev: true @@ -3917,7 +4484,10 @@ packages: /ieee754/1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false + + /ignore-by-default/1.0.1: + resolution: {integrity: sha1-SMptcvbGo68Aqa1K5odr44ieKwk=} + dev: true /ignore/4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} @@ -3927,7 +4497,6 @@ packages: /ignore/5.1.8: resolution: {integrity: sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==} engines: {node: '>= 4'} - dev: true /image-size/1.0.0: resolution: {integrity: sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==} @@ -3942,6 +4511,7 @@ packages: engines: {node: '>=8'} dependencies: import-from: 3.0.0 + dev: false /import-fresh/3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -3955,6 +4525,12 @@ packages: engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 + dev: false + + /import-lazy/2.1.0: + resolution: {integrity: sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=} + engines: {node: '>=4'} + dev: true /imurmurhash/0.1.4: resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} @@ -3985,6 +4561,11 @@ packages: /ini/1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + /ini/2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + dev: true + /internal-slot/1.0.3: resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} engines: {node: '>= 0.4'} @@ -3992,32 +4573,41 @@ packages: get-intrinsic: 1.1.1 has: 1.0.3 side-channel: 1.0.4 - dev: true + + /interpret/2.2.0: + resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} + engines: {node: '>= 0.10'} /ipaddr.js/1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} dev: false + /is-absolute/1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} + dependencies: + is-relative: 1.0.0 + is-windows: 1.0.2 + /is-accessor-descriptor/0.1.6: resolution: {integrity: sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 - dev: false /is-accessor-descriptor/1.0.0: resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 6.0.3 - dev: false - /is-arguments/1.1.0: - resolution: {integrity: sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==} + /is-arguments/1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 + has-tostringtag: 1.0.0 dev: false /is-arrayish/0.2.1: @@ -4047,7 +4637,6 @@ packages: /is-buffer/1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - dev: false /is-builtin-module/3.1.0: resolution: {integrity: sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==} @@ -4056,11 +4645,6 @@ packages: builtin-modules: 3.2.0 dev: true - /is-callable/1.2.3: - resolution: {integrity: sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==} - engines: {node: '>= 0.4'} - dev: false - /is-callable/1.2.4: resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} engines: {node: '>= 0.4'} @@ -4070,12 +4654,17 @@ packages: hasBin: true dependencies: ci-info: 2.0.0 - dev: false - /is-core-module/2.5.0: - resolution: {integrity: sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==} + /is-color-stop/1.1.0: + resolution: {integrity: sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=} dependencies: - has: 1.0.3 + css-color-names: 0.0.4 + hex-color-regex: 1.1.0 + hsl-regex: 1.0.0 + hsla-regex: 1.0.0 + rgb-regex: 1.0.1 + rgba-regex: 1.0.0 + dev: false /is-core-module/2.6.0: resolution: {integrity: sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==} @@ -4083,19 +4672,22 @@ packages: has: 1.0.3 dev: true + /is-core-module/2.7.0: + resolution: {integrity: sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==} + dependencies: + has: 1.0.3 + /is-data-descriptor/0.1.4: resolution: {integrity: sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 - dev: false /is-data-descriptor/1.0.0: resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 6.0.3 - dev: false /is-date-object/1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} @@ -4110,7 +4702,6 @@ packages: is-accessor-descriptor: 0.1.6 is-data-descriptor: 0.1.4 kind-of: 5.1.0 - dev: false /is-descriptor/1.0.2: resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} @@ -4119,19 +4710,16 @@ packages: is-accessor-descriptor: 1.0.0 is-data-descriptor: 1.0.0 kind-of: 6.0.3 - dev: false /is-extendable/0.1.1: resolution: {integrity: sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=} engines: {node: '>=0.10.0'} - dev: false /is-extendable/1.0.1: resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} engines: {node: '>=0.10.0'} dependencies: is-plain-object: 2.0.4 - dev: false /is-extglob/2.1.1: resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} @@ -4149,9 +4737,11 @@ packages: engines: {node: '>=8'} dev: true - /is-generator-function/1.0.9: - resolution: {integrity: sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==} + /is-generator-function/1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 dev: false /is-glob/4.0.1: @@ -4160,6 +4750,20 @@ packages: dependencies: is-extglob: 2.1.1 + /is-glob/4.0.2: + resolution: {integrity: sha512-ZZTOjRcDjuAAAv2cTBQP/lL59ZTArx77+7UzHdWW/XB1mrfp7DEaVpKmZ0XIzx+M7AxfhKcqV+nMetUQmFifwg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-installed-globally/0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + dependencies: + global-dirs: 3.0.0 + is-path-inside: 3.0.3 + dev: true + /is-nan/1.3.2: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} @@ -4172,6 +4776,11 @@ packages: resolution: {integrity: sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==} engines: {node: '>= 0.4'} + /is-npm/5.0.0: + resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==} + engines: {node: '>=10'} + dev: true + /is-number-object/1.0.6: resolution: {integrity: sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==} engines: {node: '>= 0.4'} @@ -4183,7 +4792,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 - dev: false /is-number/7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} @@ -4194,6 +4802,11 @@ packages: engines: {node: '>=8'} dev: true + /is-path-inside/3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + /is-plain-obj/1.1.0: resolution: {integrity: sha1-caUMhCnfync8kqOQpKA7OfzVHT4=} engines: {node: '>=0.10.0'} @@ -4204,15 +4817,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 - dev: false - - /is-regex/1.1.3: - resolution: {integrity: sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-symbols: 1.0.2 - dev: false /is-regex/1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} @@ -4220,23 +4824,23 @@ packages: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - dev: true + + /is-relative/1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} + dependencies: + is-unc-path: 1.0.0 /is-stream/1.1.0: resolution: {integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ=} engines: {node: '>=0.10.0'} dev: false - /is-stream/2.0.0: - resolution: {integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==} + /is-stream/2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} dev: true - /is-string/1.0.6: - resolution: {integrity: sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==} - engines: {node: '>= 0.4'} - dev: false - /is-string/1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -4256,29 +4860,36 @@ packages: text-extensions: 1.9.0 dev: true - /is-typed-array/1.1.5: - resolution: {integrity: sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==} + /is-typed-array/1.1.8: + resolution: {integrity: sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.4 + available-typed-arrays: 1.0.5 call-bind: 1.0.2 - es-abstract: 1.18.3 + es-abstract: 1.18.6 foreach: 2.0.5 - has-symbols: 1.0.2 + has-tostringtag: 1.0.0 dev: false /is-typedarray/1.0.0: resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} - dev: false + + /is-unc-path/1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} + dependencies: + unc-path-regex: 0.1.2 /is-windows/1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - dev: false + + /is-yarn-global/0.3.0: + resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} + dev: true /isarray/1.0.0: resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} - dev: false /isexe/2.0.0: resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} @@ -4288,15 +4899,13 @@ packages: engines: {node: '>=0.10.0'} dependencies: isarray: 1.0.0 - dev: false /isobject/3.0.1: resolution: {integrity: sha1-TkMekrEalzFjaqH5yNHMvP2reN8=} engines: {node: '>=0.10.0'} - dev: false - /istanbul-lib-coverage/3.0.0: - resolution: {integrity: sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==} + /istanbul-lib-coverage/3.0.1: + resolution: {integrity: sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ==} engines: {node: '>=8'} dev: false @@ -4304,21 +4913,20 @@ packages: resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.14.8 + '@babel/core': 7.15.5 '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.0.0 + istanbul-lib-coverage: 3.0.1 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: false - /istextorbinary/5.12.0: - resolution: {integrity: sha512-wLDRWD7qpNTYubk04+q3en1+XZGS4vYWK0+SxNSXJLaITMMEK+J3o/TlOMyULeH1qozVZ9uUkKcyMA8odyxz8w==} + /istextorbinary/6.0.0: + resolution: {integrity: sha512-4j3UqQCa06GAf6QHlN3giz2EeFU7qc6Q5uB/aY7Gmb3xmLDLepDOtsZqkb4sCfJgFvTbLUinNw0kHgHs8XOHoQ==} engines: {node: '>=10'} dependencies: - binaryextensions: 4.15.0 - editions: 6.2.0 - textextensions: 5.12.0 + binaryextensions: 4.18.0 + textextensions: 5.14.0 dev: false /iterare/1.2.1: @@ -4332,10 +4940,10 @@ packages: dependencies: '@jest/types': 26.6.2 '@types/graceful-fs': 4.1.5 - '@types/node': 14.17.6 + '@types/node': 16.9.6 anymatch: 3.1.2 fb-watchman: 2.0.1 - graceful-fs: 4.2.6 + graceful-fs: 4.2.8 jest-regex-util: 26.0.0 jest-serializer: 26.6.2 jest-util: 26.6.2 @@ -4356,8 +4964,8 @@ packages: resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} engines: {node: '>= 10.14.2'} dependencies: - '@types/node': 14.17.6 - graceful-fs: 4.2.6 + '@types/node': 16.9.6 + graceful-fs: 4.2.8 dev: false /jest-util/26.6.2: @@ -4365,9 +4973,9 @@ packages: engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 - '@types/node': 14.17.6 - chalk: 4.1.1 - graceful-fs: 4.2.6 + '@types/node': 16.9.6 + chalk: 4.1.2 + graceful-fs: 4.2.8 is-ci: 2.0.0 micromatch: 4.0.4 dev: false @@ -4376,7 +4984,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 14.17.6 + '@types/node': 16.9.6 merge-stream: 2.0.0 supports-color: 7.2.0 dev: false @@ -4385,16 +4993,11 @@ packages: resolution: {integrity: sha512-mk0umAQ5lT+CaOJ+Qp01N6kz48sJG2kr2n1rX0koqKf6FIygQV0qLOdN9SCYID4IVeSigDOcPeGLozdMLYfb5g==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 14.17.5 + '@types/node': 16.9.6 merge-stream: 2.0.0 supports-color: 8.1.1 dev: false - /joycon/3.0.1: - resolution: {integrity: sha512-SJcJNBg32dGgxhPtM0wQqxqV0ax9k/9TaUskGDSJkSFSQOEWWvQ3zzWdGQRIUry2j1zA5+ReH13t0Mf3StuVZA==} - engines: {node: '>=10'} - dev: true - /js-tokens/4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -4410,6 +5013,10 @@ packages: engines: {node: '>=4'} hasBin: true + /json-buffer/3.0.0: + resolution: {integrity: sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=} + dev: true + /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -4418,7 +5025,6 @@ packages: /json-schema-traverse/1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true /json-stable-stringify-without-jsonify/1.0.1: resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=} @@ -4429,7 +5035,6 @@ packages: hasBin: true dependencies: minimist: 1.2.5 - dev: false /json5/2.2.0: resolution: {integrity: sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==} @@ -4443,7 +5048,7 @@ packages: dependencies: universalify: 2.0.0 optionalDependencies: - graceful-fs: 4.2.6 + graceful-fs: 4.2.8 /jsonparse/1.3.1: resolution: {integrity: sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=} @@ -4466,8 +5071,8 @@ packages: semver: 5.7.1 dev: false - /jsx-ast-utils/3.2.0: - resolution: {integrity: sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==} + /jsx-ast-utils/3.2.1: + resolution: {integrity: sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==} engines: {node: '>=4.0'} dependencies: array-includes: 3.1.3 @@ -4489,29 +5094,116 @@ packages: safe-buffer: 5.2.1 dev: false + /keyv/3.1.0: + resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} + dependencies: + json-buffer: 3.0.0 + dev: true + /kind-of/3.2.2: resolution: {integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 - dev: false /kind-of/4.0.0: resolution: {integrity: sha1-IIE989cSkosgc3hpGkUGb65y3Vc=} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 - dev: false /kind-of/5.1.0: resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} engines: {node: '>=0.10.0'} - dev: false /kind-of/6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} + /knex/0.21.19: + resolution: {integrity: sha512-6etvrq9XI1Ck6mEc/XiXFGVpD1Lmj6v9XWojqZgEbOvyMbW7XRvgZ99yIhN/kaBH+43FEy3xv/AcbRaH+1pJtw==} + engines: {node: '>=10'} + hasBin: true + peerDependencies: + mssql: ^6.2.1 + mysql: ^2.18.1 + mysql2: ^2.1.0 + pg: ^8.3.0 + sqlite3: ^5.0.0 + peerDependenciesMeta: + mssql: + optional: true + mysql: + optional: true + mysql2: + optional: true + pg: + optional: true + sqlite3: + optional: true + dependencies: + colorette: 1.2.1 + commander: 6.2.1 + debug: 4.3.1 + esm: 3.2.25 + getopts: 2.2.5 + interpret: 2.2.0 + liftoff: 3.1.0 + lodash: 4.17.21 + pg-connection-string: 2.4.0 + tarn: 3.0.1 + tildify: 2.0.0 + v8flags: 3.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /knex/0.21.19_pg@8.6.0: + resolution: {integrity: sha512-6etvrq9XI1Ck6mEc/XiXFGVpD1Lmj6v9XWojqZgEbOvyMbW7XRvgZ99yIhN/kaBH+43FEy3xv/AcbRaH+1pJtw==} + engines: {node: '>=10'} + hasBin: true + peerDependencies: + mssql: ^6.2.1 + mysql: ^2.18.1 + mysql2: ^2.1.0 + pg: ^8.3.0 + sqlite3: ^5.0.0 + peerDependenciesMeta: + mssql: + optional: true + mysql: + optional: true + mysql2: + optional: true + pg: + optional: true + sqlite3: + optional: true + dependencies: + colorette: 1.2.1 + commander: 6.2.1 + debug: 4.3.1 + esm: 3.2.25 + getopts: 2.2.5 + interpret: 2.2.0 + liftoff: 3.1.0 + lodash: 4.17.21 + pg: 8.6.0 + pg-connection-string: 2.4.0 + tarn: 3.0.1 + tildify: 2.0.0 + v8flags: 3.2.0 + transitivePeerDependencies: + - supports-color + dev: false + + /latest-version/5.1.0: + resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} + engines: {node: '>=8'} + dependencies: + package-json: 6.5.0 + dev: true + /levn/0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -4520,14 +5212,27 @@ packages: type-check: 0.4.0 dev: true - /libphonenumber-js/1.9.22: - resolution: {integrity: sha512-nE0aF0wrNq09ewF36s9FVqRW73hmpw6cobVDlbexmsu1432LEfuN24BCudNuRx4t2rElSeK/N0JbedzRW/TC4A==} + /libphonenumber-js/1.9.34: + resolution: {integrity: sha512-gHTNU9xTtVgSp30IDX/57W4pETMXDIYXFfwEOJVXiYosiY7Hc7ogJwlBjOqlCcU04X0aA8DT57hdwUC1sJBJnA==} dev: false - /light-my-request/4.4.1: - resolution: {integrity: sha512-FDNRF2mYjthIRWE7O8d/X7AzDx4otQHl4/QXbu3Q/FRwBFcgb+ZoDaUd5HwN53uQXLAiw76osN+Va0NEaOW6rQ==} + /liftoff/3.1.0: + resolution: {integrity: sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==} + engines: {node: '>= 0.8'} dependencies: - ajv: 6.12.6 + extend: 3.0.2 + findup-sync: 3.0.0 + fined: 1.2.0 + flagged-respawn: 1.0.1 + is-plain-object: 2.0.4 + object.map: 1.0.1 + rechoir: 0.6.2 + resolve: 1.20.0 + + /light-my-request/4.4.4: + resolution: {integrity: sha512-nxYLB+Lke3wGQ55HQIo/CjSS18xGyHRF0y/u7YxEwp1YsqQTxObteBXYHZY3ELSvYmqy0pRLTWbI5//zRYTXlg==} + dependencies: + ajv: 8.6.3 cookie: 0.4.1 fastify-warning: 0.2.0 readable-stream: 3.6.0 @@ -4537,6 +5242,7 @@ packages: /lilconfig/2.0.3: resolution: {integrity: sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==} engines: {node: '>=10'} + dev: false /lines-and-columns/1.1.6: resolution: {integrity: sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=} @@ -4602,10 +5308,6 @@ packages: resolution: {integrity: sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=} dev: false - /lodash.toarray/4.4.0: - resolution: {integrity: sha1-JMS/zWsvuji/0FlNsRedjptlZWE=} - dev: false - /lodash.topath/4.5.2: resolution: {integrity: sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=} dev: false @@ -4626,17 +5328,27 @@ packages: /lower-case/2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: - tslib: 2.3.0 + tslib: 2.3.1 dev: false + /lowercase-keys/1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} + engines: {node: '>=0.10.0'} + dev: true + + /lowercase-keys/2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + dev: true + /lru-cache/6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 - /luxon/2.0.1: - resolution: {integrity: sha512-8Eawf81c9ZlQj62W3eq4mp+C7SAIAnmaS7ZuEAiX503YMcn+0C1JnMQRtfaQj6B5qTZLgHv0F4H5WabBCvi1fw==} + /luxon/2.0.2: + resolution: {integrity: sha512-ZRioYLCgRHrtTORaZX1mx+jtxKtKuI5ZDvHNAmqpUzGqSrR+tL4FVLn/CUGMA3h0+AKD1MAxGI5GnCqR5txNqg==} dev: false /make-dir/3.1.0: @@ -4644,26 +5356,34 @@ packages: engines: {node: '>=8'} dependencies: semver: 6.3.0 - dev: false + + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /make-iterator/1.0.1: + resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 /makeerror/1.0.11: resolution: {integrity: sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=} dependencies: - tmpl: 1.0.4 + tmpl: 1.0.5 dev: false /map-cache/0.2.2: resolution: {integrity: sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=} engines: {node: '>=0.10.0'} - dev: false /map-obj/1.0.1: resolution: {integrity: sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=} engines: {node: '>=0.10.0'} dev: true - /map-obj/4.2.1: - resolution: {integrity: sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==} + /map-obj/4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} dev: true @@ -4672,7 +5392,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: object-visit: 1.0.1 - dev: false /md5.js/1.3.5: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} @@ -4682,6 +5401,11 @@ packages: safe-buffer: 5.2.1 dev: false + /memory-pager/1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + dev: true + optional: true + /meow/8.1.2: resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} engines: {node: '>=10'} @@ -4691,7 +5415,7 @@ packages: decamelize-keys: 1.1.0 hard-rejection: 2.1.0 minimist-options: 4.1.0 - normalize-package-data: 3.0.2 + normalize-package-data: 3.0.3 read-pkg-up: 7.0.1 redent: 3.0.0 trim-newlines: 3.0.1 @@ -4727,7 +5451,6 @@ packages: regex-not: 1.0.2 snapdragon: 0.8.2 to-regex: 3.0.2 - dev: false /micromatch/4.0.4: resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} @@ -4753,16 +5476,16 @@ packages: brorand: 1.1.0 dev: false - /mime-db/1.48.0: - resolution: {integrity: sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==} + /mime-db/1.49.0: + resolution: {integrity: sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==} engines: {node: '>= 0.6'} dev: false - /mime-types/2.1.31: - resolution: {integrity: sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==} + /mime-types/2.1.32: + resolution: {integrity: sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==} engines: {node: '>= 0.6'} dependencies: - mime-db: 1.48.0 + mime-db: 1.49.0 dev: false /mimic-fn/2.1.0: @@ -4770,6 +5493,11 @@ packages: engines: {node: '>=6'} dev: true + /mimic-response/1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + dev: true + /mimic-response/2.1.0: resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} engines: {node: '>=8'} @@ -4805,8 +5533,8 @@ packages: /minimist/1.2.5: resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} - /minipass/3.1.3: - resolution: {integrity: sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==} + /minipass/3.1.5: + resolution: {integrity: sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==} engines: {node: '>=8'} dependencies: yallist: 4.0.0 @@ -4816,7 +5544,7 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} dependencies: - minipass: 3.1.3 + minipass: 3.1.5 yallist: 4.0.0 dev: false @@ -4826,7 +5554,6 @@ packages: dependencies: for-in: 1.0.2 is-extendable: 1.0.1 - dev: false /mkdirp-classic/0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -4853,31 +5580,47 @@ packages: resolution: {integrity: sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==} dev: false + /mongodb-connection-string-url/2.1.0: + resolution: {integrity: sha512-Qf9Zw7KGiRljWvMrrUFDdVqo46KIEiDuCzvEN97rh/PcKzk2bd6n9KuzEwBwW9xo5glwx69y1mI6s+jFUD/aIQ==} + dependencies: + '@types/whatwg-url': 8.2.1 + whatwg-url: 9.1.0 + dev: true + + /mongodb/4.1.2: + resolution: {integrity: sha512-pHCKDoOy1h6mVurziJmXmTMPatYWOx8pbnyFgSgshja9Y36Q+caHUzTDY6rrIy9HCSrjnbXmx3pCtvNZHmR8xg==} + engines: {node: '>=12.9.0'} + dependencies: + bson: 4.5.2 + denque: 2.0.1 + mongodb-connection-string-url: 2.1.0 + optionalDependencies: + saslprep: 1.0.3 + dev: true + /ms/2.0.0: resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} - dev: false /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} /ms/2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /ms/3.0.0-canary.1: + resolution: {integrity: sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==} + engines: {node: '>=12.13'} dev: false /multimap/1.1.0: resolution: {integrity: sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==} dev: true - /mz/2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - dev: true + /nanocolors/0.1.12: + resolution: {integrity: sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==} - /nanoid/3.1.23: - resolution: {integrity: sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==} + /nanoid/3.1.25: + resolution: {integrity: sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: false @@ -4897,7 +5640,6 @@ packages: regex-not: 1.0.2 snapdragon: 0.8.2 to-regex: 3.0.2 - dev: false /napi-build-utils/1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} @@ -4913,20 +5655,14 @@ packages: resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=} dev: true - /nest-next/9.3.0-beta.0_55add61a94687181d4ca049c4c373f05: - resolution: {integrity: sha512-G2ZvSq2hhvQY7s5Ff5noUEjF7fXALtLMFc/I+gg3ro9wCt9bNmkHQgm84w1D8FxSunNbHyy7kbVgy4ZDL8NImw==} - peerDependencies: - '@nestjs/common': ^6.4 - '@nestjs/core': ^6.4 - next: ^9.0.6 + /next-transpile-modules/8.0.0: + resolution: {integrity: sha512-Q2f2yB0zMJ8KJbIYAeZoIxG6cSfVk813zr6B5HzsLMBVcJ3FaF8lKr7WG66n0KlHCwjLSmf/6EkgI6QQVWHrDw==} dependencies: - '@nestjs/common': 8.0.4_e911b02ebc86a0e92191a7b133b2fcd0 - '@nestjs/core': 8.0.4_e4988ec8350f50541cb1b028c87076a8 - next: 11.0.1_f31b35bdaa3b7c2fce82404f09d2dac4 - rxjs: 6.6.7 + enhanced-resolve: 5.8.3 + escalade: 3.1.1 dev: false - /next/11.0.1_f31b35bdaa3b7c2fce82404f09d2dac4: + /next/11.0.1_bd7797d63db473de6e2318609a63c933: resolution: {integrity: sha512-yR7be7asNbvpVNpi6xxEg28wZ7Gqmj1nOt0sABH9qORmF3+pms2KZ7Cng33oK5nqPIzEEFJD0pp2PCe3/ueMIg==} engines: {node: '>=12.0.0'} hasBin: true @@ -4955,7 +5691,7 @@ packages: browserify-zlib: 0.2.0 browserslist: 4.16.6 buffer: 5.6.0 - caniuse-lite: 1.0.30001245 + caniuse-lite: 1.0.30001260 chalk: 2.4.2 chokidar: 3.5.1 constants-browserify: 1.0.0 @@ -4976,7 +5712,7 @@ packages: os-browserify: 0.3.0 p-limit: 3.1.0 path-browserify: 1.0.1 - pnp-webpack-plugin: 1.6.4_typescript@4.3.5 + pnp-webpack-plugin: 1.6.4_typescript@4.4.3 postcss: 8.2.13 process: 0.11.10 prop-types: 15.7.2 @@ -5001,6 +5737,85 @@ packages: - webpack dev: false + /next/11.1.2: + resolution: {integrity: sha512-azEYL0L+wFjv8lstLru3bgvrzPvK0P7/bz6B/4EJ9sYkXeW8r5Bjh78D/Ol7VOg0EIPz0CXoe72hzAlSAXo9hw==} + engines: {node: '>=12.0.0'} + hasBin: true + peerDependencies: + fibers: '>= 3.1.0' + node-sass: ^4.0.0 || ^5.0.0 + react: ^17.0.2 + react-dom: ^17.0.2 + sass: ^1.3.0 + peerDependenciesMeta: + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + dependencies: + '@babel/runtime': 7.15.3 + '@hapi/accept': 5.0.2 + '@next/env': 11.1.2 + '@next/polyfill-module': 11.1.2 + '@next/react-dev-overlay': 11.1.2 + '@next/react-refresh-utils': 11.1.2_react-refresh@0.8.3 + '@node-rs/helper': 1.2.1 + assert: 2.0.0 + ast-types: 0.13.2 + browserify-zlib: 0.2.0 + browserslist: 4.16.6 + buffer: 5.6.0 + caniuse-lite: 1.0.30001260 + chalk: 2.4.2 + chokidar: 3.5.1 + constants-browserify: 1.0.0 + crypto-browserify: 3.12.0 + cssnano-simple: 3.0.0_postcss@8.2.15 + domain-browser: 4.19.0 + encoding: 0.1.13 + etag: 1.8.1 + find-cache-dir: 3.3.1 + get-orientation: 1.1.2 + https-browserify: 1.0.0 + image-size: 1.0.0 + jest-worker: 27.0.0-next.5 + native-url: 0.3.4 + node-fetch: 2.6.1 + node-html-parser: 1.4.9 + node-libs-browser: 2.2.1 + os-browserify: 0.3.0 + p-limit: 3.1.0 + path-browserify: 1.0.1 + pnp-webpack-plugin: 1.6.4 + postcss: 8.2.15 + process: 0.11.10 + querystring-es3: 0.2.1 + raw-body: 2.4.1 + react-is: 17.0.2 + react-refresh: 0.8.3 + stream-browserify: 3.0.0 + stream-http: 3.1.1 + string_decoder: 1.3.0 + styled-jsx: 4.0.1 + timers-browserify: 2.0.12 + tty-browserify: 0.0.1 + use-subscription: 1.5.1 + util: 0.12.4 + vm-browserify: 1.1.2 + watchpack: 2.1.1 + optionalDependencies: + '@next/swc-darwin-arm64': 11.1.2 + '@next/swc-darwin-x64': 11.1.2 + '@next/swc-linux-x64-gnu': 11.1.2 + '@next/swc-win32-x64-msvc': 11.1.2 + transitivePeerDependencies: + - '@babel/core' + - typescript + - webpack + dev: false + /nice-try/1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: false @@ -5009,11 +5824,11 @@ packages: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 - tslib: 2.3.0 + tslib: 2.3.1 dev: false - /node-abi/2.30.0: - resolution: {integrity: sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==} + /node-abi/2.30.1: + resolution: {integrity: sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==} dependencies: semver: 5.7.1 dev: false @@ -5022,10 +5837,14 @@ packages: resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} dev: false - /node-emoji/1.10.0: - resolution: {integrity: sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==} + /node-addon-api/4.2.0: + resolution: {integrity: sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q==} + dev: false + + /node-emoji/1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} dependencies: - lodash.toarray: 4.4.0 + lodash: 4.17.21 dev: false /node-fetch/2.6.1: @@ -5033,6 +5852,13 @@ packages: engines: {node: 4.x || >=6.0.0} dev: false + /node-fetch/2.6.5: + resolution: {integrity: sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==} + engines: {node: 4.x || >=6.0.0} + dependencies: + whatwg-url: 5.0.0 + dev: false + /node-html-parser/1.4.9: resolution: {integrity: sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw==} dependencies: @@ -5074,13 +5900,34 @@ packages: /node-modules-regexp/1.0.0: resolution: {integrity: sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=} engines: {node: '>=0.10.0'} - - /node-releases/1.1.73: - resolution: {integrity: sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==} dev: false - /node-releases/1.1.75: - resolution: {integrity: sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==} + /node-releases/1.1.76: + resolution: {integrity: sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==} + + /nodemon/2.0.13: + resolution: {integrity: sha512-UMXMpsZsv1UXUttCn6gv8eQPhn6DR4BW+txnL3IN5IHqrCwcrT/yWHfL35UsClGXknTH79r5xbu+6J1zNHuSyA==} + engines: {node: '>=8.10.0'} + hasBin: true + requiresBuild: true + dependencies: + chokidar: 3.5.2 + debug: 3.2.7 + ignore-by-default: 1.0.1 + minimatch: 3.0.4 + pstree.remy: 1.1.8 + semver: 5.7.1 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.3 + update-notifier: 5.1.0 + dev: true + + /nopt/1.0.10: + resolution: {integrity: sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=} + hasBin: true + dependencies: + abbrev: 1.1.1 dev: true /nopt/5.0.0: @@ -5100,12 +5947,12 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-package-data/3.0.2: - resolution: {integrity: sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==} + /normalize-package-data/3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} engines: {node: '>=10'} dependencies: hosted-git-info: 4.0.2 - resolve: 1.20.0 + is-core-module: 2.6.0 semver: 7.3.5 validate-npm-package-license: 3.0.4 dev: true @@ -5126,6 +5973,11 @@ packages: engines: {node: '>=0.10.0'} dev: false + /normalize-url/4.5.1: + resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} + engines: {node: '>=8'} + dev: true + /normalize-url/6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} @@ -5148,7 +6000,7 @@ packages: /npmlog/4.1.2: resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} dependencies: - are-we-there-yet: 1.1.5 + are-we-there-yet: 1.1.7 console-control-strings: 1.1.0 gauge: 2.7.4 set-blocking: 2.0.0 @@ -5170,7 +6022,6 @@ packages: copy-descriptor: 0.1.1 define-property: 0.2.5 kind-of: 3.2.2 - dev: false /object-hash/2.2.0: resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} @@ -5197,7 +6048,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 - dev: false /object.assign/4.1.2: resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} @@ -5208,13 +6058,22 @@ packages: has-symbols: 1.0.2 object-keys: 1.1.1 + /object.defaults/1.1.0: + resolution: {integrity: sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=} + engines: {node: '>=0.10.0'} + dependencies: + array-each: 1.0.1 + array-slice: 1.1.0 + for-own: 1.0.0 + isobject: 3.0.1 + /object.entries/1.1.4: resolution: {integrity: sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.5 + es-abstract: 1.18.6 dev: true /object.fromentries/2.0.4: @@ -5223,16 +6082,29 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.5 + es-abstract: 1.18.6 has: 1.0.3 dev: true + /object.hasown/1.0.0: + resolution: {integrity: sha512-qYMF2CLIjxxLGleeM0jrcB4kiv3loGVAjKQKvH8pSU/i2VcRRvUNmxbD+nEMmrXRfORhuVJuH8OtSYCZoue3zA==} + dependencies: + define-properties: 1.1.3 + es-abstract: 1.18.6 + dev: true + + /object.map/1.0.1: + resolution: {integrity: sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=} + engines: {node: '>=0.10.0'} + dependencies: + for-own: 1.0.0 + make-iterator: 1.0.1 + /object.pick/1.3.0: resolution: {integrity: sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 - dev: false /object.values/1.1.4: resolution: {integrity: sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==} @@ -5240,7 +6112,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.5 + es-abstract: 1.18.6 dev: true /once/1.4.0: @@ -5259,7 +6131,7 @@ packages: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} dependencies: - deep-is: 0.1.3 + deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 @@ -5271,6 +6143,11 @@ packages: resolution: {integrity: sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=} dev: false + /p-cancelable/1.1.0: + resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} + engines: {node: '>=6'} + dev: true + /p-finally/1.0.0: resolution: {integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=} engines: {node: '>=4'} @@ -5304,6 +6181,20 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + /package-json/6.5.0: + resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} + engines: {node: '>=8'} + dependencies: + got: 9.6.0 + registry-auth-token: 4.2.1 + registry-url: 5.1.0 + semver: 6.3.0 + dev: true + + /packet-reader/1.0.0: + resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} + dev: false + /pako/1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} dev: false @@ -5314,6 +6205,11 @@ packages: dependencies: callsites: 3.1.0 + /parent-require/1.0.0: + resolution: {integrity: sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc=} + engines: {node: '>= 0.4.0'} + dev: true + /parse-asn1/5.1.6: resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} dependencies: @@ -5324,6 +6220,14 @@ packages: safe-buffer: 5.2.1 dev: false + /parse-filepath/1.0.2: + resolution: {integrity: sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=} + engines: {node: '>=0.8'} + dependencies: + is-absolute: 1.0.0 + map-cache: 0.2.2 + path-root: 0.1.1 + /parse-json/5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -5333,17 +6237,20 @@ packages: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.1.6 + /parse-passwd/1.0.0: + resolution: {integrity: sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=} + engines: {node: '>=0.10.0'} + /pascal-case/3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 - tslib: 2.3.0 + tslib: 2.3.1 dev: false /pascalcase/0.1.1: resolution: {integrity: sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=} engines: {node: '>=0.10.0'} - dev: false /passport-jwt/4.0.0: resolution: {integrity: sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==} @@ -5364,8 +6271,8 @@ packages: engines: {node: '>= 0.4.0'} dev: false - /passport/0.4.1: - resolution: {integrity: sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==} + /passport/0.5.0: + resolution: {integrity: sha512-ln+ue5YaNDS+fes6O5PCzXKSseY5u8MYhX9H5Co4s+HfYI5oqvnHKoOORLYDUPh+8tHvrxugF2GFcUA1Q1Gqfg==} engines: {node: '>= 0.4.0'} dependencies: passport-strategy: 1.0.0 @@ -5396,10 +6303,21 @@ packages: /path-key/3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + dev: true /path-parse/1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + /path-root-regex/0.1.2: + resolution: {integrity: sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=} + engines: {node: '>=0.10.0'} + + /path-root/0.1.1: + resolution: {integrity: sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=} + engines: {node: '>=0.10.0'} + dependencies: + path-root-regex: 0.1.2 + /path-to-regexp/3.2.0: resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} dev: false @@ -5427,11 +6345,70 @@ packages: sha.js: 2.4.11 dev: false - /peek-readable/3.1.4: - resolution: {integrity: sha512-DX7ec7frSMtCWw+zMd27f66hcxIz/w9LQTY2RflB4WNHCVPAye1pJiP2t3gvaaOhu7IOhtPbHw8MemMj+F5lrg==} + /peek-readable/4.0.1: + resolution: {integrity: sha512-7qmhptnR0WMSpxT5rMHG9bW/mYSR1uqaPFj2MHvT+y/aOUu6msJijpKt5SkTDKySwg65OWG2JwTMBlgcbwMHrQ==} engines: {node: '>=8'} dev: false + /pg-connection-string/2.4.0: + resolution: {integrity: sha512-3iBXuv7XKvxeMrIgym7njT+HlZkwZqqGX4Bu9cci8xHZNT+Um1gWKqCsAzcC0d95rcKMU5WBg6YRUcHyV0HZKQ==} + + /pg-connection-string/2.5.0: + resolution: {integrity: sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==} + dev: false + + /pg-int8/1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + dev: false + + /pg-pool/3.4.1_pg@8.6.0: + resolution: {integrity: sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ==} + peerDependencies: + pg: '>=8.0' + dependencies: + pg: 8.6.0 + dev: false + + /pg-protocol/1.5.0: + resolution: {integrity: sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==} + dev: false + + /pg-types/2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + dev: false + + /pg/8.6.0: + resolution: {integrity: sha512-qNS9u61lqljTDFvmk/N66EeGq3n6Ujzj0FFyNMGQr6XuEv4tgNTXvJQTfJdcvGit5p5/DWPu+wj920hAJFI+QQ==} + engines: {node: '>= 8.0.0'} + peerDependencies: + pg-native: '>=2.0.0' + peerDependenciesMeta: + pg-native: + optional: true + dependencies: + buffer-writer: 2.0.0 + packet-reader: 1.0.0 + pg-connection-string: 2.5.0 + pg-pool: 3.4.1_pg@8.6.0 + pg-protocol: 1.5.0 + pg-types: 2.2.0 + pgpass: 1.0.4 + dev: false + + /pgpass/1.0.4: + resolution: {integrity: sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==} + dependencies: + split2: 3.2.2 + dev: false + /picomatch/2.3.0: resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==} engines: {node: '>=8.6'} @@ -5440,15 +6417,16 @@ packages: resolution: {integrity: sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==} dev: false - /pino/6.13.0: - resolution: {integrity: sha512-mRXSTfa34tbfrWqCIp1sUpZLqBhcoaGapoyxfEwaWwJGMpLijlRdDKIQUyvq4M3DUfFH5vEglwSw8POZYwbThA==} + /pino/6.13.3: + resolution: {integrity: sha512-tJy6qVgkh9MwNgqX1/oYi3ehfl2Y9H0uHyEEMsBe74KinESIjdMrMQDWpcZPpPicg3VV35d/GLQZmo4QgU2Xkg==} hasBin: true dependencies: - fast-redact: 3.0.1 - fast-safe-stringify: 2.0.8 + fast-redact: 3.0.2 + fast-safe-stringify: 2.1.1 + fastify-warning: 0.2.0 flatstr: 1.0.12 pino-std-serializers: 3.2.0 - quick-format-unescaped: 4.0.3 + quick-format-unescaped: 4.0.4 sonic-boom: 1.4.1 dev: false @@ -5457,6 +6435,7 @@ packages: engines: {node: '>= 6'} dependencies: node-modules-regexp: 1.0.0 + dev: false /pkg-dir/4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} @@ -5474,11 +6453,20 @@ packages: engines: {node: '>=4'} dev: true - /pnp-webpack-plugin/1.6.4_typescript@4.3.5: + /pnp-webpack-plugin/1.6.4: resolution: {integrity: sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==} engines: {node: '>=6'} dependencies: - ts-pnp: 1.2.0_typescript@4.3.5 + ts-pnp: 1.2.0 + transitivePeerDependencies: + - typescript + dev: false + + /pnp-webpack-plugin/1.6.4_typescript@4.4.3: + resolution: {integrity: sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==} + engines: {node: '>=6'} + dependencies: + ts-pnp: 1.2.0_typescript@4.4.3 transitivePeerDependencies: - typescript dev: false @@ -5486,14 +6474,13 @@ packages: /posix-character-classes/0.1.1: resolution: {integrity: sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=} engines: {node: '>=0.10.0'} - dev: false /postcss-js/3.0.3: resolution: {integrity: sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==} engines: {node: '>=10.0'} dependencies: camelcase-css: 2.0.1 - postcss: 8.3.6 + postcss: 8.3.7 dev: false /postcss-load-config/3.1.0: @@ -5508,14 +6495,15 @@ packages: import-cwd: 3.0.0 lilconfig: 2.0.3 yaml: 1.10.2 + dev: false - /postcss-nested/5.0.5_postcss@8.3.6: - resolution: {integrity: sha512-GSRXYz5bccobpTzLQZXOnSOfKl6TwVr5CyAQJUPub4nuRJSOECK5AqurxVgmtxP48p0Kc/ndY/YyS1yqldX0Ew==} - engines: {node: '>=10.0'} + /postcss-nested/5.0.6_postcss@8.3.7: + resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==} + engines: {node: '>=12.0'} peerDependencies: - postcss: ^8.1.13 + postcss: ^8.2.14 dependencies: - postcss: 8.3.6 + postcss: 8.3.7 postcss-selector-parser: 6.0.6 dev: false @@ -5539,22 +6527,53 @@ packages: resolution: {integrity: sha512-FCE5xLH+hjbzRdpbRb1IMCvPv9yZx2QnDarBEYSN0N0HYk+TcXsEhwdFcFb+SRWOKzKGErhIEbBK2ogyLdTtfQ==} engines: {node: ^10 || ^12 || >=14} dependencies: - colorette: 1.2.2 - nanoid: 3.1.23 + colorette: 1.4.0 + nanoid: 3.1.25 source-map: 0.6.1 dev: false - /postcss/8.3.6: - resolution: {integrity: sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==} + /postcss/8.2.15: + resolution: {integrity: sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==} engines: {node: ^10 || ^12 || >=14} dependencies: - colorette: 1.2.2 - nanoid: 3.1.23 + colorette: 1.4.0 + nanoid: 3.1.25 + source-map: 0.6.1 + dev: false + + /postcss/8.3.7: + resolution: {integrity: sha512-9SaY7nnyQ63/WittqZYAvkkYPyKxchMKH71UDzeTmWuLSvxTRpeEeABZAzlCi55cuGcoFyoV/amX2BdsafQidQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanocolors: 0.1.12 + nanoid: 3.1.25 source-map-js: 0.6.2 dev: false - /prebuild-install/6.1.3: - resolution: {integrity: sha512-iqqSR84tNYQUQHRXalSKdIaM8Ov1QxOVuBNWI7+BzZWv6Ih9k75wOnH1rGQ9WWTaaLkTpxWKIciOF0KyfM74+Q==} + /postgres-array/2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + dev: false + + /postgres-bytea/1.0.0: + resolution: {integrity: sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=} + engines: {node: '>=0.10.0'} + dev: false + + /postgres-date/1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + dev: false + + /postgres-interval/1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + dependencies: + xtend: 4.0.2 + dev: false + + /prebuild-install/6.1.4: + resolution: {integrity: sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==} engines: {node: '>=6'} hasBin: true dependencies: @@ -5564,7 +6583,7 @@ packages: minimist: 1.2.5 mkdirp-classic: 0.5.3 napi-build-utils: 1.0.2 - node-abi: 2.30.0 + node-abi: 2.30.1 npmlog: 4.1.2 pump: 3.0.0 rc: 1.2.8 @@ -5578,8 +6597,13 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier/2.3.2: - resolution: {integrity: sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==} + /prepend-http/2.0.0: + resolution: {integrity: sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=} + engines: {node: '>=4'} + dev: true + + /prettier/2.4.1: + resolution: {integrity: sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==} engines: {node: '>=10.13.0'} hasBin: true dev: true @@ -5597,15 +6621,6 @@ packages: react: 17.0.2 dev: false - /prisma/2.27.0: - resolution: {integrity: sha512-/3H9C+IPlJmY5KArhfKHMpxKXqcZIBZ+LjM1b5FxvLCGQkq/mRC96SpHcKcLtiYgftNAX13nvlxg+cBw9Dbe8Q==} - engines: {node: '>=12.2'} - hasBin: true - requiresBuild: true - dependencies: - '@prisma/engines': 2.27.0-43.cdba6ec525e0213cce26f8e4bb23cf556d1479bb - dev: true - /process-nextick-args/2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: false @@ -5635,6 +6650,10 @@ packages: ipaddr.js: 1.9.1 dev: false + /pstree.remy/1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: true + /public-encrypt/4.0.3: resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} dependencies: @@ -5651,7 +6670,6 @@ packages: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: false /punycode/1.3.2: resolution: {integrity: sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=} @@ -5665,13 +6683,20 @@ packages: resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} + /pupa/2.1.1: + resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} + engines: {node: '>=8'} + dependencies: + escape-goat: 2.1.1 + dev: true + /purgecss/4.0.3: resolution: {integrity: sha512-PYOIn5ibRIP34PBU9zohUcCI09c7drPJJtTDAc0Q6QlRz2/CHQ8ywGLdE7ZhxU2VTqB7p5wkvj5Qcm05Rz3Jmw==} hasBin: true dependencies: commander: 6.2.1 - glob: 7.1.7 - postcss: 8.3.6 + glob: 7.2.0 + postcss: 8.3.7 postcss-selector-parser: 6.0.6 dev: false @@ -5706,8 +6731,8 @@ packages: inherits: 2.0.4 dev: false - /quick-format-unescaped/4.0.3: - resolution: {integrity: sha512-MaL/oqh02mhEo5m5J2rwsVL23Iw2PEaGVHgT2vFt8AAsr0lfvQA5dpXo9TPu0rz7tSBdUPgkbam0j/fj5ZM8yg==} + /quick-format-unescaped/4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} dev: false /quick-lru/4.0.1: @@ -5751,7 +6776,6 @@ packages: ini: 1.3.8 minimist: 1.2.5 strip-json-comments: 2.0.1 - dev: false /react-dom/17.0.2_react@17.0.2: resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==} @@ -5824,7 +6848,7 @@ packages: /readable-stream/2.3.7: resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} dependencies: - core-util-is: 1.0.2 + core-util-is: 1.0.3 inherits: 2.0.4 isarray: 1.0.0 process-nextick-args: 2.0.1 @@ -5861,6 +6885,12 @@ packages: dependencies: picomatch: 2.3.0 + /rechoir/0.6.2: + resolution: {integrity: sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.20.0 + /redent/3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -5880,8 +6910,8 @@ packages: resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} dev: false - /regenerator-runtime/0.13.7: - resolution: {integrity: sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==} + /regenerator-runtime/0.13.9: + resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} dev: false /regex-not/1.0.2: @@ -5890,10 +6920,9 @@ packages: dependencies: extend-shallow: 3.0.2 safe-regex: 1.1.0 - dev: false - /regexp-tree/0.1.23: - resolution: {integrity: sha512-+7HWfb4Bvu8Rs2eQTUIpX9I/PlQkYOuTNbRpKLJlQpSgwSkzFYh+pUj0gtvglnOZLKB6YgnIgRuJ2/IlpL48qw==} + /regexp-tree/0.1.24: + resolution: {integrity: sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==} hasBin: true dev: true @@ -5910,6 +6939,20 @@ packages: engines: {node: '>=8'} dev: true + /registry-auth-token/4.2.1: + resolution: {integrity: sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==} + engines: {node: '>=6.0.0'} + dependencies: + rc: 1.2.8 + dev: true + + /registry-url/5.1.0: + resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} + engines: {node: '>=8'} + dependencies: + rc: 1.2.8 + dev: true + /remove-trailing-separator/1.1.0: resolution: {integrity: sha1-wkvOKig62tW8P1jg1IJJuSN52O8=} dev: false @@ -5917,12 +6960,10 @@ packages: /repeat-element/1.1.4: resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} engines: {node: '>=0.10.0'} - dev: false /repeat-string/1.6.1: resolution: {integrity: sha1-jcrkcOHIirwtYA//Sndihtp15jc=} engines: {node: '>=0.10'} - dev: false /require-directory/2.1.1: resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} @@ -5932,8 +6973,18 @@ packages: /require-from-string/2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + + /require-main-filename/2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} dev: true + /resolve-dir/1.0.1: + resolution: {integrity: sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -5952,12 +7003,11 @@ packages: /resolve-url/0.2.1: resolution: {integrity: sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=} deprecated: https://github.com/lydell/resolve-url#deprecated - dev: false /resolve/1.20.0: resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} dependencies: - is-core-module: 2.5.0 + is-core-module: 2.7.0 path-parse: 1.0.7 /resolve/2.0.0-next.3: @@ -5967,10 +7017,15 @@ packages: path-parse: 1.0.7 dev: true + /responselike/1.0.2: + resolution: {integrity: sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=} + dependencies: + lowercase-keys: 1.0.1 + dev: true + /ret/0.1.15: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} - dev: false /ret/0.2.2: resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} @@ -5985,11 +7040,19 @@ packages: resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} dev: false + /rgb-regex/1.0.1: + resolution: {integrity: sha1-wODWiC3w4jviVKR16O3UGRX+rrE=} + dev: false + + /rgba-regex/1.0.0: + resolution: {integrity: sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=} + dev: false + /rimraf/3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: - glob: 7.1.7 + glob: 7.2.0 /ripemd160/2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} @@ -5998,14 +7061,6 @@ packages: inherits: 2.0.4 dev: false - /rollup/2.53.2: - resolution: {integrity: sha512-1CtEYuS5CRCzFZ7SNW5528SlDlk4VDXIRGwbm/2POQxA/G4+7/crIqJwkmnj8Q/74hGx4oVlNvh4E1CJQ5hZ6w==} - engines: {node: '>=10.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - /rsvp/4.8.5: resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==} engines: {node: 6.* || >= 7.*} @@ -6016,15 +7071,8 @@ packages: dependencies: queue-microtask: 1.2.3 - /rxjs/6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} - dependencies: - tslib: 1.14.1 - dev: false - - /rxjs/7.2.0: - resolution: {integrity: sha512-aX8w9OpKrQmiPKfT1bqETtUr9JygIz6GZ+gql8v7CijClsP0laoFUdKzxFAoWuRdSlOdU2+crss+cMf+cqMTnw==} + /rxjs/7.3.0: + resolution: {integrity: sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw==} dependencies: tslib: 2.1.0 dev: false @@ -6039,12 +7087,11 @@ packages: resolution: {integrity: sha1-QKNmnzsHfR6UPURinhV91IAjvy4=} dependencies: ret: 0.1.15 - dev: false /safe-regex/2.1.1: resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} dependencies: - regexp-tree: 0.1.23 + regexp-tree: 0.1.24 dev: true /safe-regex2/2.0.0: @@ -6074,6 +7121,14 @@ packages: walker: 1.0.7 dev: false + /saslprep/1.0.3: + resolution: {integrity: sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==} + engines: {node: '>=6'} + dependencies: + sparse-bitfield: 3.0.3 + dev: true + optional: true + /scheduler/0.20.2: resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} dependencies: @@ -6085,6 +7140,13 @@ packages: resolution: {integrity: sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg==} dev: false + /semver-diff/3.1.1: + resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + /semver-store/0.3.0: resolution: {integrity: sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg==} dev: false @@ -6106,7 +7168,6 @@ packages: /set-blocking/2.0.0: resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=} - dev: false /set-cookie-parser/2.4.8: resolution: {integrity: sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg==} @@ -6120,7 +7181,6 @@ packages: is-extendable: 0.1.1 is-plain-object: 2.0.4 split-string: 3.1.0 - dev: false /setimmediate/1.0.5: resolution: {integrity: sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=} @@ -6138,15 +7198,15 @@ packages: safe-buffer: 5.2.1 dev: false - /sharp/0.28.3: - resolution: {integrity: sha512-21GEP45Rmr7q2qcmdnjDkNP04Ooh5v0laGS5FDpojOO84D1DJwUijLiSq8XNNM6e8aGXYtoYRh3sVNdm8NodMA==} - engines: {node: '>=10'} + /sharp/0.29.1: + resolution: {integrity: sha512-DpgdAny9TuS+oWCQ7MRS8XyY9x6q1+yW3a5wNx0J3HrGuB/Jot/8WcT+lElHY9iJu2pwtegSGxqMaqFiMhs4rQ==} + engines: {node: '>=12.13.0'} requiresBuild: true dependencies: - color: 3.1.3 + color: 4.0.1 detect-libc: 1.0.3 - node-addon-api: 3.2.1 - prebuild-install: 6.1.3 + node-addon-api: 4.2.0 + prebuild-install: 6.1.4 semver: 7.3.5 simple-get: 3.1.0 tar-fs: 2.1.1 @@ -6165,6 +7225,7 @@ packages: engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 + dev: true /shebang-regex/1.0.0: resolution: {integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=} @@ -6174,6 +7235,7 @@ packages: /shebang-regex/3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + dev: true /shell-quote/1.7.2: resolution: {integrity: sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==} @@ -6185,10 +7247,9 @@ packages: call-bind: 1.0.2 get-intrinsic: 1.1.1 object-inspect: 1.11.0 - dev: true - /signal-exit/3.0.3: - resolution: {integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==} + /signal-exit/3.0.4: + resolution: {integrity: sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q==} /simple-concat/1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} @@ -6228,14 +7289,12 @@ packages: define-property: 1.0.0 isobject: 3.0.1 snapdragon-util: 3.0.1 - dev: false /snapdragon-util/3.0.1: resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 - dev: false /snapdragon/0.8.2: resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} @@ -6249,7 +7308,6 @@ packages: source-map: 0.5.7 source-map-resolve: 0.5.3 use: 3.1.1 - dev: false /sonic-boom/1.4.1: resolution: {integrity: sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==} @@ -6271,11 +7329,16 @@ packages: resolve-url: 0.2.1 source-map-url: 0.4.1 urix: 0.1.0 - dev: false + + /source-map-support/0.5.20: + resolution: {integrity: sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true /source-map-url/0.4.1: resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} - dev: false /source-map/0.5.7: resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} @@ -6284,7 +7347,6 @@ packages: /source-map/0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - dev: false /source-map/0.7.3: resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} @@ -6298,6 +7360,13 @@ packages: whatwg-url: 7.1.0 dev: false + /sparse-bitfield/3.0.3: + resolution: {integrity: sha1-/0rm5oZWBWuks+eSqzM004JzyhE=} + dependencies: + memory-pager: 1.5.0 + dev: true + optional: true + /spdx-correct/3.1.1: resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} dependencies: @@ -6325,17 +7394,19 @@ packages: engines: {node: '>=0.10.0'} dependencies: extend-shallow: 3.0.2 - dev: false /split2/3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: readable-stream: 3.6.0 - dev: true /sprintf-js/1.0.3: resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} + /sqlstring/2.3.2: + resolution: {integrity: sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==} + engines: {node: '>= 0.6'} + /stacktrace-parser/0.1.10: resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} engines: {node: '>=6'} @@ -6349,7 +7420,6 @@ packages: dependencies: define-property: 0.2.5 object-copy: 0.1.0 - dev: false /statuses/1.5.0: resolution: {integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=} @@ -6426,13 +7496,13 @@ packages: strip-ansi: 3.0.1 dev: false - /string-width/4.2.2: - resolution: {integrity: sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==} + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.0 + strip-ansi: 6.0.1 dev: true /string.prototype.matchall/4.0.5: @@ -6440,7 +7510,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.5 + es-abstract: 1.18.6 get-intrinsic: 1.1.1 has-symbols: 1.0.2 internal-slot: 1.0.3 @@ -6476,13 +7546,25 @@ packages: engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 - dev: false /strip-ansi/6.0.0: resolution: {integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==} engines: {node: '>=8'} dependencies: - ansi-regex: 5.0.0 + ansi-regex: 5.0.1 + dev: false + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-bom/3.0.0: + resolution: {integrity: sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=} + engines: {node: '>=4'} + dev: true /strip-eof/1.0.0: resolution: {integrity: sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=} @@ -6504,19 +7586,17 @@ packages: /strip-json-comments/2.0.1: resolution: {integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=} engines: {node: '>=0.10.0'} - dev: false /strip-json-comments/3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - dev: true - /strtok3/6.1.3: - resolution: {integrity: sha512-ssWSKFOeUTurMSucgyUf+a6Z9mVTYrsYiyEK5RLnh8BM6sFrKSljVlnjZXIDxMguYfdQI+mUPFHo88FYTxq1XA==} + /strtok3/6.2.4: + resolution: {integrity: sha512-GO8IcFF9GmFDvqduIspUBwCzCbqzegyVKIsSymcMgiZKeCfrN9SowtUoi8+b59WZMAjIzVZic/Ft97+pynR3Iw==} engines: {node: '>=10'} dependencies: - '@tokenizer/token': 0.1.1 - peek-readable: 3.1.4 + '@tokenizer/token': 0.3.0 + peek-readable: 4.0.1 dev: false /styled-jsx/3.3.2_react@17.0.2: @@ -6535,6 +7615,26 @@ packages: stylis-rule-sheet: 0.0.10_stylis@3.5.4 dev: false + /styled-jsx/4.0.1: + resolution: {integrity: sha512-Gcb49/dRB1k8B4hdK8vhW27Rlb2zujCk1fISrizCcToIs+55B4vmUM0N9Gi4nnVfFZWe55jRdWpAqH1ldAKWvQ==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + react: '>= 16.8.0 || 17.x.x || 18.x.x' + peerDependenciesMeta: + '@babel/core': + optional: true + dependencies: + '@babel/plugin-syntax-jsx': 7.14.5 + '@babel/types': 7.15.0 + convert-source-map: 1.7.0 + loader-utils: 1.2.3 + source-map: 0.7.3 + string-hash: 1.1.3 + stylis: 3.5.4 + stylis-rule-sheet: 0.0.10_stylis@3.5.4 + dev: false + /stylis-rule-sheet/0.0.10_stylis@3.5.4: resolution: {integrity: sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==} peerDependencies: @@ -6547,17 +7647,9 @@ packages: resolution: {integrity: sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==} dev: false - /sucrase/3.20.0: - resolution: {integrity: sha512-Rsp+BX7DRuCleJvBAHN7gQ3ddk7U0rJev19XlIBF6dAq9vX4Tr5mHk4E7+ig/I7BM3DLYotCmm20lfBElT2XtQ==} - engines: {node: '>=8'} - hasBin: true - dependencies: - commander: 4.1.1 - glob: 7.1.6 - lines-and-columns: 1.1.6 - mz: 2.7.0 - pirates: 4.0.1 - ts-interface-checker: 0.1.13 + /supports-color/2.0.0: + resolution: {integrity: sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=} + engines: {node: '>=0.8.0'} dev: true /supports-color/5.5.0: @@ -6579,8 +7671,8 @@ packages: has-flag: 4.0.0 dev: false - /swr/0.5.6_react@17.0.2: - resolution: {integrity: sha512-Bmx3L4geMZjYT5S2Z6EE6/5Cx6v1Ka0LhqZKq8d6WL2eu9y6gHWz3dUzfIK/ymZVHVfwT/EweFXiYGgfifei3w==} + /swr/1.0.1_react@17.0.2: + resolution: {integrity: sha512-EPQAxSjoD4IaM49rpRHK0q+/NzcwoT8c0/Ylu/u3/6mFj/CWnQVjNJ0MV2Iuw/U+EJSd2TX5czdAwKPYZIG0YA==} peerDependencies: react: ^16.11.0 || ^17.0.0 dependencies: @@ -6592,29 +7684,29 @@ packages: resolution: {integrity: sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==} engines: {node: '>=10.0.0'} dependencies: - ajv: 8.6.2 + ajv: 8.6.3 lodash.clonedeep: 4.5.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 - string-width: 4.2.2 - strip-ansi: 6.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 dev: true - /tailwindcss/2.2.7_7b69a43ec4689fa7484dee35f79a7806: - resolution: {integrity: sha512-jv35rugP5j8PpzbXnsria7ZAry7Evh0KtQ4MZqNd+PhF+oIKPwJTVwe/rmfRx9cZw3W7iPZyzBmeoAoNwfJ1yg==} + /tailwindcss/2.2.15_dd4850c39760d2665af3f9e21d00faf4: + resolution: {integrity: sha512-WgV41xTMbnSoTNMNnJvShQZ+8GmY86DmXTrCgnsveNZJdlybfwCItV8kAqjYmU49YiFr+ofzmT1JlAKajBZboQ==} engines: {node: '>=12.13.0'} hasBin: true peerDependencies: autoprefixer: ^10.0.2 postcss: ^8.0.9 dependencies: - arg: 5.0.0 - autoprefixer: 10.3.1_postcss@8.3.6 + arg: 5.0.1 + autoprefixer: 10.3.5_postcss@8.3.7 bytes: 3.1.0 - chalk: 4.1.1 + chalk: 4.1.2 chokidar: 3.5.2 - color: 3.2.1 - cosmiconfig: 7.0.0 + color: 4.0.1 + cosmiconfig: 7.0.1 detective: 5.2.0 didyoumean: 1.2.2 dlv: 1.1.3 @@ -6622,17 +7714,18 @@ packages: fs-extra: 10.0.0 glob-parent: 6.0.1 html-tags: 3.1.0 + is-color-stop: 1.1.0 is-glob: 4.0.1 lodash: 4.17.21 lodash.topath: 4.5.2 modern-normalize: 1.1.0 - node-emoji: 1.10.0 + node-emoji: 1.11.0 normalize-path: 3.0.0 object-hash: 2.2.0 - postcss: 8.3.6 + postcss: 8.3.7 postcss-js: 3.0.3 postcss-load-config: 3.1.0 - postcss-nested: 5.0.5_postcss@8.3.6 + postcss-nested: 5.0.6_postcss@8.3.7 postcss-selector-parser: 6.0.6 postcss-value-parser: 4.1.0 pretty-hrtime: 1.0.3 @@ -6645,6 +7738,11 @@ packages: - ts-node dev: false + /tapable/2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: false + /tar-fs/2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} dependencies: @@ -6665,24 +7763,28 @@ packages: readable-stream: 3.6.0 dev: false - /tar/6.1.0: - resolution: {integrity: sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==} + /tar/6.1.11: + resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} engines: {node: '>= 10'} dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 - minipass: 3.1.3 + minipass: 3.1.5 minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 dev: false + /tarn/3.0.1: + resolution: {integrity: sha512-6usSlV9KyHsspvwu2duKH+FMUhqJnAh6J5J/4MITl8s94iSUQTLkJggdiewKv4RyARQccnigV48Z+khiuVZDJw==} + engines: {node: '>=8.0.0'} + /test-exclude/6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} dependencies: '@istanbuljs/schema': 0.1.3 - glob: 7.1.7 + glob: 7.2.0 minimatch: 3.0.4 dev: false @@ -6695,24 +7797,11 @@ packages: resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} dev: true - /textextensions/5.12.0: - resolution: {integrity: sha512-IYogUDaP65IXboCiPPC0jTLLBzYlhhw2Y4b0a2trPgbHNGGGEfuHE6tds+yDcCf4mpNDaGISFzwSSezcXt+d6w==} + /textextensions/5.14.0: + resolution: {integrity: sha512-4cAYwNFNYlIAHBUo7p6zw8POUvWbZor+/R0Tanv+rIhsauEyV9QSrEXL40pI+GfTQxKX8k6Tyw6CmdSDSmASrg==} engines: {node: '>=0.8'} dev: false - /thenify-all/1.6.0: - resolution: {integrity: sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=} - engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - dev: true - - /thenify/3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: true - /throttle-debounce/2.3.0: resolution: {integrity: sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==} engines: {node: '>=8'} @@ -6728,6 +7817,10 @@ packages: readable-stream: 3.6.0 dev: true + /tildify/2.0.0: + resolution: {integrity: sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==} + engines: {node: '>=8'} + /timers-browserify/2.0.12: resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} engines: {node: '>=0.6.0'} @@ -6747,8 +7840,8 @@ packages: rimraf: 3.0.2 dev: false - /tmpl/1.0.4: - resolution: {integrity: sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=} + /tmpl/1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: false /to-arraybuffer/1.0.1: @@ -6764,7 +7857,11 @@ packages: engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 - dev: false + + /to-readable-stream/1.0.0: + resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} + engines: {node: '>=6'} + dev: true /to-regex-range/2.1.1: resolution: {integrity: sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=} @@ -6772,7 +7869,6 @@ packages: dependencies: is-number: 3.0.0 repeat-string: 1.6.1 - dev: false /to-regex-range/5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -6788,7 +7884,6 @@ packages: extend-shallow: 3.0.2 regex-not: 1.0.2 safe-regex: 1.1.0 - dev: false /toggle-selection/1.0.6: resolution: {integrity: sha1-bkWxJj8gF/oKzH2J14sVuL932jI=} @@ -6799,23 +7894,36 @@ packages: engines: {node: '>=0.6'} dev: false - /token-types/3.1.0: - resolution: {integrity: sha512-WhoeIW7UTn7NC7L0t/4x3vU/YYSS1oeUxYgiGXQLd82Kaf1qtlxOex3ETY0+o2QuRgAdyursMlUhQBKDCfMUkQ==} + /token-types/4.1.1: + resolution: {integrity: sha512-hD+QyuUAyI2spzsI0B7gf/jJ2ggR4RjkAo37j3StuePhApJUwcWDjnHDOFdIWYSwNR28H14hpwm4EI+V1Ted1w==} engines: {node: '>=10'} dependencies: - '@tokenizer/token': 0.1.1 + '@tokenizer/token': 0.3.0 ieee754: 1.2.1 dev: false + /touch/3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true + + /tr46/0.0.3: + resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} + dev: false + /tr46/1.0.1: resolution: {integrity: sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=} dependencies: punycode: 2.1.1 dev: false - /tree-kill/1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true + /tr46/2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} + dependencies: + punycode: 2.1.1 dev: true /trim-newlines/3.0.1: @@ -6823,16 +7931,56 @@ packages: engines: {node: '>=8'} dev: true - /trim-off-newlines/1.0.1: - resolution: {integrity: sha1-n5up2e+odkw4dpi8v+sshI8RrbM=} - engines: {node: '>=0.10.0'} + /ts-eager/2.0.2: + resolution: {integrity: sha512-xzFPL2z7mgLs0brZXaIHTm91Pjl/Cuu9AMKprgSuK+kIS2LjiG8fqqg4eqz3tgBy9OIdupb9w55pr7ea3JBB+Q==} + engines: {node: '>=12.18.4'} + hasBin: true + dependencies: + esbuild: 0.11.23 + source-map-support: 0.5.20 dev: true - /ts-interface-checker/0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + /ts-node/10.2.1_@types+node@16.10.1: + resolution: {integrity: sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==} + engines: {node: '>=12.0.0'} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.6.1 + '@tsconfig/node10': 1.0.8 + '@tsconfig/node12': 1.0.9 + '@tsconfig/node14': 1.0.1 + '@tsconfig/node16': 1.0.2 + '@types/node': 16.10.1 + acorn: 8.5.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + yn: 3.1.1 dev: true - /ts-pnp/1.2.0_typescript@4.3.5: + /ts-pnp/1.2.0: + resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==} + engines: {node: '>=6'} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dev: false + + /ts-pnp/1.2.0_typescript@4.4.3: resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==} engines: {node: '>=6'} peerDependencies: @@ -6841,56 +7989,37 @@ packages: typescript: optional: true dependencies: - typescript: 4.3.5 + typescript: 4.4.3 dev: false + /tsconfig-paths/3.9.0: + resolution: {integrity: sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.1 + minimist: 1.2.5 + strip-bom: 3.0.0 + dev: true + /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true /tslib/2.1.0: resolution: {integrity: sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==} dev: false - /tslib/2.3.0: - resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + /tslib/2.3.1: + resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} dev: false - /tsup/4.12.5_typescript@4.3.5: - resolution: {integrity: sha512-3f0StcX+trOZvgaY/iU11U8HvvQ4v/LLgoP9OmxtOQVXP8e/Q8FSk69d0bXFb2pHB77CmVxvqiWdwybELQfx1A==} - hasBin: true - peerDependencies: - typescript: ^4.2.3 - peerDependenciesMeta: - typescript: - optional: true - dependencies: - cac: 6.7.3 - chalk: 4.1.1 - chokidar: 3.5.2 - debug: 4.3.2 - esbuild: 0.12.15 - execa: 5.1.1 - globby: 11.0.4 - joycon: 3.0.1 - postcss-load-config: 3.1.0 - resolve-from: 5.0.0 - rollup: 2.53.2 - sucrase: 3.20.0 - tree-kill: 1.2.2 - typescript: 4.3.5 - transitivePeerDependencies: - - supports-color - - ts-node - dev: true - - /tsutils/3.21.0_typescript@4.3.5: + /tsutils/3.21.0: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 4.3.5 dev: true /tty-browserify/0.0.0: @@ -6943,14 +8072,20 @@ packages: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} dependencies: is-typedarray: 1.0.0 - dev: false - /typescript/4.3.5: - resolution: {integrity: sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==} + /typescript/4.4.3: + resolution: {integrity: sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==} engines: {node: '>=4.2.0'} hasBin: true dev: true + /umzug/2.3.0: + resolution: {integrity: sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==} + engines: {node: '>=6.0.0'} + dependencies: + bluebird: 3.7.2 + dev: true + /unbox-primitive/1.0.1: resolution: {integrity: sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==} dependencies: @@ -6959,6 +8094,16 @@ packages: has-symbols: 1.0.2 which-boxed-primitive: 1.0.2 + /unc-path-regex/0.1.2: + resolution: {integrity: sha1-5z3T17DXxe2G+6xrCufYxqadUPo=} + engines: {node: '>=0.10.0'} + + /undefsafe/2.0.3: + resolution: {integrity: sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==} + dependencies: + debug: 2.6.9 + dev: true + /union-value/1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} @@ -6967,7 +8112,13 @@ packages: get-value: 2.0.6 is-extendable: 0.1.1 set-value: 2.0.1 - dev: false + + /unique-string/2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + dependencies: + crypto-random-string: 2.0.0 + dev: true /universalify/2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} @@ -6984,12 +8135,31 @@ packages: dependencies: has-value: 0.3.1 isobject: 3.0.1 - dev: false + + /update-notifier/5.1.0: + resolution: {integrity: sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==} + engines: {node: '>=10'} + dependencies: + boxen: 5.1.2 + chalk: 4.1.2 + configstore: 5.0.1 + has-yarn: 2.1.0 + import-lazy: 2.1.0 + is-ci: 2.0.0 + is-installed-globally: 0.4.0 + is-npm: 5.0.0 + is-yarn-global: 0.3.0 + latest-version: 5.1.0 + pupa: 2.1.1 + semver: 7.3.5 + semver-diff: 3.1.1 + xdg-basedir: 4.0.0 + dev: true /upper-case/2.0.2: resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} dependencies: - tslib: 2.3.0 + tslib: 2.3.1 dev: false /uri-js/4.4.1: @@ -7000,7 +8170,13 @@ packages: /urix/0.1.0: resolution: {integrity: sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=} deprecated: Please see https://github.com/lydell/urix#deprecated - dev: false + + /url-parse-lax/3.0.0: + resolution: {integrity: sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=} + engines: {node: '>=4'} + dependencies: + prepend-http: 2.0.0 + dev: true /url/0.11.0: resolution: {integrity: sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=} @@ -7009,6 +8185,14 @@ packages: querystring: 0.2.0 dev: false + /use-subscription/1.5.1: + resolution: {integrity: sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + dependencies: + object-assign: 4.1.1 + dev: false + /use-subscription/1.5.1_react@17.0.2: resolution: {integrity: sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==} peerDependencies: @@ -7021,7 +8205,6 @@ packages: /use/3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} - dev: false /util-deprecate/1.0.2: resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} @@ -7042,11 +8225,22 @@ packages: resolution: {integrity: sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==} dependencies: inherits: 2.0.4 - is-arguments: 1.1.0 - is-generator-function: 1.0.9 - is-typed-array: 1.1.5 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.8 safe-buffer: 5.2.1 - which-typed-array: 1.1.4 + which-typed-array: 1.1.7 + dev: false + + /util/0.12.4: + resolution: {integrity: sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.8 + safe-buffer: 5.2.1 + which-typed-array: 1.1.7 dev: false /uuid/8.3.2: @@ -7058,6 +8252,12 @@ packages: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true + /v8flags/3.2.0: + resolution: {integrity: sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==} + engines: {node: '>= 0.10'} + dependencies: + homedir-polyfill: 1.0.3 + /validate-npm-package-license/3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -7075,18 +8275,6 @@ packages: engines: {node: '>= 0.8'} dev: false - /version-compare/1.2.0: - resolution: {integrity: sha512-hfc76oyGqCuyofT85uDNbjt4khHijJEmU+0n5Vp6TDPg5WzorV7o8BtGyFJjJHN+5SHJM4gVpyvcdY9x/X5wSQ==} - engines: {node: '>=4'} - dev: false - - /version-range/1.2.0: - resolution: {integrity: sha512-dtpGs3yyiQdPLKLGunbfbNDM14g7rH5u1T+/+uyndyPuFBRrFKjMjkLwdD4PsUZlawz9i1DWFJPEw2bCKFJAhQ==} - engines: {node: '>=4'} - dependencies: - version-compare: 1.2.0 - dev: false - /vm-browserify/1.1.2: resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} dev: false @@ -7102,13 +8290,29 @@ packages: engines: {node: '>=10.13.0'} dependencies: glob-to-regexp: 0.4.1 - graceful-fs: 4.2.6 + graceful-fs: 4.2.8 + dev: false + + /webidl-conversions/3.0.1: + resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} dev: false /webidl-conversions/4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} dev: false + /webidl-conversions/6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} + dev: true + + /whatwg-url/5.0.0: + resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + /whatwg-url/7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} dependencies: @@ -7117,6 +8321,14 @@ packages: webidl-conversions: 4.0.2 dev: false + /whatwg-url/9.1.0: + resolution: {integrity: sha512-CQ0UcrPHyomtlOCot1TL77WyMIm/bCwrJ2D6AOKGwEczU9EpyoqAokfqrf/MioU9kHcMsmJZcg1egXix2KYEsA==} + engines: {node: '>=12'} + dependencies: + tr46: 2.1.0 + webidl-conversions: 6.1.0 + dev: true + /which-boxed-primitive/1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: @@ -7126,17 +8338,20 @@ packages: is-string: 1.0.7 is-symbol: 1.0.4 - /which-typed-array/1.1.4: - resolution: {integrity: sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==} + /which-module/2.0.0: + resolution: {integrity: sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=} + dev: true + + /which-typed-array/1.1.7: + resolution: {integrity: sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.4 + available-typed-arrays: 1.0.5 call-bind: 1.0.2 - es-abstract: 1.18.3 + es-abstract: 1.18.6 foreach: 2.0.5 - function-bind: 1.1.1 - has-symbols: 1.0.2 - is-typed-array: 1.1.5 + has-tostringtag: 1.0.0 + is-typed-array: 1.1.8 dev: false /which/1.3.1: @@ -7144,7 +8359,6 @@ packages: hasBin: true dependencies: isexe: 2.0.0 - dev: false /which/2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} @@ -7152,6 +8366,7 @@ packages: hasBin: true dependencies: isexe: 2.0.0 + dev: true /wide-align/1.1.3: resolution: {integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==} @@ -7159,18 +8374,34 @@ packages: string-width: 1.0.2 dev: false + /widest-line/3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + dependencies: + string-width: 4.2.3 + dev: true + /word-wrap/1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} dev: true + /wrap-ansi/6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + /wrap-ansi/7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 - string-width: 4.2.2 - strip-ansi: 6.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 dev: true /wrappy/1.0.2: @@ -7181,20 +8412,28 @@ packages: dependencies: imurmurhash: 0.1.4 is-typedarray: 1.0.0 - signal-exit: 3.0.3 + signal-exit: 3.0.4 typedarray-to-buffer: 3.1.5 - dev: false /xbytes/1.7.0: resolution: {integrity: sha512-iZglBXuHoC1F7jRz7746QhicNE167tEVq2H/iYQ1jIFdYIjqL8OfM86K52csfRZm+d83/VJO8bu37jN/G1ekKQ==} engines: {node: '>=1'} dev: false + /xdg-basedir/4.0.0: + resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} + engines: {node: '>=8'} + dev: true + /xtend/4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} dev: false + /y18n/4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: true + /y18n/5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -7207,24 +8446,62 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} + /yargonaut/1.1.4: + resolution: {integrity: sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==} + dependencies: + chalk: 1.1.3 + figlet: 1.5.2 + parent-require: 1.0.0 + dev: true + + /yargs-parser/18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: true + /yargs-parser/20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} dev: true - /yargs/17.0.1: - resolution: {integrity: sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==} + /yargs/15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.0 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: true + + /yargs/17.2.0: + resolution: {integrity: sha512-UPeZv4h9Xv510ibpt5rdsUNzgD78nMa1rhxxCgvkKiq06hlKCEHJLiJ6Ub8zDg/wR6hedEI6ovnd2vCvJ4nusA==} engines: {node: '>=12'} dependencies: cliui: 7.0.4 escalade: 3.1.1 get-caller-file: 2.0.5 require-directory: 2.1.1 - string-width: 4.2.2 + string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 dev: true + /yn/3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + /yocto-queue/0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..ac44c04 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +packages: + - "packages/**" + - "!**/test/**" diff --git a/prisma/migrations/20210403030737_init/migration.sql b/prisma/migrations/20210403030737_init/migration.sql deleted file mode 100644 index c85f9ef..0000000 --- a/prisma/migrations/20210403030737_init/migration.sql +++ /dev/null @@ -1,65 +0,0 @@ --- CreateTable -CREATE TABLE "files" ( - "id" TEXT NOT NULL, - "createdAt" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "type" TEXT NOT NULL, - "size" INTEGER NOT NULL, - "hash" TEXT NOT NULL, - "name" TEXT, - "ownerId" TEXT NOT NULL, - - PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "thumbnails" ( - "id" TEXT NOT NULL, - "size" INTEGER NOT NULL, - "duration" INTEGER NOT NULL, - "data" BYTEA NOT NULL, - "createdAt" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "fileId" TEXT NOT NULL, - - PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "links" ( - "id" TEXT NOT NULL, - "createdAt" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "destination" TEXT NOT NULL, - "clicks" INTEGER NOT NULL DEFAULT 0, - "ownerId" TEXT NOT NULL, - - PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "users" ( - "id" TEXT NOT NULL, - "username" TEXT NOT NULL, - "permissions" INTEGER NOT NULL DEFAULT 0, - "password" TEXT NOT NULL, - "token" TEXT NOT NULL, - "invite" TEXT NOT NULL, - - PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "thumbnails_fileId_unique" ON "thumbnails"("fileId"); - --- CreateIndex -CREATE UNIQUE INDEX "users.username_unique" ON "users"("username"); - --- CreateIndex -CREATE INDEX "users.username_index" ON "users"("username"); - --- AddForeignKey -ALTER TABLE "files" ADD FOREIGN KEY ("ownerId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "thumbnails" ADD FOREIGN KEY ("fileId") REFERENCES "files"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "links" ADD FOREIGN KEY ("ownerId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20210416050125_host_tags/migration.sql b/prisma/migrations/20210416050125_host_tags/migration.sql deleted file mode 100644 index d3081fd..0000000 --- a/prisma/migrations/20210416050125_host_tags/migration.sql +++ /dev/null @@ -1,9 +0,0 @@ --- "host" was added for restricting uploads to --- specific hosts -ALTER TABLE "files" ADD COLUMN "host" TEXT; -ALTER TABLE "links" ADD COLUMN "host" TEXT; - --- "tags" was added --- "token" was renamed to "secret" -ALTER TABLE "users" ADD COLUMN "tags" TEXT[]; -ALTER TABLE "users" RENAME COLUMN "token" TO "secret"; \ No newline at end of file diff --git a/prisma/migrations/20210420060855_thumbnail_cascades/migration.sql b/prisma/migrations/20210420060855_thumbnail_cascades/migration.sql deleted file mode 100644 index 2bff5f7..0000000 --- a/prisma/migrations/20210420060855_thumbnail_cascades/migration.sql +++ /dev/null @@ -1,3 +0,0 @@ --- fixes thumbnail cascade deletion because prisma doesnt wanna handle it for us -ALTER TABLE "thumbnails" DROP CONSTRAINT "thumbnails_fileId_fkey"; -ALTER TABLE "thumbnails" ADD FOREIGN KEY ("fileId") REFERENCES files("id") ON DELETE CASCADE; \ No newline at end of file diff --git a/prisma/migrations/20210423163121_thumbnail_mime_change/migration.sql b/prisma/migrations/20210423163121_thumbnail_mime_change/migration.sql deleted file mode 100644 index 5b35559..0000000 --- a/prisma/migrations/20210423163121_thumbnail_mime_change/migration.sql +++ /dev/null @@ -1,4 +0,0 @@ --- we're changing the type of thumbnails from image/jpeg to image/webp for alpha support --- and since we dont store thumbnail mime types the choices were store them or wipe old jpeg thumbnails --- and this seemed the better option. -TRUNCATE "thumbnails"; \ No newline at end of file diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml deleted file mode 100644 index fbffa92..0000000 --- a/prisma/migrations/migration_lock.toml +++ /dev/null @@ -1,3 +0,0 @@ -# Please do not edit this file manually -# It should be added in your version-control system (i.e. Git) -provider = "postgresql" \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma deleted file mode 100644 index f532a2f..0000000 --- a/prisma/schema.prisma +++ /dev/null @@ -1,62 +0,0 @@ -generator client { - provider = "prisma-client-js" -} - -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} - -model File { - id String @id - createdAt DateTime @default(now()) @db.Timestamptz(6) - type String - size Int - hash String - name String? - host String? - owner User @relation(fields: [ownerId], references: [id]) - ownerId String - thumbnail Thumbnail? - - @@map("files") -} - -model Thumbnail { - id String @id - size Int - duration Int - data Bytes - createdAt DateTime @default(now()) @db.Timestamptz(6) - file File @relation(fields: [fileId], references: [id]) - fileId String - - @@map("thumbnails") -} - -model Link { - id String @id - createdAt DateTime @default(now()) @db.Timestamptz(6) - destination String - host String? - clicks Int @default(0) - owner User @relation(fields: [ownerId], references: [id]) - ownerId String - - @@map("links") -} - -model User { - id String @id - username String @unique - permissions Int @default(0) - password String - secret String - invite String - tags String[] - files File[] - links Link[] - - @@index([username]) - @@map("users") -} diff --git a/src/components/time.tsx b/src/components/time.tsx deleted file mode 100644 index 5814b44..0000000 --- a/src/components/time.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { DateTime } from "luxon"; -import { FunctionComponent, useEffect, useMemo, useState } from "react"; - -export interface TimeProps { - date: string | number | Date; - className?: string; -} - -export const Time: FunctionComponent = (props) => { - const date = useMemo(() => new Date(props.date), [props.date]); - const time = useMemo(() => DateTime.fromJSDate(date), [date]); - const [relative, setRelative] = useState(time.toRelative()); - const iso = date.toISOString(); - - useEffect(() => { - const timer = setInterval(() => { - setRelative(time.toRelative()); - }, 60_000); - - return () => { - clearInterval(timer); - }; - }); - - return ( - - ); -}; diff --git a/src/config.ts b/src/config.ts deleted file mode 100644 index d71eb07..0000000 --- a/src/config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { loadConfig, validateConfig } from "@ryanke/venera"; -import { MicroConfig } from "./classes/MicroConfig"; - -const data = loadConfig("micro"); -const config = validateConfig(MicroConfig, data, { - // breaks with some of the whacky transforms we do - enableImplicitConversion: false, -}); - -if (config.rootHost.wildcard) { - throw new Error(`Root host cannot be a wildcard domain.`); -} - -export { config }; diff --git a/src/helpers/error-handler.helper.ts b/src/helpers/error-handler.helper.ts deleted file mode 100644 index b69b402..0000000 --- a/src/helpers/error-handler.helper.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { HttpException, HttpStatus, InternalServerErrorException, Logger } from "@nestjs/common"; -import { FastifyRequest } from "fastify"; -import { StatusCodes } from "http-status-codes"; -import { RenderableReply } from "../types"; - -export const errorHandler = async (error: any, request: FastifyRequest, reply: RenderableReply) => { - const isWrapped = error instanceof HttpException; - const wrapped = isWrapped ? error : new InternalServerErrorException(error.message); - const response = wrapped.getResponse() as any; - const status = wrapped.getStatus(); - if (status >= HttpStatus.INTERNAL_SERVER_ERROR) { - const logger = new Logger("ErrorHandler"); - logger.error(error.message, error.stack); - } - - if (request.url.startsWith("/api")) { - return reply.status(status).send(response); - } - - // let NOT_FOUND fall through to nest for routing - if (status !== StatusCodes.NOT_FOUND) { - return reply.render("_error", { - status: status.toString(), - message: response.message, - }); - } -}; diff --git a/src/hooks/use-config.hook.tsx b/src/hooks/use-config.hook.tsx deleted file mode 100644 index 326fdce..0000000 --- a/src/hooks/use-config.hook.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import useSWR from "swr"; -import { Endpoints } from "../constants"; -import { GetServerConfigData } from "../types"; - -export const useConfig = (removeInaccessibleHosts: boolean, initialData?: GetServerConfigData | undefined) => { - const config = useSWR(Endpoints.CONFIG, { initialData }); - if (config.data && removeInaccessibleHosts) { - config.data.hosts = config.data.hosts.filter((host) => host.authorised); - } - - return config; -}; diff --git a/src/interceptors/redirect.interceptor.ts b/src/interceptors/redirect.interceptor.ts deleted file mode 100644 index 8dbdb99..0000000 --- a/src/interceptors/redirect.interceptor.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from "@nestjs/common"; -import { FastifyReply, FastifyRequest } from "fastify"; -import { StatusCodes } from "http-status-codes"; -import { Observable } from "rxjs"; -import { config } from "../config"; - -@Injectable() -export class RedirectInterceptor implements NestInterceptor { - intercept(context: ExecutionContext, next: CallHandler): Observable { - const request = context.switchToHttp().getRequest(); - const response = context.switchToHttp().getResponse(); - const host = config.hosts.find((host) => host.pattern.test(request.hostname)); - if (!host) { - response.redirect(StatusCodes.TEMPORARY_REDIRECT, config.rootHost.url); - return next.handle(); - } - - if (host.redirect && request.url === "/") { - response.redirect(StatusCodes.TEMPORARY_REDIRECT, host.redirect); - return next.handle(); - } - - request.host = host; - return next.handle(); - } -} diff --git a/src/modules/deletion/deletion.controller.ts b/src/modules/deletion/deletion.controller.ts deleted file mode 100644 index 65ed18e..0000000 --- a/src/modules/deletion/deletion.controller.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Controller, Get, Param } from "@nestjs/common"; -import { DeletionService } from "./deletion.service"; - -@Controller() -export class DeletionController { - constructor(private deletionService: DeletionService) {} - - @Get("delete/:token") - async getDeletionPage(@Param("token") token: string) { - await this.deletionService.useToken(token); - return { deleted: true }; - } - - @Get("api/delete/:token") - async getDeletion(@Param("token") token: string) { - return this.deletionService.verifyToken(token); - } -} diff --git a/src/modules/deletion/deletion.module.ts b/src/modules/deletion/deletion.module.ts deleted file mode 100644 index 9d697c1..0000000 --- a/src/modules/deletion/deletion.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Module } from "@nestjs/common"; -import { AuthModule } from "../auth/auth.module"; -import { FileModule } from "../file/file.module"; -import { LinkModule } from "../link/link.module"; -import { DeletionController } from "./deletion.controller"; -import { DeletionService } from "./deletion.service"; - -@Module({ - controllers: [DeletionController], - providers: [DeletionService], - exports: [DeletionService], - imports: [AuthModule, FileModule, LinkModule], -}) -export class DeletionModule {} diff --git a/src/modules/deletion/deletion.service.ts b/src/modules/deletion/deletion.service.ts deleted file mode 100644 index 6e7010d..0000000 --- a/src/modules/deletion/deletion.service.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { BadRequestException, Injectable, NotFoundException } from "@nestjs/common"; -import { AuthService, TokenType } from "../auth/auth.service"; -import { FileService } from "../file/file.service"; -import { LinkService } from "../link/link.service"; - -export interface JWTPayloadDelete { - type: ContentType; - sub: string; -} - -export enum ContentType { - FILE, - LINK, -} - -@Injectable() -export class DeletionService { - constructor(private authService: AuthService, private fileService: FileService, private linkService: LinkService) {} - - async useToken(token: string) { - try { - const payload = await this.verifyToken(token); - switch (payload.type) { - case ContentType.FILE: - await this.fileService.deleteFile(payload.sub, null); - break; - case ContentType.LINK: - await this.linkService.deleteLink(payload.sub, null); - break; - default: - throw new BadRequestException("Unknown deletion type."); - } - } catch (error: unknown) { - if (error instanceof NotFoundException) { - throw new BadRequestException("That content has already been deleted."); - } - - throw error; - } - } - - verifyToken(token: string) { - return this.authService.verifyToken(TokenType.DELETION, token); - } - - async createToken(type: ContentType, id: string) { - const payload: JWTPayloadDelete = { type, sub: id }; - const token = await this.authService.signToken(TokenType.DELETION, payload); - const url = `/delete/${token}`; - return { - token, - url, - }; - } -} diff --git a/src/modules/invite/invite.controller.ts b/src/modules/invite/invite.controller.ts deleted file mode 100644 index ea434f0..0000000 --- a/src/modules/invite/invite.controller.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Controller, Get, Param, Post, Res, UseGuards } from "@nestjs/common"; -import { Permission } from "../../constants"; -import { JWTAuthGuard } from "../../guards/jwt.guard"; -import { RenderableReply } from "../../types"; -import { RequirePermissions, UserId } from "../auth/auth.decorators"; -import { InviteService } from "./invite.service"; - -@Controller() -export class InviteController { - constructor(private inviteService: InviteService) {} - - @Get("invite/:token") - async getInvitePage(@Res() reply: RenderableReply, @Param("token") token: string) { - const payload = await this.getInvite(token); - return reply.render("invite/[inviteToken]", { - inviteToken: token, - invite: JSON.stringify(payload), - }); - } - - @Get("api/invite/:token") - async getInvite(@Param("token") token: string) { - return this.inviteService.verifyToken(token); - } - - @Get("api/invite") - @Post("api/invite") - @RequirePermissions(Permission.CREATE_INVITE) - @UseGuards(JWTAuthGuard) - async createInvite(@UserId() userId: string) { - return this.inviteService.create(userId, null); - } -} diff --git a/src/modules/invite/invite.service.ts b/src/modules/invite/invite.service.ts deleted file mode 100644 index f89bc6f..0000000 --- a/src/modules/invite/invite.service.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { BadRequestException, Injectable, Logger, OnApplicationBootstrap } from "@nestjs/common"; -import { nanoid } from "nanoid"; -import { config } from "../../config"; -import { Permission } from "../../constants"; -import { prisma } from "../../prisma"; -import { AuthService, TokenType } from "../auth/auth.service"; - -export interface JWTPayloadInvite { - id: string; - inviter?: string; - permissions?: number; -} - -@Injectable() -export class InviteService implements OnApplicationBootstrap { - private readonly logger = new Logger(InviteService.name); - constructor(private authService: AuthService) {} - - async create(inviterId: string | null, permissions: Permission | null) { - const payload: JWTPayloadInvite = { - id: nanoid(16), - inviter: inviterId ?? undefined, - permissions: permissions ?? undefined, - }; - - const token = await this.authService.signToken(TokenType.INVITE, payload, "1h"); - const url = config.rootHost.url + `/invite/${token}`; - return { - token, - url, - }; - } - - async verifyToken(token: string) { - const payload = await this.authService.verifyToken(TokenType.INVITE, token); - const existing = await prisma.user.findFirst({ where: { invite: payload.id } }); - if (existing) throw new BadRequestException("That invite has already been used."); - return payload; - } - - async onApplicationBootstrap() { - const users = await prisma.user.count({ take: 1 }); - if (users >= 1) return; - const invite = await this.create(null, Permission.ADMINISTRATOR); - this.logger.log(`Go to ${invite.url} to create the first account.`); - } -} diff --git a/src/modules/link/link.controller.ts b/src/modules/link/link.controller.ts deleted file mode 100644 index 1a36ece..0000000 --- a/src/modules/link/link.controller.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { BadRequestException, Controller, Delete, Get, NotFoundException, Param, Post, Query, Request, Res } from "@nestjs/common"; -import { FastifyReply, FastifyRequest } from "fastify"; -import { prisma } from "../../prisma"; -import { UserId } from "../auth/auth.decorators"; -import { ContentType, DeletionService } from "../deletion/deletion.service"; -import { LinkService } from "./link.service"; - -@Controller() -export class LinkController { - constructor(private linkService: LinkService, private deletionService: DeletionService) {} - - @Get(["link/:id", "s/:id"]) - async getLinkPage(@Res() reply: FastifyReply, @Param("id") id: string) { - const link = await prisma.link.findFirst({ where: { id } }); - if (!link) throw new NotFoundException(); - await reply.redirect(301, link.destination); - await prisma.link.update({ - where: { id: link.id }, - data: { - clicks: { - increment: 1, - }, - }, - }); - } - - @Get("api/link/:id") - async getLink(@Param("id") id: string, @Request() request: FastifyRequest) { - return this.linkService.getLink(id, request.host); - } - - @Delete("api/link/:id") - async deleteLink(@UserId() userId: string, @Param("id") id: string) { - return this.linkService.deleteLink(id, userId); - } - - @Post("api/link") - async createLink(@UserId() userId: string, @Query("url") url?: string) { - if (!url?.startsWith("http")) throw new BadRequestException("Invalid URL."); - const link = await this.linkService.createLink(url, userId); - const deletionUrl = this.deletionService.createToken(ContentType.LINK, link.id); - const urls = this.linkService.getLinkUrls(link); - return Object.assign(urls, { delete: deletionUrl }); - } -} diff --git a/src/modules/link/link.module.ts b/src/modules/link/link.module.ts deleted file mode 100644 index 87c684c..0000000 --- a/src/modules/link/link.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { forwardRef, Module } from "@nestjs/common"; -import { DeletionModule } from "../deletion/deletion.module"; -import { HostsModule } from "../hosts/hosts.module"; -import { LinkController } from "./link.controller"; -import { LinkService } from "./link.service"; - -@Module({ - imports: [forwardRef(() => DeletionModule), HostsModule], - controllers: [LinkController], - providers: [LinkService], - exports: [LinkService], -}) -export class LinkModule {} diff --git a/src/modules/link/link.service.ts b/src/modules/link/link.service.ts deleted file mode 100644 index 188e258..0000000 --- a/src/modules/link/link.service.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Injectable, NotFoundException, UnauthorizedException } from "@nestjs/common"; -import { Link } from "@prisma/client"; -import { MicroHost } from "../../classes/MicroHost"; -import { generateContentId } from "../../helpers/generate-content-id.helper"; -import { prisma } from "../../prisma"; -import { HostsService } from "../hosts/hosts.service"; - -@Injectable() -export class LinkService { - constructor(private hostsService: HostsService) {} - - async getLink(id: string, host: MicroHost) { - const link = await prisma.link.findFirst({ where: { id } }); - if (!link) throw new NotFoundException(); - if (!this.hostsService.checkHostCanSendFile(link, host)) { - throw new NotFoundException("Your redirect is in another castle."); - } - - return link; - } - - async createLink(destination: string, ownerId: string) { - const link = prisma.link.create({ - data: { - id: generateContentId(), - destination: destination, - ownerId: ownerId, - }, - }); - - return link; - } - - async deleteLink(id: string, ownerId: string | null) { - const link = await prisma.link.findFirst({ where: { id } }); - if (!link) throw new NotFoundException(); - if (ownerId && link.ownerId !== ownerId) { - throw new UnauthorizedException("You cannot delete other users files."); - } - - await prisma.link.delete({ where: { id: link.id } }); - } - - getLinkUrls(link: Pick) { - const direct = `/s/${link.id}`; - const metadata = `/api/link/${link.id}`; - return { direct, metadata }; - } -} diff --git a/src/modules/upload/upload.controller.ts b/src/modules/upload/upload.controller.ts deleted file mode 100644 index 9788474..0000000 --- a/src/modules/upload/upload.controller.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { BadRequestException, ForbiddenException, Controller, Headers, Post, Query, Req, UseGuards } from "@nestjs/common"; -import { FastifyRequest } from "fastify"; -import { MultipartFile } from "fastify-multipart"; -import { config } from "../../config"; -import { JWTAuthGuard } from "../../guards/jwt.guard"; -import { UserId } from "../auth/auth.decorators"; -import { ContentType, DeletionService } from "../deletion/deletion.service"; -import { FileService } from "../file/file.service"; -import { HostsService } from "../hosts/hosts.service"; -import { LinkService } from "../link/link.service"; -import { UserService } from "../user/user.service"; - -@Controller() -export class UploadController { - constructor( - private fileService: FileService, - private linkService: LinkService, - private deletionService: DeletionService, - private hostsService: HostsService, - private userService: UserService - ) {} - - @Post(["api/upload", "api/sharex"]) - @UseGuards(JWTAuthGuard) - async createUpload( - @Req() request: FastifyRequest, - @UserId() userId: string, - @Query("input") input?: string, - @Headers("x-micro-host") hosts = config.rootHost.url - ) { - const user = await this.userService.getUser(userId); - if (!user) throw new ForbiddenException("Unknown user."); - const host = await this.hostsService.resolveHost(hosts, user.tags, true); - // todo: this is a shitty way to detect urls - if (input?.startsWith("http")) { - const link = await this.linkService.createLink(input, userId); - const urls = this.linkService.getLinkUrls(link); - const deletion = await this.deletionService.createToken(ContentType.LINK, link.id); - return { - // "view" aliases to "direct" for compatibility with the image uploader - id: link.id, - host: link.host, - links: { - view: this.hostsService.formatHostUrl(host.url, user.username, urls.direct), - direct: this.hostsService.formatHostUrl(host.url, user.username, urls.direct), - metadata: this.hostsService.formatHostUrl(host.url, user.username, urls.metadata), - delete: this.hostsService.formatHostUrl(host.url, user.username, deletion.url), - }, - }; - } - - // todo: IIRC the type is invalid and it can be undefined, but some dumbass - // didn't leave a comment so this should be double-checked and likely handled - // better (overriding the type in a definition file/submitting a PR to fix it at - // the source) - const upload = (await request.file()) as MultipartFile | undefined; - if (!upload) throw new BadRequestException("Missing upload."); - const file = await this.fileService.createFile(upload, request, user, host); - const deletion = await this.deletionService.createToken(ContentType.FILE, file.id); - const urls = this.fileService.getFileUrls(file); - return { - id: file.id, - host: file.host, - links: { - metadata: this.hostsService.formatHostUrl(host.url, user.username, urls.metadata), - thumbnail: this.hostsService.formatHostUrl(host.url, user.username, urls.thumbnail), - direct: this.hostsService.formatHostUrl(host.url, user.username, urls.direct), - view: this.hostsService.formatHostUrl(host.url, user.username, urls.view), - delete: this.hostsService.formatHostUrl(host.url, user.username, deletion.url), - }, - }; - } -} diff --git a/src/modules/upload/upload.module.ts b/src/modules/upload/upload.module.ts deleted file mode 100644 index 9576133..0000000 --- a/src/modules/upload/upload.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from "@nestjs/common"; -import { DeletionModule } from "../deletion/deletion.module"; -import { FileModule } from "../file/file.module"; -import { HostsModule } from "../hosts/hosts.module"; -import { LinkModule } from "../link/link.module"; -import { UserModule } from "../user/user.module"; -import { UploadController } from "./upload.controller"; - -@Module({ - imports: [UserModule, HostsModule, FileModule, LinkModule, DeletionModule], - controllers: [UploadController], -}) -export class UploadModule {} diff --git a/src/modules/user/dto/user-files-query.dto.ts b/src/modules/user/dto/user-files-query.dto.ts deleted file mode 100644 index 2669872..0000000 --- a/src/modules/user/dto/user-files-query.dto.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Transform } from "class-transformer"; -import { IsNumber, IsOptional, IsString, Max, Min } from "class-validator"; - -export class UserFilesQueryDto { - @IsNumber() - @Min(1) - @Max(100) - @IsOptional() - @Transform(({ value }) => +value) - take?: number; - - @IsString() - @IsOptional() - cursor?: string; -} diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts deleted file mode 100644 index 4265033..0000000 --- a/src/modules/user/user.service.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { ConflictException, Injectable } from "@nestjs/common"; -import bcrypt from "bcrypt"; -import { nanoid } from "nanoid"; -import { Permission } from "../../constants"; -import { generateContentId } from "../../helpers/generate-content-id.helper"; -import { prisma } from "../../prisma"; -import { JWTPayloadInvite } from "../invite/invite.service"; -import { CreateUserDto } from "./dto/create-user.dto"; -import { UserFilesQueryDto } from "./dto/user-files-query.dto"; - -@Injectable() -export class UserService { - getUser(id: string, secret = false) { - return prisma.user.findFirst({ - where: { id }, - select: { - id: true, - username: true, - invite: true, - secret: secret, - permissions: true, - tags: true, - }, - }); - } - - getUserFiles(userId: string, dto?: UserFilesQueryDto) { - return prisma.file.findMany({ - take: dto?.take ?? 24, - skip: dto?.cursor ? 1 : 0, - cursor: dto?.cursor ? { id: dto.cursor } : undefined, - orderBy: { createdAt: "desc" }, - where: { - ownerId: userId, - }, - }); - } - - deleteUser(id: string) { - return prisma.user.delete({ - where: { id }, - }); - } - - async createUser(data: CreateUserDto, invite: JWTPayloadInvite) { - const hashedPassword = await bcrypt.hash(data.password, 10); - const existing = await prisma.user.findFirst({ where: { username: data.username } }); - if (existing) throw new ConflictException("A user with that username already exists."); - const user = await prisma.user.create({ - data: { - id: generateContentId(), - secret: nanoid(), - password: hashedPassword, - username: data.username, - invite: invite.id, - permissions: invite.permissions, - }, - }); - - return user; - } - - checkPermissions(permissions: Permission | number, permission: Permission | number) { - return (permissions & permission) === permission; - } - - addPermissions(permissions: Permission | number, permission: Permission | number) { - permissions |= permission; - } - - clearPermissions(permissions: Permission | number, permission: Permission | number) { - permissions &= ~permission; - } -} diff --git a/src/prisma.ts b/src/prisma.ts deleted file mode 100644 index 664d9e0..0000000 --- a/src/prisma.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PrismaClient } from "@prisma/client"; -import { config } from "./config"; - -export const prisma = new PrismaClient({ - datasources: { - db: { - url: config.database, - }, - }, -}); diff --git a/tsconfig.build.json b/tsconfig.build.json deleted file mode 100644 index b3338ed..0000000 --- a/tsconfig.build.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - // tsup requires tsconfig.build.json, so this is basically just an alias. - // https://github.com/egoist/tsup/blob/405e165ef7412adf54b9a83248144daa4c13be04/src/load.ts#L34 - "extends": "./tsconfig.server.json" -} diff --git a/tsconfig.json b/tsconfig.json index 7901051..cc58f26 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,30 +1,11 @@ { - "include": ["./src/**/*", "next-env.d.ts"], - "exclude": ["node_modules/*"], + "extends": "@tsconfig/node16/tsconfig.json", "compilerOptions": { - "target": "esnext", - "module": "esnext", - "jsx": "preserve", "strict": true, - "pretty": true, - "noImplicitAny": true, - "alwaysStrict": true, - "noImplicitThis": true, - "outDir": ".next", - "moduleResolution": "node", - "forceConsistentCasingInFileNames": true, - "esModuleInterop": true, - "noUnusedLocals": true, - "sourceMap": true, - "skipLibCheck": true, - "experimentalDecorators": true, + "outDir": "dist", "emitDecoratorMetadata": true, - "lib": ["es2017", "dom"], - "baseUrl": ".", - "typeRoots": ["node_modules/@types", "./types"], - "noEmit": true, - "resolveJsonModule": true, - "isolatedModules": true, - "allowJs": true + "experimentalDecorators": true, + "moduleResolution": "node", + "resolveJsonModule": true } } diff --git a/tsconfig.server.json b/tsconfig.server.json deleted file mode 100644 index 6c62a77..0000000 --- a/tsconfig.server.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": ".next/api", - "target": "esnext", - "module": "commonjs", - "moduleResolution": "node", - "isolatedModules": false, - "noEmit": false, - "allowJs": false - } -} diff --git a/tsup.config.ts b/tsup.config.ts deleted file mode 100644 index bf6ebc6..0000000 --- a/tsup.config.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { esbuildDecorators } from "@anatine/esbuild-decorators"; -import type { Options } from "tsup"; - -const TSCONFIG_NAME = "./tsconfig.server.json"; -const TSCONFIG = require(TSCONFIG_NAME); - -export const tsup: Options = { - sourcemap: true, - minify: false, - dts: false, - clean: true, - ignoreWatch: ["**/{.next,example,data}/**", "**/*.tsx", "next-env.d.ts"], - outDir: TSCONFIG.compilerOptions.outDir, - entryPoints: ["src/main.ts"], - esbuildPlugins: [ - esbuildDecorators({ - tsconfig: TSCONFIG_NAME, - }), - ], -};