From 9b9a2cf41b7e5978e1cf7d30401c8fe1fa797ddf Mon Sep 17 00:00:00 2001 From: Bieber Date: Wed, 20 Mar 2024 17:52:18 +0800 Subject: [PATCH] release: v1.1.0-beta (#475) * feat: support excel import (#431) * feat: support `csv` import * perf: optimise import memory expend * fix: `openapi` upload type error * test: compatible ci attachment download * feat: add import file icon * feat: support `excel` import feat: limit excel file size refactor: rewrite import font-end * chore: add `sheetjs` license * feat: update import url validate strategy * test: add excel import e2e * feat: add logger in import records * fix: type and lint error * chore: replace axios to node-fetch in nestjs * test: update import-table e2e * test: update import-table delay time * chore: delete `sheetjs` license * feat: add analyze loading * chore: export upload-panel component * feat: integrate github login (#432) * feat: integrate gitHub login * feat: dynamic social auth module * feat: add github auth env validation * chore: remove electron (#438) * feat: credit check (#436) * feat: credit check * test: exceed credit limit * refactor: more appropriate email template structure (#437) * chore: make pnpm automatically install the specified version of Node.js (#433) * chore: remove nvm step * fix: the error of copying and pasting empty content (#443) * fix: the error of copying and pasting empty content * ci: fixed node version * ci: pnpm newline handling * feat: compatible `tsv` import (#446) * fix: rename link results in illegal data (#448) * fix: unexpected horizontal lines on login page (#447) * test: import test file save in tmp dir (#449) * docs: add deploy on Zeabur in Readme (#451) * docs: add deploy on Zeabur in Readme * Update README.md * Update README.md * build: image support `multi-platforms` & app image support `csp-open` (#445) * build: app image support `csp-open` * feat: docker image multi-platforms support * fix: allow default db address (#461) * feat: forgot password and setup new password (#452) * feat: forgot password and setup new password * chore: remove useless code * fix: use instance test context creator * fix: type error * fix: sdk build config for *.spec.tsx * fix: execute repeat when import upload (#464) * fix: notify jump url & upgrade deps (#465) * fix: notify jump url & upgrade deps * feat: update `PUBLIC_DATABASE_PROXY` env * fix: ensure interface-provided 'orderBy' parameter overrides view's default sort (#463) * fix: ensure interface-provided 'orderBy' parameter overrides view's default sort * fix: existence of identical fields sorted, with the later overwriting the earlier * chore: signin error alerts * feat: support google oatuh2 (#466) * refactor: api for adjusting the order (#453) * fix: i18n * docs: star distribution * refactor: view order * refactor: view+table+base updateOrder * feat: ci add `coverallsapp/github-action` (#468) * feat: ci add `coverallsapp/github-action` * fix: vitest `coverage.reporter` config (#469) * fix: vitest `coverage.reporter` config * chore(example): update dockers examples (#474) * docs: Update header titles for consistency (#455) * docs: add one-click deploy on sealos. (#462) Signed-off-by: zzjin * chore: Update constants.ts (#457) minor fix * refactor: row order (#473) * refactor: row order * fix: sqlite test --------- Signed-off-by: zzjin Co-authored-by: Mike Co-authored-by: Boris Co-authored-by: Anjorin Damilare Co-authored-by: Yuhang <2312744987@qq.com> Co-authored-by: Pengap Co-authored-by: emmanuel <154705254+codesmith-emmy@users.noreply.github.com> Co-authored-by: zzjin Co-authored-by: Ikko Eltociear Ashimine --- .github/actions/pnpm-install/action.yml | 2 +- .github/workflows/docker-push.yml | 20 +- .github/workflows/integration-tests.yml | 2 +- .github/workflows/linting.yml | 2 +- .github/workflows/unit-tests.yml | 23 +- .npmrc | 4 +- .nvmrc | 1 - Makefile | 18 +- README.md | 36 +- apps/electron/.gitignore | 96 - apps/electron/README.md | 73 - apps/electron/forge.config.js | 93 - apps/electron/index.html | 12 - apps/electron/package.json | 38 - apps/electron/scripts/prepare-server.js | 83 - apps/electron/src/env.js | 23 - apps/electron/src/index.css | 6 - apps/electron/src/main.js | 60 - apps/electron/src/preload.js | 2 - apps/electron/src/renderer.js | 31 - apps/electron/src/server.js | 12 - apps/electron/src/utils.js | 11 - apps/electron/static/background.png | Bin 395903 -> 0 bytes apps/electron/static/icons/icon.icns | Bin 269368 -> 0 bytes apps/electron/static/icons/icon.ico | Bin 92713 -> 0 bytes apps/electron/static/icons/icon.png | Bin 92713 -> 0 bytes apps/electron/static/loading.html | 39 - apps/electron/vite.main.config.mjs | 10 - apps/electron/vite.preload.config.mjs | 4 - apps/electron/vite.renderer.config.mjs | 4 - apps/electron/yarn.lock | 5087 ----------------- apps/nestjs-backend/.gitignore | 11 +- apps/nestjs-backend/package.json | 40 +- apps/nestjs-backend/src/cache/types.ts | 10 + .../nestjs-backend/src/configs/auth.config.ts | 11 + .../nestjs-backend/src/configs/base.config.ts | 2 +- .../src/configs/env.validation.schema.ts | 20 + .../src/configs/threshold.config.ts | 5 +- .../src/db-provider/db.provider.interface.ts | 9 +- .../src/db-provider/postgres.provider.ts | 20 +- .../src/db-provider/sqlite.provider.ts | 13 +- .../events/table/record.event.ts | 5 +- .../attachments-table.service.spec.ts | 5 - .../features/attachments/plugins/adapter.ts | 9 +- .../src/features/attachments/plugins/local.ts | 50 +- .../src/features/attachments/plugins/minio.ts | 19 +- .../src/features/auth/auth.controller.ts | 32 +- .../src/features/auth/auth.module.ts | 2 + .../src/features/auth/auth.service.ts | 117 +- .../src/features/auth/guard/github.guard.ts | 5 + .../src/features/auth/guard/google.guard.ts | 5 + .../src/features/auth/oauth/oauth.store.ts | 39 + .../auth/social/github/github.controller.ts | 27 + .../auth/social/github/github.module.ts | 13 + .../auth/social/google/google.controller.ts | 27 + .../auth/social/google/google.module.ts | 13 + .../src/features/auth/social/social.module.ts | 16 + .../auth/strategies/github.strategy.ts | 47 + .../auth/strategies/google.strategy.ts | 49 + .../nestjs-backend/src/features/auth/utils.ts | 19 +- .../create-record/create-record.spec.ts | 2 - .../update-record/update-record.spec.ts | 3 +- .../records/update-record/update-record.ts | 2 +- .../features/base/base-duplicate.service.ts | 2 +- .../src/features/base/base.controller.ts | 17 +- .../src/features/base/base.service.ts | 85 +- .../features/base/db-connection.service.ts | 34 +- .../features/calculation/reference.service.ts | 12 +- .../field-supplement.service.ts | 6 +- .../src/features/field/field.service.ts | 6 +- .../src/features/graph/graph.service.ts | 4 +- .../open-api/import-open-api.service.ts | 110 +- .../features/import/open-api/import.class.ts | 346 +- .../mail-sender/mail-sender.service.ts | 26 +- .../templates/pages/collaborator-cell-tag.hbs | 122 - .../pages/collaborator-multi-row-tag.hbs | 112 - .../pages/{invite.hbs => normal.hbs} | 16 +- .../partials/collaborator-cell-tag.hbs | 25 + .../partials/collaborator-multi-row-tag.hbs | 19 + .../mail-sender/templates/partials/invite.hbs | 11 + .../templates/partials/reset-password.hbs | 7 + .../notification/notification.service.ts | 2 +- .../open-api/record-open-api.controller.ts | 4 +- .../record/open-api/record-open-api.module.ts | 11 +- .../open-api/record-open-api.service.ts | 60 +- .../record-calculate.service.ts | 7 +- .../src/features/record/record.service.ts | 233 +- .../selection/selection.service.spec.ts | 15 +- .../features/selection/selection.service.ts | 2 +- .../src/features/share/share.service.ts | 5 +- .../src/features/space/space.service.ts | 3 +- .../open-api/table-open-api.controller.ts | 8 +- .../table/open-api/table-open-api.service.ts | 70 +- .../src/features/table/table.service.ts | 36 +- .../src/features/user/user.service.ts | 152 +- .../src/features/view/model/factory.ts | 1 - .../view/open-api/view-open-api.controller.ts | 21 +- .../view/open-api/view-open-api.service.ts | 251 +- .../src/features/view/view.module.ts | 3 +- .../src/features/view/view.service.ts | 122 +- apps/nestjs-backend/src/share-db/interface.ts | 25 +- .../src/share-db/share-db.adapter.ts | 15 +- apps/nestjs-backend/src/utils/index.ts | 1 - .../src/utils/update-order.spec.ts | 203 + apps/nestjs-backend/src/utils/update-order.ts | 106 + .../src/utils/view-order-field-name.ts | 5 - apps/nestjs-backend/test/credit.e2e-spec.ts | 91 + .../test/db-connection.e2e-spec.ts | 2 +- .../test/field-converting.e2e-spec.ts | 20 +- .../test/order-update.e2e-spec.ts | 277 + apps/nestjs-backend/test/record.e2e-spec.ts | 18 - .../test/reference.e2e-spec.ts.bak | 8 +- apps/nestjs-backend/test/sort.e2e-spec.ts | 29 +- .../test/table-import.e2e-spec.ts | 322 +- apps/nestjs-backend/test/table.e2e-spec.ts | 9 +- apps/nestjs-backend/test/utils/init-app.ts | 1 + apps/nestjs-backend/test/utils/record-mock.ts | 18 +- .../test/view-order.e2e-spec.ts | 55 - apps/nestjs-backend/vitest-e2e.config.ts | 17 +- apps/nestjs-backend/vitest.config.ts | 15 +- apps/nextjs-app/.env | 2 +- apps/nextjs-app/.env.development | 6 +- apps/nextjs-app/.env.example | 19 +- apps/nextjs-app/.env.test | 4 +- apps/nextjs-app/README.md | 132 +- apps/nextjs-app/next.config.js | 8 +- apps/nextjs-app/package.json | 59 +- apps/nextjs-app/src/components/Error.tsx | 22 + .../app/blocks/import-table/FileItem.tsx | 63 - .../app/blocks/import-table/TableImport.tsx | 279 +- .../app/blocks/import-table/UrlPanel.tsx | 85 + .../CollapsePanel.tsx | 34 +- .../field-config-panel/FieldConfigPanel.tsx | 127 + .../PreviewColumn.tsx | 16 - .../import-table/field-config-panel/index.ts | 3 + .../features/app/blocks/import-table/index.ts | 1 - .../import-table/upload-panel/Process.tsx | 34 + .../{Upload.tsx => upload-panel/Trigger.tsx} | 18 +- .../import-table/upload-panel/UploadPanel.tsx | 69 + .../blocks/import-table/upload-panel/index.ts | 3 + .../app/blocks/space/DraggableBaseGrid.tsx | 26 +- .../app/blocks/table-list/DraggableList.tsx | 17 +- .../app/blocks/table-list/TableList.tsx | 23 +- .../app/blocks/table-list/TableListItem.tsx | 7 +- .../app/blocks/table-list/TableOperation.tsx | 5 +- .../table/table-header/Collaborators.tsx | 2 +- .../app/blocks/view/grid/GridViewBase.tsx | 5 +- .../view/grid/components/RecordMenu.tsx | 63 +- .../view/grid/hooks/useSelectionOperation.ts | 8 +- .../app/blocks/view/list/DraggableWrapper.tsx | 10 +- .../app/components/setting/Account.tsx | 31 +- .../setting/account/AddPassword.tsx | 118 + .../features/auth/components/LayoutMain.tsx | 16 + .../src/features/auth/components/SignForm.tsx | 32 +- .../features/auth/components/SocialAuth.tsx | 55 + .../features/auth/components/TeableFooter.tsx | 27 + .../auth/pages/ForgetPasswordPage.tsx | 75 + .../src/features/auth/pages/LoginPage.tsx | 10 +- .../features/auth/pages/ResetPasswordPage.tsx | 83 + apps/nextjs-app/src/lib/server-env.ts | 2 + apps/nextjs-app/src/pages/_app.tsx | 1 + .../src/pages/auth/forget-password.tsx | 24 + .../src/pages/auth/reset-password.tsx | 24 + .../{react-i18next.d.ts => next-i18next.d.ts} | 4 +- apps/nextjs-app/vitest.config.ts | 19 +- docker-bake.hcl | 4 +- dockers/examples/cluster/.env | 48 +- dockers/examples/cluster/README.md | 37 +- dockers/examples/cluster/docker-compose.yaml | 70 +- .../cluster/gateway/conf.d/minio.conf | 63 + dockers/examples/docker-swarm/.env | 27 +- dockers/examples/docker-swarm/deploy.sh | 2 +- .../docker-swarm/docker-compose.app.yml | 12 +- .../docker-swarm/docker-compose.kit.yml | 6 +- .../docker-swarm/gateway/conf.d/minio.conf | 24 +- dockers/examples/standalone/.env | 20 +- .../examples/standalone/docker-compose.yaml | 36 +- dockers/teable/Dockerfile | 24 +- dockers/teable/Dockerfile.db-migrate | 9 +- package.json | 9 +- packages/common-i18n/src/locales/en/auth.json | 30 + .../common-i18n/src/locales/en/common.json | 17 +- .../common-i18n/src/locales/en/table.json | 13 +- packages/common-i18n/src/locales/zh/auth.json | 30 + .../common-i18n/src/locales/zh/common.json | 17 +- .../common-i18n/src/locales/zh/table.json | 17 +- packages/core/package.json | 14 +- packages/core/src/formula/evaluate.ts | 4 +- packages/core/src/formula/functions/common.ts | 4 +- .../src/formula/functions/date-time.spec.ts | 2 - .../core/src/formula/functions/system.spec.ts | 1 - packages/core/src/formula/visitor.spec.ts | 1 - packages/core/src/formula/visitor.ts | 4 +- packages/core/src/import/constant.ts | 9 +- packages/core/src/import/index.ts | 2 +- packages/core/src/import/types.ts | 28 +- .../abstract/formula.field.abstract.ts | 4 +- .../src/models/record/record.schema.spec.ts | 11 - .../core/src/models/record/record.schema.ts | 27 +- packages/core/src/models/record/record.ts | 2 - .../core/src/models/table/table.schema.ts | 9 +- packages/core/src/models/table/table.ts | 2 - .../src/models/view/sort/sort.schema.spec.ts | 5 +- packages/core/src/models/view/sort/sort.ts | 10 +- packages/core/src/models/view/view.schema.ts | 4 +- packages/core/src/models/view/view.ts | 2 - packages/core/src/op-builder/common.ts | 1 - .../core/src/op-builder/record/add-record.ts | 1 - packages/core/src/op-builder/record/index.ts | 1 - .../op-builder/record/record-op-builder.ts | 2 - .../src/op-builder/record/set-record-order.ts | 40 - packages/core/src/utils/id-generator.ts | 5 + packages/core/vitest.config.ts | 18 +- packages/db-main-prisma/package.json | 4 +- .../20240313062534_add_credit/migration.sql | 2 + .../prisma/postgres/schema.prisma | 1 + .../20240313061543_add_credit/migration.sql | 2 + .../prisma/sqlite/schema.prisma | 1 + .../db-main-prisma/prisma/template.prisma | 1 + packages/eslint-config-bases/package.json | 4 +- packages/icons/package.json | 2 +- packages/icons/src/components/FileCsv.tsx | 2 +- packages/icons/src/components/GithubLogo.tsx | 25 + packages/icons/src/components/GoogleLogo.tsx | 37 + packages/icons/src/components/Import.tsx | 28 + packages/icons/src/index.ts | 3 + packages/openapi/package.json | 2 +- .../src/aggregation/get-aggregation.ts | 2 +- packages/openapi/src/auth/add-password.ts | 37 + packages/openapi/src/auth/index.ts | 3 + packages/openapi/src/auth/reset-password.ts | 38 + .../src/auth/send-reset-password-email.ts | 36 + packages/openapi/src/auth/user-me.ts | 1 + .../openapi/src/base/create-from-template.ts | 2 +- packages/openapi/src/base/create.ts | 2 - packages/openapi/src/base/get.ts | 1 - packages/openapi/src/base/index.ts | 1 + packages/openapi/src/base/update-order.ts | 42 + packages/openapi/src/base/update.ts | 1 - packages/openapi/src/field/update.ts | 4 +- packages/openapi/src/space/get-base-list.ts | 2 +- packages/openapi/src/table/update-order.ts | 18 +- packages/openapi/src/view/index.ts | 1 + packages/openapi/src/view/update-order.ts | 15 +- .../openapi/src/view/update-record-order.ts | 58 + packages/sdk/package.json | 18 +- .../components/editor/formula/constants.ts | 2 +- .../hooks/use-grid-async-records.ts | 40 +- .../__tests__/createSessionContext.tsx | 22 + .../sdk/src/context/session/SessionContext.ts | 6 +- .../src/context/session/SessionProvider.tsx | 2 +- ...stances.spec.ts => use-instances.spec.tsx} | 28 +- packages/sdk/src/model/base.ts | 4 +- packages/sdk/src/model/record/record.ts | 22 +- packages/sdk/src/model/table/table.ts | 18 +- packages/sdk/src/model/view/view.ts | 5 +- packages/sdk/tsconfig.build.json | 2 +- packages/sdk/vitest.config.ts | 19 +- packages/ui-lib/package.json | 27 +- .../ui-lib/src/base/selector/Selector.tsx | 1 - packages/ui-lib/src/shadcn/ui/command.tsx | 2 +- pnpm-lock.yaml | 4979 ++++++++-------- scripts/build-image.mjs | 33 +- scripts/db-migrate.mjs | 8 +- 264 files changed, 7051 insertions(+), 10606 deletions(-) delete mode 100644 .nvmrc delete mode 100644 apps/electron/.gitignore delete mode 100644 apps/electron/README.md delete mode 100644 apps/electron/forge.config.js delete mode 100644 apps/electron/index.html delete mode 100644 apps/electron/package.json delete mode 100644 apps/electron/scripts/prepare-server.js delete mode 100644 apps/electron/src/env.js delete mode 100644 apps/electron/src/index.css delete mode 100644 apps/electron/src/main.js delete mode 100644 apps/electron/src/preload.js delete mode 100644 apps/electron/src/renderer.js delete mode 100644 apps/electron/src/server.js delete mode 100644 apps/electron/src/utils.js delete mode 100644 apps/electron/static/background.png delete mode 100644 apps/electron/static/icons/icon.icns delete mode 100644 apps/electron/static/icons/icon.ico delete mode 100644 apps/electron/static/icons/icon.png delete mode 100644 apps/electron/static/loading.html delete mode 100644 apps/electron/vite.main.config.mjs delete mode 100644 apps/electron/vite.preload.config.mjs delete mode 100644 apps/electron/vite.renderer.config.mjs delete mode 100644 apps/electron/yarn.lock create mode 100644 apps/nestjs-backend/src/features/auth/guard/github.guard.ts create mode 100644 apps/nestjs-backend/src/features/auth/guard/google.guard.ts create mode 100644 apps/nestjs-backend/src/features/auth/oauth/oauth.store.ts create mode 100644 apps/nestjs-backend/src/features/auth/social/github/github.controller.ts create mode 100644 apps/nestjs-backend/src/features/auth/social/github/github.module.ts create mode 100644 apps/nestjs-backend/src/features/auth/social/google/google.controller.ts create mode 100644 apps/nestjs-backend/src/features/auth/social/google/google.module.ts create mode 100644 apps/nestjs-backend/src/features/auth/social/social.module.ts create mode 100644 apps/nestjs-backend/src/features/auth/strategies/github.strategy.ts create mode 100644 apps/nestjs-backend/src/features/auth/strategies/google.strategy.ts delete mode 100644 apps/nestjs-backend/src/features/mail-sender/templates/pages/collaborator-cell-tag.hbs delete mode 100644 apps/nestjs-backend/src/features/mail-sender/templates/pages/collaborator-multi-row-tag.hbs rename apps/nestjs-backend/src/features/mail-sender/templates/pages/{invite.hbs => normal.hbs} (76%) create mode 100644 apps/nestjs-backend/src/features/mail-sender/templates/partials/collaborator-cell-tag.hbs create mode 100644 apps/nestjs-backend/src/features/mail-sender/templates/partials/collaborator-multi-row-tag.hbs create mode 100644 apps/nestjs-backend/src/features/mail-sender/templates/partials/invite.hbs create mode 100644 apps/nestjs-backend/src/features/mail-sender/templates/partials/reset-password.hbs create mode 100644 apps/nestjs-backend/src/utils/update-order.spec.ts create mode 100644 apps/nestjs-backend/src/utils/update-order.ts delete mode 100644 apps/nestjs-backend/src/utils/view-order-field-name.ts create mode 100644 apps/nestjs-backend/test/credit.e2e-spec.ts create mode 100644 apps/nestjs-backend/test/order-update.e2e-spec.ts delete mode 100644 apps/nestjs-backend/test/view-order.e2e-spec.ts create mode 100644 apps/nextjs-app/src/components/Error.tsx delete mode 100644 apps/nextjs-app/src/features/app/blocks/import-table/FileItem.tsx create mode 100644 apps/nextjs-app/src/features/app/blocks/import-table/UrlPanel.tsx rename apps/nextjs-app/src/features/app/blocks/import-table/{ => field-config-panel}/CollapsePanel.tsx (72%) create mode 100644 apps/nextjs-app/src/features/app/blocks/import-table/field-config-panel/FieldConfigPanel.tsx rename apps/nextjs-app/src/features/app/blocks/import-table/{ => field-config-panel}/PreviewColumn.tsx (87%) create mode 100644 apps/nextjs-app/src/features/app/blocks/import-table/field-config-panel/index.ts create mode 100644 apps/nextjs-app/src/features/app/blocks/import-table/upload-panel/Process.tsx rename apps/nextjs-app/src/features/app/blocks/import-table/{Upload.tsx => upload-panel/Trigger.tsx} (65%) create mode 100644 apps/nextjs-app/src/features/app/blocks/import-table/upload-panel/UploadPanel.tsx create mode 100644 apps/nextjs-app/src/features/app/blocks/import-table/upload-panel/index.ts create mode 100644 apps/nextjs-app/src/features/app/components/setting/account/AddPassword.tsx create mode 100644 apps/nextjs-app/src/features/auth/components/LayoutMain.tsx create mode 100644 apps/nextjs-app/src/features/auth/components/SocialAuth.tsx create mode 100644 apps/nextjs-app/src/features/auth/components/TeableFooter.tsx create mode 100644 apps/nextjs-app/src/features/auth/pages/ForgetPasswordPage.tsx create mode 100644 apps/nextjs-app/src/features/auth/pages/ResetPasswordPage.tsx create mode 100644 apps/nextjs-app/src/pages/auth/forget-password.tsx create mode 100644 apps/nextjs-app/src/pages/auth/reset-password.tsx rename apps/nextjs-app/src/types.d/{react-i18next.d.ts => next-i18next.d.ts} (87%) create mode 100644 dockers/examples/cluster/gateway/conf.d/minio.conf delete mode 100644 packages/core/src/op-builder/record/set-record-order.ts create mode 100644 packages/db-main-prisma/prisma/postgres/migrations/20240313062534_add_credit/migration.sql create mode 100644 packages/db-main-prisma/prisma/sqlite/migrations/20240313061543_add_credit/migration.sql create mode 100644 packages/icons/src/components/GithubLogo.tsx create mode 100644 packages/icons/src/components/GoogleLogo.tsx create mode 100644 packages/icons/src/components/Import.tsx create mode 100644 packages/openapi/src/auth/add-password.ts create mode 100644 packages/openapi/src/auth/reset-password.ts create mode 100644 packages/openapi/src/auth/send-reset-password-email.ts create mode 100644 packages/openapi/src/base/update-order.ts create mode 100644 packages/openapi/src/view/update-record-order.ts create mode 100644 packages/sdk/src/context/__tests__/createSessionContext.tsx rename packages/sdk/src/context/use-instances/{use-instances.spec.ts => use-instances.spec.tsx} (85%) diff --git a/.github/actions/pnpm-install/action.yml b/.github/actions/pnpm-install/action.yml index a85d4b92f..f5594297f 100644 --- a/.github/actions/pnpm-install/action.yml +++ b/.github/actions/pnpm-install/action.yml @@ -36,7 +36,7 @@ runs: id: pnpm-config shell: bash run: | - echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT + echo "STORE_PATH=$(pnpm store path | tr -d '\n')" >> $GITHUB_OUTPUT - name: ⚙️ Cache rotation keys id: cache-rotation diff --git a/.github/workflows/docker-push.yml b/.github/workflows/docker-push.yml index 2208e9c47..f9fe7ad0f 100644 --- a/.github/workflows/docker-push.yml +++ b/.github/workflows/docker-push.yml @@ -4,6 +4,13 @@ on: push: branches: - develop + tags: + - 'v*' + paths: + - 'apps/nestjs-backend/**' + - 'apps/nextjs-app/**' + - 'packages/core/**' + - 'packages/sdk/**' jobs: build-push: @@ -31,6 +38,12 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.PACKAGES_KEY }} + - name: Login to Docker Hub registry + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_HUB_NAME }} + password: ${{ secrets.DOCKER_HUB_AK }} + - name: Login to Ali container registry uses: docker/login-action@v3 with: @@ -51,11 +64,10 @@ jobs: images: | registry.cn-shenzhen.aliyuncs.com/teable/${{ matrix.image }} ghcr.io/teableio/${{ matrix.image }} + docker.io/teableio/${{ matrix.image }} tags: | - type=ref,event=branch type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} - type=sha # set latest tag for default branch type=raw,value=latest,enable={{is_default_branch}} - name: ⚙️ Set up QEMU @@ -65,7 +77,7 @@ jobs: - name: 📦 Build and push run: | zx scripts/build-image.mjs --file=dockers/teable/${{ matrix.file }} \ - --cache-from=type=registry,ref=ghcr.io/teableio/${{ matrix.image }}:buildcache \ - --cache-to=type=registry,ref=ghcr.io/teableio/${{ matrix.image }}:buildcache,mode=max \ + --build-arg="ENABLE_CSP=false" \ --tag="${{ steps.meta.outputs.tags }}" \ + --platforms="linux/amd64,linux/arm64" \ --push diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index 771984583..7b4e9535b 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -15,7 +15,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [20.x] + node-version: [20.9.0] database-type: [postgres, sqlite] env: CI: 1 diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 0df5fd561..c55f391f8 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: - node-version: [20.x] + node-version: [20.9.0] steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 6480d4830..a48b551e2 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -1,6 +1,9 @@ name: Unit Tests on: + push: + branches: + - develop pull_request: branches: - develop @@ -11,13 +14,13 @@ on: - 'packages/sdk/**' jobs: - build: + test: runs-on: ubuntu-latest name: Unit Tests strategy: matrix: - node-version: [20.x] + node-version: [20.9.0] steps: - uses: actions/checkout@v4 @@ -41,4 +44,18 @@ jobs: - name: 🧪 Run Tests run: | - pnpm g:test-unit + pnpm g:test-unit-cover + - name: Coveralls Parallel + uses: coverallsapp/github-action@v2 + with: + flag-name: run-${{ join(matrix.*, '-') }} + parallel: true + + finish: + needs: test + runs-on: ubuntu-latest + steps: + - name: Coveralls Finished + uses: coverallsapp/github-action@v2 + with: + parallel-finished: true diff --git a/.npmrc b/.npmrc index ef109fbd6..811419d83 100644 --- a/.npmrc +++ b/.npmrc @@ -2,7 +2,7 @@ engine-strict=true strict-peer-dependencies=false auto-install-peers=true lockfile=true +# force use npmjs.org registry registry=https://registry.npmjs.org/ +use-node-version=20.9.0 save-prefix='' -# http-proxy=http://127.0.0.1:7890 -# https-proxy=http://127.0.0.1:7890 \ No newline at end of file diff --git a/.nvmrc b/.nvmrc deleted file mode 100644 index c946e1df4..000000000 --- a/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v20.9.0 \ No newline at end of file diff --git a/Makefile b/Makefile index 5ebf14108..8594be86b 100644 --- a/Makefile +++ b/Makefile @@ -56,10 +56,6 @@ else ifeq (docker.restart,$(firstword $(MAKECMDGOALS))) SERVICE_TARGET = true else ifeq (docker.up,$(firstword $(MAKECMDGOALS))) SERVICE_TARGET = true -else ifeq (docker.build,$(firstword $(MAKECMDGOALS))) - SERVICE_TARGET = true -else ifeq (build-nocache,$(firstword $(MAKECMDGOALS))) - SERVICE_TARGET = true else ifeq (docker.await,$(firstword $(MAKECMDGOALS))) SERVICE_TARGET = true else ifeq (docker.run,$(firstword $(MAKECMDGOALS))) @@ -141,8 +137,6 @@ ifneq ($(NETWORK_MODE),host) $(warning ${GREEN}network $(NETWORK_MODE) removed${RESET}) endif -docker.build: - $(DOCKER_COMPOSE_ARGS) $(DOCKER_COMPOSE) $(COMPOSE_FILE_ARGS) build --parallel --progress=plain $(SERVICE) docker.run: docker.create.network $(DOCKER_COMPOSE_ARGS) $(DOCKER_COMPOSE) $(COMPOSE_FILE_ARGS) run -T --no-deps --rm $(SERVICE) $(SERVICE_ARGS) @@ -193,6 +187,18 @@ docker.status: docker.images: $(DOCKER_COMPOSE_ARGS) $(DOCKER_COMPOSE) $(COMPOSE_FILE_ARGS) images + +build.app: + @zx --version || pnpm add -g zx; \ + zx scripts/build-image.mjs --file=dockers/teable/Dockerfile \ + --tag=teable:develop + +build.db-migrate: + @zx --version || pnpm add -g zx; \ + zx scripts/build-image.mjs --file=dockers/teable/Dockerfile.db-migrate \ + --tag=teable-db-migrate:develop + + sqlite.integration.test: @export PRISMA_DATABASE_URL='file:../../db/main.db'; \ make sqlite.mode; \ diff --git a/README.md b/README.md index 91cd06fe8..bf565eb68 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@

- Home | Help | Blog | Template | Roadmap | Discord + Home | Help | Blog | Template | Roadmap | Discord | Twitter

@@ -53,7 +53,7 @@ ## ✨Features -#### 📊 Spreadsheet-like interface +#### 📊 Spreadsheet-like Interface All you want is here @@ -106,7 +106,7 @@ You own your data, in spite of the cloud - Bring your own database (coming soon) -#### ⚡️ Real-time collaboration +#### ⚡️ Real-time Collaboration Designed for teams @@ -114,7 +114,7 @@ Designed for teams - Seamlessly integrate collaboration member invitation and management - Perfect permission management mechanism, from table to column level -#### 🧩 Extensions (coming soon) +#### 🧩 Extensions (Coming Soon) Expand infinite possibilities @@ -122,14 +122,14 @@ Expand infinite possibilities - Customize your own application with extremely low cost - Extremely easy-to-use script extensions mode -#### 🤖 Automation (coming soon) +#### 🤖 Automation (Coming Soon) Empower data-driven workflows effortlessly and seamlessly - Design your workflow with AI or Visual programming - Super easy to retrieve data from the table -#### 🧠 Copilot (coming soon) +#### 🧠 Copilot (Coming Soon) Native Integrated AI ability @@ -139,7 +139,7 @@ Native Integrated AI ability - Chat 2 Action. "After the order is paid and completed, an email notification will be sent to the customer" - More actions... -#### 🗄️ Support for multiple databases (coming soon) +#### 🗄️ Support for Multiple Databases (Coming Soon) Choose the SQL database you like @@ -154,9 +154,8 @@ Choose the SQL database you like ``` . ├── apps -│ ├── electron (desktop, include a electron app ) │ ├── nextjs-app (front-end, include a nextjs app) -│ └── nestjs-backend (backend, running on server or inside electron app) +│ └── nestjs-backend (backend, include a nestjs app) └── packages ├── common-i18n (locales) ├── core (share code and interface) @@ -168,7 +167,7 @@ Choose the SQL database you like ## Deploy -### Deploy with docker +### Deploy With Docker ```sh cd dockers/examples/standalone/ @@ -177,18 +176,21 @@ docker-compose up -d for more details, see [dockers/examples](dockers/examples) -### Deploy with Railway +### One Click Deployment + +These platforms are easy to deploy with one click and come with free credits. [![Deploy on Railway](https://railway.app/button.svg)](https://railway.app/template/wada5e?referralCode=rE4BjB) +[![Deploy on Zeabur](https://zeabur.com/button.svg)](https://zeabur.com/templates/QF8695) + +[![Deploy on Sealos](https://raw.githubusercontent.com/labring-actions/templates/main/Deploy-on-Sealos.svg)](https://cloud.sealos.io/?openapp=system-template%3FtemplateName%3Dteable) + ## Development #### 1. Initialize ```sh -# Use `.nvmrc` file to specify node version(Requires pre `nvm` tools) -nvm install && nvm use - # Enabling the Help Management Package Manager corepack enable @@ -207,14 +209,14 @@ we currently support `sqlite` and `postgres`, you can switch between them by run make switch-db-mode ``` -#### 3. Custom environment variables(optional) +#### 3. Custom Environment Variables(Optional) ```sh cd apps/nextjs-app copy .env.development .env.development.local ``` -#### 4. Run dev server +#### 4. Run Dev Server you just need to start backend, it will start next server for frontend automatically, file change will be auto reload @@ -236,7 +238,7 @@ Giving non-techy people the ability to create their software sounds exciting. Bu - Maintaining systems with complex setups can be hard for developers, especially if these aren't built using common software standards. - Systems that don't use these standards might need revamping or replacing, costing more in the long run. It might even mean ditching the no-code route and going back to traditional coding. -#### What we think the future of no-code products look like +#### What We Think the Future Of No-code Products Look Like - An interface that anyone can use to build applications easily. - Easy access to data, letting users grab, move, and reuse their information as they wish. diff --git a/apps/electron/.gitignore b/apps/electron/.gitignore deleted file mode 100644 index 895e025e0..000000000 --- a/apps/electron/.gitignore +++ /dev/null @@ -1,96 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock -.DS_Store - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# next.js build output -.next - -# nuxt.js build output -.nuxt - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# Webpack -.webpack/ - -# Vite -.vite/ - -# Electron-Forge -out/ - -server/ - -.yarn/ \ No newline at end of file diff --git a/apps/electron/README.md b/apps/electron/README.md deleted file mode 100644 index 3421e516f..000000000 --- a/apps/electron/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# @teable/electron - -This is a repository in a monorepo project used to package applications into Electron desktop apps. - -## Getting Started - -### Install Dependencies - -Run the following command in the root directory to install the dependencies: - -``` -yarn install -``` - -### Development Mode - -Run the following command to start the development mode, which loads the local web application in Electron: - -``` -yarn start -``` - -> tips: Ensure that nest is start. - -### Start prepare - -Build all nextjs and nestjs dependent packages: - -``` -yarn g:build -``` - -Run prepare scripts - -``` -yarn prepare:server -``` - -### Building the App - -Run the following command to package the application into an Electron desktop app: - -- Build mac: - -``` -yarn make:mac -``` - -- Build windows: - -``` -yarn make:win -``` - -The packaged app will be generated in the `out` directory. - -Debug build: - -``` -yarn package:debug -``` - -## Notes - -- Make sure you have Node.js and npm installed on your local machine. -- Packaging the Electron app may take some time, please be patient. -- If you encounter any issues during the packaging process, check the console output or log files for error information. - -## TODO - -- [ ] Organize environment variable configuration. -- [ ] The database file can be initialized to any location. -- [ ] Optimize packing volume. diff --git a/apps/electron/forge.config.js b/apps/electron/forge.config.js deleted file mode 100644 index fefcbedf3..000000000 --- a/apps/electron/forge.config.js +++ /dev/null @@ -1,93 +0,0 @@ -const path = require('path'); - -module.exports = { - packagerConfig: { - appId: 'YourAppID', - name: 'TeableApp', - osxSign: {}, - icon: 'static/icons/icon', - ignore: (file) => { - const isTsOrMap = (p) => /[^/\\]+\.js\.map$/.test(p) || /[^/\\]+\.ts$/.test(p); - if (!file) return false; - - if (file.startsWith('/.vite')) { - return false; - } - - if (file === '/package.json') { - return false; - } - - if (file.startsWith('/static')) { - return false; - } - - if ( - file.startsWith('/server') && - !isTsOrMap(file) && - !file.startsWith('/server/.yarn') && - !file.startsWith('/server/apps/nextjs-app/.next/cache') - ) { - return false; - } - - if (file.startsWith('/node_modules') && !isTsOrMap(file)) { - return false; - } - - return true; - }, - }, - rebuildConfig: {}, - makers: [ - { - name: '@electron-forge/maker-zip', - config: {}, - }, - { - name: '@electron-forge/maker-squirrel', - config: {}, - }, - // { - // name: '@electron-forge/maker-deb', - // config: {}, - // }, - // { - // name: '@electron-forge/maker-rpm', - // config: {}, - // }, - { - name: '@electron-forge/maker-dmg', - config: { - background: path.join(__dirname, 'static', 'background.png'), - icon: path.join(__dirname, 'static', 'icons', 'icon.icns'), - }, - }, - ], - plugins: [ - { - name: '@electron-forge/plugin-vite', - config: { - // `build` can specify multiple entry builds, which can be Main process, Preload scripts, Worker process, etc. - // If you are familiar with Vite configuration, it will look really familiar. - build: [ - { - // `entry` is just an alias for `build.lib.entry` in the corresponding file of `config`. - entry: 'src/main.js', - config: 'vite.main.config.mjs', - }, - { - entry: 'src/preload.js', - config: 'vite.preload.config.mjs', - }, - ], - renderer: [ - { - name: 'main_window', - config: 'vite.renderer.config.mjs', - }, - ], - }, - }, - ], -}; diff --git a/apps/electron/index.html b/apps/electron/index.html deleted file mode 100644 index 1556a2a95..000000000 --- a/apps/electron/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Hello World! - - -

💖 Hello World!

-

Welcome to your Electron application.

- - - diff --git a/apps/electron/package.json b/apps/electron/package.json deleted file mode 100644 index 5f9c937e5..000000000 --- a/apps/electron/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "@table-group/electron", - "productName": "electron-vite", - "version": "1.0.0", - "description": "My Electron application description", - "main": ".vite/build/main.js", - "scripts": { - "prepare:server": "rm -rf server && node ./scripts/prepare-server.js", - "start": "electron-forge start", - "package": "electron-forge package", - "package:debug": "electron-forge package && out/TeableApp-darwin-x64/TeableApp.app/Contents/MacOS/TeableApp --enable-logging", - "make:mac": "electron-forge make --platform=mas --arch=x64", - "make:win": "electron-forge make --platform=win32 --arch=x64", - "publish": "electron-forge publish", - "lint": "echo \"No linting configured\"" - }, - "keywords": [], - "author": { - "name": "boris", - "email": "boris2code@outlook.com" - }, - "license": "MIT", - "devDependencies": { - "@electron-forge/cli": "6.2.1", - "@electron-forge/maker-deb": "6.2.1", - "@electron-forge/maker-dmg": "6.2.1", - "@electron-forge/maker-rpm": "6.2.1", - "@electron-forge/maker-squirrel": "6.2.1", - "@electron-forge/maker-zip": "6.2.1", - "@electron-forge/plugin-auto-unpack-natives": "6.2.1", - "@electron-forge/plugin-vite": "6.2.1", - "electron": "25.3.0", - "is-port-reachable": "3.1.0" - }, - "dependencies": { - "electron-squirrel-startup": "1.0.0" - } -} diff --git a/apps/electron/scripts/prepare-server.js b/apps/electron/scripts/prepare-server.js deleted file mode 100644 index 65ee3481c..000000000 --- a/apps/electron/scripts/prepare-server.js +++ /dev/null @@ -1,83 +0,0 @@ -const path = require('path'); -const { execSync } = require('child_process'); -const { copySync, writeFileSync } = require('fs-extra'); - -const root = path.join(__dirname, '../../../'); - -// enter project directory -const serverOutput = 'apps/electron/server'; - -const packages = [ - { - path: '', - files: ['package.json', '.yarnrc.yml', '.yarn/releases', '.yarn/plugins', 'static'], - }, - { - path: 'apps/nestjs-backend', - files: ['package.json', 'dist'], - }, - { - path: 'apps/nextjs-app', - files: ['package.json', '.next', '.env', 'public'], - }, - { - path: 'packages/core', - files: ['package.json', 'dist'], - }, - { - path: 'packages/db-main-prisma', - files: ['package.json', 'dist', 'prisma', '.env'], - }, - { - path: 'packages/icons', - files: ['package.json', 'dist'], - }, - { - path: 'packages/openapi', - files: ['package.json', 'dist'], - }, - { - path: 'packages/sdk', - files: ['package.json', 'dist'], - }, - { - path: 'packages/ui-lib', - files: ['package.json', 'dist'], - }, - { - path: 'packages/common-i18n', - files: ['package.json', 'src'], - }, -]; - -function copyPackages() { - packages.forEach((pkg) => { - console.log('begin copy...', pkg.path); - pkg.files.forEach((file) => { - const src = path.join(root, `${pkg.path}/${file}`); - const dest = path.join(root, `${serverOutput}/${pkg.path}/${file}`); - copySync(src, dest); - }); - console.log('completed ✅'); - }); - console.log('🎉 copy packages success!!!'); -} - -function fixPostinstall() { - packages.forEach((pkg) => { - const packageJsonPath = path.join(root, serverOutput, pkg.path, 'package.json'); - const packageJson = require(packageJsonPath); - if (pkg.path.includes('db-main-prisma') || !packageJson?.scripts?.postinstall) { - return; - } - delete packageJson.scripts.postinstall; - - writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2)); - }); -} - -copyPackages(); -writeFileSync('server/yarn.lock', ''); -fixPostinstall(); - -execSync('yarn workspaces focus --production --all', { cwd: 'server/', stdio: 'inherit' }); diff --git a/apps/electron/src/env.js b/apps/electron/src/env.js deleted file mode 100644 index 75e985e66..000000000 --- a/apps/electron/src/env.js +++ /dev/null @@ -1,23 +0,0 @@ -import { getAvailablePort } from './utils'; -const path = require('path'); - -export const initEnv = async () => { - const defaultPort = 3000; - - process.env.ELECTRON_DEV = Boolean(MAIN_WINDOW_VITE_DEV_SERVER_URL); - - if (process.env.ELECTRON_DEV === 'true') { - process.env.PORT = defaultPort; - return; - } - const port = await getAvailablePort(defaultPort); - process.env.STATIC_PATH = path.join(__dirname, '../..', 'static'); - process.env.NODE_ENV = 'production'; - process.env.SOCKET_PORT = port; - process.env.PORT = port; - process.env.NEXTJS_DIR = path.join(process.resourcesPath, '/app/server/apps/nextjs-app'); - process.env.I18N_LOCALES_PATH = path.join( - process.resourcesPath, - '/app/server/packages/common-i18n/src/locales' - ); -}; diff --git a/apps/electron/src/index.css b/apps/electron/src/index.css deleted file mode 100644 index 8ed165983..000000000 --- a/apps/electron/src/index.css +++ /dev/null @@ -1,6 +0,0 @@ -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; - margin: auto; - max-width: 38rem; - padding: 2rem; -} diff --git a/apps/electron/src/main.js b/apps/electron/src/main.js deleted file mode 100644 index 840bbc93f..000000000 --- a/apps/electron/src/main.js +++ /dev/null @@ -1,60 +0,0 @@ -const { app, BrowserWindow } = require('electron'); -const path = require('path'); -import { startServer } from './server'; -import { initEnv } from './env'; - -// Handle creating/removing shortcuts on Windows when installing/uninstalling. -if (require('electron-squirrel-startup')) { - app.quit(); -} - -const createWindow = async () => { - await initEnv(); - // Create the browser window. - const mainWindow = new BrowserWindow({ - width: 800, - height: 600, - title: 'TeableApp', - icon: path.join(process.env.STATIC_PATH, 'icons', 'icon.png'), - webPreferences: { - preload: path.join(__dirname, 'preload.js'), - nodeIntegration: true, - nodeIntegrationInWorker: true, - scrollBounce: true, - }, - }); - - // and load the index.html of the app. - mainWindow.loadFile(path.join(process.env.STATIC_PATH, 'loading.html')); - // Open the DevTools. - process.env.ELECTRON_DEV === 'true' && mainWindow.webContents.openDevTools(); - - startServer(mainWindow); -}; - -// This method will be called when Electron has finished -// initialization and is ready to create browser windows. -// Some APIs can only be used after this event occurs. -app.on('ready', async () => { - await createWindow(); -}); - -// Quit when all windows are closed, except on macOS. There, it's common -// for applications and their menu bar to stay active until the user quits -// explicitly with Cmd + Q. -app.on('window-all-closed', () => { - if (process.platform !== 'darwin') { - app.quit(); - } -}); - -app.on('activate', async () => { - // On OS X it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. - if (BrowserWindow.getAllWindows().length === 0) { - await createWindow(); - } -}); - -// In this file you can include the rest of your app's specific main process -// code. You can also put them in separate files and import them here. diff --git a/apps/electron/src/preload.js b/apps/electron/src/preload.js deleted file mode 100644 index 5e9d369cc..000000000 --- a/apps/electron/src/preload.js +++ /dev/null @@ -1,2 +0,0 @@ -// See the Electron documentation for details on how to use preload scripts: -// https://www.electronjs.org/docs/latest/tutorial/process-model#preload-scripts diff --git a/apps/electron/src/renderer.js b/apps/electron/src/renderer.js deleted file mode 100644 index 22f238be8..000000000 --- a/apps/electron/src/renderer.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * This file will automatically be loaded by vite and run in the "renderer" context. - * To learn more about the differences between the "main" and the "renderer" context in - * Electron, visit: - * - * https://electronjs.org/docs/tutorial/application-architecture#main-and-renderer-processes - * - * By default, Node.js integration in this file is disabled. When enabling Node.js integration - * in a renderer process, please be aware of potential security implications. You can read - * more about security risks here: - * - * https://electronjs.org/docs/tutorial/security - * - * To enable Node.js integration in this file, open up `main.js` and enable the `nodeIntegration` - * flag: - * - * ``` - * // Create the browser window. - * mainWindow = new BrowserWindow({ - * width: 800, - * height: 600, - * webPreferences: { - * nodeIntegration: true - * } - * }); - * ``` - */ - -import './index.css'; - -console.log('👋 This message is being logged by "renderer.js", included via Vite'); diff --git a/apps/electron/src/server.js b/apps/electron/src/server.js deleted file mode 100644 index 2b5cff311..000000000 --- a/apps/electron/src/server.js +++ /dev/null @@ -1,12 +0,0 @@ -const path = require('path'); - -export const startServer = async (mainWindow) => { - if (process.env.ELECTRON_DEV === 'true') { - return; - } - - let p = path.join(process.resourcesPath, '/app/server/apps/nestjs-backend/dist/bootstrap.js'); - const backend = require(p); - await backend.bootstrap(); - mainWindow.loadURL(`http://localhost:${process.env.PORT}/space`); -}; diff --git a/apps/electron/src/utils.js b/apps/electron/src/utils.js deleted file mode 100644 index 575772d02..000000000 --- a/apps/electron/src/utils.js +++ /dev/null @@ -1,11 +0,0 @@ -import isPortReachable from 'is-port-reachable'; - -export async function getAvailablePort(dPort) { - let port = Number(dPort); - const host = 'localhost'; - while (await isPortReachable(port, { host })) { - console.log(`> Fail on http://${host}:${port} Trying on ${port + 1}`); - port++; - } - return port; -} diff --git a/apps/electron/static/background.png b/apps/electron/static/background.png deleted file mode 100644 index 64173937e176d56dc3a3659f7a0597a524c08890..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 395903 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%0DdrT0+UoH$sO=ex}h$9>8z3OfGq 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%0AlLU1Bx3?Cl&;9yJmRm{q(#o+M++`jFP|58Ww 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�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 |7RDevGu^ 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≶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 diff --git a/apps/electron/static/icons/icon.png b/apps/electron/static/icons/icon.png deleted file mode 100644 index b5540dbef52c9224c3440a3de3d0e52dd1a21917..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92713 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≶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 diff --git a/apps/electron/static/loading.html b/apps/electron/static/loading.html deleted file mode 100644 index 56560f189..000000000 --- a/apps/electron/static/loading.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - Loading - - - -
-
-
- - diff --git a/apps/electron/vite.main.config.mjs b/apps/electron/vite.main.config.mjs deleted file mode 100644 index c93ad0382..000000000 --- a/apps/electron/vite.main.config.mjs +++ /dev/null @@ -1,10 +0,0 @@ -import { defineConfig } from 'vite'; - -// https://vitejs.dev/config -export default defineConfig({ - resolve: { - // Some libs that can run in both Web and Node.js, such as `axios`, we need to tell Vite to build them in Node.js. - browserField: false, - mainFields: ['module', 'jsnext:main', 'jsnext'], - }, -}); diff --git a/apps/electron/vite.preload.config.mjs b/apps/electron/vite.preload.config.mjs deleted file mode 100644 index 690be5b1a..000000000 --- a/apps/electron/vite.preload.config.mjs +++ /dev/null @@ -1,4 +0,0 @@ -import { defineConfig } from 'vite'; - -// https://vitejs.dev/config -export default defineConfig({}); diff --git a/apps/electron/vite.renderer.config.mjs b/apps/electron/vite.renderer.config.mjs deleted file mode 100644 index 690be5b1a..000000000 --- a/apps/electron/vite.renderer.config.mjs +++ /dev/null @@ -1,4 +0,0 @@ -import { defineConfig } from 'vite'; - -// https://vitejs.dev/config -export default defineConfig({}); diff --git a/apps/electron/yarn.lock b/apps/electron/yarn.lock deleted file mode 100644 index bb601ee87..000000000 --- a/apps/electron/yarn.lock +++ /dev/null @@ -1,5087 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 6 - cacheKey: 8 - -"@electron-forge/cli@npm:^6.2.1": - version: 6.2.1 - resolution: "@electron-forge/cli@npm:6.2.1" - dependencies: - "@electron-forge/core": 6.2.1 - "@electron-forge/shared-types": 6.2.1 - "@electron/get": ^2.0.0 - chalk: ^4.0.0 - commander: ^4.1.1 - debug: ^4.3.1 - fs-extra: ^10.0.0 - listr2: ^5.0.3 - semver: ^7.2.1 - bin: - electron-forge: dist/electron-forge.js - electron-forge-vscode-nix: script/vscode.sh - electron-forge-vscode-win: script/vscode.cmd - checksum: d17953906ce330965625bd46ab5a0f09ca3c9243f61d55709f358df2f2cecf508eed32938c15321cea938644245b1e89a266c1856f1f530de0320e8a746c7c13 - languageName: node - linkType: hard - -"@electron-forge/core-utils@npm:6.2.1": - version: 6.2.1 - resolution: "@electron-forge/core-utils@npm:6.2.1" - dependencies: - "@electron-forge/shared-types": 6.2.1 - "@electron/rebuild": ^3.2.10 - "@malept/cross-spawn-promise": ^2.0.0 - chalk: ^4.0.0 - debug: ^4.3.1 - find-up: ^5.0.0 - fs-extra: ^10.0.0 - log-symbols: ^4.0.0 - semver: ^7.2.1 - yarn-or-npm: ^3.0.1 - checksum: 67ce49e67f4c094311f5a4def1ef029be8332e62b07517d32ce37c5804975b421a0ac97455673452a202fdd821b3c6330b2341f18f63b7ade42648778fec43f3 - languageName: node - linkType: hard - -"@electron-forge/core@npm:6.2.1": - version: 6.2.1 - resolution: "@electron-forge/core@npm:6.2.1" - dependencies: - "@electron-forge/core-utils": 6.2.1 - "@electron-forge/maker-base": 6.2.1 - "@electron-forge/plugin-base": 6.2.1 - "@electron-forge/publisher-base": 6.2.1 - "@electron-forge/shared-types": 6.2.1 - "@electron-forge/template-base": 6.2.1 - "@electron-forge/template-vite": 6.2.1 - "@electron-forge/template-webpack": 6.2.1 - "@electron-forge/template-webpack-typescript": 6.2.1 - "@electron/get": ^2.0.0 - "@electron/rebuild": ^3.2.10 - "@malept/cross-spawn-promise": ^2.0.0 - chalk: ^4.0.0 - debug: ^4.3.1 - electron-packager: ^17.1.1 - fast-glob: ^3.2.7 - filenamify: ^4.1.0 - find-up: ^5.0.0 - fs-extra: ^10.0.0 - got: ^11.8.5 - interpret: ^3.1.1 - listr2: ^5.0.3 - lodash: ^4.17.20 - log-symbols: ^4.0.0 - node-fetch: ^2.6.7 - progress: ^2.0.3 - rechoir: ^0.8.0 - resolve-package: ^1.0.1 - semver: ^7.2.1 - source-map-support: ^0.5.13 - sudo-prompt: ^9.1.1 - username: ^5.1.0 - yarn-or-npm: ^3.0.1 - checksum: c6d9bc103d0a6ebd8aebed36c93e576c375c411f9e31ca66cc5de65f8bad4b204d5fb45511a66724c94528ae999186fe6bd814cc6381d154b8a9feb449cd3aa5 - languageName: node - linkType: hard - -"@electron-forge/maker-base@npm:6.2.1": - version: 6.2.1 - resolution: "@electron-forge/maker-base@npm:6.2.1" - dependencies: - "@electron-forge/shared-types": 6.2.1 - fs-extra: ^10.0.0 - which: ^2.0.2 - checksum: 0b22f5dce43f3b15088ba2fff660918f4538c7e0d15b803a5df93a4022617d410eaf72e9d0838da5851480d4ca852b9dd4d030d03c4f61e3586c8e58b93e7a11 - languageName: node - linkType: hard - -"@electron-forge/maker-deb@npm:^6.2.1": - version: 6.2.1 - resolution: "@electron-forge/maker-deb@npm:6.2.1" - dependencies: - "@electron-forge/maker-base": 6.2.1 - "@electron-forge/shared-types": 6.2.1 - electron-installer-debian: ^3.0.0 - dependenciesMeta: - electron-installer-debian: - optional: true - checksum: 1d2e1f4411e16e971fc5828328036dba1258b6ef7377b87af694f359e7c910ca20723285f11250b1ef61593bb30e28457551eff1b8ad26c8fb6ec0c5ac858359 - languageName: node - linkType: hard - -"@electron-forge/maker-dmg@npm:6.2.1": - version: 6.2.1 - resolution: "@electron-forge/maker-dmg@npm:6.2.1" - dependencies: - "@electron-forge/maker-base": 6.2.1 - "@electron-forge/shared-types": 6.2.1 - electron-installer-dmg: ^4.0.0 - fs-extra: ^10.0.0 - dependenciesMeta: - electron-installer-dmg: - optional: true - checksum: 7e00dfa17ac5045f7163bef8836869abc0940e6588641756a5ffea5d93b5c477d93ccb42ef223c2b4a018406466e4a8230663591fff48f1688acf54314e5e366 - languageName: node - linkType: hard - -"@electron-forge/maker-rpm@npm:^6.2.1": - version: 6.2.1 - resolution: "@electron-forge/maker-rpm@npm:6.2.1" - dependencies: - "@electron-forge/maker-base": 6.2.1 - "@electron-forge/shared-types": 6.2.1 - electron-installer-redhat: ^3.2.0 - dependenciesMeta: - electron-installer-redhat: - optional: true - checksum: 47d5b1f3b94075dc9e7d5e4b73a9bad5411c97c287688b1416fe4982612395500f4fdac164fefe96b4293fa7b49bf41c7211a69c4dddefb61f20f3a345a3d29a - languageName: node - linkType: hard - -"@electron-forge/maker-squirrel@npm:^6.2.1": - version: 6.2.1 - resolution: "@electron-forge/maker-squirrel@npm:6.2.1" - dependencies: - "@electron-forge/maker-base": 6.2.1 - "@electron-forge/shared-types": 6.2.1 - electron-winstaller: ^5.0.0 - fs-extra: ^10.0.0 - dependenciesMeta: - electron-winstaller: - optional: true - checksum: 62f496bbeb7bc7690b9b509689ddc467920d12fe2e263064bebf1692fc91b9d68641623dec2b2e0bb3c959f0086681dea64ab53f80a21f875ca2c3c3e1935b99 - languageName: node - linkType: hard - -"@electron-forge/maker-zip@npm:^6.2.1": - version: 6.2.1 - resolution: "@electron-forge/maker-zip@npm:6.2.1" - dependencies: - "@electron-forge/maker-base": 6.2.1 - "@electron-forge/shared-types": 6.2.1 - cross-zip: ^4.0.0 - fs-extra: ^10.0.0 - got: ^11.8.5 - checksum: d78468fad71895bf794983e9e7f77aaa95c962a3e59e7d40266ab4aa27f23f65ca288ffaa8db025e7b6c108c41108fabbfbdc6c6297a085be50fa9a06d330a66 - languageName: node - linkType: hard - -"@electron-forge/plugin-auto-unpack-natives@npm:^6.2.1": - version: 6.2.1 - resolution: "@electron-forge/plugin-auto-unpack-natives@npm:6.2.1" - dependencies: - "@electron-forge/plugin-base": 6.2.1 - "@electron-forge/shared-types": 6.2.1 - checksum: dc8b72ce3646f488975f27ce8190ba55dc269ac40dc4fc4f0d92c303177b6092fcc93a8318546fe2246364e5395ce819d1d5466f09910fa8bb820651e73534fd - languageName: node - linkType: hard - -"@electron-forge/plugin-base@npm:6.2.1": - version: 6.2.1 - resolution: "@electron-forge/plugin-base@npm:6.2.1" - dependencies: - "@electron-forge/shared-types": 6.2.1 - checksum: 03e3294201c3308d521651ef19e672ec9e4cdb1c34e273bc4451fc7fdc7b917036cf9ad4a21e105ca8082276e5d7477ab8cd4d5bef5fdda9025d12b657c04e26 - languageName: node - linkType: hard - -"@electron-forge/plugin-vite@npm:^6.2.1": - version: 6.2.1 - resolution: "@electron-forge/plugin-vite@npm:6.2.1" - dependencies: - "@electron-forge/core-utils": 6.2.1 - "@electron-forge/plugin-base": 6.2.1 - "@electron-forge/shared-types": 6.2.1 - "@electron-forge/web-multi-logger": 6.2.1 - chalk: ^4.0.0 - debug: ^4.3.1 - vite: ^4.1.1 - checksum: c96b3d759352b39c7d07679192c86f3b2e5005844bad1c43f6e7f9709028bc89c194fdd754b099209ab17a28a510b3a465d8bb77bcda85f101f8d63565a9f006 - languageName: node - linkType: hard - -"@electron-forge/publisher-base@npm:6.2.1": - version: 6.2.1 - resolution: "@electron-forge/publisher-base@npm:6.2.1" - dependencies: - "@electron-forge/shared-types": 6.2.1 - checksum: 787d11db87b44c89732b373313d597f4b7e555b709e944a998318aaa8f81c65f91459ace79046798c0d2fa5573da02be3c0f45541e55dbf83e09afde32c4d5dc - languageName: node - linkType: hard - -"@electron-forge/shared-types@npm:6.2.1": - version: 6.2.1 - resolution: "@electron-forge/shared-types@npm:6.2.1" - dependencies: - "@electron/rebuild": ^3.2.10 - electron-packager: ^17.1.1 - listr2: ^5.0.3 - checksum: 524c27b9d40f5b085c4a624aa24c97499c47cc632ab2cf17a4de57c52ebdaf59d842231082a7b7549387df958e8e8dd512082c03e504ad56f3c62d600a44619e - languageName: node - linkType: hard - -"@electron-forge/template-base@npm:6.2.1": - version: 6.2.1 - resolution: "@electron-forge/template-base@npm:6.2.1" - dependencies: - "@electron-forge/shared-types": 6.2.1 - "@malept/cross-spawn-promise": ^2.0.0 - debug: ^4.3.1 - fs-extra: ^10.0.0 - username: ^5.1.0 - checksum: 3f826cd48bfdf91b1b8c85ece81d689f9e37d83c247851c4bbfba4adbaf5da87dca72c8c329b4cd64e408067161eca45ef929c5f617b5297c7a7bc25fc79057a - languageName: node - linkType: hard - -"@electron-forge/template-vite@npm:6.2.1": - version: 6.2.1 - resolution: "@electron-forge/template-vite@npm:6.2.1" - dependencies: - "@electron-forge/shared-types": 6.2.1 - "@electron-forge/template-base": 6.2.1 - fs-extra: ^10.0.0 - checksum: 878b90b71f05956be7df253d890af4753bbe2043c62b08fa2c0ddcc0dd706921a1c57899b11bbb0ea4f86e4c71f245b171d7e9b484b2842638d6d09294d23d62 - languageName: node - linkType: hard - -"@electron-forge/template-webpack-typescript@npm:6.2.1": - version: 6.2.1 - resolution: "@electron-forge/template-webpack-typescript@npm:6.2.1" - dependencies: - "@electron-forge/shared-types": 6.2.1 - "@electron-forge/template-base": 6.2.1 - fs-extra: ^10.0.0 - checksum: 0770b9730a15e0ded37a951e1859f588d8390af9c34600895125bae34536c407e39c0c31ba76a1f2c49c7639d8fbd26d64293e54a2870b75e16cdb196ec9e08e - languageName: node - linkType: hard - -"@electron-forge/template-webpack@npm:6.2.1": - version: 6.2.1 - resolution: "@electron-forge/template-webpack@npm:6.2.1" - dependencies: - "@electron-forge/shared-types": 6.2.1 - "@electron-forge/template-base": 6.2.1 - fs-extra: ^10.0.0 - checksum: 67de5c342e458a3d2dceb3413d05085919efa8a0767c31c1c3024c5298962f8fcd4c32f062a236aab75d0147d593173fdc9fc33ef5bb07d0c14716e3e93592a6 - languageName: node - linkType: hard - -"@electron-forge/web-multi-logger@npm:6.2.1": - version: 6.2.1 - resolution: "@electron-forge/web-multi-logger@npm:6.2.1" - dependencies: - express: ^4.17.1 - express-ws: ^5.0.2 - xterm: ^4.9.0 - xterm-addon-fit: ^0.5.0 - xterm-addon-search: ^0.8.0 - checksum: 81d952c96d06e8773254769f7f5caf41ec35f6e7fd1d8ee76dfa133023fa5e12602582c9d7a8441daafe3011eba25d32bad671d8a21285c48997dbd2487ab287 - languageName: node - linkType: hard - -"@electron/asar@npm:^3.2.1": - version: 3.2.4 - resolution: "@electron/asar@npm:3.2.4" - dependencies: - chromium-pickle-js: ^0.2.0 - commander: ^5.0.0 - glob: ^7.1.6 - minimatch: ^3.0.4 - bin: - asar: bin/asar.js - checksum: 06e3e8fe7c894f7e7727410af5a9957ec77088f775b22441acf4ef718a9e6642a4dc1672f77ee1ce325fc367c8d59ac1e02f7db07869c8ced8a00132a3b54643 - languageName: node - linkType: hard - -"@electron/get@npm:^2.0.0": - version: 2.0.2 - resolution: "@electron/get@npm:2.0.2" - dependencies: - debug: ^4.1.1 - env-paths: ^2.2.0 - fs-extra: ^8.1.0 - global-agent: ^3.0.0 - got: ^11.8.5 - progress: ^2.0.3 - semver: ^6.2.0 - sumchecker: ^3.0.1 - dependenciesMeta: - global-agent: - optional: true - checksum: 900845cc0b31b54761fc9b0ada2dea1e999e59aacc48999d53903bcb7c9a0a7356b5fe736cf610b2a56c5a21f5a3c0e083b2ed2b7e52c36a4d0f420d4b5ec268 - languageName: node - linkType: hard - -"@electron/notarize@npm:^1.2.3": - version: 1.2.4 - resolution: "@electron/notarize@npm:1.2.4" - dependencies: - debug: ^4.1.1 - fs-extra: ^9.0.1 - checksum: 3aa19fb247f9297b96a25f1a082f552e0c78a726ddfc98de9cdd4e4b092fc36fe07d680b762dd5a2bceda97b1044d3a0e6d9eadc5022f7c329a1fcf081133c9b - languageName: node - linkType: hard - -"@electron/osx-sign@npm:^1.0.1": - version: 1.0.4 - resolution: "@electron/osx-sign@npm:1.0.4" - dependencies: - compare-version: ^0.1.2 - debug: ^4.3.4 - fs-extra: ^10.0.0 - isbinaryfile: ^4.0.8 - minimist: ^1.2.6 - plist: ^3.0.5 - bin: - electron-osx-flat: bin/electron-osx-flat.js - electron-osx-sign: bin/electron-osx-sign.js - checksum: 0d7382922eabd06ee53b538e15050c7662773ba3fd07cc51ee86f5ec63872685c3b6c8678c967afe7efbee1b393d555fb5553137f7a76af514b30d102568d63e - languageName: node - linkType: hard - -"@electron/rebuild@npm:^3.2.10": - version: 3.2.13 - resolution: "@electron/rebuild@npm:3.2.13" - dependencies: - "@malept/cross-spawn-promise": ^2.0.0 - chalk: ^4.0.0 - debug: ^4.1.1 - detect-libc: ^2.0.1 - fs-extra: ^10.0.0 - got: ^11.7.0 - node-abi: ^3.0.0 - node-api-version: ^0.1.4 - node-gyp: ^9.0.0 - ora: ^5.1.0 - semver: ^7.3.5 - tar: ^6.0.5 - yargs: ^17.0.1 - bin: - electron-rebuild: lib/cli.js - checksum: 79ce6323fa95cab75dc1edb52540c8dd367db9ab084ca94fefde1a46699139b3cee3f5449b7b3b5b9b529887d9f3fabe1689a738351b716e3090e636296c3b1b - languageName: node - linkType: hard - -"@electron/universal@npm:^1.3.2": - version: 1.4.1 - resolution: "@electron/universal@npm:1.4.1" - dependencies: - "@electron/asar": ^3.2.1 - "@malept/cross-spawn-promise": ^1.1.0 - debug: ^4.3.1 - dir-compare: ^3.0.0 - fs-extra: ^9.0.1 - minimatch: ^3.0.4 - plist: ^3.0.4 - checksum: 257f3a25a4f940ccbe601a0f3a2a925a28657bc3c5fc46018980b771825834665d184e5ce75cfa0b8639525a0bdbb7f0bc02e69e2d4fb044add64638db4d48a4 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/android-arm64@npm:0.18.14" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/android-arm@npm:0.18.14" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/android-x64@npm:0.18.14" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/darwin-arm64@npm:0.18.14" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/darwin-x64@npm:0.18.14" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/freebsd-arm64@npm:0.18.14" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/freebsd-x64@npm:0.18.14" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/linux-arm64@npm:0.18.14" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/linux-arm@npm:0.18.14" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/linux-ia32@npm:0.18.14" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/linux-loong64@npm:0.18.14" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/linux-mips64el@npm:0.18.14" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/linux-ppc64@npm:0.18.14" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/linux-riscv64@npm:0.18.14" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/linux-s390x@npm:0.18.14" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/linux-x64@npm:0.18.14" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/netbsd-x64@npm:0.18.14" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/openbsd-x64@npm:0.18.14" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/sunos-x64@npm:0.18.14" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/win32-arm64@npm:0.18.14" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/win32-ia32@npm:0.18.14" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.18.14": - version: 0.18.14 - resolution: "@esbuild/win32-x64@npm:0.18.14" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" - dependencies: - string-width: ^5.1.2 - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: ^7.0.1 - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: ^8.1.0 - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb - languageName: node - linkType: hard - -"@malept/cross-spawn-promise@npm:^1.0.0, @malept/cross-spawn-promise@npm:^1.1.0": - version: 1.1.1 - resolution: "@malept/cross-spawn-promise@npm:1.1.1" - dependencies: - cross-spawn: ^7.0.1 - checksum: 1aa468f9ff3aa59dbaa720731ddf9c1928228b6844358d8821b86628953e0608420e88c6366d85af35acad73b1addaa472026a1836ad3fec34813eb38b2bd25a - languageName: node - linkType: hard - -"@malept/cross-spawn-promise@npm:^2.0.0": - version: 2.0.0 - resolution: "@malept/cross-spawn-promise@npm:2.0.0" - dependencies: - cross-spawn: ^7.0.1 - checksum: 9016a6674842c161b6949d7876e655874ca2d7f6a4fd88a73147d2abde0dcb3981c5dd9714e721e40f92e953ba16e18d7ee3fc94e8b1aae9b5922c582cd320da - languageName: node - linkType: hard - -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: ^1.1.9 - checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 - languageName: node - linkType: hard - -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 - languageName: node - linkType: hard - -"@nodelib/fs.walk@npm:^1.2.3": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: ^1.6.0 - checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 - languageName: node - linkType: hard - -"@npmcli/fs@npm:^3.1.0": - version: 3.1.0 - resolution: "@npmcli/fs@npm:3.1.0" - dependencies: - semver: ^7.3.5 - checksum: a50a6818de5fc557d0b0e6f50ec780a7a02ab8ad07e5ac8b16bf519e0ad60a144ac64f97d05c443c3367235d337182e1d012bbac0eb8dbae8dc7b40b193efd0e - languageName: node - linkType: hard - -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f - languageName: node - linkType: hard - -"@sindresorhus/is@npm:^4.0.0": - version: 4.6.0 - resolution: "@sindresorhus/is@npm:4.6.0" - checksum: 83839f13da2c29d55c97abc3bc2c55b250d33a0447554997a85c539e058e57b8da092da396e252b11ec24a0279a0bed1f537fa26302209327060643e327f81d2 - languageName: node - linkType: hard - -"@szmarczak/http-timer@npm:^4.0.5": - version: 4.0.6 - resolution: "@szmarczak/http-timer@npm:4.0.6" - dependencies: - defer-to-connect: ^2.0.0 - checksum: c29df3bcec6fc3bdec2b17981d89d9c9fc9bd7d0c9bcfe92821dc533f4440bc890ccde79971838b4ceed1921d456973c4180d7175ee1d0023ad0562240a58d95 - languageName: node - linkType: hard - -"@table-group/electron@workspace:.": - version: 0.0.0-use.local - resolution: "@table-group/electron@workspace:." - dependencies: - "@electron-forge/cli": ^6.2.1 - "@electron-forge/maker-deb": ^6.2.1 - "@electron-forge/maker-dmg": 6.2.1 - "@electron-forge/maker-rpm": ^6.2.1 - "@electron-forge/maker-squirrel": ^6.2.1 - "@electron-forge/maker-zip": ^6.2.1 - "@electron-forge/plugin-auto-unpack-natives": ^6.2.1 - "@electron-forge/plugin-vite": ^6.2.1 - electron: 25.3.0 - electron-squirrel-startup: 1.0.0 - is-port-reachable: 3.1.0 - languageName: unknown - linkType: soft - -"@tootallnate/once@npm:2": - version: 2.0.0 - resolution: "@tootallnate/once@npm:2.0.0" - checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 - languageName: node - linkType: hard - -"@types/cacheable-request@npm:^6.0.1": - version: 6.0.3 - resolution: "@types/cacheable-request@npm:6.0.3" - dependencies: - "@types/http-cache-semantics": "*" - "@types/keyv": ^3.1.4 - "@types/node": "*" - "@types/responselike": ^1.0.0 - checksum: d9b26403fe65ce6b0cb3720b7030104c352bcb37e4fac2a7089a25a97de59c355fa08940658751f2f347a8512aa9d18fdb66ab3ade835975b2f454f2d5befbd9 - languageName: node - linkType: hard - -"@types/fs-extra@npm:^9.0.1": - version: 9.0.13 - resolution: "@types/fs-extra@npm:9.0.13" - dependencies: - "@types/node": "*" - checksum: add79e212acd5ac76b97b9045834e03a7996aef60a814185e0459088fd290519a3c1620865d588fa36c4498bf614210d2a703af5cf80aa1dbc125db78f6edac3 - languageName: node - linkType: hard - -"@types/glob@npm:^7.1.1": - version: 7.2.0 - resolution: "@types/glob@npm:7.2.0" - dependencies: - "@types/minimatch": "*" - "@types/node": "*" - checksum: 6ae717fedfdfdad25f3d5a568323926c64f52ef35897bcac8aca8e19bc50c0bd84630bbd063e5d52078b2137d8e7d3c26eabebd1a2f03ff350fff8a91e79fc19 - languageName: node - linkType: hard - -"@types/http-cache-semantics@npm:*": - version: 4.0.1 - resolution: "@types/http-cache-semantics@npm:4.0.1" - checksum: 1048aacf627829f0d5f00184e16548205cd9f964bf0841c29b36bc504509230c40bc57c39778703a1c965a6f5b416ae2cbf4c1d4589c889d2838dd9dbfccf6e9 - languageName: node - linkType: hard - -"@types/keyv@npm:^3.1.4": - version: 3.1.4 - resolution: "@types/keyv@npm:3.1.4" - dependencies: - "@types/node": "*" - checksum: e009a2bfb50e90ca9b7c6e8f648f8464067271fd99116f881073fa6fa76dc8d0133181dd65e6614d5fb1220d671d67b0124aef7d97dc02d7e342ab143a47779d - languageName: node - linkType: hard - -"@types/minimatch@npm:*": - version: 5.1.2 - resolution: "@types/minimatch@npm:5.1.2" - checksum: 0391a282860c7cb6fe262c12b99564732401bdaa5e395bee9ca323c312c1a0f45efbf34dce974682036e857db59a5c9b1da522f3d6055aeead7097264c8705a8 - languageName: node - linkType: hard - -"@types/node@npm:*": - version: 20.4.2 - resolution: "@types/node@npm:20.4.2" - checksum: 99e544ea7560d51f01f95627fc40394c24a13da8f041121a0da13e4ef0a2aa332932eaf9a5e8d0e30d1c07106e96a183be392cbba62e8cf0bf6a085d5c0f4149 - languageName: node - linkType: hard - -"@types/node@npm:^18.11.18": - version: 18.16.19 - resolution: "@types/node@npm:18.16.19" - checksum: 63c31f09616508aa7135380a4c79470a897b75f9ff3a70eb069e534dfabdec3f32fb0f9df5939127f1086614d980ddea0fa5e8cc29a49103c4f74cd687618aaf - languageName: node - linkType: hard - -"@types/responselike@npm:^1.0.0": - version: 1.0.0 - resolution: "@types/responselike@npm:1.0.0" - dependencies: - "@types/node": "*" - checksum: e99fc7cc6265407987b30deda54c1c24bb1478803faf6037557a774b2f034c5b097ffd65847daa87e82a61a250d919f35c3588654b0fdaa816906650f596d1b0 - languageName: node - linkType: hard - -"@types/yauzl@npm:^2.9.1": - version: 2.10.0 - resolution: "@types/yauzl@npm:2.10.0" - dependencies: - "@types/node": "*" - checksum: 55d27ae5d346ea260e40121675c24e112ef0247649073848e5d4e03182713ae4ec8142b98f61a1c6cbe7d3b72fa99bbadb65d8b01873e5e605cdc30f1ff70ef2 - languageName: node - linkType: hard - -"@xmldom/xmldom@npm:^0.8.8": - version: 0.8.10 - resolution: "@xmldom/xmldom@npm:0.8.10" - checksum: 4c136aec31fb3b49aaa53b6fcbfe524d02a1dc0d8e17ee35bd3bf35e9ce1344560481cd1efd086ad1a4821541482528672306d5e37cdbd187f33d7fadd3e2cf0 - languageName: node - linkType: hard - -"abbrev@npm:^1.0.0": - version: 1.1.1 - resolution: "abbrev@npm:1.1.1" - checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 - languageName: node - linkType: hard - -"accepts@npm:~1.3.8": - version: 1.3.8 - resolution: "accepts@npm:1.3.8" - dependencies: - mime-types: ~2.1.34 - negotiator: 0.6.3 - checksum: 50c43d32e7b50285ebe84b613ee4a3aa426715a7d131b65b786e2ead0fd76b6b60091b9916d3478a75f11f162628a2139991b6c03ab3f1d9ab7c86075dc8eab4 - languageName: node - linkType: hard - -"agent-base@npm:6, agent-base@npm:^6.0.2": - version: 6.0.2 - resolution: "agent-base@npm:6.0.2" - dependencies: - debug: 4 - checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d - languageName: node - linkType: hard - -"agentkeepalive@npm:^4.2.1": - version: 4.3.0 - resolution: "agentkeepalive@npm:4.3.0" - dependencies: - debug: ^4.1.0 - depd: ^2.0.0 - humanize-ms: ^1.2.1 - checksum: 982453aa44c11a06826c836025e5162c846e1200adb56f2d075400da7d32d87021b3b0a58768d949d824811f5654223d5a8a3dad120921a2439625eb847c6260 - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: ^2.0.0 - indent-string: ^4.0.0 - checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 - languageName: node - linkType: hard - -"ansi-escapes@npm:^4.3.0": - version: 4.3.2 - resolution: "ansi-escapes@npm:4.3.2" - dependencies: - type-fest: ^0.21.3 - checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b - languageName: node - linkType: hard - -"ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: ^2.0.1 - checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 - languageName: node - linkType: hard - -"ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 - languageName: node - linkType: hard - -"appdmg@npm:^0.6.4": - version: 0.6.6 - resolution: "appdmg@npm:0.6.6" - dependencies: - async: ^1.4.2 - ds-store: ^0.1.5 - execa: ^1.0.0 - fs-temp: ^1.0.0 - fs-xattr: ^0.3.0 - image-size: ^0.7.4 - is-my-json-valid: ^2.20.0 - minimist: ^1.1.3 - parse-color: ^1.0.0 - path-exists: ^4.0.0 - repeat-string: ^1.5.4 - bin: - appdmg: bin/appdmg.js - conditions: os=darwin - languageName: node - linkType: hard - -"aproba@npm:^1.0.3 || ^2.0.0": - version: 2.0.0 - resolution: "aproba@npm:2.0.0" - checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 - languageName: node - linkType: hard - -"are-we-there-yet@npm:^3.0.0": - version: 3.0.1 - resolution: "are-we-there-yet@npm:3.0.1" - dependencies: - delegates: ^1.0.0 - readable-stream: ^3.6.0 - checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 - languageName: node - linkType: hard - -"array-flatten@npm:1.1.1": - version: 1.1.1 - resolution: "array-flatten@npm:1.1.1" - checksum: a9925bf3512d9dce202112965de90c222cd59a4fbfce68a0951d25d965cf44642931f40aac72309c41f12df19afa010ecadceb07cfff9ccc1621e99d89ab5f3b - languageName: node - linkType: hard - -"asar@npm:^3.0.0": - version: 3.2.0 - resolution: "asar@npm:3.2.0" - dependencies: - "@types/glob": ^7.1.1 - chromium-pickle-js: ^0.2.0 - commander: ^5.0.0 - glob: ^7.1.6 - minimatch: ^3.0.4 - dependenciesMeta: - "@types/glob": - optional: true - bin: - asar: bin/asar.js - checksum: f7d30b45970b053252ac124230bf319459d0728d7f6dedbe2f765cd2a83792d5a716d2c3f2861ceda69372b401f335e1f46460335169eadd0e91a0904a4f5a15 - languageName: node - linkType: hard - -"astral-regex@npm:^2.0.0": - version: 2.0.0 - resolution: "astral-regex@npm:2.0.0" - checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 - languageName: node - linkType: hard - -"async@npm:^1.4.2": - version: 1.5.2 - resolution: "async@npm:1.5.2" - checksum: fe5d6214d8f15bd51eee5ae8ec5079b228b86d2d595f47b16369dec2e11b3ff75a567bb5f70d12d79006665fbbb7ee0a7ec0e388524eefd454ecbe651c124ebd - languageName: node - linkType: hard - -"at-least-node@npm:^1.0.0": - version: 1.0.0 - resolution: "at-least-node@npm:1.0.0" - checksum: 463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e - languageName: node - linkType: hard - -"author-regex@npm:^1.0.0": - version: 1.0.0 - resolution: "author-regex@npm:1.0.0" - checksum: 9ad8bffb02978c7a53cbe0b0ff55988fa9f4429797b2c3783f0964df6ee198663285d7f0f3f981766a8c4fe91633ba62582244c1b54d50096007a0fe115b6898 - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 - languageName: node - linkType: hard - -"base32-encode@npm:^0.1.0 || ^1.0.0": - version: 1.2.0 - resolution: "base32-encode@npm:1.2.0" - dependencies: - to-data-view: ^1.1.0 - checksum: b8df667599d50b2c9fca206fcab9bf6500d2e980b14da204eb7de5ce978c99e4874e8138d109bd88d5bca1bfb5ae83926bca37b084d2c9842f8acb12b4b839d9 - languageName: node - linkType: hard - -"base64-js@npm:^1.3.1, base64-js@npm:^1.5.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 - languageName: node - linkType: hard - -"bl@npm:^4.1.0": - version: 4.1.0 - resolution: "bl@npm:4.1.0" - dependencies: - buffer: ^5.5.0 - inherits: ^2.0.4 - readable-stream: ^3.4.0 - checksum: 9e8521fa7e83aa9427c6f8ccdcba6e8167ef30cc9a22df26effcc5ab682ef91d2cbc23a239f945d099289e4bbcfae7a192e9c28c84c6202e710a0dfec3722662 - languageName: node - linkType: hard - -"bluebird@npm:^3.1.1": - version: 3.7.2 - resolution: "bluebird@npm:3.7.2" - checksum: 869417503c722e7dc54ca46715f70e15f4d9c602a423a02c825570862d12935be59ed9c7ba34a9b31f186c017c23cac6b54e35446f8353059c101da73eac22ef - languageName: node - linkType: hard - -"body-parser@npm:1.20.1": - version: 1.20.1 - resolution: "body-parser@npm:1.20.1" - dependencies: - bytes: 3.1.2 - content-type: ~1.0.4 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.1 - type-is: ~1.6.18 - unpipe: 1.0.0 - checksum: f1050dbac3bede6a78f0b87947a8d548ce43f91ccc718a50dd774f3c81f2d8b04693e52acf62659fad23101827dd318da1fb1363444ff9a8482b886a3e4a5266 - languageName: node - linkType: hard - -"boolean@npm:^3.0.1": - version: 3.2.0 - resolution: "boolean@npm:3.2.0" - checksum: fb29535b8bf710ef45279677a86d14f5185d604557204abd2ca5fa3fb2a5c80e04d695c8dbf13ab269991977a79bb6c04b048220a6b2a3849853faa94f4a7d77 - languageName: node - linkType: hard - -"bplist-creator@npm:~0.0.3": - version: 0.0.8 - resolution: "bplist-creator@npm:0.0.8" - dependencies: - stream-buffers: ~2.2.0 - checksum: 7a98c7fb3c1b505a0667abd0f8c976bc01c4437fbb52cb902076a3aea3523e8d44111e21a4228c4c3b307d1c4a727968ed02bd91daf0aea7efed5081db92fb95 - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: ^1.0.0 - concat-map: 0.0.1 - checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: ^1.0.0 - checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 - languageName: node - linkType: hard - -"braces@npm:^3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" - dependencies: - fill-range: ^7.0.1 - checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 - languageName: node - linkType: hard - -"buffer-crc32@npm:~0.2.3": - version: 0.2.13 - resolution: "buffer-crc32@npm:0.2.13" - checksum: 06252347ae6daca3453b94e4b2f1d3754a3b146a111d81c68924c22d91889a40623264e95e67955b1cb4a68cbedf317abeabb5140a9766ed248973096db5ce1c - languageName: node - linkType: hard - -"buffer-equal@npm:^1.0.0": - version: 1.0.1 - resolution: "buffer-equal@npm:1.0.1" - checksum: 6ead0f976726c4e2fb6f2e82419983f4a99cbf2cca1f1e107e16c23c4d91d9046c732dd29b63fc6ac194354f74fa107e8e94946ef2527812d83cde1d5a006309 - languageName: node - linkType: hard - -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb - languageName: node - linkType: hard - -"buffer@npm:^5.5.0": - version: 5.7.1 - resolution: "buffer@npm:5.7.1" - dependencies: - base64-js: ^1.3.1 - ieee754: ^1.1.13 - checksum: e2cf8429e1c4c7b8cbd30834ac09bd61da46ce35f5c22a78e6c2f04497d6d25541b16881e30a019c6fd3154150650ccee27a308eff3e26229d788bbdeb08ab84 - languageName: node - linkType: hard - -"bytes@npm:3.1.2": - version: 3.1.2 - resolution: "bytes@npm:3.1.2" - checksum: e4bcd3948d289c5127591fbedf10c0b639ccbf00243504e4e127374a15c3bc8eed0d28d4aaab08ff6f1cf2abc0cce6ba3085ed32f4f90e82a5683ce0014e1b6e - languageName: node - linkType: hard - -"cacache@npm:^17.0.0": - version: 17.1.3 - resolution: "cacache@npm:17.1.3" - dependencies: - "@npmcli/fs": ^3.1.0 - fs-minipass: ^3.0.0 - glob: ^10.2.2 - lru-cache: ^7.7.1 - minipass: ^5.0.0 - minipass-collect: ^1.0.2 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - p-map: ^4.0.0 - ssri: ^10.0.0 - tar: ^6.1.11 - unique-filename: ^3.0.0 - checksum: 385756781e1e21af089160d89d7462b7ed9883c978e848c7075b90b73cb823680e66092d61513050164588387d2ca87dd6d910e28d64bc13a9ac82cd8580c796 - languageName: node - linkType: hard - -"cacheable-lookup@npm:^5.0.3": - version: 5.0.4 - resolution: "cacheable-lookup@npm:5.0.4" - checksum: 763e02cf9196bc9afccacd8c418d942fc2677f22261969a4c2c2e760fa44a2351a81557bd908291c3921fe9beb10b976ba8fa50c5ca837c5a0dd945f16468f2d - languageName: node - linkType: hard - -"cacheable-request@npm:^7.0.2": - version: 7.0.4 - resolution: "cacheable-request@npm:7.0.4" - dependencies: - clone-response: ^1.0.2 - get-stream: ^5.1.0 - http-cache-semantics: ^4.0.0 - keyv: ^4.0.0 - lowercase-keys: ^2.0.0 - normalize-url: ^6.0.1 - responselike: ^2.0.0 - checksum: 0de9df773fd4e7dd9bd118959878f8f2163867e2e1ab3575ffbecbe6e75e80513dd0c68ba30005e5e5a7b377cc6162bbc00ab1db019bb4e9cb3c2f3f7a6f1ee4 - languageName: node - linkType: hard - -"call-bind@npm:^1.0.0": - version: 1.0.2 - resolution: "call-bind@npm:1.0.2" - dependencies: - function-bind: ^1.1.1 - get-intrinsic: ^1.0.2 - checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 - languageName: node - linkType: hard - -"camelcase@npm:^5.0.0": - version: 5.3.1 - resolution: "camelcase@npm:5.3.1" - checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b - languageName: node - linkType: hard - -"chalk@npm:^4.0.0, chalk@npm:^4.1.0": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc - languageName: node - linkType: hard - -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f - languageName: node - linkType: hard - -"chromium-pickle-js@npm:^0.2.0": - version: 0.2.0 - resolution: "chromium-pickle-js@npm:0.2.0" - checksum: 5ccacc538b0a1ecf3484c8fb3327eae129ceee858db0f64eb0a5ff87bda096a418d0d3e6f6e0967c6334d336a2c7463f7b683ec0e1cafbe736907fa2ee2f58ca - languageName: node - linkType: hard - -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 - languageName: node - linkType: hard - -"cli-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-cursor@npm:3.1.0" - dependencies: - restore-cursor: ^3.1.0 - checksum: 2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29 - languageName: node - linkType: hard - -"cli-spinners@npm:^2.5.0": - version: 2.9.0 - resolution: "cli-spinners@npm:2.9.0" - checksum: a9c56e1f44457d4a9f4f535364e729cb8726198efa9e98990cfd9eda9e220dfa4ba12f92808d1be5e29029cdfead781db82dc8549b97b31c907d55f96aa9b0e2 - languageName: node - linkType: hard - -"cli-truncate@npm:^2.1.0": - version: 2.1.0 - resolution: "cli-truncate@npm:2.1.0" - dependencies: - slice-ansi: ^3.0.0 - string-width: ^4.2.0 - checksum: bf1e4e6195392dc718bf9cd71f317b6300dc4a9191d052f31046b8773230ece4fa09458813bf0e3455a5e68c0690d2ea2c197d14a8b85a7b5e01c97f4b5feb5d - languageName: node - linkType: hard - -"cliui@npm:^6.0.0": - version: 6.0.0 - resolution: "cliui@npm:6.0.0" - dependencies: - string-width: ^4.2.0 - strip-ansi: ^6.0.0 - wrap-ansi: ^6.2.0 - checksum: 4fcfd26d292c9f00238117f39fc797608292ae36bac2168cfee4c85923817d0607fe21b3329a8621e01aedf512c99b7eaa60e363a671ffd378df6649fb48ae42 - languageName: node - linkType: hard - -"cliui@npm:^7.0.2": - version: 7.0.4 - resolution: "cliui@npm:7.0.4" - dependencies: - string-width: ^4.2.0 - strip-ansi: ^6.0.0 - wrap-ansi: ^7.0.0 - checksum: ce2e8f578a4813806788ac399b9e866297740eecd4ad1823c27fd344d78b22c5f8597d548adbcc46f0573e43e21e751f39446c5a5e804a12aace402b7a315d7f - languageName: node - linkType: hard - -"cliui@npm:^8.0.1": - version: 8.0.1 - resolution: "cliui@npm:8.0.1" - dependencies: - string-width: ^4.2.0 - strip-ansi: ^6.0.1 - wrap-ansi: ^7.0.0 - checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 - languageName: node - linkType: hard - -"clone-response@npm:^1.0.2": - version: 1.0.3 - resolution: "clone-response@npm:1.0.3" - dependencies: - mimic-response: ^1.0.0 - checksum: 4e671cac39b11c60aa8ba0a450657194a5d6504df51bca3fac5b3bd0145c4f8e8464898f87c8406b83232e3bc5cca555f51c1f9c8ac023969ebfbf7f6bdabb2e - languageName: node - linkType: hard - -"clone@npm:^1.0.2": - version: 1.0.4 - resolution: "clone@npm:1.0.4" - checksum: d06418b7335897209e77bdd430d04f882189582e67bd1f75a04565f3f07f5b3f119a9d670c943b6697d0afb100f03b866b3b8a1f91d4d02d72c4ecf2bb64b5dd - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: ~1.1.4 - checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 - languageName: node - linkType: hard - -"color-convert@npm:~0.5.0": - version: 0.5.3 - resolution: "color-convert@npm:0.5.3" - checksum: 1074989a2c216d0171a397b870a0d698ef802ab3f9ece72b35bd92c4d20aeab31f222ea525dd5d3fad175a3f256a750eadd14ab882caed0089efc1cb7ba74086 - languageName: node - linkType: hard - -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 - languageName: node - linkType: hard - -"color-support@npm:^1.1.3": - version: 1.1.3 - resolution: "color-support@npm:1.1.3" - bin: - color-support: bin.js - checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b - languageName: node - linkType: hard - -"colorette@npm:^2.0.19": - version: 2.0.20 - resolution: "colorette@npm:2.0.20" - checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d - languageName: node - linkType: hard - -"commander@npm:^4.1.1": - version: 4.1.1 - resolution: "commander@npm:4.1.1" - checksum: d7b9913ff92cae20cb577a4ac6fcc121bd6223319e54a40f51a14740a681ad5c574fd29a57da478a5f234a6fa6c52cbf0b7c641353e03c648b1ae85ba670b977 - languageName: node - linkType: hard - -"commander@npm:^5.0.0": - version: 5.1.0 - resolution: "commander@npm:5.1.0" - checksum: 0b7fec1712fbcc6230fcb161d8d73b4730fa91a21dc089515489402ad78810547683f058e2a9835929c212fead1d6a6ade70db28bbb03edbc2829a9ab7d69447 - languageName: node - linkType: hard - -"compare-version@npm:^0.1.2": - version: 0.1.2 - resolution: "compare-version@npm:0.1.2" - checksum: 0ceaf50b5f912c8eb8eeca19375e617209d200abebd771e9306510166462e6f91ad764f33f210a3058ee27c83f2f001a7a4ca32f509da2d207d0143a3438a020 - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af - languageName: node - linkType: hard - -"console-control-strings@npm:^1.1.0": - version: 1.1.0 - resolution: "console-control-strings@npm:1.1.0" - checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed - languageName: node - linkType: hard - -"content-disposition@npm:0.5.4": - version: 0.5.4 - resolution: "content-disposition@npm:0.5.4" - dependencies: - safe-buffer: 5.2.1 - checksum: afb9d545e296a5171d7574fcad634b2fdf698875f4006a9dd04a3e1333880c5c0c98d47b560d01216fb6505a54a2ba6a843ee3a02ec86d7e911e8315255f56c3 - languageName: node - linkType: hard - -"content-type@npm:~1.0.4": - version: 1.0.5 - resolution: "content-type@npm:1.0.5" - checksum: 566271e0a251642254cde0f845f9dd4f9856e52d988f4eb0d0dcffbb7a1f8ec98de7a5215fc628f3bce30fe2fb6fd2bc064b562d721658c59b544e2d34ea2766 - languageName: node - linkType: hard - -"cookie-signature@npm:1.0.6": - version: 1.0.6 - resolution: "cookie-signature@npm:1.0.6" - checksum: f4e1b0a98a27a0e6e66fd7ea4e4e9d8e038f624058371bf4499cfcd8f3980be9a121486995202ba3fca74fbed93a407d6d54d43a43f96fd28d0bd7a06761591a - languageName: node - linkType: hard - -"cookie@npm:0.5.0": - version: 0.5.0 - resolution: "cookie@npm:0.5.0" - checksum: 1f4bd2ca5765f8c9689a7e8954183f5332139eb72b6ff783d8947032ec1fdf43109852c178e21a953a30c0dd42257828185be01b49d1eb1a67fd054ca588a180 - languageName: node - linkType: hard - -"cross-spawn-windows-exe@npm:^1.1.0, cross-spawn-windows-exe@npm:^1.2.0": - version: 1.2.0 - resolution: "cross-spawn-windows-exe@npm:1.2.0" - dependencies: - "@malept/cross-spawn-promise": ^1.1.0 - is-wsl: ^2.2.0 - which: ^2.0.2 - checksum: 57662e8fb24b53f39330aa405e5bbce874dc5cc61fcf212031def1c6fbb1aa62f5635dcacb942d6165e97460984c16b0a57ee223b4c8492f4b92147c77bc573f - languageName: node - linkType: hard - -"cross-spawn@npm:^6.0.0, cross-spawn@npm:^6.0.5": - version: 6.0.5 - resolution: "cross-spawn@npm:6.0.5" - dependencies: - nice-try: ^1.0.4 - path-key: ^2.0.1 - semver: ^5.5.0 - shebang-command: ^1.2.0 - which: ^1.2.9 - checksum: f893bb0d96cd3d5751d04e67145bdddf25f99449531a72e82dcbbd42796bbc8268c1076c6b3ea51d4d455839902804b94bc45dfb37ecbb32ea8e54a6741c3ab9 - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: ^3.1.0 - shebang-command: ^2.0.0 - which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - -"cross-zip@npm:^4.0.0": - version: 4.0.0 - resolution: "cross-zip@npm:4.0.0" - checksum: 055291adb4b18e69f9883b54a3c38acbfd8d810190d16966242f9b1795c8bb682b03e3a8633839cee574b1ce83ed2eec8079e3ab72ada38c0bae8d89ab9a42c3 - languageName: node - linkType: hard - -"debug@npm:2.6.9, debug@npm:^2.2.0": - version: 2.6.9 - resolution: "debug@npm:2.6.9" - dependencies: - ms: 2.0.0 - checksum: d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 - languageName: node - linkType: hard - -"debug@npm:^3.1.0": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: ^2.1.1 - checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c - languageName: node - linkType: hard - -"decamelize@npm:^1.2.0": - version: 1.2.0 - resolution: "decamelize@npm:1.2.0" - checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa - languageName: node - linkType: hard - -"decompress-response@npm:^6.0.0": - version: 6.0.0 - resolution: "decompress-response@npm:6.0.0" - dependencies: - mimic-response: ^3.1.0 - checksum: d377cf47e02d805e283866c3f50d3d21578b779731e8c5072d6ce8c13cc31493db1c2f6784da9d1d5250822120cefa44f1deab112d5981015f2e17444b763812 - languageName: node - linkType: hard - -"defaults@npm:^1.0.3": - version: 1.0.4 - resolution: "defaults@npm:1.0.4" - dependencies: - clone: ^1.0.2 - checksum: 3a88b7a587fc076b84e60affad8b85245c01f60f38fc1d259e7ac1d89eb9ce6abb19e27215de46b98568dd5bc48471730b327637e6f20b0f1bc85cf00440c80a - languageName: node - linkType: hard - -"defer-to-connect@npm:^2.0.0": - version: 2.0.1 - resolution: "defer-to-connect@npm:2.0.1" - checksum: 8a9b50d2f25446c0bfefb55a48e90afd58f85b21bcf78e9207cd7b804354f6409032a1705c2491686e202e64fc05f147aa5aa45f9aa82627563f045937f5791b - languageName: node - linkType: hard - -"define-properties@npm:^1.1.3": - version: 1.2.0 - resolution: "define-properties@npm:1.2.0" - dependencies: - has-property-descriptors: ^1.0.0 - object-keys: ^1.1.1 - checksum: e60aee6a19b102df4e2b1f301816804e81ab48bb91f00d0d935f269bf4b3f79c88b39e4f89eaa132890d23267335fd1140dfcd8d5ccd61031a0a2c41a54e33a6 - languageName: node - linkType: hard - -"delegates@npm:^1.0.0": - version: 1.0.0 - resolution: "delegates@npm:1.0.0" - checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd - languageName: node - linkType: hard - -"depd@npm:2.0.0, depd@npm:^2.0.0": - version: 2.0.0 - resolution: "depd@npm:2.0.0" - checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a - languageName: node - linkType: hard - -"destroy@npm:1.2.0": - version: 1.2.0 - resolution: "destroy@npm:1.2.0" - checksum: 0acb300b7478a08b92d810ab229d5afe0d2f4399272045ab22affa0d99dbaf12637659411530a6fcd597a9bdac718fc94373a61a95b4651bbc7b83684a565e38 - languageName: node - linkType: hard - -"detect-libc@npm:^2.0.1": - version: 2.0.2 - resolution: "detect-libc@npm:2.0.2" - checksum: 2b2cd3649b83d576f4be7cc37eb3b1815c79969c8b1a03a40a4d55d83bc74d010753485753448eacb98784abf22f7dbd3911fd3b60e29fda28fed2d1a997944d - languageName: node - linkType: hard - -"detect-node@npm:^2.0.4": - version: 2.1.0 - resolution: "detect-node@npm:2.1.0" - checksum: 832184ec458353e41533ac9c622f16c19f7c02d8b10c303dfd3a756f56be93e903616c0bb2d4226183c9351c15fc0b3dba41a17a2308262afabcfa3776e6ae6e - languageName: node - linkType: hard - -"dir-compare@npm:^3.0.0": - version: 3.3.0 - resolution: "dir-compare@npm:3.3.0" - dependencies: - buffer-equal: ^1.0.0 - minimatch: ^3.0.4 - checksum: 05e7381509b17cb4e6791bd9569c12ce4267f44b1ee36594946ed895ed7ad24da9285130dc42af3a60707d58c76307bb3a1cbae2acd0a9cce8c74664e6a26828 - languageName: node - linkType: hard - -"ds-store@npm:^0.1.5": - version: 0.1.6 - resolution: "ds-store@npm:0.1.6" - dependencies: - bplist-creator: ~0.0.3 - macos-alias: ~0.2.5 - tn1150: ^0.1.0 - checksum: b574fdd92d8008e6e089ca958a9d186e4cca2b69131004ccc958a06fcea0a1079b6efd0693a74ad7f85b1f5df69edbfb81896eaef1644e1d23c506f9740c0945 - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed - languageName: node - linkType: hard - -"ee-first@npm:1.1.1": - version: 1.1.1 - resolution: "ee-first@npm:1.1.1" - checksum: 1b4cac778d64ce3b582a7e26b218afe07e207a0f9bfe13cc7395a6d307849cfe361e65033c3251e00c27dd060cab43014c2d6b2647676135e18b77d2d05b3f4f - languageName: node - linkType: hard - -"electron-installer-common@npm:^0.10.2": - version: 0.10.3 - resolution: "electron-installer-common@npm:0.10.3" - dependencies: - "@malept/cross-spawn-promise": ^1.0.0 - "@types/fs-extra": ^9.0.1 - asar: ^3.0.0 - debug: ^4.1.1 - fs-extra: ^9.0.0 - glob: ^7.1.4 - lodash: ^4.17.15 - parse-author: ^2.0.0 - semver: ^7.1.1 - tmp-promise: ^3.0.2 - dependenciesMeta: - "@types/fs-extra": - optional: true - checksum: c441c1fc1e8d57428b872cccf82e9748183588224fcdaf90189fa38f735311c7e4ebeb4c02d6b9e9901a3922f89b9c426e8be543359b44e2d12251be026f1ded - languageName: node - linkType: hard - -"electron-installer-debian@npm:^3.0.0": - version: 3.1.0 - resolution: "electron-installer-debian@npm:3.1.0" - dependencies: - "@malept/cross-spawn-promise": ^1.0.0 - debug: ^4.1.1 - electron-installer-common: ^0.10.2 - fs-extra: ^9.0.0 - get-folder-size: ^2.0.1 - lodash: ^4.17.4 - word-wrap: ^1.2.3 - yargs: ^15.0.1 - bin: - electron-installer-debian: src/cli.js - conditions: (os=darwin | os=linux) - languageName: node - linkType: hard - -"electron-installer-dmg@npm:^4.0.0": - version: 4.0.0 - resolution: "electron-installer-dmg@npm:4.0.0" - dependencies: - appdmg: ^0.6.4 - debug: ^4.3.2 - minimist: ^1.1.1 - dependenciesMeta: - appdmg: - optional: true - bin: - electron-installer-dmg: bin/electron-installer-dmg.js - checksum: 59006b5a560bf08096d970a44b429c218cb3b0c99144d8f276a354af66312c6cb215b177e4411a833013754a0033c28b2c2dadf5cd2b1dfee7c8b6b6dbdc9dae - languageName: node - linkType: hard - -"electron-installer-redhat@npm:^3.2.0": - version: 3.4.0 - resolution: "electron-installer-redhat@npm:3.4.0" - dependencies: - "@malept/cross-spawn-promise": ^1.0.0 - debug: ^4.1.1 - electron-installer-common: ^0.10.2 - fs-extra: ^9.0.0 - lodash: ^4.17.15 - word-wrap: ^1.2.3 - yargs: ^16.0.2 - bin: - electron-installer-redhat: src/cli.js - conditions: (os=darwin | os=linux) - languageName: node - linkType: hard - -"electron-packager@npm:^17.1.1": - version: 17.1.1 - resolution: "electron-packager@npm:17.1.1" - dependencies: - "@electron/asar": ^3.2.1 - "@electron/get": ^2.0.0 - "@electron/notarize": ^1.2.3 - "@electron/osx-sign": ^1.0.1 - "@electron/universal": ^1.3.2 - cross-spawn-windows-exe: ^1.2.0 - debug: ^4.0.1 - extract-zip: ^2.0.0 - filenamify: ^4.1.0 - fs-extra: ^10.1.0 - galactus: ^0.2.1 - get-package-info: ^1.0.0 - junk: ^3.1.0 - parse-author: ^2.0.0 - plist: ^3.0.0 - rcedit: ^3.0.1 - resolve: ^1.1.6 - semver: ^7.1.3 - yargs-parser: ^21.1.1 - bin: - electron-packager: bin/electron-packager.js - checksum: db59ef057c47e1e2bb4b3c701a767aedef80893472d78e33ab73dd7dcf8bb77f6d5c80fe8d6f8afcd5a36bb5efe6a05f8fc425acb366f7871ad362cd6aefd9d5 - languageName: node - linkType: hard - -"electron-squirrel-startup@npm:1.0.0": - version: 1.0.0 - resolution: "electron-squirrel-startup@npm:1.0.0" - dependencies: - debug: ^2.2.0 - checksum: a1f658e326bd0f5c24aec95fd9a94a2e2b8b645adbd421465829f32719d15e85d6469d9369914c3b766d61e71eebb9f6725057b7fafa78adbcc5d6d3ce5d7a22 - languageName: node - linkType: hard - -"electron-winstaller@npm:^5.0.0": - version: 5.1.0 - resolution: "electron-winstaller@npm:5.1.0" - dependencies: - "@electron/asar": ^3.2.1 - debug: ^4.1.1 - fs-extra: ^7.0.1 - lodash.template: ^4.2.2 - temp: ^0.9.0 - checksum: a283b1ee0b0355a54602c807dcf55e7cef92b79ddd08de8ec1e0913ca0c976ed0c03ec651fb0cc69ff86d6a21f2caef7d6992b83c03af772cc03ddf17fd68151 - languageName: node - linkType: hard - -"electron@npm:25.3.0": - version: 25.3.0 - resolution: "electron@npm:25.3.0" - dependencies: - "@electron/get": ^2.0.0 - "@types/node": ^18.11.18 - extract-zip: ^2.0.1 - bin: - electron: cli.js - checksum: 60817fe35c71dd1c3a764b0f8eb99fbbd7a0ba2dde1f715d5ebdc75b27eefba7f98e2e3ba79c90f43f0c37931c9a4e78b9f1bc72e1a28772dfbe2cd85edc79bb - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 - languageName: node - linkType: hard - -"encode-utf8@npm:^1.0.3": - version: 1.0.3 - resolution: "encode-utf8@npm:1.0.3" - checksum: 550224bf2a104b1d355458c8a82e9b4ea07f9fc78387bc3a49c151b940ad26473de8dc9e121eefc4e84561cb0b46de1e4cd2bc766f72ee145e9ea9541482817f - languageName: node - linkType: hard - -"encodeurl@npm:~1.0.2": - version: 1.0.2 - resolution: "encodeurl@npm:1.0.2" - checksum: e50e3d508cdd9c4565ba72d2012e65038e5d71bdc9198cb125beb6237b5b1ade6c0d343998da9e170fb2eae52c1bed37d4d6d98a46ea423a0cddbed5ac3f780c - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: ^0.6.2 - checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f - languageName: node - linkType: hard - -"end-of-stream@npm:^1.1.0": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" - dependencies: - once: ^1.4.0 - checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 - languageName: node - linkType: hard - -"error-ex@npm:^1.2.0": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" - dependencies: - is-arrayish: ^0.2.1 - checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 - languageName: node - linkType: hard - -"es6-error@npm:^4.1.1": - version: 4.1.1 - resolution: "es6-error@npm:4.1.1" - checksum: ae41332a51ec1323da6bbc5d75b7803ccdeddfae17c41b6166ebbafc8e8beb7a7b80b884b7fab1cc80df485860ac3c59d78605e860bb4f8cd816b3d6ade0d010 - languageName: node - linkType: hard - -"esbuild@npm:^0.18.10": - version: 0.18.14 - resolution: "esbuild@npm:0.18.14" - dependencies: - "@esbuild/android-arm": 0.18.14 - "@esbuild/android-arm64": 0.18.14 - "@esbuild/android-x64": 0.18.14 - "@esbuild/darwin-arm64": 0.18.14 - "@esbuild/darwin-x64": 0.18.14 - "@esbuild/freebsd-arm64": 0.18.14 - "@esbuild/freebsd-x64": 0.18.14 - "@esbuild/linux-arm": 0.18.14 - "@esbuild/linux-arm64": 0.18.14 - "@esbuild/linux-ia32": 0.18.14 - "@esbuild/linux-loong64": 0.18.14 - "@esbuild/linux-mips64el": 0.18.14 - "@esbuild/linux-ppc64": 0.18.14 - "@esbuild/linux-riscv64": 0.18.14 - "@esbuild/linux-s390x": 0.18.14 - "@esbuild/linux-x64": 0.18.14 - "@esbuild/netbsd-x64": 0.18.14 - "@esbuild/openbsd-x64": 0.18.14 - "@esbuild/sunos-x64": 0.18.14 - "@esbuild/win32-arm64": 0.18.14 - "@esbuild/win32-ia32": 0.18.14 - "@esbuild/win32-x64": 0.18.14 - dependenciesMeta: - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 1e07d4c269262a9c31f8c23e6d8d891e3ad3b62851b6c35651088d8e19a1be3f49fd09580be3154ba8253da1646f50099e78435dad4e38a14527721038785f77 - languageName: node - linkType: hard - -"escalade@npm:^3.1.1": - version: 3.1.1 - resolution: "escalade@npm:3.1.1" - checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 - languageName: node - linkType: hard - -"escape-html@npm:~1.0.3": - version: 1.0.3 - resolution: "escape-html@npm:1.0.3" - checksum: 6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^1.0.2": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 - languageName: node - linkType: hard - -"etag@npm:~1.8.1": - version: 1.8.1 - resolution: "etag@npm:1.8.1" - checksum: 571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff - languageName: node - linkType: hard - -"execa@npm:^1.0.0": - version: 1.0.0 - resolution: "execa@npm:1.0.0" - dependencies: - cross-spawn: ^6.0.0 - get-stream: ^4.0.0 - is-stream: ^1.1.0 - npm-run-path: ^2.0.0 - p-finally: ^1.0.0 - signal-exit: ^3.0.0 - strip-eof: ^1.0.0 - checksum: ddf1342c1c7d02dd93b41364cd847640f6163350d9439071abf70bf4ceb1b9b2b2e37f54babb1d8dc1df8e0d8def32d0e81e74a2e62c3e1d70c303eb4c306bc4 - languageName: node - linkType: hard - -"expand-tilde@npm:^2.0.0, expand-tilde@npm:^2.0.2": - version: 2.0.2 - resolution: "expand-tilde@npm:2.0.2" - dependencies: - homedir-polyfill: ^1.0.1 - checksum: 2efe6ed407d229981b1b6ceb552438fbc9e5c7d6a6751ad6ced3e0aa5cf12f0b299da695e90d6c2ac79191b5c53c613e508f7149e4573abfbb540698ddb7301a - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 - languageName: node - linkType: hard - -"express-ws@npm:^5.0.2": - version: 5.0.2 - resolution: "express-ws@npm:5.0.2" - dependencies: - ws: ^7.4.6 - peerDependencies: - express: ^4.0.0 || ^5.0.0-alpha.1 - checksum: a7134c51b6a630a369bbc7e06b6fad9ec174d535dd76c990ea6285e6cb08abad408ddb1162ba347ec5725fc483ae9f035f2eecb22ea91f3ecebff05772f62f0b - languageName: node - linkType: hard - -"express@npm:^4.17.1": - version: 4.18.2 - resolution: "express@npm:4.18.2" - dependencies: - accepts: ~1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.1 - content-disposition: 0.5.4 - content-type: ~1.0.4 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - etag: ~1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: ~1.1.2 - on-finished: 2.4.1 - parseurl: ~1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: ~2.0.7 - qs: 6.11.0 - range-parser: ~1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: ~1.6.18 - utils-merge: 1.0.1 - vary: ~1.1.2 - checksum: 3c4b9b076879442f6b968fe53d85d9f1eeacbb4f4c41e5f16cc36d77ce39a2b0d81b3f250514982110d815b2f7173f5561367f9110fcc541f9371948e8c8b037 - languageName: node - linkType: hard - -"extract-zip@npm:^2.0.0, extract-zip@npm:^2.0.1": - version: 2.0.1 - resolution: "extract-zip@npm:2.0.1" - dependencies: - "@types/yauzl": ^2.9.1 - debug: ^4.1.1 - get-stream: ^5.1.0 - yauzl: ^2.10.0 - dependenciesMeta: - "@types/yauzl": - optional: true - bin: - extract-zip: cli.js - checksum: 8cbda9debdd6d6980819cc69734d874ddd71051c9fe5bde1ef307ebcedfe949ba57b004894b585f758b7c9eeeea0e3d87f2dda89b7d25320459c2c9643ebb635 - languageName: node - linkType: hard - -"fast-glob@npm:^3.2.7": - version: 3.3.0 - resolution: "fast-glob@npm:3.3.0" - dependencies: - "@nodelib/fs.stat": ^2.0.2 - "@nodelib/fs.walk": ^1.2.3 - glob-parent: ^5.1.2 - merge2: ^1.3.0 - micromatch: ^4.0.4 - checksum: 20df62be28eb5426fe8e40e0d05601a63b1daceb7c3d87534afcad91bdcf1e4b1743cf2d5247d6e225b120b46df0b9053a032b2691ba34ee121e033acd81f547 - languageName: node - linkType: hard - -"fastq@npm:^1.6.0": - version: 1.15.0 - resolution: "fastq@npm:1.15.0" - dependencies: - reusify: ^1.0.4 - checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a - languageName: node - linkType: hard - -"fd-slicer@npm:~1.1.0": - version: 1.1.0 - resolution: "fd-slicer@npm:1.1.0" - dependencies: - pend: ~1.2.0 - checksum: c8585fd5713f4476eb8261150900d2cb7f6ff2d87f8feb306ccc8a1122efd152f1783bdb2b8dc891395744583436bfd8081d8e63ece0ec8687eeefea394d4ff2 - languageName: node - linkType: hard - -"filename-reserved-regex@npm:^2.0.0": - version: 2.0.0 - resolution: "filename-reserved-regex@npm:2.0.0" - checksum: 323a0020fd7f243238ffccab9d728cbc5f3a13c84b2c10e01efb09b8324561d7a51776be76f36603c734d4f69145c39a5d12492bf6142a28b50d7f90bd6190bc - languageName: node - linkType: hard - -"filenamify@npm:^4.1.0": - version: 4.3.0 - resolution: "filenamify@npm:4.3.0" - dependencies: - filename-reserved-regex: ^2.0.0 - strip-outer: ^1.0.1 - trim-repeated: ^1.0.0 - checksum: 5b71a7ff8e958c8621957e6fbf7872024126d3b5da50f59b1634af3343ba1a69d4cc15cfe4ca4bbfa7c959ad4d98614ee51e6f1d9fa7326eef8ceda2da8cd74e - languageName: node - linkType: hard - -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" - dependencies: - to-regex-range: ^5.0.1 - checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 - languageName: node - linkType: hard - -"finalhandler@npm:1.2.0": - version: 1.2.0 - resolution: "finalhandler@npm:1.2.0" - dependencies: - debug: 2.6.9 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - on-finished: 2.4.1 - parseurl: ~1.3.3 - statuses: 2.0.1 - unpipe: ~1.0.0 - checksum: 92effbfd32e22a7dff2994acedbd9bcc3aa646a3e919ea6a53238090e87097f8ef07cced90aa2cc421abdf993aefbdd5b00104d55c7c5479a8d00ed105b45716 - languageName: node - linkType: hard - -"find-up@npm:^2.0.0": - version: 2.1.0 - resolution: "find-up@npm:2.1.0" - dependencies: - locate-path: ^2.0.0 - checksum: 43284fe4da09f89011f08e3c32cd38401e786b19226ea440b75386c1b12a4cb738c94969808d53a84f564ede22f732c8409e3cfc3f7fb5b5c32378ad0bbf28bd - languageName: node - linkType: hard - -"find-up@npm:^4.0.0, find-up@npm:^4.1.0": - version: 4.1.0 - resolution: "find-up@npm:4.1.0" - dependencies: - locate-path: ^5.0.0 - path-exists: ^4.0.0 - checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 - languageName: node - linkType: hard - -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: ^6.0.0 - path-exists: ^4.0.0 - checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 - languageName: node - linkType: hard - -"flora-colossus@npm:^1.0.0": - version: 1.0.1 - resolution: "flora-colossus@npm:1.0.1" - dependencies: - debug: ^4.1.1 - fs-extra: ^7.0.0 - checksum: c3d0387aee84a4f95564c6eb0b38a5925226f8561c309ddea49984db5ae19eaa95f08b6b0005bcae062cceea01dcd837968341dc24855e0c3f53479a5ed6854c - languageName: node - linkType: hard - -"fmix@npm:^0.1.0": - version: 0.1.0 - resolution: "fmix@npm:0.1.0" - dependencies: - imul: ^1.0.0 - checksum: c465344d4f169eaf10d45c33949a1e7a633f09dba2ac7063ce8ae8be743df5979d708f7f24900163589f047f5194ac5fc2476177ce31175e8805adfa7b8fb7a4 - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0": - version: 3.1.1 - resolution: "foreground-child@npm:3.1.1" - dependencies: - cross-spawn: ^7.0.0 - signal-exit: ^4.0.1 - checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 - languageName: node - linkType: hard - -"forwarded@npm:0.2.0": - version: 0.2.0 - resolution: "forwarded@npm:0.2.0" - checksum: fd27e2394d8887ebd16a66ffc889dc983fbbd797d5d3f01087c020283c0f019a7d05ee85669383d8e0d216b116d720fc0cef2f6e9b7eb9f4c90c6e0bc7fd28e6 - languageName: node - linkType: hard - -"fresh@npm:0.5.2": - version: 0.5.2 - resolution: "fresh@npm:0.5.2" - checksum: 13ea8b08f91e669a64e3ba3a20eb79d7ca5379a81f1ff7f4310d54e2320645503cc0c78daedc93dfb6191287295f6479544a649c64d8e41a1c0fb0c221552346 - languageName: node - linkType: hard - -"fs-extra@npm:^10.0.0, fs-extra@npm:^10.1.0": - version: 10.1.0 - resolution: "fs-extra@npm:10.1.0" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50 - languageName: node - linkType: hard - -"fs-extra@npm:^4.0.0": - version: 4.0.3 - resolution: "fs-extra@npm:4.0.3" - dependencies: - graceful-fs: ^4.1.2 - jsonfile: ^4.0.0 - universalify: ^0.1.0 - checksum: c5ae3c7043ad7187128e619c0371da01b58694c1ffa02c36fb3f5b459925d9c27c3cb1e095d9df0a34a85ca993d8b8ff6f6ecef868fd5ebb243548afa7fc0936 - languageName: node - linkType: hard - -"fs-extra@npm:^7.0.0, fs-extra@npm:^7.0.1": - version: 7.0.1 - resolution: "fs-extra@npm:7.0.1" - dependencies: - graceful-fs: ^4.1.2 - jsonfile: ^4.0.0 - universalify: ^0.1.0 - checksum: 141b9dccb23b66a66cefdd81f4cda959ff89282b1d721b98cea19ba08db3dcbe6f862f28841f3cf24bb299e0b7e6c42303908f65093cb7e201708e86ea5a8dcf - languageName: node - linkType: hard - -"fs-extra@npm:^8.1.0": - version: 8.1.0 - resolution: "fs-extra@npm:8.1.0" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^4.0.0 - universalify: ^0.1.0 - checksum: bf44f0e6cea59d5ce071bba4c43ca76d216f89e402dc6285c128abc0902e9b8525135aa808adad72c9d5d218e9f4bcc63962815529ff2f684ad532172a284880 - languageName: node - linkType: hard - -"fs-extra@npm:^9.0.0, fs-extra@npm:^9.0.1": - version: 9.1.0 - resolution: "fs-extra@npm:9.1.0" - dependencies: - at-least-node: ^1.0.0 - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: ba71ba32e0faa74ab931b7a0031d1523c66a73e225de7426e275e238e312d07313d2da2d33e34a52aa406c8763ade5712eb3ec9ba4d9edce652bcacdc29e6b20 - languageName: node - linkType: hard - -"fs-minipass@npm:^2.0.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: ^3.0.0 - checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.2 - resolution: "fs-minipass@npm:3.0.2" - dependencies: - minipass: ^5.0.0 - checksum: e9cc0e1f2d01c6f6f62f567aee59530aba65c6c7b2ae88c5027bc34c711ebcfcfaefd0caf254afa6adfe7d1fba16bc2537508a6235196bac7276747d078aef0a - languageName: node - linkType: hard - -"fs-temp@npm:^1.0.0": - version: 1.2.1 - resolution: "fs-temp@npm:1.2.1" - dependencies: - random-path: ^0.1.0 - checksum: 64d1b96c7adc172a0fbe6116f425f3588ac585dc7011524174e539df7794a4ca81874bb1c8ee74a47991cc35b7dc036f5bf880074844b2165027042b346b38d9 - languageName: node - linkType: hard - -"fs-xattr@npm:^0.3.0": - version: 0.3.1 - resolution: "fs-xattr@npm:0.3.1" - dependencies: - node-gyp: latest - conditions: "!os=win32" - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 - languageName: node - linkType: hard - -"fsevents@npm:~2.3.2": - version: 2.3.2 - resolution: "fsevents@npm:2.3.2" - dependencies: - node-gyp: latest - checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@~2.3.2#~builtin": - version: 2.3.2 - resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=df0bf1" - dependencies: - node-gyp: latest - conditions: os=darwin - languageName: node - linkType: hard - -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a - languageName: node - linkType: hard - -"galactus@npm:^0.2.1": - version: 0.2.1 - resolution: "galactus@npm:0.2.1" - dependencies: - debug: ^3.1.0 - flora-colossus: ^1.0.0 - fs-extra: ^4.0.0 - checksum: c026c180ea7bd5a80c3e493a561e30973fcbc9b05dbf036b9143d8fbfdfac81d969159f319c3d7088217e59a8b74389aa1d55217062ffbd793dc952c85d2bc97 - languageName: node - linkType: hard - -"gar@npm:^1.0.4": - version: 1.0.4 - resolution: "gar@npm:1.0.4" - checksum: 6b1010b5c17056526298734bfa08716f111cd023394dbe32496841e2f7b0dfe9e742b8ddb56103c0867f2ae80f5f069262916e5398ac982467be4da240ba7bb9 - languageName: node - linkType: hard - -"gauge@npm:^4.0.3": - version: 4.0.4 - resolution: "gauge@npm:4.0.4" - dependencies: - aproba: ^1.0.3 || ^2.0.0 - color-support: ^1.1.3 - console-control-strings: ^1.1.0 - has-unicode: ^2.0.1 - signal-exit: ^3.0.7 - string-width: ^4.2.3 - strip-ansi: ^6.0.1 - wide-align: ^1.1.5 - checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d - languageName: node - linkType: hard - -"generate-function@npm:^2.0.0": - version: 2.3.1 - resolution: "generate-function@npm:2.3.1" - dependencies: - is-property: ^1.0.2 - checksum: 652f083de206ead2bae4caf9c7eeb465e8d98c0b8ed2a29c6afc538cef0785b5c6eea10548f1e13cc586d3afd796c13c830c2cb3dc612ec2457b2aadda5f57c9 - languageName: node - linkType: hard - -"generate-object-property@npm:^1.1.0": - version: 1.2.0 - resolution: "generate-object-property@npm:1.2.0" - dependencies: - is-property: ^1.0.0 - checksum: 5141ca5fd545f0aabd24fd13f9f3ecf9cfea2255db00d46e282d65141d691d560c70b6361c3c0c4982f86f600361925bfd4773e0350c66d0210e6129ae553a09 - languageName: node - linkType: hard - -"get-caller-file@npm:^2.0.1, get-caller-file@npm:^2.0.5": - version: 2.0.5 - resolution: "get-caller-file@npm:2.0.5" - checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 - languageName: node - linkType: hard - -"get-folder-size@npm:^2.0.1": - version: 2.0.1 - resolution: "get-folder-size@npm:2.0.1" - dependencies: - gar: ^1.0.4 - tiny-each-async: 2.0.3 - bin: - get-folder-size: bin/get-folder-size - checksum: f6bc0fe8dda84aa15ca2170ffbeefde99870e6f6cfc807bd6eb035163b53c3266e41be66ea34b181a296a535dd976d7f26eff2bbaf6d1d6e8833d6634032549a - languageName: node - linkType: hard - -"get-installed-path@npm:^2.0.3": - version: 2.1.1 - resolution: "get-installed-path@npm:2.1.1" - dependencies: - global-modules: 1.0.0 - checksum: 7b07d8279a5e3629378ddf4d310653dfa478b74ace43b90e93954455085231946e6f97e7870a5b92d4fa3e45b423b8aebcae652dee742b01a797f54f1c1e90a9 - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1": - version: 1.2.1 - resolution: "get-intrinsic@npm:1.2.1" - dependencies: - function-bind: ^1.1.1 - has: ^1.0.3 - has-proto: ^1.0.1 - has-symbols: ^1.0.3 - checksum: 5b61d88552c24b0cf6fa2d1b3bc5459d7306f699de060d76442cce49a4721f52b8c560a33ab392cf5575b7810277d54ded9d4d39a1ea61855619ebc005aa7e5f - languageName: node - linkType: hard - -"get-package-info@npm:^1.0.0": - version: 1.0.0 - resolution: "get-package-info@npm:1.0.0" - dependencies: - bluebird: ^3.1.1 - debug: ^2.2.0 - lodash.get: ^4.0.0 - read-pkg-up: ^2.0.0 - checksum: 6b2c99d9eaf7adbd7fa246fdcf1b20fc5171d2be661e042dc1bf851cdb028955640745c88f2f92463477cba9030240fad05619ddc874bc99f9c021921e892462 - languageName: node - linkType: hard - -"get-stream@npm:^4.0.0": - version: 4.1.0 - resolution: "get-stream@npm:4.1.0" - dependencies: - pump: ^3.0.0 - checksum: 443e1914170c15bd52ff8ea6eff6dfc6d712b031303e36302d2778e3de2506af9ee964d6124010f7818736dcfde05c04ba7ca6cc26883106e084357a17ae7d73 - languageName: node - linkType: hard - -"get-stream@npm:^5.1.0": - version: 5.2.0 - resolution: "get-stream@npm:5.2.0" - dependencies: - pump: ^3.0.0 - checksum: 8bc1a23174a06b2b4ce600df38d6c98d2ef6d84e020c1ddad632ad75bac4e092eeb40e4c09e0761c35fc2dbc5e7fff5dab5e763a383582c4a167dd69a905bd12 - languageName: node - linkType: hard - -"glob-parent@npm:^5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: ^4.0.1 - checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e - languageName: node - linkType: hard - -"glob@npm:^10.2.2": - version: 10.3.3 - resolution: "glob@npm:10.3.3" - dependencies: - foreground-child: ^3.1.0 - jackspeak: ^2.0.3 - minimatch: ^9.0.1 - minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - path-scurry: ^1.10.1 - bin: - glob: dist/cjs/src/bin.js - checksum: 29190d3291f422da0cb40b77a72fc8d2c51a36524e99b8bf412548b7676a6627489528b57250429612b6eec2e6fe7826d328451d3e694a9d15e575389308ec53 - languageName: node - linkType: hard - -"glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.1.1 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 - languageName: node - linkType: hard - -"global-agent@npm:^3.0.0": - version: 3.0.0 - resolution: "global-agent@npm:3.0.0" - dependencies: - boolean: ^3.0.1 - es6-error: ^4.1.1 - matcher: ^3.0.0 - roarr: ^2.15.3 - semver: ^7.3.2 - serialize-error: ^7.0.1 - checksum: 75074d80733b4bd5386c47f5df028e798018025beac0ab310e9908c72bf5639e408203e7bca0130d5ee01b5f4abc6d34385d96a9f950ea5fe1979bb431c808f7 - languageName: node - linkType: hard - -"global-modules@npm:1.0.0, global-modules@npm:^1.0.0": - version: 1.0.0 - resolution: "global-modules@npm:1.0.0" - dependencies: - global-prefix: ^1.0.1 - is-windows: ^1.0.1 - resolve-dir: ^1.0.0 - checksum: 10be68796c1e1abc1e2ba87ec4ea507f5629873b119ab0cd29c07284ef2b930f1402d10df01beccb7391dedd9cd479611dd6a24311c71be58937beaf18edf85e - languageName: node - linkType: hard - -"global-prefix@npm:^1.0.1": - version: 1.0.2 - resolution: "global-prefix@npm:1.0.2" - dependencies: - expand-tilde: ^2.0.2 - homedir-polyfill: ^1.0.1 - ini: ^1.3.4 - is-windows: ^1.0.1 - which: ^1.2.14 - checksum: 061b43470fe498271bcd514e7746e8a8535032b17ab9570517014ae27d700ff0dca749f76bbde13ba384d185be4310d8ba5712cb0e74f7d54d59390db63dd9a0 - languageName: node - linkType: hard - -"globalthis@npm:^1.0.1": - version: 1.0.3 - resolution: "globalthis@npm:1.0.3" - dependencies: - define-properties: ^1.1.3 - checksum: fbd7d760dc464c886d0196166d92e5ffb4c84d0730846d6621a39fbbc068aeeb9c8d1421ad330e94b7bca4bb4ea092f5f21f3d36077812af5d098b4dc006c998 - languageName: node - linkType: hard - -"got@npm:^11.7.0, got@npm:^11.8.5": - version: 11.8.6 - resolution: "got@npm:11.8.6" - dependencies: - "@sindresorhus/is": ^4.0.0 - "@szmarczak/http-timer": ^4.0.5 - "@types/cacheable-request": ^6.0.1 - "@types/responselike": ^1.0.0 - cacheable-lookup: ^5.0.3 - cacheable-request: ^7.0.2 - decompress-response: ^6.0.0 - http2-wrapper: ^1.0.0-beta.5.2 - lowercase-keys: ^2.0.0 - p-cancelable: ^2.0.0 - responselike: ^2.0.0 - checksum: bbc783578a8d5030c8164ef7f57ce41b5ad7db2ed13371e1944bef157eeca5a7475530e07c0aaa71610d7085474d0d96222c9f4268d41db333a17e39b463f45d - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad - languageName: node - linkType: hard - -"has-property-descriptors@npm:^1.0.0": - version: 1.0.0 - resolution: "has-property-descriptors@npm:1.0.0" - dependencies: - get-intrinsic: ^1.1.1 - checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb - languageName: node - linkType: hard - -"has-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "has-proto@npm:1.0.1" - checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 - languageName: node - linkType: hard - -"has-unicode@npm:^2.0.1": - version: 2.0.1 - resolution: "has-unicode@npm:2.0.1" - checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 - languageName: node - linkType: hard - -"has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" - dependencies: - function-bind: ^1.1.1 - checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 - languageName: node - linkType: hard - -"homedir-polyfill@npm:^1.0.1": - version: 1.0.3 - resolution: "homedir-polyfill@npm:1.0.3" - dependencies: - parse-passwd: ^1.0.0 - checksum: 18dd4db87052c6a2179d1813adea0c4bfcfa4f9996f0e226fefb29eb3d548e564350fa28ec46b0bf1fbc0a1d2d6922ceceb80093115ea45ff8842a4990139250 - languageName: node - linkType: hard - -"hosted-git-info@npm:^2.1.4": - version: 2.8.9 - resolution: "hosted-git-info@npm:2.8.9" - checksum: c955394bdab888a1e9bb10eb33029e0f7ce5a2ac7b3f158099dc8c486c99e73809dca609f5694b223920ca2174db33d32b12f9a2a47141dc59607c29da5a62dd - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 - languageName: node - linkType: hard - -"http-errors@npm:2.0.0": - version: 2.0.0 - resolution: "http-errors@npm:2.0.0" - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - checksum: 9b0a3782665c52ce9dc658a0d1560bcb0214ba5699e4ea15aefb2a496e2ca83db03ebc42e1cce4ac1f413e4e0d2d736a3fd755772c556a9a06853ba2a0b7d920 - languageName: node - linkType: hard - -"http-proxy-agent@npm:^5.0.0": - version: 5.0.0 - resolution: "http-proxy-agent@npm:5.0.0" - dependencies: - "@tootallnate/once": 2 - agent-base: 6 - debug: 4 - checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 - languageName: node - linkType: hard - -"http2-wrapper@npm:^1.0.0-beta.5.2": - version: 1.0.3 - resolution: "http2-wrapper@npm:1.0.3" - dependencies: - quick-lru: ^5.1.1 - resolve-alpn: ^1.0.0 - checksum: 74160b862ec699e3f859739101ff592d52ce1cb207b7950295bf7962e4aa1597ef709b4292c673bece9c9b300efad0559fc86c71b1409c7a1e02b7229456003e - languageName: node - linkType: hard - -"https-proxy-agent@npm:^5.0.0": - version: 5.0.1 - resolution: "https-proxy-agent@npm:5.0.1" - dependencies: - agent-base: 6 - debug: 4 - checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 - languageName: node - linkType: hard - -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: ^2.0.0 - checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 - languageName: node - linkType: hard - -"iconv-lite@npm:0.4.24": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" - dependencies: - safer-buffer: ">= 2.1.2 < 3" - checksum: bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6 - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: ">= 2.1.2 < 3.0.0" - checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf - languageName: node - linkType: hard - -"ieee754@npm:^1.1.13": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e - languageName: node - linkType: hard - -"image-size@npm:^0.7.4": - version: 0.7.5 - resolution: "image-size@npm:0.7.5" - bin: - image-size: bin/image-size.js - checksum: f88860c9d9b5c8ad00d3de9d6f5ba105bda5a5024bfb6b90559a075a4b838ed4f5d3cba14edf0f18fe5d75df596a172b52feca43848e11c34f31f4df2c88a011 - languageName: node - linkType: hard - -"imul@npm:^1.0.0": - version: 1.0.1 - resolution: "imul@npm:1.0.1" - checksum: 6c2af3d5f09e2135e14d565a2c108412b825b221eb2c881f9130467f2adccf7ae201773ae8bcf1be169e2d090567a1fdfa9cf20d3b7da7b9cecb95b920ff3e52 - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 - languageName: node - linkType: hard - -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: ^1.3.0 - wrappy: 1 - checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.3, inherits@npm:^2.0.4": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 - languageName: node - linkType: hard - -"ini@npm:^1.3.4": - version: 1.3.8 - resolution: "ini@npm:1.3.8" - checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 - languageName: node - linkType: hard - -"interpret@npm:^3.1.1": - version: 3.1.1 - resolution: "interpret@npm:3.1.1" - checksum: 35cebcf48c7351130437596d9ab8c8fe131ce4038da4561e6d665f25640e0034702a031cf7e3a5cea60ac7ac548bf17465e0571ede126f3d3a6933152171ac82 - languageName: node - linkType: hard - -"ip@npm:^2.0.0": - version: 2.0.0 - resolution: "ip@npm:2.0.0" - checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 - languageName: node - linkType: hard - -"ipaddr.js@npm:1.9.1": - version: 1.9.1 - resolution: "ipaddr.js@npm:1.9.1" - checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77 - languageName: node - linkType: hard - -"is-arrayish@npm:^0.2.1": - version: 0.2.1 - resolution: "is-arrayish@npm:0.2.1" - checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f - languageName: node - linkType: hard - -"is-core-module@npm:^2.12.0": - version: 2.12.1 - resolution: "is-core-module@npm:2.12.1" - dependencies: - has: ^1.0.3 - checksum: f04ea30533b5e62764e7b2e049d3157dc0abd95ef44275b32489ea2081176ac9746ffb1cdb107445cf1ff0e0dfcad522726ca27c27ece64dadf3795428b8e468 - languageName: node - linkType: hard - -"is-docker@npm:^2.0.0": - version: 2.2.1 - resolution: "is-docker@npm:2.2.1" - bin: - is-docker: cli.js - checksum: 3fef7ddbf0be25958e8991ad941901bf5922ab2753c46980b60b05c1bf9c9c2402d35e6dc32e4380b980ef5e1970a5d9d5e5aa2e02d77727c3b6b5e918474c56 - languageName: node - linkType: hard - -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 - languageName: node - linkType: hard - -"is-glob@npm:^4.0.1": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" - dependencies: - is-extglob: ^2.1.1 - checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 - languageName: node - linkType: hard - -"is-interactive@npm:^1.0.0": - version: 1.0.0 - resolution: "is-interactive@npm:1.0.0" - checksum: 824808776e2d468b2916cdd6c16acacebce060d844c35ca6d82267da692e92c3a16fdba624c50b54a63f38bdc4016055b6f443ce57d7147240de4f8cdabaf6f9 - languageName: node - linkType: hard - -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 - languageName: node - linkType: hard - -"is-my-ip-valid@npm:^1.0.0": - version: 1.0.1 - resolution: "is-my-ip-valid@npm:1.0.1" - checksum: 0a50180a9c0842503a2199ca0ba03888069e7c093f71236c65632e9b0f496ea57536856e1ad3d1635010cb5959c551496ea84cfc56088a8e7879fe30b9d71943 - languageName: node - linkType: hard - -"is-my-json-valid@npm:^2.20.0": - version: 2.20.6 - resolution: "is-my-json-valid@npm:2.20.6" - dependencies: - generate-function: ^2.0.0 - generate-object-property: ^1.1.0 - is-my-ip-valid: ^1.0.0 - jsonpointer: ^5.0.0 - xtend: ^4.0.0 - checksum: d3519e18e6a0f4c777d5a2027b5c80d05abd0949179b94795bd2aa6c54e8f44c23b8789cb7d44332015b86cfd73dca57331e7fa53202b28e40aa4620e7f61166 - languageName: node - linkType: hard - -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a - languageName: node - linkType: hard - -"is-port-reachable@npm:3.1.0": - version: 3.1.0 - resolution: "is-port-reachable@npm:3.1.0" - checksum: ce0c872addfe1722a3f1ec6923b9b88b5a370041a10317e1bd76bd62c616feb52c8a6f473e35e7bcf208db22fb5f138433a3a1cd889d95a1f798dbc7a9dc63cf - languageName: node - linkType: hard - -"is-property@npm:^1.0.0, is-property@npm:^1.0.2": - version: 1.0.2 - resolution: "is-property@npm:1.0.2" - checksum: 33b661a3690bcc88f7e47bb0a21b9e3187e76a317541ea7ec5e8096d954f441b77a46d8930c785f7fbf4ef8dfd624c25495221e026e50f74c9048fe501773be5 - languageName: node - linkType: hard - -"is-stream@npm:^1.1.0": - version: 1.1.0 - resolution: "is-stream@npm:1.1.0" - checksum: 063c6bec9d5647aa6d42108d4c59723d2bd4ae42135a2d4db6eadbd49b7ea05b750fd69d279e5c7c45cf9da753ad2c00d8978be354d65aa9f6bb434969c6a2ae - languageName: node - linkType: hard - -"is-unicode-supported@npm:^0.1.0": - version: 0.1.0 - resolution: "is-unicode-supported@npm:0.1.0" - checksum: a2aab86ee7712f5c2f999180daaba5f361bdad1efadc9610ff5b8ab5495b86e4f627839d085c6530363c6d6d4ecbde340fb8e54bdb83da4ba8e0865ed5513c52 - languageName: node - linkType: hard - -"is-windows@npm:^1.0.1": - version: 1.0.2 - resolution: "is-windows@npm:1.0.2" - checksum: 438b7e52656fe3b9b293b180defb4e448088e7023a523ec21a91a80b9ff8cdb3377ddb5b6e60f7c7de4fa8b63ab56e121b6705fe081b3cf1b828b0a380009ad7 - languageName: node - linkType: hard - -"is-wsl@npm:^2.2.0": - version: 2.2.0 - resolution: "is-wsl@npm:2.2.0" - dependencies: - is-docker: ^2.0.0 - checksum: 20849846ae414997d290b75e16868e5261e86ff5047f104027026fd61d8b5a9b0b3ade16239f35e1a067b3c7cc02f70183cb661010ed16f4b6c7c93dad1b19d8 - languageName: node - linkType: hard - -"isbinaryfile@npm:^4.0.8": - version: 4.0.10 - resolution: "isbinaryfile@npm:4.0.10" - checksum: a6b28db7e23ac7a77d3707567cac81356ea18bd602a4f21f424f862a31d0e7ab4f250759c98a559ece35ffe4d99f0d339f1ab884ffa9795172f632ab8f88e686 - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 - languageName: node - linkType: hard - -"jackspeak@npm:^2.0.3": - version: 2.2.1 - resolution: "jackspeak@npm:2.2.1" - dependencies: - "@isaacs/cliui": ^8.0.2 - "@pkgjs/parseargs": ^0.11.0 - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: e29291c0d0f280a063fa18fbd1e891ab8c2d7519fd34052c0ebde38538a15c603140d60c2c7f432375ff7ee4c5f1c10daa8b2ae19a97c3d4affe308c8360c1df - languageName: node - linkType: hard - -"json-buffer@npm:3.0.1": - version: 3.0.1 - resolution: "json-buffer@npm:3.0.1" - checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 - languageName: node - linkType: hard - -"json-stringify-safe@npm:^5.0.1": - version: 5.0.1 - resolution: "json-stringify-safe@npm:5.0.1" - checksum: 48ec0adad5280b8a96bb93f4563aa1667fd7a36334f79149abd42446d0989f2ddc58274b479f4819f1f00617957e6344c886c55d05a4e15ebb4ab931e4a6a8ee - languageName: node - linkType: hard - -"jsonfile@npm:^4.0.0": - version: 4.0.0 - resolution: "jsonfile@npm:4.0.0" - dependencies: - graceful-fs: ^4.1.6 - dependenciesMeta: - graceful-fs: - optional: true - checksum: 6447d6224f0d31623eef9b51185af03ac328a7553efcee30fa423d98a9e276ca08db87d71e17f2310b0263fd3ffa6c2a90a6308367f661dc21580f9469897c9e - languageName: node - linkType: hard - -"jsonfile@npm:^6.0.1": - version: 6.1.0 - resolution: "jsonfile@npm:6.1.0" - dependencies: - graceful-fs: ^4.1.6 - universalify: ^2.0.0 - dependenciesMeta: - graceful-fs: - optional: true - checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 - languageName: node - linkType: hard - -"jsonpointer@npm:^5.0.0": - version: 5.0.1 - resolution: "jsonpointer@npm:5.0.1" - checksum: 0b40f712900ad0c846681ea2db23b6684b9d5eedf55807b4708c656f5894b63507d0e28ae10aa1bddbea551241035afe62b6df0800fc94c2e2806a7f3adecd7c - languageName: node - linkType: hard - -"junk@npm:^3.1.0": - version: 3.1.0 - resolution: "junk@npm:3.1.0" - checksum: 6c4d68e8f8bc25b546baed802cd0e7be6a971e92f1e885c92cbfe98946d5690b961a32f8e7909e77765d3204c3e556d13c17f73e31697ffae1db07a58b9e68c0 - languageName: node - linkType: hard - -"keyv@npm:^4.0.0": - version: 4.5.3 - resolution: "keyv@npm:4.5.3" - dependencies: - json-buffer: 3.0.1 - checksum: 3ffb4d5b72b6b4b4af443bbb75ca2526b23c750fccb5ac4c267c6116888b4b65681015c2833cb20d26cf3e6e32dac6b988c77f7f022e1a571b7d90f1442257da - languageName: node - linkType: hard - -"listr2@npm:^5.0.3": - version: 5.0.8 - resolution: "listr2@npm:5.0.8" - dependencies: - cli-truncate: ^2.1.0 - colorette: ^2.0.19 - log-update: ^4.0.0 - p-map: ^4.0.0 - rfdc: ^1.3.0 - rxjs: ^7.8.0 - through: ^2.3.8 - wrap-ansi: ^7.0.0 - peerDependencies: - enquirer: ">= 2.3.0 < 3" - peerDependenciesMeta: - enquirer: - optional: true - checksum: 8be9f5632627c4df0dc33f452c98d415a49e5f1614650d3cab1b103c33e95f2a7a0e9f3e1e5de00d51bf0b4179acd8ff11b25be77dbe097cf3773c05e728d46c - languageName: node - linkType: hard - -"load-json-file@npm:^2.0.0": - version: 2.0.0 - resolution: "load-json-file@npm:2.0.0" - dependencies: - graceful-fs: ^4.1.2 - parse-json: ^2.2.0 - pify: ^2.0.0 - strip-bom: ^3.0.0 - checksum: 7f212bbf08a8c9aab087ead07aa220d1f43d83ec1c4e475a00a8d9bf3014eb29ebe901db8554627dcfb70184c274d05b7379f1e9678fe8297ae74dc495212049 - languageName: node - linkType: hard - -"locate-path@npm:^2.0.0": - version: 2.0.0 - resolution: "locate-path@npm:2.0.0" - dependencies: - p-locate: ^2.0.0 - path-exists: ^3.0.0 - checksum: 02d581edbbbb0fa292e28d96b7de36b5b62c2fa8b5a7e82638ebb33afa74284acf022d3b1e9ae10e3ffb7658fbc49163fcd5e76e7d1baaa7801c3e05a81da755 - languageName: node - linkType: hard - -"locate-path@npm:^5.0.0": - version: 5.0.0 - resolution: "locate-path@npm:5.0.0" - dependencies: - p-locate: ^4.1.0 - checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 - languageName: node - linkType: hard - -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" - dependencies: - p-locate: ^5.0.0 - checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a - languageName: node - linkType: hard - -"lodash._reinterpolate@npm:^3.0.0": - version: 3.0.0 - resolution: "lodash._reinterpolate@npm:3.0.0" - checksum: 06d2d5f33169604fa5e9f27b6067ed9fb85d51a84202a656901e5ffb63b426781a601508466f039c720af111b0c685d12f1a5c14ff8df5d5f27e491e562784b2 - languageName: node - linkType: hard - -"lodash.get@npm:^4.0.0": - version: 4.4.2 - resolution: "lodash.get@npm:4.4.2" - checksum: e403047ddb03181c9d0e92df9556570e2b67e0f0a930fcbbbd779370972368f5568e914f913e93f3b08f6d492abc71e14d4e9b7a18916c31fa04bd2306efe545 - languageName: node - linkType: hard - -"lodash.template@npm:^4.2.2": - version: 4.5.0 - resolution: "lodash.template@npm:4.5.0" - dependencies: - lodash._reinterpolate: ^3.0.0 - lodash.templatesettings: ^4.0.0 - checksum: ca64e5f07b6646c9d3dbc0fe3aaa995cb227c4918abd1cef7a9024cd9c924f2fa389a0ec4296aa6634667e029bc81d4bbdb8efbfde11df76d66085e6c529b450 - languageName: node - linkType: hard - -"lodash.templatesettings@npm:^4.0.0": - version: 4.2.0 - resolution: "lodash.templatesettings@npm:4.2.0" - dependencies: - lodash._reinterpolate: ^3.0.0 - checksum: 863e025478b092997e11a04e9d9e735875eeff1ffcd6c61742aa8272e3c2cddc89ce795eb9726c4e74cef5991f722897ff37df7738a125895f23fc7d12a7bb59 - languageName: node - linkType: hard - -"lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.4": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 - languageName: node - linkType: hard - -"log-symbols@npm:^4.0.0, log-symbols@npm:^4.1.0": - version: 4.1.0 - resolution: "log-symbols@npm:4.1.0" - dependencies: - chalk: ^4.1.0 - is-unicode-supported: ^0.1.0 - checksum: fce1497b3135a0198803f9f07464165e9eb83ed02ceb2273930a6f8a508951178d8cf4f0378e9d28300a2ed2bc49050995d2bd5f53ab716bb15ac84d58c6ef74 - languageName: node - linkType: hard - -"log-update@npm:^4.0.0": - version: 4.0.0 - resolution: "log-update@npm:4.0.0" - dependencies: - ansi-escapes: ^4.3.0 - cli-cursor: ^3.1.0 - slice-ansi: ^4.0.0 - wrap-ansi: ^6.2.0 - checksum: ae2f85bbabc1906034154fb7d4c4477c79b3e703d22d78adee8b3862fa913942772e7fa11713e3d96fb46de4e3cabefbf5d0a544344f03b58d3c4bff52aa9eb2 - languageName: node - linkType: hard - -"lowercase-keys@npm:^2.0.0": - version: 2.0.0 - resolution: "lowercase-keys@npm:2.0.0" - checksum: 24d7ebd56ccdf15ff529ca9e08863f3c54b0b9d1edb97a3ae1af34940ae666c01a1e6d200707bce730a8ef76cb57cc10e65f245ecaaf7e6bc8639f2fb460ac23 - languageName: node - linkType: hard - -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: ^4.0.0 - checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 - languageName: node - linkType: hard - -"lru-cache@npm:^7.7.1": - version: 7.18.3 - resolution: "lru-cache@npm:7.18.3" - checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 - languageName: node - linkType: hard - -"lru-cache@npm:^9.1.1 || ^10.0.0": - version: 10.0.0 - resolution: "lru-cache@npm:10.0.0" - checksum: 18f101675fe283bc09cda0ef1e3cc83781aeb8373b439f086f758d1d91b28730950db785999cd060d3c825a8571c03073e8c14512b6655af2188d623031baf50 - languageName: node - linkType: hard - -"macos-alias@npm:~0.2.5": - version: 0.2.11 - resolution: "macos-alias@npm:0.2.11" - dependencies: - nan: ^2.4.0 - node-gyp: latest - conditions: os=darwin - languageName: node - linkType: hard - -"make-fetch-happen@npm:^11.0.3": - version: 11.1.1 - resolution: "make-fetch-happen@npm:11.1.1" - dependencies: - agentkeepalive: ^4.2.1 - cacache: ^17.0.0 - http-cache-semantics: ^4.1.1 - http-proxy-agent: ^5.0.0 - https-proxy-agent: ^5.0.0 - is-lambda: ^1.0.1 - lru-cache: ^7.7.1 - minipass: ^5.0.0 - minipass-fetch: ^3.0.0 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - negotiator: ^0.6.3 - promise-retry: ^2.0.1 - socks-proxy-agent: ^7.0.0 - ssri: ^10.0.0 - checksum: 7268bf274a0f6dcf0343829489a4506603ff34bd0649c12058753900b0eb29191dce5dba12680719a5d0a983d3e57810f594a12f3c18494e93a1fbc6348a4540 - languageName: node - linkType: hard - -"map-age-cleaner@npm:^0.1.1": - version: 0.1.3 - resolution: "map-age-cleaner@npm:0.1.3" - dependencies: - p-defer: ^1.0.0 - checksum: cb2804a5bcb3cbdfe4b59066ea6d19f5e7c8c196cd55795ea4c28f792b192e4c442426ae52524e5e1acbccf393d3bddacefc3d41f803e66453f6c4eda3650bc1 - languageName: node - linkType: hard - -"matcher@npm:^3.0.0": - version: 3.0.0 - resolution: "matcher@npm:3.0.0" - dependencies: - escape-string-regexp: ^4.0.0 - checksum: 8bee1a7ab7609c2c21d9c9254b6785fa708eadf289032b556d57a34e98fcd4c537659a004dafee6ce80ab157099e645c199dc52678dff1e7fb0a6684e0da4dbe - languageName: node - linkType: hard - -"media-typer@npm:0.3.0": - version: 0.3.0 - resolution: "media-typer@npm:0.3.0" - checksum: af1b38516c28ec95d6b0826f6c8f276c58aec391f76be42aa07646b4e39d317723e869700933ca6995b056db4b09a78c92d5440dc23657e6764be5d28874bba1 - languageName: node - linkType: hard - -"mem@npm:^4.3.0": - version: 4.3.0 - resolution: "mem@npm:4.3.0" - dependencies: - map-age-cleaner: ^0.1.1 - mimic-fn: ^2.0.0 - p-is-promise: ^2.0.0 - checksum: cf488608e5d59c6cb68004b70de317222d4be9f857fd535dfa6a108e04f40821479c080bc763c417b1030569d303538c59d441280078cfce07fefd1c523f98ef - languageName: node - linkType: hard - -"merge-descriptors@npm:1.0.1": - version: 1.0.1 - resolution: "merge-descriptors@npm:1.0.1" - checksum: 5abc259d2ae25bb06d19ce2b94a21632583c74e2a9109ee1ba7fd147aa7362b380d971e0251069f8b3eb7d48c21ac839e21fa177b335e82c76ec172e30c31a26 - languageName: node - linkType: hard - -"merge2@npm:^1.3.0": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 - languageName: node - linkType: hard - -"methods@npm:~1.1.2": - version: 1.1.2 - resolution: "methods@npm:1.1.2" - checksum: 0917ff4041fa8e2f2fda5425a955fe16ca411591fbd123c0d722fcf02b73971ed6f764d85f0a6f547ce49ee0221ce2c19a5fa692157931cecb422984f1dcd13a - languageName: node - linkType: hard - -"micromatch@npm:^4.0.4": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" - dependencies: - braces: ^3.0.2 - picomatch: ^2.3.1 - checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc - languageName: node - linkType: hard - -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f - languageName: node - linkType: hard - -"mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: 1.52.0 - checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 - languageName: node - linkType: hard - -"mime@npm:1.6.0": - version: 1.6.0 - resolution: "mime@npm:1.6.0" - bin: - mime: cli.js - checksum: fef25e39263e6d207580bdc629f8872a3f9772c923c7f8c7e793175cee22777bbe8bba95e5d509a40aaa292d8974514ce634ae35769faa45f22d17edda5e8557 - languageName: node - linkType: hard - -"mimic-fn@npm:^2.0.0, mimic-fn@npm:^2.1.0": - version: 2.1.0 - resolution: "mimic-fn@npm:2.1.0" - checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a - languageName: node - linkType: hard - -"mimic-response@npm:^1.0.0": - version: 1.0.1 - resolution: "mimic-response@npm:1.0.1" - checksum: 034c78753b0e622bc03c983663b1cdf66d03861050e0c8606563d149bc2b02d63f62ce4d32be4ab50d0553ae0ffe647fc34d1f5281184c6e1e8cf4d85e8d9823 - languageName: node - linkType: hard - -"mimic-response@npm:^3.1.0": - version: 3.1.0 - resolution: "mimic-response@npm:3.1.0" - checksum: 25739fee32c17f433626bf19f016df9036b75b3d84a3046c7d156e72ec963dd29d7fc8a302f55a3d6c5a4ff24259676b15d915aad6480815a969ff2ec0836867 - languageName: node - linkType: hard - -"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: ^1.1.7 - checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a - languageName: node - linkType: hard - -"minimatch@npm:^9.0.1": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" - dependencies: - brace-expansion: ^2.0.1 - checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 - languageName: node - linkType: hard - -"minimist@npm:^1.1.1, minimist@npm:^1.1.3, minimist@npm:^1.2.6": - version: 1.2.8 - resolution: "minimist@npm:1.2.8" - checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 - languageName: node - linkType: hard - -"minipass-collect@npm:^1.0.2": - version: 1.0.2 - resolution: "minipass-collect@npm:1.0.2" - dependencies: - minipass: ^3.0.0 - checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 - languageName: node - linkType: hard - -"minipass-fetch@npm:^3.0.0": - version: 3.0.3 - resolution: "minipass-fetch@npm:3.0.3" - dependencies: - encoding: ^0.1.13 - minipass: ^5.0.0 - minipass-sized: ^1.0.3 - minizlib: ^2.1.2 - dependenciesMeta: - encoding: - optional: true - checksum: af5ab2552a16fcf505d35fd7ffb84b57f4a0eeb269e6e1d9a2a75824dda48b36e527083250b7cca4a4def21d9544e2ade441e4730e233c0bc2133f6abda31e18 - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: ^3.0.0 - checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: ^3.0.0 - checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: ^3.0.0 - checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: ^4.0.0 - checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 - languageName: node - linkType: hard - -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0": - version: 7.0.2 - resolution: "minipass@npm:7.0.2" - checksum: 46776de732eb7cef2c7404a15fb28c41f5c54a22be50d47b03c605bf21f5c18d61a173c0a20b49a97e7a65f78d887245066410642551e45fffe04e9ac9e325bc - languageName: node - linkType: hard - -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" - dependencies: - minipass: ^3.0.0 - yallist: ^4.0.0 - checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 - languageName: node - linkType: hard - -"mkdirp@npm:^0.5.1": - version: 0.5.6 - resolution: "mkdirp@npm:0.5.6" - dependencies: - minimist: ^1.2.6 - bin: - mkdirp: bin/cmd.js - checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 - languageName: node - linkType: hard - -"mkdirp@npm:^1.0.3": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" - bin: - mkdirp: bin/cmd.js - checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f - languageName: node - linkType: hard - -"ms@npm:2.0.0": - version: 2.0.0 - resolution: "ms@npm:2.0.0" - checksum: 0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4 - languageName: node - linkType: hard - -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d - languageName: node - linkType: hard - -"murmur-32@npm:^0.1.0 || ^0.2.0": - version: 0.2.0 - resolution: "murmur-32@npm:0.2.0" - dependencies: - encode-utf8: ^1.0.3 - fmix: ^0.1.0 - imul: ^1.0.0 - checksum: 664f19319c23b2910bd6b4d79e072c910168b157c26bf4507c78f0c7a259cb6f6233fb04eca7d02b271491a8f87660d5c4619f35f7411d9ab10fca715fa93f7c - languageName: node - linkType: hard - -"nan@npm:^2.4.0": - version: 2.17.0 - resolution: "nan@npm:2.17.0" - dependencies: - node-gyp: latest - checksum: ec609aeaf7e68b76592a3ba96b372aa7f5df5b056c1e37410b0f1deefbab5a57a922061e2c5b369bae9c7c6b5e6eecf4ad2dac8833a1a7d3a751e0a7c7f849ed - languageName: node - linkType: hard - -"nanoid@npm:^3.3.6": - version: 3.3.6 - resolution: "nanoid@npm:3.3.6" - bin: - nanoid: bin/nanoid.cjs - checksum: 7d0eda657002738aa5206107bd0580aead6c95c460ef1bdd0b1a87a9c7ae6277ac2e9b945306aaa5b32c6dcb7feaf462d0f552e7f8b5718abfc6ead5c94a71b3 - languageName: node - linkType: hard - -"negotiator@npm:0.6.3, negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 - languageName: node - linkType: hard - -"nice-try@npm:^1.0.4": - version: 1.0.5 - resolution: "nice-try@npm:1.0.5" - checksum: 0b4af3b5bb5d86c289f7a026303d192a7eb4417231fe47245c460baeabae7277bcd8fd9c728fb6bd62c30b3e15cd6620373e2cf33353b095d8b403d3e8a15aff - languageName: node - linkType: hard - -"node-abi@npm:^3.0.0": - version: 3.45.0 - resolution: "node-abi@npm:3.45.0" - dependencies: - semver: ^7.3.5 - checksum: 18c4305d7de5f1132741a2a66ba652941518210d02c9268702abe97ce1c166db468b4fc3e85fff04b9c19218c2e47f4e295f9a46422dc834932f4e11443400cd - languageName: node - linkType: hard - -"node-api-version@npm:^0.1.4": - version: 0.1.4 - resolution: "node-api-version@npm:0.1.4" - dependencies: - semver: ^7.3.5 - checksum: e652a9502a6b62bda01d6134be30195f9d8b3ba75190a4190c76e7ed4f12a410cdc7ec301f878aff11dafc14bc7d9c4fc81f88c1e174c8fb970b7b33eb978b98 - languageName: node - linkType: hard - -"node-fetch@npm:^2.6.7": - version: 2.6.12 - resolution: "node-fetch@npm:2.6.12" - dependencies: - whatwg-url: ^5.0.0 - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - checksum: 3bc1655203d47ee8e313c0d96664b9673a3d4dd8002740318e9d27d14ef306693a4b2ef8d6525775056fd912a19e23f3ac0d7111ad8925877b7567b29a625592 - languageName: node - linkType: hard - -"node-gyp@npm:^9.0.0, node-gyp@npm:latest": - version: 9.4.0 - resolution: "node-gyp@npm:9.4.0" - dependencies: - env-paths: ^2.2.0 - exponential-backoff: ^3.1.1 - glob: ^7.1.4 - graceful-fs: ^4.2.6 - make-fetch-happen: ^11.0.3 - nopt: ^6.0.0 - npmlog: ^6.0.0 - rimraf: ^3.0.2 - semver: ^7.3.5 - tar: ^6.1.2 - which: ^2.0.2 - bin: - node-gyp: bin/node-gyp.js - checksum: 78b404e2e0639d64e145845f7f5a3cb20c0520cdaf6dda2f6e025e9b644077202ea7de1232396ba5bde3fee84cdc79604feebe6ba3ec84d464c85d407bb5da99 - languageName: node - linkType: hard - -"nopt@npm:^6.0.0": - version: 6.0.0 - resolution: "nopt@npm:6.0.0" - dependencies: - abbrev: ^1.0.0 - bin: - nopt: bin/nopt.js - checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac - languageName: node - linkType: hard - -"normalize-package-data@npm:^2.3.2": - version: 2.5.0 - resolution: "normalize-package-data@npm:2.5.0" - dependencies: - hosted-git-info: ^2.1.4 - resolve: ^1.10.0 - semver: 2 || 3 || 4 || 5 - validate-npm-package-license: ^3.0.1 - checksum: 7999112efc35a6259bc22db460540cae06564aa65d0271e3bdfa86876d08b0e578b7b5b0028ee61b23f1cae9fc0e7847e4edc0948d3068a39a2a82853efc8499 - languageName: node - linkType: hard - -"normalize-url@npm:^6.0.1": - version: 6.1.0 - resolution: "normalize-url@npm:6.1.0" - checksum: 4a4944631173e7d521d6b80e4c85ccaeceb2870f315584fa30121f505a6dfd86439c5e3fdd8cd9e0e291290c41d0c3599f0cb12ab356722ed242584c30348e50 - languageName: node - linkType: hard - -"npm-run-path@npm:^2.0.0": - version: 2.0.2 - resolution: "npm-run-path@npm:2.0.2" - dependencies: - path-key: ^2.0.0 - checksum: acd5ad81648ba4588ba5a8effb1d98d2b339d31be16826a118d50f182a134ac523172101b82eab1d01cb4c2ba358e857d54cfafd8163a1ffe7bd52100b741125 - languageName: node - linkType: hard - -"npmlog@npm:^6.0.0": - version: 6.0.2 - resolution: "npmlog@npm:6.0.2" - dependencies: - are-we-there-yet: ^3.0.0 - console-control-strings: ^1.1.0 - gauge: ^4.0.3 - set-blocking: ^2.0.0 - checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a - languageName: node - linkType: hard - -"object-inspect@npm:^1.9.0": - version: 1.12.3 - resolution: "object-inspect@npm:1.12.3" - checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db - languageName: node - linkType: hard - -"object-keys@npm:^1.1.1": - version: 1.1.1 - resolution: "object-keys@npm:1.1.1" - checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a - languageName: node - linkType: hard - -"on-finished@npm:2.4.1": - version: 2.4.1 - resolution: "on-finished@npm:2.4.1" - dependencies: - ee-first: 1.1.1 - checksum: d20929a25e7f0bb62f937a425b5edeb4e4cde0540d77ba146ec9357f00b0d497cdb3b9b05b9c8e46222407d1548d08166bff69cc56dfa55ba0e4469228920ff0 - languageName: node - linkType: hard - -"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: 1 - checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 - languageName: node - linkType: hard - -"onetime@npm:^5.1.0": - version: 5.1.2 - resolution: "onetime@npm:5.1.2" - dependencies: - mimic-fn: ^2.1.0 - checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34 - languageName: node - linkType: hard - -"ora@npm:^5.1.0": - version: 5.4.1 - resolution: "ora@npm:5.4.1" - dependencies: - bl: ^4.1.0 - chalk: ^4.1.0 - cli-cursor: ^3.1.0 - cli-spinners: ^2.5.0 - is-interactive: ^1.0.0 - is-unicode-supported: ^0.1.0 - log-symbols: ^4.1.0 - strip-ansi: ^6.0.0 - wcwidth: ^1.0.1 - checksum: 28d476ee6c1049d68368c0dc922e7225e3b5600c3ede88fade8052837f9ed342625fdaa84a6209302587c8ddd9b664f71f0759833cbdb3a4cf81344057e63c63 - languageName: node - linkType: hard - -"p-cancelable@npm:^2.0.0": - version: 2.1.1 - resolution: "p-cancelable@npm:2.1.1" - checksum: 3dba12b4fb4a1e3e34524535c7858fc82381bbbd0f247cc32dedc4018592a3950ce66b106d0880b4ec4c2d8d6576f98ca885dc1d7d0f274d1370be20e9523ddf - languageName: node - linkType: hard - -"p-defer@npm:^1.0.0": - version: 1.0.0 - resolution: "p-defer@npm:1.0.0" - checksum: 4271b935c27987e7b6f229e5de4cdd335d808465604644cb7b4c4c95bef266735859a93b16415af8a41fd663ee9e3b97a1a2023ca9def613dba1bad2a0da0c7b - languageName: node - linkType: hard - -"p-finally@npm:^1.0.0": - version: 1.0.0 - resolution: "p-finally@npm:1.0.0" - checksum: 93a654c53dc805dd5b5891bab16eb0ea46db8f66c4bfd99336ae929323b1af2b70a8b0654f8f1eae924b2b73d037031366d645f1fd18b3d30cbd15950cc4b1d4 - languageName: node - linkType: hard - -"p-is-promise@npm:^2.0.0": - version: 2.1.0 - resolution: "p-is-promise@npm:2.1.0" - checksum: c9a8248c8b5e306475a5d55ce7808dbce4d4da2e3d69526e4991a391a7809bfd6cfdadd9bf04f1c96a3db366c93d9a0f5ee81d949e7b1684c4e0f61f747199ef - languageName: node - linkType: hard - -"p-limit@npm:^1.1.0": - version: 1.3.0 - resolution: "p-limit@npm:1.3.0" - dependencies: - p-try: ^1.0.0 - checksum: 281c1c0b8c82e1ac9f81acd72a2e35d402bf572e09721ce5520164e9de07d8274451378a3470707179ad13240535558f4b277f02405ad752e08c7d5b0d54fbfd - languageName: node - linkType: hard - -"p-limit@npm:^2.2.0": - version: 2.3.0 - resolution: "p-limit@npm:2.3.0" - dependencies: - p-try: ^2.0.0 - checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 - languageName: node - linkType: hard - -"p-limit@npm:^3.0.2": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: ^0.1.0 - checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 - languageName: node - linkType: hard - -"p-locate@npm:^2.0.0": - version: 2.0.0 - resolution: "p-locate@npm:2.0.0" - dependencies: - p-limit: ^1.1.0 - checksum: e2dceb9b49b96d5513d90f715780f6f4972f46987dc32a0e18bc6c3fc74a1a5d73ec5f81b1398af5e58b99ea1ad03fd41e9181c01fa81b4af2833958696e3081 - languageName: node - linkType: hard - -"p-locate@npm:^4.1.0": - version: 4.1.0 - resolution: "p-locate@npm:4.1.0" - dependencies: - p-limit: ^2.2.0 - checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 - languageName: node - linkType: hard - -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: ^3.0.2 - checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 - languageName: node - linkType: hard - -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: ^3.0.0 - checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c - languageName: node - linkType: hard - -"p-try@npm:^1.0.0": - version: 1.0.0 - resolution: "p-try@npm:1.0.0" - checksum: 3b5303f77eb7722144154288bfd96f799f8ff3e2b2b39330efe38db5dd359e4fb27012464cd85cb0a76e9b7edd1b443568cb3192c22e7cffc34989df0bafd605 - languageName: node - linkType: hard - -"p-try@npm:^2.0.0": - version: 2.2.0 - resolution: "p-try@npm:2.2.0" - checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae - languageName: node - linkType: hard - -"parse-author@npm:^2.0.0": - version: 2.0.0 - resolution: "parse-author@npm:2.0.0" - dependencies: - author-regex: ^1.0.0 - checksum: 066ad615de7dbc3c4293eaaf66a65ea81f8e75e2cffcaf9dd3bcdd4dc4cfff1baa3c85bb3adbedfbed2ddee3298ef4e25ef51b524e91d5a5815d8d9598d31367 - languageName: node - linkType: hard - -"parse-color@npm:^1.0.0": - version: 1.0.0 - resolution: "parse-color@npm:1.0.0" - dependencies: - color-convert: ~0.5.0 - checksum: 0e6e1821eacb4cd21dff380eceafa229052fe22b9951a891c7cac6080a681f29cb2ac50050398ae6cba089cde87f640bcaf8439bf16d468de029691275c175ef - languageName: node - linkType: hard - -"parse-json@npm:^2.2.0": - version: 2.2.0 - resolution: "parse-json@npm:2.2.0" - dependencies: - error-ex: ^1.2.0 - checksum: dda78a63e57a47b713a038630868538f718a7ca0cd172a36887b0392ccf544ed0374902eb28f8bf3409e8b71d62b79d17062f8543afccf2745f9b0b2d2bb80ca - languageName: node - linkType: hard - -"parse-passwd@npm:^1.0.0": - version: 1.0.0 - resolution: "parse-passwd@npm:1.0.0" - checksum: 4e55e0231d58f828a41d0f1da2bf2ff7bcef8f4cb6146e69d16ce499190de58b06199e6bd9b17fbf0d4d8aef9052099cdf8c4f13a6294b1a522e8e958073066e - languageName: node - linkType: hard - -"parseurl@npm:~1.3.3": - version: 1.3.3 - resolution: "parseurl@npm:1.3.3" - checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 - languageName: node - linkType: hard - -"path-exists@npm:^3.0.0": - version: 3.0.0 - resolution: "path-exists@npm:3.0.0" - checksum: 96e92643aa34b4b28d0de1cd2eba52a1c5313a90c6542d03f62750d82480e20bfa62bc865d5cfc6165f5fcd5aeb0851043c40a39be5989646f223300021bae0a - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 - languageName: node - linkType: hard - -"path-key@npm:^2.0.0, path-key@npm:^2.0.1": - version: 2.0.1 - resolution: "path-key@npm:2.0.1" - checksum: f7ab0ad42fe3fb8c7f11d0c4f849871e28fbd8e1add65c370e422512fc5887097b9cf34d09c1747d45c942a8c1e26468d6356e2df3f740bf177ab8ca7301ebfd - languageName: node - linkType: hard - -"path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 - languageName: node - linkType: hard - -"path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a - languageName: node - linkType: hard - -"path-scurry@npm:^1.10.1": - version: 1.10.1 - resolution: "path-scurry@npm:1.10.1" - dependencies: - lru-cache: ^9.1.1 || ^10.0.0 - minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - checksum: e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90 - languageName: node - linkType: hard - -"path-to-regexp@npm:0.1.7": - version: 0.1.7 - resolution: "path-to-regexp@npm:0.1.7" - checksum: 69a14ea24db543e8b0f4353305c5eac6907917031340e5a8b37df688e52accd09e3cebfe1660b70d76b6bd89152f52183f28c74813dbf454ba1a01c82a38abce - languageName: node - linkType: hard - -"path-type@npm:^2.0.0": - version: 2.0.0 - resolution: "path-type@npm:2.0.0" - dependencies: - pify: ^2.0.0 - checksum: 749dc0c32d4ebe409da155a0022f9be3d08e6fd276adb3dfa27cb2486519ab2aa277d1453b3fde050831e0787e07b0885a75653fefcc82d883753c5b91121b1c - languageName: node - linkType: hard - -"pend@npm:~1.2.0": - version: 1.2.0 - resolution: "pend@npm:1.2.0" - checksum: 6c72f5243303d9c60bd98e6446ba7d30ae29e3d56fdb6fae8767e8ba6386f33ee284c97efe3230a0d0217e2b1723b8ab490b1bbf34fcbb2180dbc8a9de47850d - languageName: node - linkType: hard - -"picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 - languageName: node - linkType: hard - -"picomatch@npm:^2.3.1": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf - languageName: node - linkType: hard - -"pify@npm:^2.0.0": - version: 2.3.0 - resolution: "pify@npm:2.3.0" - checksum: 9503aaeaf4577acc58642ad1d25c45c6d90288596238fb68f82811c08104c800e5a7870398e9f015d82b44ecbcbef3dc3d4251a1cbb582f6e5959fe09884b2ba - languageName: node - linkType: hard - -"pkg-dir@npm:^4.2.0": - version: 4.2.0 - resolution: "pkg-dir@npm:4.2.0" - dependencies: - find-up: ^4.0.0 - checksum: 9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6 - languageName: node - linkType: hard - -"plist@npm:^3.0.0, plist@npm:^3.0.4, plist@npm:^3.0.5": - version: 3.1.0 - resolution: "plist@npm:3.1.0" - dependencies: - "@xmldom/xmldom": ^0.8.8 - base64-js: ^1.5.1 - xmlbuilder: ^15.1.1 - checksum: c8ea013da8646d4c50dff82f9be39488054621cc229957621bb00add42b5d4ce3657cf58d4b10c50f7dea1a81118f825838f838baeb4e6f17fab453ecf91d424 - languageName: node - linkType: hard - -"postcss@npm:^8.4.25": - version: 8.4.26 - resolution: "postcss@npm:8.4.26" - dependencies: - nanoid: ^3.3.6 - picocolors: ^1.0.0 - source-map-js: ^1.0.2 - checksum: 1cf08ee10d58cbe98f94bf12ac49a5e5ed1588507d333d2642aacc24369ca987274e1f60ff4cbf0081f70d2ab18a5cd3a4a273f188d835b8e7f3ba381b184e57 - languageName: node - linkType: hard - -"progress@npm:^2.0.3": - version: 2.0.3 - resolution: "progress@npm:2.0.3" - checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7 - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: ^2.0.2 - retry: ^0.12.0 - checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 - languageName: node - linkType: hard - -"proxy-addr@npm:~2.0.7": - version: 2.0.7 - resolution: "proxy-addr@npm:2.0.7" - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - checksum: 29c6990ce9364648255454842f06f8c46fcd124d3e6d7c5066df44662de63cdc0bad032e9bf5a3d653ff72141cc7b6019873d685708ac8210c30458ad99f2b74 - languageName: node - linkType: hard - -"pump@npm:^3.0.0": - version: 3.0.0 - resolution: "pump@npm:3.0.0" - dependencies: - end-of-stream: ^1.1.0 - once: ^1.3.1 - checksum: e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9 - languageName: node - linkType: hard - -"qs@npm:6.11.0": - version: 6.11.0 - resolution: "qs@npm:6.11.0" - dependencies: - side-channel: ^1.0.4 - checksum: 6e1f29dd5385f7488ec74ac7b6c92f4d09a90408882d0c208414a34dd33badc1a621019d4c799a3df15ab9b1d0292f97c1dd71dc7c045e69f81a8064e5af7297 - languageName: node - linkType: hard - -"queue-microtask@npm:^1.2.2": - version: 1.2.3 - resolution: "queue-microtask@npm:1.2.3" - checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 - languageName: node - linkType: hard - -"quick-lru@npm:^5.1.1": - version: 5.1.1 - resolution: "quick-lru@npm:5.1.1" - checksum: a516faa25574be7947969883e6068dbe4aa19e8ef8e8e0fd96cddd6d36485e9106d85c0041a27153286b0770b381328f4072aa40d3b18a19f5f7d2b78b94b5ed - languageName: node - linkType: hard - -"random-path@npm:^0.1.0": - version: 0.1.2 - resolution: "random-path@npm:0.1.2" - dependencies: - base32-encode: ^0.1.0 || ^1.0.0 - murmur-32: ^0.1.0 || ^0.2.0 - checksum: 9fe83df7705e7c7707feba280433f1dd3937dfd6feccc85e1f5fad1e5f84930777a64faa871f4ced4c7825fdfeb5f727f70fc808d81914c02e4c914bac177a34 - languageName: node - linkType: hard - -"range-parser@npm:~1.2.1": - version: 1.2.1 - resolution: "range-parser@npm:1.2.1" - checksum: 0a268d4fea508661cf5743dfe3d5f47ce214fd6b7dec1de0da4d669dd4ef3d2144468ebe4179049eff253d9d27e719c88dae55be64f954e80135a0cada804ec9 - languageName: node - linkType: hard - -"raw-body@npm:2.5.1": - version: 2.5.1 - resolution: "raw-body@npm:2.5.1" - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - checksum: 5362adff1575d691bb3f75998803a0ffed8c64eabeaa06e54b4ada25a0cd1b2ae7f4f5ec46565d1bec337e08b5ac90c76eaa0758de6f72a633f025d754dec29e - languageName: node - linkType: hard - -"rcedit@npm:^3.0.1": - version: 3.0.1 - resolution: "rcedit@npm:3.0.1" - dependencies: - cross-spawn-windows-exe: ^1.1.0 - checksum: 73332443aa9e5c70bcd4e8a2f5195f5591a03ef08bf1fe477c116f2525e0d525ced0ad5c32c23dcadc27550aec297559e1f944676f833d25d549c7d27b95e165 - languageName: node - linkType: hard - -"read-pkg-up@npm:^2.0.0": - version: 2.0.0 - resolution: "read-pkg-up@npm:2.0.0" - dependencies: - find-up: ^2.0.0 - read-pkg: ^2.0.0 - checksum: 22f9026fb72219ecd165f94f589461c70a88461dc7ea0d439a310ef2a5271ff176a4df4e5edfad087d8ac89b8553945eb209476b671e8ed081c990f30fc40b27 - languageName: node - linkType: hard - -"read-pkg@npm:^2.0.0": - version: 2.0.0 - resolution: "read-pkg@npm:2.0.0" - dependencies: - load-json-file: ^2.0.0 - normalize-package-data: ^2.3.2 - path-type: ^2.0.0 - checksum: 85c5bf35f2d96acdd756151ba83251831bb2b1040b7d96adce70b2cb119b5320417f34876de0929f2d06c67f3df33ef4636427df3533913876f9ef2487a6f48f - languageName: node - linkType: hard - -"readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: ^2.0.3 - string_decoder: ^1.1.1 - util-deprecate: ^1.0.1 - checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d - languageName: node - linkType: hard - -"rechoir@npm:^0.8.0": - version: 0.8.0 - resolution: "rechoir@npm:0.8.0" - dependencies: - resolve: ^1.20.0 - checksum: ad3caed8afdefbc33fbc30e6d22b86c35b3d51c2005546f4e79bcc03c074df804b3640ad18945e6bef9ed12caedc035655ec1082f64a5e94c849ff939dc0a788 - languageName: node - linkType: hard - -"repeat-string@npm:^1.5.4": - version: 1.6.1 - resolution: "repeat-string@npm:1.6.1" - checksum: 1b809fc6db97decdc68f5b12c4d1a671c8e3f65ec4a40c238bc5200e44e85bcc52a54f78268ab9c29fcf5fe4f1343e805420056d1f30fa9a9ee4c2d93e3cc6c0 - languageName: node - linkType: hard - -"require-directory@npm:^2.1.1": - version: 2.1.1 - resolution: "require-directory@npm:2.1.1" - checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80 - languageName: node - linkType: hard - -"require-main-filename@npm:^2.0.0": - version: 2.0.0 - resolution: "require-main-filename@npm:2.0.0" - checksum: e9e294695fea08b076457e9ddff854e81bffbe248ed34c1eec348b7abbd22a0d02e8d75506559e2265e96978f3c4720bd77a6dad84755de8162b357eb6c778c7 - languageName: node - linkType: hard - -"resolve-alpn@npm:^1.0.0": - version: 1.2.1 - resolution: "resolve-alpn@npm:1.2.1" - checksum: f558071fcb2c60b04054c99aebd572a2af97ef64128d59bef7ab73bd50d896a222a056de40ffc545b633d99b304c259ea9d0c06830d5c867c34f0bfa60b8eae0 - languageName: node - linkType: hard - -"resolve-dir@npm:^1.0.0": - version: 1.0.1 - resolution: "resolve-dir@npm:1.0.1" - dependencies: - expand-tilde: ^2.0.0 - global-modules: ^1.0.0 - checksum: ef736b8ed60d6645c3b573da17d329bfb50ec4e1d6c5ffd6df49e3497acef9226f9810ea6823b8ece1560e01dcb13f77a9f6180d4f242d00cc9a8f4de909c65c - languageName: node - linkType: hard - -"resolve-package@npm:^1.0.1": - version: 1.0.1 - resolution: "resolve-package@npm:1.0.1" - dependencies: - get-installed-path: ^2.0.3 - checksum: ce89b69e58171ccbf5ea05afdcf42ae7ebd98e210472a2bee194750796d480d98703a773abb4dab1a685346ef91210c2aa6dbc5cfda1bdcd71b1b8cc43ef0627 - languageName: node - linkType: hard - -"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.20.0": - version: 1.22.3 - resolution: "resolve@npm:1.22.3" - dependencies: - is-core-module: ^2.12.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: fb834b81348428cb545ff1b828a72ea28feb5a97c026a1cf40aa1008352c72811ff4d4e71f2035273dc536dcfcae20c13604ba6283c612d70fa0b6e44519c374 - languageName: node - linkType: hard - -"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin": - version: 1.22.3 - resolution: "resolve@patch:resolve@npm%3A1.22.3#~builtin::version=1.22.3&hash=c3c19d" - dependencies: - is-core-module: ^2.12.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: ad59734723b596d0891321c951592ed9015a77ce84907f89c9d9307dd0c06e11a67906a3e628c4cae143d3e44898603478af0ddeb2bba3f229a9373efe342665 - languageName: node - linkType: hard - -"responselike@npm:^2.0.0": - version: 2.0.1 - resolution: "responselike@npm:2.0.1" - dependencies: - lowercase-keys: ^2.0.0 - checksum: b122535466e9c97b55e69c7f18e2be0ce3823c5d47ee8de0d9c0b114aa55741c6db8bfbfce3766a94d1272e61bfb1ebf0a15e9310ac5629fbb7446a861b4fd3a - languageName: node - linkType: hard - -"restore-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "restore-cursor@npm:3.1.0" - dependencies: - onetime: ^5.1.0 - signal-exit: ^3.0.2 - checksum: f877dd8741796b909f2a82454ec111afb84eb45890eb49ac947d87991379406b3b83ff9673a46012fca0d7844bb989f45cc5b788254cf1a39b6b5a9659de0630 - languageName: node - linkType: hard - -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c - languageName: node - linkType: hard - -"reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc - languageName: node - linkType: hard - -"rfdc@npm:^1.3.0": - version: 1.3.0 - resolution: "rfdc@npm:1.3.0" - checksum: fb2ba8512e43519983b4c61bd3fa77c0f410eff6bae68b08614437bc3f35f91362215f7b4a73cbda6f67330b5746ce07db5dd9850ad3edc91271ad6deea0df32 - languageName: node - linkType: hard - -"rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: ^7.1.3 - bin: - rimraf: bin.js - checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 - languageName: node - linkType: hard - -"rimraf@npm:~2.6.2": - version: 2.6.3 - resolution: "rimraf@npm:2.6.3" - dependencies: - glob: ^7.1.3 - bin: - rimraf: ./bin.js - checksum: 3ea587b981a19016297edb96d1ffe48af7e6af69660e3b371dbfc73722a73a0b0e9be5c88089fbeeb866c389c1098e07f64929c7414290504b855f54f901ab10 - languageName: node - linkType: hard - -"roarr@npm:^2.15.3": - version: 2.15.4 - resolution: "roarr@npm:2.15.4" - dependencies: - boolean: ^3.0.1 - detect-node: ^2.0.4 - globalthis: ^1.0.1 - json-stringify-safe: ^5.0.1 - semver-compare: ^1.0.0 - sprintf-js: ^1.1.2 - checksum: 682e28d5491e3ae99728a35ba188f4f0ccb6347dbd492f95dc9f4bfdfe8ee63d8203ad234766ee2db88c8d7a300714304976eb095ce5c9366fe586c03a21586c - languageName: node - linkType: hard - -"rollup@npm:^3.25.2": - version: 3.26.3 - resolution: "rollup@npm:3.26.3" - dependencies: - fsevents: ~2.3.2 - dependenciesMeta: - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: e6a765b2b7af709170344cc804392936613e06b6bdab46a04d264368d154bdadaaaf77de39e6e656bf728a060d7b4867d81e2464d791c0f37dd5b21aa9c7a6df - languageName: node - linkType: hard - -"run-parallel@npm:^1.1.9": - version: 1.2.0 - resolution: "run-parallel@npm:1.2.0" - dependencies: - queue-microtask: ^1.2.2 - checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d - languageName: node - linkType: hard - -"rxjs@npm:^7.8.0": - version: 7.8.1 - resolution: "rxjs@npm:7.8.1" - dependencies: - tslib: ^2.1.0 - checksum: de4b53db1063e618ec2eca0f7965d9137cabe98cf6be9272efe6c86b47c17b987383df8574861bcced18ebd590764125a901d5506082be84a8b8e364bf05f119 - languageName: node - linkType: hard - -"safe-buffer@npm:5.2.1, safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 - languageName: node - linkType: hard - -"semver-compare@npm:^1.0.0": - version: 1.0.0 - resolution: "semver-compare@npm:1.0.0" - checksum: dd1d7e2909744cf2cf71864ac718efc990297f9de2913b68e41a214319e70174b1d1793ac16e31183b128c2b9812541300cb324db8168e6cf6b570703b171c68 - languageName: node - linkType: hard - -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.5.0": - version: 5.7.2 - resolution: "semver@npm:5.7.2" - bin: - semver: bin/semver - checksum: fb4ab5e0dd1c22ce0c937ea390b4a822147a9c53dbd2a9a0132f12fe382902beef4fbf12cf51bb955248d8d15874ce8cd89532569756384f994309825f10b686 - languageName: node - linkType: hard - -"semver@npm:^6.2.0": - version: 6.3.1 - resolution: "semver@npm:6.3.1" - bin: - semver: bin/semver.js - checksum: ae47d06de28836adb9d3e25f22a92943477371292d9b665fb023fae278d345d508ca1958232af086d85e0155aee22e313e100971898bbb8d5d89b8b1d4054ca2 - languageName: node - linkType: hard - -"semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.5": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 - languageName: node - linkType: hard - -"send@npm:0.18.0": - version: 0.18.0 - resolution: "send@npm:0.18.0" - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - etag: ~1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: ~1.2.1 - statuses: 2.0.1 - checksum: 74fc07ebb58566b87b078ec63e5a3e41ecd987e4272ba67b7467e86c6ad51bc6b0b0154133b6d8b08a2ddda360464f71382f7ef864700f34844a76c8027817a8 - languageName: node - linkType: hard - -"serialize-error@npm:^7.0.1": - version: 7.0.1 - resolution: "serialize-error@npm:7.0.1" - dependencies: - type-fest: ^0.13.1 - checksum: e0aba4dca2fc9fe74ae1baf38dbd99190e1945445a241ba646290f2176cdb2032281a76443b02ccf0caf30da5657d510746506368889a593b9835a497fc0732e - languageName: node - linkType: hard - -"serve-static@npm:1.15.0": - version: 1.15.0 - resolution: "serve-static@npm:1.15.0" - dependencies: - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - parseurl: ~1.3.3 - send: 0.18.0 - checksum: af57fc13be40d90a12562e98c0b7855cf6e8bd4c107fe9a45c212bf023058d54a1871b1c89511c3958f70626fff47faeb795f5d83f8cf88514dbaeb2b724464d - languageName: node - linkType: hard - -"set-blocking@npm:^2.0.0": - version: 2.0.0 - resolution: "set-blocking@npm:2.0.0" - checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 - languageName: node - linkType: hard - -"setprototypeof@npm:1.2.0": - version: 1.2.0 - resolution: "setprototypeof@npm:1.2.0" - checksum: be18cbbf70e7d8097c97f713a2e76edf84e87299b40d085c6bf8b65314e994cc15e2e317727342fa6996e38e1f52c59720b53fe621e2eb593a6847bf0356db89 - languageName: node - linkType: hard - -"shebang-command@npm:^1.2.0": - version: 1.2.0 - resolution: "shebang-command@npm:1.2.0" - dependencies: - shebang-regex: ^1.0.0 - checksum: 9eed1750301e622961ba5d588af2212505e96770ec376a37ab678f965795e995ade7ed44910f5d3d3cb5e10165a1847f52d3348c64e146b8be922f7707958908 - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: ^3.0.0 - checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa - languageName: node - linkType: hard - -"shebang-regex@npm:^1.0.0": - version: 1.0.0 - resolution: "shebang-regex@npm:1.0.0" - checksum: 404c5a752cd40f94591dfd9346da40a735a05139dac890ffc229afba610854d8799aaa52f87f7e0c94c5007f2c6af55bdcaeb584b56691926c5eaf41dc8f1372 - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 - languageName: node - linkType: hard - -"side-channel@npm:^1.0.4": - version: 1.0.4 - resolution: "side-channel@npm:1.0.4" - dependencies: - call-bind: ^1.0.0 - get-intrinsic: ^1.0.2 - object-inspect: ^1.9.0 - checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.7": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1": - version: 4.0.2 - resolution: "signal-exit@npm:4.0.2" - checksum: 41f5928431cc6e91087bf0343db786a6313dd7c6fd7e551dbc141c95bb5fb26663444fd9df8ea47c5d7fc202f60aa7468c3162a9365cbb0615fc5e1b1328fe31 - languageName: node - linkType: hard - -"slice-ansi@npm:^3.0.0": - version: 3.0.0 - resolution: "slice-ansi@npm:3.0.0" - dependencies: - ansi-styles: ^4.0.0 - astral-regex: ^2.0.0 - is-fullwidth-code-point: ^3.0.0 - checksum: 5ec6d022d12e016347e9e3e98a7eb2a592213a43a65f1b61b74d2c78288da0aded781f665807a9f3876b9daa9ad94f64f77d7633a0458876c3a4fdc4eb223f24 - languageName: node - linkType: hard - -"slice-ansi@npm:^4.0.0": - version: 4.0.0 - resolution: "slice-ansi@npm:4.0.0" - dependencies: - ansi-styles: ^4.0.0 - astral-regex: ^2.0.0 - is-fullwidth-code-point: ^3.0.0 - checksum: 4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756 - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^7.0.0": - version: 7.0.0 - resolution: "socks-proxy-agent@npm:7.0.0" - dependencies: - agent-base: ^6.0.2 - debug: ^4.3.3 - socks: ^2.6.2 - checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 - languageName: node - linkType: hard - -"socks@npm:^2.6.2": - version: 2.7.1 - resolution: "socks@npm:2.7.1" - dependencies: - ip: ^2.0.0 - smart-buffer: ^4.2.0 - checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 - languageName: node - linkType: hard - -"source-map-js@npm:^1.0.2": - version: 1.0.2 - resolution: "source-map-js@npm:1.0.2" - checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c - languageName: node - linkType: hard - -"source-map-support@npm:^0.5.13": - version: 0.5.21 - resolution: "source-map-support@npm:0.5.21" - dependencies: - buffer-from: ^1.0.0 - source-map: ^0.6.0 - checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 - languageName: node - linkType: hard - -"source-map@npm:^0.6.0": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 - languageName: node - linkType: hard - -"spdx-correct@npm:^3.0.0": - version: 3.2.0 - resolution: "spdx-correct@npm:3.2.0" - dependencies: - spdx-expression-parse: ^3.0.0 - spdx-license-ids: ^3.0.0 - checksum: e9ae98d22f69c88e7aff5b8778dc01c361ef635580e82d29e5c60a6533cc8f4d820803e67d7432581af0cc4fb49973125076ee3b90df191d153e223c004193b2 - languageName: node - linkType: hard - -"spdx-exceptions@npm:^2.1.0": - version: 2.3.0 - resolution: "spdx-exceptions@npm:2.3.0" - checksum: cb69a26fa3b46305637123cd37c85f75610e8c477b6476fa7354eb67c08128d159f1d36715f19be6f9daf4b680337deb8c65acdcae7f2608ba51931540687ac0 - languageName: node - linkType: hard - -"spdx-expression-parse@npm:^3.0.0": - version: 3.0.1 - resolution: "spdx-expression-parse@npm:3.0.1" - dependencies: - spdx-exceptions: ^2.1.0 - spdx-license-ids: ^3.0.0 - checksum: a1c6e104a2cbada7a593eaa9f430bd5e148ef5290d4c0409899855ce8b1c39652bcc88a725259491a82601159d6dc790bedefc9016c7472f7de8de7361f8ccde - languageName: node - linkType: hard - -"spdx-license-ids@npm:^3.0.0": - version: 3.0.13 - resolution: "spdx-license-ids@npm:3.0.13" - checksum: 3469d85c65f3245a279fa11afc250c3dca96e9e847f2f79d57f466940c5bb8495da08a542646086d499b7f24a74b8d0b42f3fc0f95d50ff99af1f599f6360ad7 - languageName: node - linkType: hard - -"sprintf-js@npm:^1.1.2": - version: 1.1.2 - resolution: "sprintf-js@npm:1.1.2" - checksum: d4bb46464632b335e5faed381bd331157e0af64915a98ede833452663bc672823db49d7531c32d58798e85236581fb7342fd0270531ffc8f914e186187bf1c90 - languageName: node - linkType: hard - -"ssri@npm:^10.0.0": - version: 10.0.4 - resolution: "ssri@npm:10.0.4" - dependencies: - minipass: ^5.0.0 - checksum: fb14da9f8a72b04eab163eb13a9dda11d5962cd2317f85457c4e0b575e9a6e0e3a6a87b5bf122c75cb36565830cd5f263fb457571bf6f1587eb5f95d095d6165 - languageName: node - linkType: hard - -"statuses@npm:2.0.1": - version: 2.0.1 - resolution: "statuses@npm:2.0.1" - checksum: 18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb - languageName: node - linkType: hard - -"stream-buffers@npm:~2.2.0": - version: 2.2.0 - resolution: "stream-buffers@npm:2.2.0" - checksum: 4587d9e8f050d689fb38b4295e73408401b16de8edecc12026c6f4ae92956705ecfd995ae3845d7fa3ebf19502d5754df9143d91447fd881d86e518f43882c1c - languageName: node - linkType: hard - -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: ^8.0.0 - is-fullwidth-code-point: ^3.0.0 - strip-ansi: ^6.0.1 - checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb - languageName: node - linkType: hard - -"string-width@npm:^5.0.1, string-width@npm:^5.1.2": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" - dependencies: - eastasianwidth: ^0.2.0 - emoji-regex: ^9.2.2 - strip-ansi: ^7.0.1 - checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 - languageName: node - linkType: hard - -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: ~5.2.0 - checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 - languageName: node - linkType: hard - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: ^5.0.1 - checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c - languageName: node - linkType: hard - -"strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" - dependencies: - ansi-regex: ^6.0.1 - checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d - languageName: node - linkType: hard - -"strip-bom@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-bom@npm:3.0.0" - checksum: 8d50ff27b7ebe5ecc78f1fe1e00fcdff7af014e73cf724b46fb81ef889eeb1015fc5184b64e81a2efe002180f3ba431bdd77e300da5c6685d702780fbf0c8d5b - languageName: node - linkType: hard - -"strip-eof@npm:^1.0.0": - version: 1.0.0 - resolution: "strip-eof@npm:1.0.0" - checksum: 40bc8ddd7e072f8ba0c2d6d05267b4e0a4800898c3435b5fb5f5a21e6e47dfaff18467e7aa0d1844bb5d6274c3097246595841fbfeb317e541974ee992cac506 - languageName: node - linkType: hard - -"strip-outer@npm:^1.0.1": - version: 1.0.1 - resolution: "strip-outer@npm:1.0.1" - dependencies: - escape-string-regexp: ^1.0.2 - checksum: f8d65d33ca2b49aabc66bb41d689dda7b8b9959d320e3a40a2ef4d7079ff2f67ffb72db43f179f48dbf9495c2e33742863feab7a584d180fa62505439162c191 - languageName: node - linkType: hard - -"sudo-prompt@npm:^9.1.1": - version: 9.2.1 - resolution: "sudo-prompt@npm:9.2.1" - checksum: 50a29eec2f264f2b78d891452a64112d839a30bffbff4ec065dba4af691a35b23cdb8f9107d413e25c1a9f1925644a19994c00602495cab033d53f585fdfd665 - languageName: node - linkType: hard - -"sumchecker@npm:^3.0.1": - version: 3.0.1 - resolution: "sumchecker@npm:3.0.1" - dependencies: - debug: ^4.1.0 - checksum: 31ba7a62c889236b5b07f75b5c250d481158a1ca061b8f234fca0457bdbe48a20e5011c12c715343dc577e111463dc3d9e721b98015a445a2a88c35e0c9f0f91 - languageName: node - linkType: hard - -"supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: ^4.0.0 - checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a - languageName: node - linkType: hard - -"supports-preserve-symlinks-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae - languageName: node - linkType: hard - -"tar@npm:^6.0.5, tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.1.15 - resolution: "tar@npm:6.1.15" - dependencies: - chownr: ^2.0.0 - fs-minipass: ^2.0.0 - minipass: ^5.0.0 - minizlib: ^2.1.1 - mkdirp: ^1.0.3 - yallist: ^4.0.0 - checksum: f23832fceeba7578bf31907aac744ae21e74a66f4a17a9e94507acf460e48f6db598c7023882db33bab75b80e027c21f276d405e4a0322d58f51c7088d428268 - languageName: node - linkType: hard - -"temp@npm:^0.9.0": - version: 0.9.4 - resolution: "temp@npm:0.9.4" - dependencies: - mkdirp: ^0.5.1 - rimraf: ~2.6.2 - checksum: 8709d4d63278bd309ca0e49e80a268308dea543a949e71acd427b3314cd9417da9a2cc73425dd9c21c6780334dbffd67e05e7be5aaa73e9affe8479afc6f20e3 - languageName: node - linkType: hard - -"through@npm:^2.3.8": - version: 2.3.8 - resolution: "through@npm:2.3.8" - checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd - languageName: node - linkType: hard - -"tiny-each-async@npm:2.0.3": - version: 2.0.3 - resolution: "tiny-each-async@npm:2.0.3" - checksum: 363511e6dd1dd9eadee4809d8a3485783f24579ae464c7b0768bb48047e6eaae3360cfe72b2ba345523d1d4033b5542129771c320bfb756abcf4918824511624 - languageName: node - linkType: hard - -"tmp-promise@npm:^3.0.2": - version: 3.0.3 - resolution: "tmp-promise@npm:3.0.3" - dependencies: - tmp: ^0.2.0 - checksum: f854f5307dcee6455927ec3da9398f139897faf715c5c6dcee6d9471ae85136983ea06662eba2edf2533bdcb0fca66d16648e79e14381e30c7fb20be9c1aa62c - languageName: node - linkType: hard - -"tmp@npm:^0.2.0": - version: 0.2.1 - resolution: "tmp@npm:0.2.1" - dependencies: - rimraf: ^3.0.0 - checksum: 8b1214654182575124498c87ca986ac53dc76ff36e8f0e0b67139a8d221eaecfdec108c0e6ec54d76f49f1f72ab9325500b246f562b926f85bcdfca8bf35df9e - languageName: node - linkType: hard - -"tn1150@npm:^0.1.0": - version: 0.1.0 - resolution: "tn1150@npm:0.1.0" - dependencies: - unorm: ^1.4.1 - checksum: 525b996bd02aacb77db951c6cedc59262fc737749a9a26b6ec2c120426196f92fe796ba161382499401f9ffc2652455a21467e8d8142cb352a5017c3f1292e97 - languageName: node - linkType: hard - -"to-data-view@npm:^1.1.0": - version: 1.1.0 - resolution: "to-data-view@npm:1.1.0" - checksum: 53bf818cf7ed4b481568085cfed5528b268efe1e95d0b90c2a45031de9cf40de91600771c046924348fdedbedb54f655f98e7bf1c51041ba06f0ec3f2fd53dc6 - languageName: node - linkType: hard - -"to-regex-range@npm:^5.0.1": - version: 5.0.1 - resolution: "to-regex-range@npm:5.0.1" - dependencies: - is-number: ^7.0.0 - checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed - languageName: node - linkType: hard - -"toidentifier@npm:1.0.1": - version: 1.0.1 - resolution: "toidentifier@npm:1.0.1" - checksum: 952c29e2a85d7123239b5cfdd889a0dde47ab0497f0913d70588f19c53f7e0b5327c95f4651e413c74b785147f9637b17410ac8c846d5d4a20a5a33eb6dc3a45 - languageName: node - linkType: hard - -"tr46@npm:~0.0.3": - version: 0.0.3 - resolution: "tr46@npm:0.0.3" - checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 - languageName: node - linkType: hard - -"trim-repeated@npm:^1.0.0": - version: 1.0.0 - resolution: "trim-repeated@npm:1.0.0" - dependencies: - escape-string-regexp: ^1.0.2 - checksum: e25c235305b82c43f1d64a67a71226c406b00281755e4c2c4f3b1d0b09c687a535dd3c4483327f949f28bb89dc400a0bc5e5b749054f4b99f49ebfe48ba36496 - languageName: node - linkType: hard - -"tslib@npm:^2.1.0": - version: 2.6.0 - resolution: "tslib@npm:2.6.0" - checksum: c01066038f950016a18106ddeca4649b4d76caa76ec5a31e2a26e10586a59fceb4ee45e96719bf6c715648e7c14085a81fee5c62f7e9ebee68e77a5396e5538f - languageName: node - linkType: hard - -"type-fest@npm:^0.13.1": - version: 0.13.1 - resolution: "type-fest@npm:0.13.1" - checksum: e6bf2e3c449f27d4ef5d56faf8b86feafbc3aec3025fc9a5fbe2db0a2587c44714521f9c30d8516a833c8c506d6263f5cc11267522b10c6ccdb6cc55b0a9d1c4 - languageName: node - linkType: hard - -"type-fest@npm:^0.21.3": - version: 0.21.3 - resolution: "type-fest@npm:0.21.3" - checksum: e6b32a3b3877f04339bae01c193b273c62ba7bfc9e325b8703c4ee1b32dc8fe4ef5dfa54bf78265e069f7667d058e360ae0f37be5af9f153b22382cd55a9afe0 - languageName: node - linkType: hard - -"type-is@npm:~1.6.18": - version: 1.6.18 - resolution: "type-is@npm:1.6.18" - dependencies: - media-typer: 0.3.0 - mime-types: ~2.1.24 - checksum: 2c8e47675d55f8b4e404bcf529abdf5036c537a04c2b20177bcf78c9e3c1da69da3942b1346e6edb09e823228c0ee656ef0e033765ec39a70d496ef601a0c657 - languageName: node - linkType: hard - -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" - dependencies: - unique-slug: ^4.0.0 - checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df - languageName: node - linkType: hard - -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" - dependencies: - imurmurhash: ^0.1.4 - checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 - languageName: node - linkType: hard - -"universalify@npm:^0.1.0": - version: 0.1.2 - resolution: "universalify@npm:0.1.2" - checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff - languageName: node - linkType: hard - -"universalify@npm:^2.0.0": - version: 2.0.0 - resolution: "universalify@npm:2.0.0" - checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44 - languageName: node - linkType: hard - -"unorm@npm:^1.4.1": - version: 1.6.0 - resolution: "unorm@npm:1.6.0" - checksum: 9a86546256a45f855b6cfe719086785d6aada94f63778cecdecece8d814ac26af76cb6da70130da0a08b8803bbf0986e56c7ec4249038198f3de02607fffd811 - languageName: node - linkType: hard - -"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": - version: 1.0.0 - resolution: "unpipe@npm:1.0.0" - checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 - languageName: node - linkType: hard - -"username@npm:^5.1.0": - version: 5.1.0 - resolution: "username@npm:5.1.0" - dependencies: - execa: ^1.0.0 - mem: ^4.3.0 - checksum: 455c3b2103c164c867c263696fa3bc9a4066a3941d2d5d04bb51d9e092874af075c08311d50c9fc4685d75b3dcad43dd42d3ac1a775340f473042797dce86edb - languageName: node - linkType: hard - -"util-deprecate@npm:^1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 - languageName: node - linkType: hard - -"utils-merge@npm:1.0.1": - version: 1.0.1 - resolution: "utils-merge@npm:1.0.1" - checksum: c81095493225ecfc28add49c106ca4f09cdf56bc66731aa8dabc2edbbccb1e1bfe2de6a115e5c6a380d3ea166d1636410b62ef216bb07b3feb1cfde1d95d5080 - languageName: node - linkType: hard - -"validate-npm-package-license@npm:^3.0.1": - version: 3.0.4 - resolution: "validate-npm-package-license@npm:3.0.4" - dependencies: - spdx-correct: ^3.0.0 - spdx-expression-parse: ^3.0.0 - checksum: 35703ac889d419cf2aceef63daeadbe4e77227c39ab6287eeb6c1b36a746b364f50ba22e88591f5d017bc54685d8137bc2d328d0a896e4d3fd22093c0f32a9ad - languageName: node - linkType: hard - -"vary@npm:~1.1.2": - version: 1.1.2 - resolution: "vary@npm:1.1.2" - checksum: ae0123222c6df65b437669d63dfa8c36cee20a504101b2fcd97b8bf76f91259c17f9f2b4d70a1e3c6bbcee7f51b28392833adb6b2770b23b01abec84e369660b - languageName: node - linkType: hard - -"vite@npm:^4.1.1": - version: 4.4.4 - resolution: "vite@npm:4.4.4" - dependencies: - esbuild: ^0.18.10 - fsevents: ~2.3.2 - postcss: ^8.4.25 - rollup: ^3.25.2 - peerDependencies: - "@types/node": ">= 14" - less: "*" - lightningcss: ^1.21.0 - sass: "*" - stylus: "*" - sugarss: "*" - terser: ^5.4.0 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - "@types/node": - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - bin: - vite: bin/vite.js - checksum: 51c208e53680fa46f7166e49b037625ae43d507f85f1fd3da7e290263bccb77d5f8c466fe82746285927620afeeff949ac3b8e1b6a7b4fe7bfe11419729256b4 - languageName: node - linkType: hard - -"wcwidth@npm:^1.0.1": - version: 1.0.1 - resolution: "wcwidth@npm:1.0.1" - dependencies: - defaults: ^1.0.3 - checksum: 814e9d1ddcc9798f7377ffa448a5a3892232b9275ebb30a41b529607691c0491de47cba426e917a4d08ded3ee7e9ba2f3fe32e62ee3cd9c7d3bafb7754bd553c - languageName: node - linkType: hard - -"webidl-conversions@npm:^3.0.0": - version: 3.0.1 - resolution: "webidl-conversions@npm:3.0.1" - checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c - languageName: node - linkType: hard - -"whatwg-url@npm:^5.0.0": - version: 5.0.0 - resolution: "whatwg-url@npm:5.0.0" - dependencies: - tr46: ~0.0.3 - webidl-conversions: ^3.0.0 - checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c - languageName: node - linkType: hard - -"which-module@npm:^2.0.0": - version: 2.0.1 - resolution: "which-module@npm:2.0.1" - checksum: 1967b7ce17a2485544a4fdd9063599f0f773959cca24176dbe8f405e55472d748b7c549cd7920ff6abb8f1ab7db0b0f1b36de1a21c57a8ff741f4f1e792c52be - languageName: node - linkType: hard - -"which@npm:^1.2.14, which@npm:^1.2.9": - version: 1.3.1 - resolution: "which@npm:1.3.1" - dependencies: - isexe: ^2.0.0 - bin: - which: ./bin/which - checksum: f2e185c6242244b8426c9df1510e86629192d93c1a986a7d2a591f2c24869e7ffd03d6dac07ca863b2e4c06f59a4cc9916c585b72ee9fa1aa609d0124df15e04 - languageName: node - linkType: hard - -"which@npm:^2.0.1, which@npm:^2.0.2": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: ^2.0.0 - bin: - node-which: ./bin/node-which - checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 - languageName: node - linkType: hard - -"wide-align@npm:^1.1.5": - version: 1.1.5 - resolution: "wide-align@npm:1.1.5" - dependencies: - string-width: ^1.0.2 || 2 || 3 || 4 - checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 - languageName: node - linkType: hard - -"word-wrap@npm:^1.2.3": - version: 1.2.4 - resolution: "word-wrap@npm:1.2.4" - checksum: 8f1f2e0a397c0e074ca225ba9f67baa23f99293bc064e31355d426ae91b8b3f6b5f6c1fc9ae5e9141178bb362d563f55e62fd8d5c31f2a77e3ade56cb3e35bd1 - languageName: node - linkType: hard - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: ^4.0.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b - languageName: node - linkType: hard - -"wrap-ansi@npm:^6.2.0": - version: 6.2.0 - resolution: "wrap-ansi@npm:6.2.0" - dependencies: - ansi-styles: ^4.0.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - checksum: 6cd96a410161ff617b63581a08376f0cb9162375adeb7956e10c8cd397821f7eb2a6de24eb22a0b28401300bf228c86e50617cd568209b5f6775b93c97d2fe3a - languageName: node - linkType: hard - -"wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: ^6.1.0 - string-width: ^5.0.1 - strip-ansi: ^7.0.1 - checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 - languageName: node - linkType: hard - -"ws@npm:^7.4.6": - version: 7.5.9 - resolution: "ws@npm:7.5.9" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: c3c100a181b731f40b7f2fddf004aa023f79d64f489706a28bc23ff88e87f6a64b3c6651fbec3a84a53960b75159574d7a7385709847a62ddb7ad6af76f49138 - languageName: node - linkType: hard - -"xmlbuilder@npm:^15.1.1": - version: 15.1.1 - resolution: "xmlbuilder@npm:15.1.1" - checksum: 14f7302402e28d1f32823583d121594a9dca36408d40320b33f598bd589ca5163a352d076489c9c64d2dc1da19a790926a07bf4191275330d4de2b0d85bb1843 - languageName: node - linkType: hard - -"xtend@npm:^4.0.0": - version: 4.0.2 - resolution: "xtend@npm:4.0.2" - checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a - languageName: node - linkType: hard - -"xterm-addon-fit@npm:^0.5.0": - version: 0.5.0 - resolution: "xterm-addon-fit@npm:0.5.0" - peerDependencies: - xterm: ^4.0.0 - checksum: 884d9f360893335c87e4514beeda2af6dbebf38a89b8518f1126d9c4611aefc1598b750bb43a953b79fdf1179c40d70c77a9169ae10f07e0abbbdb39b919b33f - languageName: node - linkType: hard - -"xterm-addon-search@npm:^0.8.0": - version: 0.8.2 - resolution: "xterm-addon-search@npm:0.8.2" - peerDependencies: - xterm: ^4.0.0 - checksum: cb5fa8a551354d98d81c3f4792a43150670be119a0bf10fdff6727ee80ba2524682371f828bb175bd71075ca45989805560754bb22a30ed87d59725b7910cf1c - languageName: node - linkType: hard - -"xterm@npm:^4.9.0": - version: 4.19.0 - resolution: "xterm@npm:4.19.0" - checksum: 4385e08d6f1e26d0db295ba55f0ed9c304686a72c2cfdd32502cf59de23ae9c93434d469fc3735f44375602f209f767a1ba643a86be6f8e0f1cf7e5bfdccde87 - languageName: node - linkType: hard - -"y18n@npm:^4.0.0": - version: 4.0.3 - resolution: "y18n@npm:4.0.3" - checksum: 014dfcd9b5f4105c3bb397c1c8c6429a9df004aa560964fb36732bfb999bfe83d45ae40aeda5b55d21b1ee53d8291580a32a756a443e064317953f08025b1aa4 - languageName: node - linkType: hard - -"y18n@npm:^5.0.5": - version: 5.0.8 - resolution: "y18n@npm:5.0.8" - checksum: 54f0fb95621ee60898a38c572c515659e51cc9d9f787fb109cef6fde4befbe1c4602dc999d30110feee37456ad0f1660fa2edcfde6a9a740f86a290999550d30 - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 - languageName: node - linkType: hard - -"yargs-parser@npm:^18.1.2": - version: 18.1.3 - resolution: "yargs-parser@npm:18.1.3" - dependencies: - camelcase: ^5.0.0 - decamelize: ^1.2.0 - checksum: 60e8c7d1b85814594d3719300ecad4e6ae3796748b0926137bfec1f3042581b8646d67e83c6fc80a692ef08b8390f21ddcacb9464476c39bbdf52e34961dd4d9 - languageName: node - linkType: hard - -"yargs-parser@npm:^20.2.2": - version: 20.2.9 - resolution: "yargs-parser@npm:20.2.9" - checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 - languageName: node - linkType: hard - -"yargs-parser@npm:^21.1.1": - version: 21.1.1 - resolution: "yargs-parser@npm:21.1.1" - checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c - languageName: node - linkType: hard - -"yargs@npm:^15.0.1": - version: 15.4.1 - resolution: "yargs@npm:15.4.1" - dependencies: - cliui: ^6.0.0 - decamelize: ^1.2.0 - find-up: ^4.1.0 - get-caller-file: ^2.0.1 - require-directory: ^2.1.1 - require-main-filename: ^2.0.0 - set-blocking: ^2.0.0 - string-width: ^4.2.0 - which-module: ^2.0.0 - y18n: ^4.0.0 - yargs-parser: ^18.1.2 - checksum: 40b974f508d8aed28598087720e086ecd32a5fd3e945e95ea4457da04ee9bdb8bdd17fd91acff36dc5b7f0595a735929c514c40c402416bbb87c03f6fb782373 - languageName: node - linkType: hard - -"yargs@npm:^16.0.2": - version: 16.2.0 - resolution: "yargs@npm:16.2.0" - dependencies: - cliui: ^7.0.2 - escalade: ^3.1.1 - get-caller-file: ^2.0.5 - require-directory: ^2.1.1 - string-width: ^4.2.0 - y18n: ^5.0.5 - yargs-parser: ^20.2.2 - checksum: b14afbb51e3251a204d81937c86a7e9d4bdbf9a2bcee38226c900d00f522969ab675703bee2a6f99f8e20103f608382936034e64d921b74df82b63c07c5e8f59 - languageName: node - linkType: hard - -"yargs@npm:^17.0.1": - version: 17.7.2 - resolution: "yargs@npm:17.7.2" - dependencies: - cliui: ^8.0.1 - escalade: ^3.1.1 - get-caller-file: ^2.0.5 - require-directory: ^2.1.1 - string-width: ^4.2.3 - y18n: ^5.0.5 - yargs-parser: ^21.1.1 - checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a - languageName: node - linkType: hard - -"yarn-or-npm@npm:^3.0.1": - version: 3.0.1 - resolution: "yarn-or-npm@npm:3.0.1" - dependencies: - cross-spawn: ^6.0.5 - pkg-dir: ^4.2.0 - bin: - yarn-or-npm: bin/index.js - yon: bin/index.js - checksum: 94421b4315520075b4db6c09b6284064c047058d8bbe2663cdd4269491e5f7ea5d2e68eeaa0182a760a8757479cef665b7040a8c9ddb48a3da52587a8b712b27 - languageName: node - linkType: hard - -"yauzl@npm:^2.10.0": - version: 2.10.0 - resolution: "yauzl@npm:2.10.0" - dependencies: - buffer-crc32: ~0.2.3 - fd-slicer: ~1.1.0 - checksum: 7f21fe0bbad6e2cb130044a5d1d0d5a0e5bf3d8d4f8c4e6ee12163ce798fee3de7388d22a7a0907f563ac5f9d40f8699a223d3d5c1718da90b0156da6904022b - languageName: node - linkType: hard - -"yocto-queue@npm:^0.1.0": - version: 0.1.0 - resolution: "yocto-queue@npm:0.1.0" - checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 - languageName: node - linkType: hard diff --git a/apps/nestjs-backend/.gitignore b/apps/nestjs-backend/.gitignore index e746b599b..6d63fc39f 100644 --- a/apps/nestjs-backend/.gitignore +++ b/apps/nestjs-backend/.gitignore @@ -1,3 +1,12 @@ +# build build dist -.temporary/* \ No newline at end of file + +# testing +/coverage + +# misc +.DS_Store +*.pem +.assets +.temporary \ No newline at end of file diff --git a/apps/nestjs-backend/package.json b/apps/nestjs-backend/package.json index e9ca478a8..a7b2ed4e9 100644 --- a/apps/nestjs-backend/package.json +++ b/apps/nestjs-backend/package.json @@ -40,7 +40,7 @@ "check-size": "size-limit --highlight-less", "test": "run-s test-unit test-e2e", "test-unit": "vitest run --silent --bail 1", - "test-cov": "vitest run --coverage", + "test-unit-cover": "pnpm test-unit --coverage", "pre-test-e2e": "cross-env NODE_ENV=test pnpm -F @teable/db-main-prisma prisma-db-seed -- --e2e", "test-e2e": "pnpm pre-test-e2e && vitest run --config ./vitest-e2e.config.ts --silent --bail 1", "typecheck": "tsc --project ./tsconfig.json --noEmit", @@ -51,7 +51,7 @@ "devDependencies": { "@faker-js/faker": "8.4.1", "@nestjs/cli": "10.3.2", - "@nestjs/testing": "10.3.3", + "@nestjs/testing": "10.3.4", "@teable/eslint-config-bases": "workspace:^", "@types/bcrypt": "5.0.2", "@types/cookie": "0.6.0", @@ -60,7 +60,7 @@ "@types/express": "4.17.21", "@types/express-session": "1.18.0", "@types/fs-extra": "11.0.4", - "@types/lodash": "4.14.202", + "@types/lodash": "4.17.0", "@types/markdown-it": "13.0.7", "@types/mime-types": "2.1.4", "@types/ms": "0.7.34", @@ -69,11 +69,14 @@ "@types/node-fetch": "2.6.11", "@types/nodemailer": "6.4.14", "@types/passport": "1.0.16", + "@types/passport-github2": "1.2.9", + "@types/passport-google-oauth20": "2.0.14", "@types/passport-jwt": "4.0.1", "@types/passport-local": "1.0.38", "@types/pause": "0.1.3", "@types/sharedb": "3.3.10", "@types/ws": "8.5.10", + "@vitest/coverage-v8": "1.4.0", "copy-webpack-plugin": "12.0.2", "cross-env": "7.0.3", "dotenv-flow": "4.1.0", @@ -91,8 +94,8 @@ "ts-node": "10.9.2", "typescript": "5.4.2", "unplugin-swc": "1.4.4", - "vite-tsconfig-paths": "4.3.1", - "vitest": "1.3.1", + "vite-tsconfig-paths": "4.3.2", + "vitest": "1.4.0", "vitest-mock-extended": "1.3.1", "webpack": "5.90.2" }, @@ -101,28 +104,28 @@ "@keyv/sqlite": "3.6.7", "@nestjs-modules/mailer": "1.11.2", "@nestjs/axios": "3.0.2", - "@nestjs/common": "10.3.3", + "@nestjs/common": "10.3.4", "@nestjs/config": "3.2.0", - "@nestjs/core": "10.3.3", + "@nestjs/core": "10.3.4", "@nestjs/event-emitter": "2.0.4", "@nestjs/jwt": "10.2.0", "@nestjs/passport": "10.0.3", - "@nestjs/platform-express": "10.3.3", - "@nestjs/platform-ws": "10.3.3", + "@nestjs/platform-express": "10.3.4", + "@nestjs/platform-ws": "10.3.4", "@nestjs/swagger": "7.3.0", "@nestjs/terminus": "10.2.3", - "@nestjs/websockets": "10.3.3", + "@nestjs/websockets": "10.3.4", "@opentelemetry/api": "1.8.0", "@opentelemetry/context-async-hooks": "1.22.0", "@opentelemetry/exporter-trace-otlp-proto": "0.49.1", - "@opentelemetry/instrumentation-express": "0.36.0", + "@opentelemetry/instrumentation-express": "0.36.1", "@opentelemetry/instrumentation-http": "0.49.1", "@opentelemetry/instrumentation-pino": "0.36.0", "@opentelemetry/resources": "1.22.0", "@opentelemetry/sdk-node": "0.49.1", "@opentelemetry/semantic-conventions": "1.22.0", - "@prisma/client": "5.10.2", - "@prisma/instrumentation": "5.10.2", + "@prisma/client": "5.11.0", + "@prisma/instrumentation": "5.11.0", "@teable/common-i18n": "workspace:^", "@teable/core": "workspace:^", "@teable/db-main-prisma": "workspace:^", @@ -130,7 +133,7 @@ "@teamwork/websocket-json-stream": "2.0.0", "@types/papaparse": "5.3.14", "ajv": "8.12.0", - "axios": "1.6.7", + "axios": "1.6.8", "bcrypt": "5.1.1", "class-transformer": "0.5.1", "class-validator": "0.14.1", @@ -150,7 +153,7 @@ "keyv": "4.5.4", "knex": "3.1.0", "lodash": "4.17.21", - "markdown-it": "14.0.0", + "markdown-it": "14.1.0", "markdown-it-sanitizer": "0.4.3", "mime-types": "2.1.35", "minio": "7.1.3", @@ -158,14 +161,16 @@ "multer": "1.4.5-lts.1", "nanoid": "3.3.7", "nest-knexjs": "0.0.21", - "nestjs-cls": "4.2.0", + "nestjs-cls": "4.2.1", "nestjs-pino": "4.0.0", "nestjs-redoc": "2.2.2", "next": "14.1.3", "node-fetch": "2.7.0", - "nodemailer": "6.9.11", + "nodemailer": "6.9.12", "papaparse": "5.4.1", "passport": "0.7.0", + "passport-github2": "0.1.12", + "passport-google-oauth20": "2.0.0", "passport-jwt": "4.0.1", "passport-local": "1.0.0", "pause": "0.1.0", @@ -179,6 +184,7 @@ "transliteration": "2.3.5", "ts-pattern": "5.0.8", "ws": "8.16.0", + "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.1/xlsx-0.20.1.tgz", "zod": "3.22.4", "zod-validation-error": "3.0.3" } diff --git a/apps/nestjs-backend/src/cache/types.ts b/apps/nestjs-backend/src/cache/types.ts index fb93ac80c..ef1fa3bcf 100644 --- a/apps/nestjs-backend/src/cache/types.ts +++ b/apps/nestjs-backend/src/cache/types.ts @@ -9,6 +9,8 @@ export interface ICacheStore { [key: `auth:session-store:${string}`]: ISessionData; [key: `auth:session-user:${string}`]: Record; [key: `auth:session-expire:${string}`]: boolean; + [key: `oauth2:${string}`]: IOauth2State; + [key: `reset-password-email:${string}`]: IResetPasswordEmailCache; } export interface IAttachmentSignatureCache { @@ -33,3 +35,11 @@ export interface IAttachmentPreviewCache { url: string; expiresIn: number; } + +export interface IOauth2State { + redirectUri?: string; +} + +export interface IResetPasswordEmailCache { + userId: string; +} diff --git a/apps/nestjs-backend/src/configs/auth.config.ts b/apps/nestjs-backend/src/configs/auth.config.ts index 51e3c7b19..198daf44e 100644 --- a/apps/nestjs-backend/src/configs/auth.config.ts +++ b/apps/nestjs-backend/src/configs/auth.config.ts @@ -22,6 +22,17 @@ export const authConfig = registerAs('auth', () => ({ iv: process.env.BACKEND_ACCESS_TOKEN_ENCRYPTION_IV ?? 'i0vKGXBWkzyAoGf4', }, }, + resetPasswordEmailExpiresIn: process.env.BACKEND_RESET_PASSWORD_EMAIL_EXPIRES_IN ?? '30m', + socialAuthProviders: process.env.SOCIAL_AUTH_PROVIDERS?.split(',') ?? [], + github: { + clientID: process.env.BACKEND_GITHUB_CLIENT_ID, + clientSecret: process.env.BACKEND_GITHUB_CLIENT_SECRET, + }, + google: { + clientID: process.env.BACKEND_GOOGLE_CLIENT_ID, + clientSecret: process.env.BACKEND_GOOGLE_CLIENT_SECRET, + callbackURL: process.env.BACKEND_GOOGLE_CALLBACK_URL, + }, })); export const AuthConfig = () => Inject(authConfig.KEY); diff --git a/apps/nestjs-backend/src/configs/base.config.ts b/apps/nestjs-backend/src/configs/base.config.ts index 8de8a85f5..e7e404cc3 100644 --- a/apps/nestjs-backend/src/configs/base.config.ts +++ b/apps/nestjs-backend/src/configs/base.config.ts @@ -9,7 +9,7 @@ export const baseConfig = registerAs('base', () => ({ assetPrefix: process.env.ASSET_PREFIX ?? process.env.PUBLIC_ORIGIN!, storagePrefix: process.env.STORAGE_PREFIX ?? process.env.PUBLIC_ORIGIN!, secretKey: process.env.SECRET_KEY ?? 'defaultSecretKey', - publicDatabaseAddress: process.env.PUBLIC_DATABASE_ADDRESS, + publicDatabaseProxy: process.env.PUBLIC_DATABASE_PROXY, defaultMaxBaseDBConnections: Number(process.env.DEFAULT_MAX_BASE_DB_CONNECTIONS ?? 3), templateSpaceId: process.env.TEMPLATE_SPACE_ID, })); diff --git a/apps/nestjs-backend/src/configs/env.validation.schema.ts b/apps/nestjs-backend/src/configs/env.validation.schema.ts index 9c7eb5b04..7006ae99a 100644 --- a/apps/nestjs-backend/src/configs/env.validation.schema.ts +++ b/apps/nestjs-backend/src/configs/env.validation.schema.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/naming-convention */ import Joi from 'joi'; export const envValidationSchema = Joi.object({ @@ -37,4 +38,23 @@ export const envValidationSchema = Joi.object({ .pattern(/^(redis:\/\/|rediss:\/\/)/) .message('Cache `redis` the URI must start with the protocol `redis://` or `rediss://`'), }), + // github auth + BACKEND_GITHUB_CLIENT_ID: Joi.when('SOCIAL_AUTH_PROVIDERS', { + is: Joi.string() + .regex(/(^|,)(github)(,|$)/) + .required(), + then: Joi.string().required().messages({ + 'any.required': + 'The `BACKEND_GITHUB_CLIENT_ID` is required when `SOCIAL_AUTH_PROVIDERS` includes `github`', + }), + }), + BACKEND_GITHUB_CLIENT_SECRET: Joi.when('SOCIAL_AUTH_PROVIDERS', { + is: Joi.string() + .regex(/(^|,)(github)(,|$)/) + .required(), + then: Joi.string().required().messages({ + 'any.required': + 'The `BACKEND_GITHUB_CLIENT_SECRET` is required when `SOCIAL_AUTH_PROVIDERS` includes `github`', + }), + }), }); diff --git a/apps/nestjs-backend/src/configs/threshold.config.ts b/apps/nestjs-backend/src/configs/threshold.config.ts index 39d30018a..f300c4c68 100644 --- a/apps/nestjs-backend/src/configs/threshold.config.ts +++ b/apps/nestjs-backend/src/configs/threshold.config.ts @@ -5,13 +5,14 @@ import { registerAs } from '@nestjs/config'; export const thresholdConfig = registerAs('threshold', () => ({ maxCopyCells: Number(process.env.MAX_COPY_CELLS ?? 50_000), - maxResetCells: Number(process.env.MAX_RESET_CELLS ?? 10_000), - maxPasteCells: Number(process.env.MAX_PASTE_CELLS ?? 10_000), + maxResetCells: Number(process.env.MAX_RESET_CELLS ?? 50_000), + maxPasteCells: Number(process.env.MAX_PASTE_CELLS ?? 50_000), maxReadRows: Number(process.env.MAX_READ_ROWS ?? 10_000), maxDeleteRows: Number(process.env.MAX_DELETE_ROWS ?? 1_000), maxSyncUpdateCells: Number(process.env.MAX_SYNC_UPDATE_CELLS ?? 10_000), maxGroupPoints: Number(process.env.MAX_GROUP_POINTS ?? 5_000), calcChunkSize: Number(process.env.CALC_CHUNK_SIZE ?? 1_000), + maxFreeRowLimit: Number(process.env.MAX_FREE_ROW_LIMIT ?? 0), estimateCalcCelPerMs: Number(process.env.ESTIMATE_CALC_CEL_PER_MS ?? 3), bigTransactionTimeout: Number( process.env.BIG_TRANSACTION_TIMEOUT ?? 10 * 60 * 1000 /* 10 mins */ diff --git a/apps/nestjs-backend/src/db-provider/db.provider.interface.ts b/apps/nestjs-backend/src/db-provider/db.provider.interface.ts index e1db427bf..de7c73377 100644 --- a/apps/nestjs-backend/src/db-provider/db.provider.interface.ts +++ b/apps/nestjs-backend/src/db-provider/db.provider.interface.ts @@ -1,4 +1,5 @@ import type { DriverClient, IAggregationField, IFilter, ISortItem } from '@teable/core'; +import type { Prisma } from '@teable/db-main-prisma'; import type { Knex } from 'knex'; import type { IFieldInstance } from '../features/field/model/factory'; import type { SchemaType } from '../features/field/util'; @@ -29,13 +30,19 @@ export interface IDbProvider { dropTable(tableName: string): string; - renameColumnName(tableName: string, oldName: string, newName: string): string[]; + renameColumn(tableName: string, oldName: string, newName: string): string[]; dropColumn(tableName: string, columnName: string): string[]; // sql response format: { name: string }[], name for columnName. columnInfo(tableName: string): string; + checkColumnExist( + tableName: string, + columnName: string, + prisma: Prisma.TransactionClient + ): Promise; + dropColumnAndIndex(tableName: string, columnName: string, indexName: string): string[]; modifyColumnSchema(tableName: string, columnName: string, schemaType: SchemaType): string[]; diff --git a/apps/nestjs-backend/src/db-provider/postgres.provider.ts b/apps/nestjs-backend/src/db-provider/postgres.provider.ts index a82fb9972..50d9e8c18 100644 --- a/apps/nestjs-backend/src/db-provider/postgres.provider.ts +++ b/apps/nestjs-backend/src/db-provider/postgres.provider.ts @@ -1,6 +1,7 @@ import { Logger } from '@nestjs/common'; import type { IAggregationField, IFilter, ISortItem } from '@teable/core'; import { DriverClient } from '@teable/core'; +import type { PrismaClient } from '@teable/db-main-prisma'; import type { Knex } from 'knex'; import type { IFieldInstance } from '../features/field/model/factory'; import type { SchemaType } from '../features/field/util'; @@ -42,11 +43,26 @@ export class PostgresProvider implements IDbProvider { } dropTable(tableName: string): string { + return this.knex.raw('DROP TABLE ??', [tableName]).toQuery(); + } + + async checkColumnExist( + tableName: string, + columnName: string, + prisma: PrismaClient + ): Promise { const [schemaName, dbTableName] = this.splitTableName(tableName); - return this.knex.raw('DROP TABLE ??.??', [schemaName, dbTableName]).toQuery(); + const sql = this.knex + .raw( + 'SELECT EXISTS (SELECT FROM information_schema.columns WHERE table_schema = ? AND table_name = ? AND column_name = ?) AS exists', + [schemaName, dbTableName, columnName] + ) + .toQuery(); + const res = await prisma.$queryRawUnsafe<{ exists: boolean }[]>(sql); + return res[0].exists; } - renameColumnName(tableName: string, oldName: string, newName: string): string[] { + renameColumn(tableName: string, oldName: string, newName: string): string[] { return this.knex.schema .alterTable(tableName, (table) => { table.renameColumn(oldName, newName); diff --git a/apps/nestjs-backend/src/db-provider/sqlite.provider.ts b/apps/nestjs-backend/src/db-provider/sqlite.provider.ts index bfbfa4c00..99846ef03 100644 --- a/apps/nestjs-backend/src/db-provider/sqlite.provider.ts +++ b/apps/nestjs-backend/src/db-provider/sqlite.provider.ts @@ -2,6 +2,7 @@ import { Logger } from '@nestjs/common'; import type { IAggregationField, IFilter, ISortItem } from '@teable/core'; import { DriverClient } from '@teable/core'; +import type { PrismaClient } from '@teable/db-main-prisma'; import type { Knex } from 'knex'; import type { IFieldInstance } from '../features/field/model/factory'; import type { SchemaType } from '../features/field/util'; @@ -41,7 +42,17 @@ export class SqliteProvider implements IDbProvider { return this.knex.raw('DROP TABLE ??', [tableName]).toQuery(); } - renameColumnName(tableName: string, oldName: string, newName: string): string[] { + async checkColumnExist( + tableName: string, + columnName: string, + prisma: PrismaClient + ): Promise { + const sql = this.columnInfo(tableName); + const columns = await prisma.$queryRawUnsafe<{ name: string }[]>(sql); + return columns.some((column) => column.name === columnName); + } + + renameColumn(tableName: string, oldName: string, newName: string): string[] { return [ this.knex .raw('ALTER TABLE ?? RENAME COLUMN ?? TO ??', [tableName, oldName, newName]) diff --git a/apps/nestjs-backend/src/event-emitter/events/table/record.event.ts b/apps/nestjs-backend/src/event-emitter/events/table/record.event.ts index d86960490..0bd1c5ded 100644 --- a/apps/nestjs-backend/src/event-emitter/events/table/record.event.ts +++ b/apps/nestjs-backend/src/event-emitter/events/table/record.event.ts @@ -6,10 +6,7 @@ import { Events } from '../event.enum'; import type { IChangeValue } from '../op-event'; import { OpEvent } from '../op-event'; -export type IChangeRecord = Record< - keyof Pick, - Record -> & { +export type IChangeRecord = Record, Record> & { id: string; }; diff --git a/apps/nestjs-backend/src/features/attachments/attachments-table.service.spec.ts b/apps/nestjs-backend/src/features/attachments/attachments-table.service.spec.ts index 34279a13b..95895477a 100644 --- a/apps/nestjs-backend/src/features/attachments/attachments-table.service.spec.ts +++ b/apps/nestjs-backend/src/features/attachments/attachments-table.service.spec.ts @@ -94,12 +94,10 @@ describe('AttachmentsService', () => { const records: IRecord[] = [ { id: 'record1', - recordOrder: {}, fields: {}, }, { id: 'record2', - recordOrder: {}, fields: { field1: mockAttachmentCellValue, }, @@ -129,7 +127,6 @@ describe('AttachmentsService', () => { oldValue: null, }, }, - recordOrder: {}, }, ]; @@ -176,7 +173,6 @@ describe('AttachmentsService', () => { oldValue: mockOldAttachmentCellValue.slice(0, 1), }, }, - recordOrder: {}, }, { id: 'record2', @@ -186,7 +182,6 @@ describe('AttachmentsService', () => { oldValue: mockOldAttachmentCellValue.slice(1), }, }, - recordOrder: {}, }, ]; diff --git a/apps/nestjs-backend/src/features/attachments/plugins/adapter.ts b/apps/nestjs-backend/src/features/attachments/plugins/adapter.ts index dda337bdb..dab575977 100644 --- a/apps/nestjs-backend/src/features/attachments/plugins/adapter.ts +++ b/apps/nestjs-backend/src/features/attachments/plugins/adapter.ts @@ -1,3 +1,4 @@ +import type { Readable as ReadableStream } from 'node:stream'; import { BadRequestException } from '@nestjs/common'; import { UploadType } from '@teable/openapi'; import { storageConfig } from '../../../configs/storage'; @@ -16,7 +17,7 @@ export default abstract class StorageAdapter { } }; - static readonly getDir = (type: UploadType) => { + static readonly getDir = (type: UploadType): string => { switch (type) { case UploadType.Table: return 'table'; @@ -79,7 +80,7 @@ export default abstract class StorageAdapter { path: string, filePath: string, metadata: Record - ): Promise; + ): Promise<{ hash: string; url: string }>; /** * uploadFile with file stream @@ -91,7 +92,7 @@ export default abstract class StorageAdapter { abstract uploadFile( bucket: string, path: string, - stream: Buffer, + stream: Buffer | ReadableStream, metadata?: Record - ): Promise; + ): Promise<{ hash: string; url: string }>; } diff --git a/apps/nestjs-backend/src/features/attachments/plugins/local.ts b/apps/nestjs-backend/src/features/attachments/plugins/local.ts index 4cd9111e8..089511817 100644 --- a/apps/nestjs-backend/src/features/attachments/plugins/local.ts +++ b/apps/nestjs-backend/src/features/attachments/plugins/local.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { createReadStream, createWriteStream } from 'fs'; -import { join, resolve, dirname } from 'path'; +import { type Readable as ReadableStream } from 'node:stream'; +import { join, resolve } from 'path'; import { BadRequestException, Injectable } from '@nestjs/common'; import { getRandomString } from '@teable/core'; import type { Request } from 'express'; @@ -8,6 +9,7 @@ import * as fse from 'fs-extra'; import sharp from 'sharp'; import { CacheService } from '../../../cache/cache.service'; import { IStorageConfig, StorageConfig } from '../../../configs/storage'; +import { FileUtils } from '../../../utils'; import { Encryptor } from '../../../utils/encryptor'; import { getFullStorageUrl } from '../../../utils/full-storage-url'; import { second } from '../../../utils/second'; @@ -229,22 +231,46 @@ export class LocalStorage implements StorageAdapter { filePath: string, _metadata: Record ) { - this.save(filePath, join(bucket, path)); - return join(this.readPath, bucket, path); + const hash = await FileUtils.getHash(filePath); + await this.save(filePath, join(bucket, path)); + return { + hash, + url: join(this.readPath, bucket, path), + }; } async uploadFile( bucket: string, path: string, - stream: Buffer, + stream: Buffer | ReadableStream, _metadata?: Record - ): Promise { - const distPath = resolve(this.storageDir); - const newFilePath = resolve(distPath, join(bucket, path)); - - await fse.ensureDir(dirname(newFilePath)); - - await fse.writeFile(newFilePath, stream); - return join(this.readPath, bucket, path); + ) { + const name = getRandomString(12); + const temPath = resolve(this.temporaryDir, name); + if (stream instanceof Buffer) { + await fse.writeFile(temPath, stream); + } else { + await new Promise((resolve, reject) => { + const writer = createWriteStream(temPath); + stream.pipe(writer); + stream.on('end', function () { + writer.end(); + writer.close(); + resolve(); + }); + stream.on('error', (err) => { + writer.end(); + writer.close(); + this.deleteFile(path); + reject(err); + }); + }); + } + const hash = await FileUtils.getHash(temPath); + await this.save(temPath, join(bucket, path)); + return { + hash, + url: join(this.readPath, bucket, path), + }; } } diff --git a/apps/nestjs-backend/src/features/attachments/plugins/minio.ts b/apps/nestjs-backend/src/features/attachments/plugins/minio.ts index 62264c8d6..c9f9300de 100644 --- a/apps/nestjs-backend/src/features/attachments/plugins/minio.ts +++ b/apps/nestjs-backend/src/features/attachments/plugins/minio.ts @@ -1,4 +1,5 @@ /* eslint-disable @typescript-eslint/naming-convention */ +import type { Readable as ReadableStream } from 'node:stream'; import { join } from 'path'; import { BadRequestException, Injectable } from '@nestjs/common'; import { getRandomString } from '@teable/core'; @@ -101,17 +102,23 @@ export class MinioStorage implements StorageAdapter { filePath: string, metadata: Record ) { - await this.minioClient.fPutObject(bucket, path, filePath, metadata); - return `/${bucket}/${path}`; + const { etag: hash } = await this.minioClient.fPutObject(bucket, path, filePath, metadata); + return { + hash, + url: `/${bucket}/${path}`, + }; } async uploadFile( bucket: string, path: string, - stream: Buffer, + stream: Buffer | ReadableStream, metadata?: Record - ): Promise { - await this.minioClient.putObject(bucket, path, stream, metadata); - return `/${bucket}/${path}`; + ) { + const { etag: hash } = await this.minioClient.putObject(bucket, path, stream, metadata); + return { + hash, + url: `/${bucket}/${path}`, + }; } } diff --git a/apps/nestjs-backend/src/features/auth/auth.controller.ts b/apps/nestjs-backend/src/features/auth/auth.controller.ts index 60bc89bad..3b53d709c 100644 --- a/apps/nestjs-backend/src/features/auth/auth.controller.ts +++ b/apps/nestjs-backend/src/features/auth/auth.controller.ts @@ -1,5 +1,16 @@ import { Body, Controller, Get, HttpCode, Patch, Post, Req, Res, UseGuards } from '@nestjs/common'; -import { IChangePasswordRo, ISignup, changePasswordRoSchema, signupSchema } from '@teable/openapi'; +import { + IAddPasswordRo, + IChangePasswordRo, + IResetPasswordRo, + ISendResetPasswordEmailRo, + ISignup, + addPasswordRoSchema, + changePasswordRoSchema, + resetPasswordRoSchema, + sendResetPasswordEmailRoSchema, + signupSchema, +} from '@teable/openapi'; import { Response, Request } from 'express'; import { AUTH_SESSION_COOKIE_NAME } from '../../const'; import { ZodValidationPipe } from '../../zod.validation.pipe'; @@ -57,4 +68,23 @@ export class AuthController { await this.authService.signout(req); res.clearCookie(AUTH_SESSION_COOKIE_NAME); } + + @Post('/send-reset-password-email') + @Public() + async sendResetPasswordEmail( + @Body(new ZodValidationPipe(sendResetPasswordEmailRoSchema)) body: ISendResetPasswordEmailRo + ) { + return this.authService.sendResetPasswordEmail(body.email); + } + + @Post('/reset-password') + @Public() + async resetPassword(@Body(new ZodValidationPipe(resetPasswordRoSchema)) body: IResetPasswordRo) { + return this.authService.resetPassword(body.code, body.password); + } + + @Post('/add-password') + async addPassword(@Body(new ZodValidationPipe(addPasswordRoSchema)) body: IAddPasswordRo) { + return this.authService.addPassword(body.password); + } } diff --git a/apps/nestjs-backend/src/features/auth/auth.module.ts b/apps/nestjs-backend/src/features/auth/auth.module.ts index 87fa34977..4021acd17 100644 --- a/apps/nestjs-backend/src/features/auth/auth.module.ts +++ b/apps/nestjs-backend/src/features/auth/auth.module.ts @@ -9,6 +9,7 @@ import { AuthGuard } from './guard/auth.guard'; import { SessionStoreService } from './session/session-store.service'; import { SessionModule } from './session/session.module'; import { SessionSerializer } from './session/session.serializer'; +import { SocialModule } from './social/social.module'; import { AccessTokenStrategy } from './strategies/access-token.strategy'; import { LocalStrategy } from './strategies/local.strategy'; import { SessionStrategy } from './strategies/session.strategy'; @@ -19,6 +20,7 @@ import { SessionStrategy } from './strategies/session.strategy'; PassportModule.register({ session: true }), SessionModule, AccessTokenModule, + SocialModule, ], providers: [ AuthService, diff --git a/apps/nestjs-backend/src/features/auth/auth.service.ts b/apps/nestjs-backend/src/features/auth/auth.service.ts index 3c4681b41..7551b3a74 100644 --- a/apps/nestjs-backend/src/features/auth/auth.service.ts +++ b/apps/nestjs-backend/src/features/auth/auth.service.ts @@ -1,16 +1,15 @@ -import { - BadRequestException, - HttpException, - HttpStatus, - Injectable, - InternalServerErrorException, -} from '@nestjs/common'; -import { generateUserId } from '@teable/core'; +import { BadRequestException, HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { generateUserId, getRandomString } from '@teable/core'; import { PrismaService } from '@teable/db-main-prisma'; import type { IChangePasswordRo } from '@teable/openapi'; import * as bcrypt from 'bcrypt'; import { ClsService } from 'nestjs-cls'; +import { CacheService } from '../../cache/cache.service'; +import { AuthConfig, type IAuthConfig } from '../../configs/auth.config'; +import { MailConfig, type IMailConfig } from '../../configs/mail.config'; import type { IClsStore } from '../../types/cls'; +import { second } from '../../utils/second'; +import { MailSenderService } from '../mail-sender/mail-sender.service'; import { UserService } from '../user/user.service'; import { SessionStoreService } from './session/session-store.service'; @@ -20,7 +19,11 @@ export class AuthService { private readonly prismaService: PrismaService, private readonly userService: UserService, private readonly cls: ClsService, - private readonly sessionStoreService: SessionStoreService + private readonly sessionStoreService: SessionStoreService, + private readonly mailSenderService: MailSenderService, + private readonly cacheService: CacheService, + @AuthConfig() private readonly authConfig: IAuthConfig, + @MailConfig() private readonly mailConfig: IMailConfig ) {} private async encodePassword(password: string) { @@ -38,13 +41,21 @@ export class AuthService { return _hashPassword === hashPassword; } + private async getUserByIdOrThrow(userId: string) { + const user = await this.userService.getUserById(userId); + if (!user) { + throw new BadRequestException('User not found'); + } + return user; + } + async validateUserByEmail(email: string, pass: string) { const user = await this.userService.getUserByEmail(email); - if (user) { - const { password, salt, ...result } = user; - return (await this.comparePassword(pass, password, salt)) ? result : null; + if (!user) { + throw new BadRequestException(`${email} not registered`); } - return null; + const { password, salt, ...result } = user; + return (await this.comparePassword(pass, password, salt)) ? { ...result, password } : null; } async signup(email: string, password: string) { @@ -53,13 +64,15 @@ export class AuthService { throw new HttpException(`User ${email} is already registered`, HttpStatus.BAD_REQUEST); } const { salt, hashPassword } = await this.encodePassword(password); - return await this.userService.createUser({ - id: generateUserId(), - name: email.split('@')[0], - email, - salt, - password: hashPassword, - lastSignTime: new Date().toISOString(), + return await this.prismaService.$tx(async () => { + return await this.userService.createUser({ + id: generateUserId(), + name: email.split('@')[0], + email, + salt, + password: hashPassword, + lastSignTime: new Date().toISOString(), + }); }); } @@ -78,10 +91,8 @@ export class AuthService { async changePassword({ password, newPassword }: IChangePasswordRo) { const userId = this.cls.get('user.id'); - const user = await this.userService.getUserById(userId); - if (!user) { - throw new InternalServerErrorException('User not found'); - } + const user = await this.getUserByIdOrThrow(userId); + const { password: currentHashPassword, salt } = user; if (!(await this.comparePassword(password, currentHashPassword, salt))) { throw new BadRequestException('Password is incorrect'); @@ -104,4 +115,62 @@ export class AuthService { data: { lastSignTime: new Date().toISOString() }, }); } + + async sendResetPasswordEmail(email: string) { + const user = await this.userService.getUserByEmail(email); + if (!user) { + throw new BadRequestException('Email is not registered'); + } + const resetPasswordCode = getRandomString(30); + + const url = `${this.mailConfig.origin}/auth/reset-password?code=${resetPasswordCode}`; + const resetPasswordEmailOptions = this.mailSenderService.resetPasswordEmailOptions({ + name: user.name, + email: user.email, + resetPasswordUrl: url, + }); + await this.mailSenderService.sendMail({ + to: user.email, + ...resetPasswordEmailOptions, + }); + await this.cacheService.set( + `reset-password-email:${resetPasswordCode}`, + { userId: user.id }, + second(this.authConfig.resetPasswordEmailExpiresIn) + ); + } + + async resetPassword(code: string, newPassword: string) { + const resetPasswordEmail = await this.cacheService.get(`reset-password-email:${code}`); + if (!resetPasswordEmail) { + throw new BadRequestException('Token is invalid'); + } + const { userId } = resetPasswordEmail; + const { salt, hashPassword } = await this.encodePassword(newPassword); + await this.prismaService.txClient().user.update({ + where: { id: userId, deletedTime: null }, + data: { + password: hashPassword, + salt, + }, + }); + await this.cacheService.del(`reset-password-email:${code}`); + } + + async addPassword(newPassword: string) { + const userId = this.cls.get('user.id'); + const user = await this.getUserByIdOrThrow(userId); + + if (user.password) { + throw new BadRequestException('Password is already set'); + } + const { salt, hashPassword } = await this.encodePassword(newPassword); + await this.prismaService.txClient().user.update({ + where: { id: userId, deletedTime: null, password: null }, + data: { + password: hashPassword, + salt, + }, + }); + } } diff --git a/apps/nestjs-backend/src/features/auth/guard/github.guard.ts b/apps/nestjs-backend/src/features/auth/guard/github.guard.ts new file mode 100644 index 000000000..854767558 --- /dev/null +++ b/apps/nestjs-backend/src/features/auth/guard/github.guard.ts @@ -0,0 +1,5 @@ +import { Injectable } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; + +@Injectable() +export class GithubGuard extends AuthGuard('github') {} diff --git a/apps/nestjs-backend/src/features/auth/guard/google.guard.ts b/apps/nestjs-backend/src/features/auth/guard/google.guard.ts new file mode 100644 index 000000000..df6096776 --- /dev/null +++ b/apps/nestjs-backend/src/features/auth/guard/google.guard.ts @@ -0,0 +1,5 @@ +import { Injectable } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; + +@Injectable() +export class GoogleGuard extends AuthGuard('google') {} diff --git a/apps/nestjs-backend/src/features/auth/oauth/oauth.store.ts b/apps/nestjs-backend/src/features/auth/oauth/oauth.store.ts new file mode 100644 index 000000000..5ba364af1 --- /dev/null +++ b/apps/nestjs-backend/src/features/auth/oauth/oauth.store.ts @@ -0,0 +1,39 @@ +import { Injectable } from '@nestjs/common'; +import { getRandomString } from '@teable/core'; +import type { Request } from 'express'; +import { CacheService } from '../../../cache/cache.service'; +import type { IOauth2State } from '../../../cache/types'; +import { second } from '../../../utils/second'; + +@Injectable() +export class OauthStoreService { + key: string = 'oauth2:'; + + constructor(private readonly cacheService: CacheService) {} + + async store(req: Request, callback: (err: unknown, stateId: string) => void) { + const random = getRandomString(16); + await this.cacheService.set( + `oauth2:${random}`, + { + redirectUri: req.query.redirect_uri as string, + }, + second('12h') + ); + callback(null, random); + } + + async verify( + _req: unknown, + stateId: string, + callback: (err: unknown, ok: boolean, state: IOauth2State | string) => void + ) { + const state = await this.cacheService.get(`oauth2:${stateId}`); + if (state) { + await this.cacheService.del(`oauth2:${stateId}`); + callback(null, true, state); + } else { + callback(null, false, 'Invalid authorization request state'); + } + } +} diff --git a/apps/nestjs-backend/src/features/auth/social/github/github.controller.ts b/apps/nestjs-backend/src/features/auth/social/github/github.controller.ts new file mode 100644 index 000000000..b857c2f59 --- /dev/null +++ b/apps/nestjs-backend/src/features/auth/social/github/github.controller.ts @@ -0,0 +1,27 @@ +import { Controller, Get, Req, Res, UseGuards } from '@nestjs/common'; +import { Response } from 'express'; +import type { IOauth2State } from '../../../../cache/types'; +import { Public } from '../../decorators/public.decorator'; +import { GithubGuard } from '../../guard/github.guard'; + +@Controller('api/auth') +export class GithubController { + @Get('/github') + @Public() + @UseGuards(GithubGuard) + // eslint-disable-next-line @typescript-eslint/no-empty-function + async githubAuthenticate() {} + + @Get('/github/callback') + @Public() + @UseGuards(GithubGuard) + async githubCallback(@Req() req: Express.Request, @Res({ passthrough: true }) res: Response) { + const user = req.user!; + // set cookie, passport login + await new Promise((resolve, reject) => { + req.login(user, (err) => (err ? reject(err) : resolve())); + }); + const redirectUri = (req.authInfo as { state: IOauth2State })?.state?.redirectUri; + return res.redirect(redirectUri || '/'); + } +} diff --git a/apps/nestjs-backend/src/features/auth/social/github/github.module.ts b/apps/nestjs-backend/src/features/auth/social/github/github.module.ts new file mode 100644 index 000000000..15989d179 --- /dev/null +++ b/apps/nestjs-backend/src/features/auth/social/github/github.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { UserModule } from '../../../user/user.module'; +import { OauthStoreService } from '../../oauth/oauth.store'; +import { GithubStrategy } from '../../strategies/github.strategy'; +import { GithubController } from './github.controller'; + +@Module({ + imports: [UserModule], + providers: [GithubStrategy, OauthStoreService], + exports: [], + controllers: [GithubController], +}) +export class GithubModule {} diff --git a/apps/nestjs-backend/src/features/auth/social/google/google.controller.ts b/apps/nestjs-backend/src/features/auth/social/google/google.controller.ts new file mode 100644 index 000000000..3ac45eb8e --- /dev/null +++ b/apps/nestjs-backend/src/features/auth/social/google/google.controller.ts @@ -0,0 +1,27 @@ +import { Controller, Get, Req, Res, UseGuards } from '@nestjs/common'; +import { Response } from 'express'; +import type { IOauth2State } from '../../../../cache/types'; +import { Public } from '../../decorators/public.decorator'; +import { GoogleGuard } from '../../guard/google.guard'; + +@Controller('api/auth') +export class GoogleController { + @Get('/google') + @Public() + @UseGuards(GoogleGuard) + // eslint-disable-next-line @typescript-eslint/no-empty-function + async googleAuthenticate() {} + + @Get('/google/callback') + @Public() + @UseGuards(GoogleGuard) + async googleCallback(@Req() req: Express.Request, @Res({ passthrough: true }) res: Response) { + const user = req.user!; + // set cookie, passport login + await new Promise((resolve, reject) => { + req.login(user, (err) => (err ? reject(err) : resolve())); + }); + const redirectUri = (req.authInfo as { state: IOauth2State })?.state?.redirectUri; + return res.redirect(redirectUri || '/'); + } +} diff --git a/apps/nestjs-backend/src/features/auth/social/google/google.module.ts b/apps/nestjs-backend/src/features/auth/social/google/google.module.ts new file mode 100644 index 000000000..72caef1c7 --- /dev/null +++ b/apps/nestjs-backend/src/features/auth/social/google/google.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { UserModule } from '../../../user/user.module'; +import { OauthStoreService } from '../../oauth/oauth.store'; +import { GoogleStrategy } from '../../strategies/google.strategy'; +import { GoogleController } from './google.controller'; + +@Module({ + imports: [UserModule], + providers: [GoogleStrategy, OauthStoreService], + exports: [], + controllers: [GoogleController], +}) +export class GoogleModule {} diff --git a/apps/nestjs-backend/src/features/auth/social/social.module.ts b/apps/nestjs-backend/src/features/auth/social/social.module.ts new file mode 100644 index 000000000..e6fb3394c --- /dev/null +++ b/apps/nestjs-backend/src/features/auth/social/social.module.ts @@ -0,0 +1,16 @@ +import { Module } from '@nestjs/common'; +import { ConditionalModule } from '@nestjs/config'; +import { GithubModule } from './github/github.module'; +import { GoogleModule } from './google/google.module'; + +@Module({ + imports: [ + ConditionalModule.registerWhen(GithubModule, (env) => { + return Boolean(env.SOCIAL_AUTH_PROVIDERS?.split(',')?.includes('github')); + }), + ConditionalModule.registerWhen(GoogleModule, (env) => { + return Boolean(env.SOCIAL_AUTH_PROVIDERS?.split(',')?.includes('google')); + }), + ], +}) +export class SocialModule {} diff --git a/apps/nestjs-backend/src/features/auth/strategies/github.strategy.ts b/apps/nestjs-backend/src/features/auth/strategies/github.strategy.ts new file mode 100644 index 000000000..2dbf42acc --- /dev/null +++ b/apps/nestjs-backend/src/features/auth/strategies/github.strategy.ts @@ -0,0 +1,47 @@ +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { ConfigType } from '@nestjs/config'; +import { PassportStrategy } from '@nestjs/passport'; +import type { Profile } from 'passport-github2'; +import { Strategy } from 'passport-github2'; +import { AuthConfig } from '../../../configs/auth.config'; +import type { authConfig } from '../../../configs/auth.config'; +import { UserService } from '../../user/user.service'; +import { OauthStoreService } from '../oauth/oauth.store'; +import { pickUserMe } from '../utils'; + +@Injectable() +export class GithubStrategy extends PassportStrategy(Strategy, 'github') { + constructor( + @AuthConfig() readonly config: ConfigType, + private usersService: UserService, + oauthStoreService: OauthStoreService + ) { + const { clientID, clientSecret } = config.github; + super({ + clientID, + clientSecret, + state: true, + store: oauthStoreService, + }); + } + + async validate(_accessToken: string, _refreshToken: string, profile: Profile) { + const { id, emails, displayName, photos } = profile; + const email = emails?.[0].value; + if (!email) { + throw new UnauthorizedException('No email provided from GitHub'); + } + const user = await this.usersService.findOrCreateUser({ + name: displayName, + email, + provider: 'github', + providerId: id, + type: 'oauth', + avatarUrl: photos?.[0].value, + }); + if (!user) { + throw new UnauthorizedException('Failed to create user from GitHub profile'); + } + return pickUserMe(user); + } +} diff --git a/apps/nestjs-backend/src/features/auth/strategies/google.strategy.ts b/apps/nestjs-backend/src/features/auth/strategies/google.strategy.ts new file mode 100644 index 000000000..8c0674fe2 --- /dev/null +++ b/apps/nestjs-backend/src/features/auth/strategies/google.strategy.ts @@ -0,0 +1,49 @@ +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { ConfigType } from '@nestjs/config'; +import { PassportStrategy } from '@nestjs/passport'; +import type { Profile } from 'passport-google-oauth20'; +import { Strategy } from 'passport-google-oauth20'; +import { AuthConfig } from '../../../configs/auth.config'; +import type { authConfig } from '../../../configs/auth.config'; +import { UserService } from '../../user/user.service'; +import { OauthStoreService } from '../oauth/oauth.store'; +import { pickUserMe } from '../utils'; + +@Injectable() +export class GoogleStrategy extends PassportStrategy(Strategy, 'google') { + constructor( + @AuthConfig() readonly config: ConfigType, + private usersService: UserService, + oauthStoreService: OauthStoreService + ) { + const { clientID, clientSecret, callbackURL } = config.google; + super({ + clientID, + clientSecret, + state: true, + store: oauthStoreService, + scope: ['profile', 'email'], + callbackURL, + }); + } + + async validate(_accessToken: string, _refreshToken: string, profile: Profile) { + const { id, emails, displayName, photos } = profile; + const email = emails?.[0].value; + if (!email) { + throw new UnauthorizedException('No email provided from Google'); + } + const user = await this.usersService.findOrCreateUser({ + name: displayName, + email, + provider: 'google', + providerId: id, + type: 'oauth', + avatarUrl: photos?.[0].value, + }); + if (!user) { + throw new UnauthorizedException('Failed to create user from Google profile'); + } + return pickUserMe(user); + } +} diff --git a/apps/nestjs-backend/src/features/auth/utils.ts b/apps/nestjs-backend/src/features/auth/utils.ts index 1aebb1595..be2399b82 100644 --- a/apps/nestjs-backend/src/features/auth/utils.ts +++ b/apps/nestjs-backend/src/features/auth/utils.ts @@ -1,6 +1,21 @@ import type { Prisma } from '@teable/db-main-prisma'; +import type { IUserMeVo } from '@teable/openapi'; import { pick } from 'lodash'; +import { getFullStorageUrl } from '../../utils/full-storage-url'; -export const pickUserMe = (user: Partial>) => { - return pick(user, 'id', 'name', 'avatar', 'phone', 'email', 'notifyMeta'); +export const pickUserMe = ( + user: Pick< + Prisma.UserGetPayload, + 'id' | 'name' | 'avatar' | 'phone' | 'email' | 'password' | 'notifyMeta' + > +): IUserMeVo => { + return { + ...pick(user, 'id', 'name', 'phone', 'email'), + notifyMeta: typeof user.notifyMeta === 'object' ? user.notifyMeta : JSON.parse(user.notifyMeta), + avatar: + user.avatar && !user.avatar?.startsWith('http') + ? getFullStorageUrl(user.avatar) + : user.avatar, + hasPassword: user.password !== null, + }; }; diff --git a/apps/nestjs-backend/src/features/automation/actions/records/create-record/create-record.spec.ts b/apps/nestjs-backend/src/features/automation/actions/records/create-record/create-record.spec.ts index e2c33abee..eb154977c 100644 --- a/apps/nestjs-backend/src/features/automation/actions/records/create-record/create-record.spec.ts +++ b/apps/nestjs-backend/src/features/automation/actions/records/create-record/create-record.spec.ts @@ -8,7 +8,6 @@ import { generateBaseId, generateRecordId, generateTableId, - generateViewId, generateWorkflowActionId, } from '@teable/core'; import { vi } from 'vitest'; @@ -100,7 +99,6 @@ describe('Create-Record Action Test', () => { fields: { fldHrMYez5yIwBdKEiK: 'name: mockName', }, - recordOrder: { [generateViewId()]: 1 }, }, ], total: 1, diff --git a/apps/nestjs-backend/src/features/automation/actions/records/update-record/update-record.spec.ts b/apps/nestjs-backend/src/features/automation/actions/records/update-record/update-record.spec.ts index b657c53d4..645f4c3d5 100644 --- a/apps/nestjs-backend/src/features/automation/actions/records/update-record/update-record.spec.ts +++ b/apps/nestjs-backend/src/features/automation/actions/records/update-record/update-record.spec.ts @@ -94,12 +94,11 @@ describe('Update-Record Action Test', () => { ]) ); - vi.spyOn(recordOpenApiService, 'updateRecordById').mockImplementation( + vi.spyOn(recordOpenApiService, 'updateRecord').mockImplementation( (tableId, recordId, _updateRecordRo) => Promise.resolve({ id: recordId, fields: { [fieldId]: 'update: mockName' }, - recordOrder: { tableId: 1 }, }) ); diff --git a/apps/nestjs-backend/src/features/automation/actions/records/update-record/update-record.ts b/apps/nestjs-backend/src/features/automation/actions/records/update-record/update-record.ts index 2f2033a35..33c7a4f36 100644 --- a/apps/nestjs-backend/src/features/automation/actions/records/update-record/update-record.ts +++ b/apps/nestjs-backend/src/features/automation/actions/records/update-record/update-record.ts @@ -49,7 +49,7 @@ export class UpdateRecord extends ActionCore { let outPut: IActionResponse; await this.recordOpenApiService - .updateRecordById(tableId, recordId, updateData) + .updateRecord(tableId, recordId, updateData) .then((record) => { outPut = { data: record, status: ActionResponseStatus.OK }; }) diff --git a/apps/nestjs-backend/src/features/base/base-duplicate.service.ts b/apps/nestjs-backend/src/features/base/base-duplicate.service.ts index ca027623d..d5a16546e 100644 --- a/apps/nestjs-backend/src/features/base/base-duplicate.service.ts +++ b/apps/nestjs-backend/src/features/base/base-duplicate.service.ts @@ -270,7 +270,7 @@ export class BaseDuplicateService { const oldViewId = name.substring(ROW_ORDER_FIELD_PREFIX.length + 1); const newViewId = old2NewViewIdMap[oldViewId]; if (newViewId) { - const query = this.dbProvider.renameColumnName( + const query = this.dbProvider.renameColumn( dbTableName, name, `${ROW_ORDER_FIELD_PREFIX}_${newViewId}` diff --git a/apps/nestjs-backend/src/features/base/base.controller.ts b/apps/nestjs-backend/src/features/base/base.controller.ts index 09a76b2ab..34806fdfc 100644 --- a/apps/nestjs-backend/src/features/base/base.controller.ts +++ b/apps/nestjs-backend/src/features/base/base.controller.ts @@ -1,5 +1,5 @@ /* eslint-disable sonarjs/no-duplicate-string */ -import { Body, Controller, Delete, Get, Param, Patch, Post } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Patch, Post, Put } from '@nestjs/common'; import { createBaseRoSchema, duplicateBaseRoSchema, @@ -9,6 +9,8 @@ import { IDuplicateBaseRo, createBaseFromTemplateRoSchema, ICreateBaseFromTemplateRo, + updateOrderRoSchema, + IUpdateOrderRo, } from '@teable/openapi'; import type { ICreateBaseVo, @@ -56,7 +58,7 @@ export class BaseController { return await this.baseService.duplicateBase(duplicateBaseRo); } - @Post('createFromTemplate') + @Post('create-from-template') @Permissions('base|create') @ResourceMeta('spaceId', 'body') @EmitControllerEvent(Events.BASE_CREATE) @@ -78,6 +80,15 @@ export class BaseController { return await this.baseService.updateBase(baseId, updateBaseRo); } + @Put(':baseId/order') + @Permissions('base|update') + async updateOrder( + @Param('baseId') baseId: string, + @Body(new ZodValidationPipe(updateOrderRoSchema)) updateOrderRo: IUpdateOrderRo + ) { + return await this.baseService.updateOrder(baseId, updateOrderRo); + } + @Permissions('base|read') @Get(':baseId') async getBaseById(@Param('baseId') baseId: string): Promise { @@ -86,7 +97,7 @@ export class BaseController { @Get('access/all') async getAllBase(): Promise { - return await this.baseService.getBaseList(); + return await this.baseService.getAllBaseList(); } @Delete(':baseId') diff --git a/apps/nestjs-backend/src/features/base/base.service.ts b/apps/nestjs-backend/src/features/base/base.service.ts index 11ab1bc4d..d4e18c193 100644 --- a/apps/nestjs-backend/src/features/base/base.service.ts +++ b/apps/nestjs-backend/src/features/base/base.service.ts @@ -1,4 +1,4 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; +import { Injectable, Logger, NotFoundException } from '@nestjs/common'; import { generateBaseId } from '@teable/core'; import { PrismaService } from '@teable/db-main-prisma'; import type { @@ -6,18 +6,22 @@ import type { ICreateBaseRo, IDuplicateBaseRo, IUpdateBaseRo, + IUpdateOrderRo, } from '@teable/openapi'; import { ClsService } from 'nestjs-cls'; import { IThresholdConfig, ThresholdConfig } from '../../configs/threshold.config'; import { InjectDbProvider } from '../../db-provider/db.provider'; import { IDbProvider } from '../../db-provider/db.provider.interface'; import type { IClsStore } from '../../types/cls'; +import { updateOrder } from '../../utils/update-order'; import { PermissionService } from '../auth/permission.service'; import { CollaboratorService } from '../collaborator/collaborator.service'; import { BaseDuplicateService } from './base-duplicate.service'; @Injectable() export class BaseService { + private logger = new Logger(BaseService.name); + constructor( private readonly prismaService: PrismaService, private readonly cls: ClsService, @@ -37,7 +41,6 @@ export class BaseService { select: { id: true, name: true, - order: true, icon: true, spaceId: true, }, @@ -58,7 +61,7 @@ export class BaseService { }; } - async getBaseList() { + async getAllBaseList() { const userId = this.cls.get('user.id'); const { spaceIds, baseIds, roleMap } = await this.collaboratorService.getCollaboratorsBaseAndSpaceArray(userId); @@ -85,9 +88,7 @@ export class BaseService { }, ], }, - orderBy: { - createdTime: 'asc', - }, + orderBy: [{ spaceId: 'asc' }, { order: 'asc' }], }); return baseList.map((base) => ({ ...base, role: roleMap[base.id] || roleMap[base.spaceId] })); } @@ -105,8 +106,7 @@ export class BaseService { const { name, spaceId } = createBaseRo; return this.prismaService.$transaction(async (prisma) => { - const order = - createBaseRo.order == null ? (await this.getMaxOrder(spaceId)) + 1 : createBaseRo.order; + const order = (await this.getMaxOrder(spaceId)) + 1; const base = await prisma.base.create({ data: { @@ -121,7 +121,6 @@ export class BaseService { name: true, icon: true, spaceId: true, - order: true, }, }); @@ -148,7 +147,6 @@ export class BaseService { id: true, name: true, spaceId: true, - order: true, }, where: { id: baseId, @@ -157,6 +155,73 @@ export class BaseService { }); } + async shuffle(spaceId: string) { + const bases = await this.prismaService.base.findMany({ + where: { spaceId, deletedTime: null }, + select: { id: true }, + orderBy: { order: 'asc' }, + }); + + this.logger.log(`lucky base shuffle! ${spaceId}`, 'shuffle'); + + await this.prismaService.$tx(async (prisma) => { + for (let i = 0; i < bases.length; i++) { + const base = bases[i]; + await prisma.base.update({ + data: { order: i }, + where: { id: base.id }, + }); + } + }); + } + + async updateOrder(baseId: string, orderRo: IUpdateOrderRo) { + const { anchorId, position } = orderRo; + + const base = await this.prismaService.base + .findFirstOrThrow({ + select: { spaceId: true, order: true, id: true }, + where: { id: baseId, deletedTime: null }, + }) + .catch(() => { + throw new NotFoundException(`Base ${baseId} not found`); + }); + + const anchorBase = await this.prismaService.base + .findFirstOrThrow({ + select: { order: true, id: true }, + where: { spaceId: base.spaceId, id: anchorId, deletedTime: null }, + }) + .catch(() => { + throw new NotFoundException(`Anchor ${anchorId} not found`); + }); + + await updateOrder({ + parentId: base.spaceId, + position, + item: base, + anchorItem: anchorBase, + getNextItem: async (whereOrder, align) => { + return this.prismaService.base.findFirst({ + select: { order: true, id: true }, + where: { + spaceId: base.spaceId, + deletedTime: null, + order: whereOrder, + }, + orderBy: { order: align }, + }); + }, + update: async (_, id, data) => { + await this.prismaService.base.update({ + data: { order: data.newOrder }, + where: { id }, + }); + }, + shuffle: this.shuffle.bind(this), + }); + } + async deleteBase(baseId: string) { const userId = this.cls.get('user.id'); diff --git a/apps/nestjs-backend/src/features/base/db-connection.service.ts b/apps/nestjs-backend/src/features/base/db-connection.service.ts index 53ba9bd69..fa5a80918 100644 --- a/apps/nestjs-backend/src/features/base/db-connection.service.ts +++ b/apps/nestjs-backend/src/features/base/db-connection.service.ts @@ -117,11 +117,12 @@ export class DbConnectionService { } const readOnlyRole = `read_only_role_${baseId}`; - if (!this.baseConfig.publicDatabaseAddress) { - throw new NotFoundException('PUBLIC_DATABASE_ADDRESS is not found in env'); + const publicDatabaseProxy = this.baseConfig.publicDatabaseProxy; + if (!publicDatabaseProxy) { + throw new NotFoundException('PUBLIC_DATABASE_PROXY is not found in env'); } - const originDsn = parseDsn(this.baseConfig.publicDatabaseAddress); // Assuming parseDsn is already defined to parse the DSN + const { hostname: dbHostProxy, port: dbPortProxy } = new URL(`https://${publicDatabaseProxy}`); // Check if the base exists and the user is the owner const base = await this.prismaService.base.findFirst({ @@ -140,12 +141,15 @@ export class DbConnectionService { const currentConnections = await this.getConnectionCount(readOnlyRole); + const databaseUrl = this.configService.getOrThrow('PRISMA_DATABASE_URL'); + const { db } = parseDsn(databaseUrl); + // Construct the DSN for the read-only role const dsn: IDbConnectionVo['dsn'] = { driver: DriverClient.Pg, - host: originDsn.host, - port: originDsn.port, - db: originDsn.db, + host: dbHostProxy, + port: Number(dbPortProxy), + db: db, user: readOnlyRole, pass: base.schemaPass, params: { @@ -181,12 +185,16 @@ export class DbConnectionService { const readOnlyRole = `read_only_role_${baseId}`; const schemaName = baseId; const password = nanoid(); - const databaseUrl = this.baseConfig.publicDatabaseAddress; - if (!databaseUrl) { - throw new NotFoundException('PUBLIC_DATABASE_ADDRESS is not found in env'); + const publicDatabaseProxy = this.baseConfig.publicDatabaseProxy; + if (!publicDatabaseProxy) { + throw new NotFoundException('PUBLIC_DATABASE_PROXY is not found in env'); } - const originDsn = parseDsn(databaseUrl); + const { hostname: dbHostProxy, port: dbPortProxy } = new URL( + `https://${publicDatabaseProxy}` + ); + const databaseUrl = this.configService.getOrThrow('PRISMA_DATABASE_URL'); + const { db } = parseDsn(databaseUrl); return this.prismaService.$tx(async (prisma) => { await prisma.base @@ -233,9 +241,9 @@ export class DbConnectionService { const dsn: IDbConnectionVo['dsn'] = { driver: DriverClient.Pg, - host: originDsn.host, - port: originDsn.port, - db: originDsn.db, + host: dbHostProxy, + port: Number(dbPortProxy), + db: db, user: readOnlyRole, pass: password, params: { diff --git a/apps/nestjs-backend/src/features/calculation/reference.service.ts b/apps/nestjs-backend/src/features/calculation/reference.service.ts index a911f5e33..cb3adb130 100644 --- a/apps/nestjs-backend/src/features/calculation/reference.service.ts +++ b/apps/nestjs-backend/src/features/calculation/reference.service.ts @@ -5,7 +5,6 @@ import type { ILinkFieldOptions, IOtOperation, IRecord, - ITinyRecord, } from '@teable/core'; import { evaluate, FieldType, isMultiValueLink, RecordOpBuilder, Relationship } from '@teable/core'; import { PrismaService } from '@teable/db-main-prisma'; @@ -42,12 +41,12 @@ export interface IGraphItem { } export interface IRecordMap { - [recordId: string]: ITinyRecord; + [recordId: string]: IRecord; } export interface IRecordItem { - record: ITinyRecord; - dependencies?: ITinyRecord[]; + record: IRecord; + dependencies?: IRecord[]; } export interface IRecordData { @@ -510,7 +509,7 @@ export class ReferenceService { field: IFieldInstance, relationship: Relationship, lookupField: IFieldInstance, - record: ITinyRecord, + record: IRecord, lookupValues: unknown ): unknown { if (field.type !== FieldType.Link && field.type !== FieldType.Rollup) { @@ -674,7 +673,6 @@ export class ReferenceService { lastModifiedTime: (raw.__last_modified_time as Date)?.toISOString(), createdBy: raw.__created_by as string, lastModifiedBy: raw.__last_modified_by as string, - recordOrder: {}, }; } @@ -846,7 +844,7 @@ export class ReferenceService { recordItemMap: recordMap && Object.values(recordMap).reduce>((pre, record) => { - let dependencies: ITinyRecord[] | undefined; + let dependencies: IRecord[] | undefined; if (relatedItems) { const options = field.lookupOptions ? field.lookupOptions diff --git a/apps/nestjs-backend/src/features/field/field-calculate/field-supplement.service.ts b/apps/nestjs-backend/src/features/field/field-calculate/field-supplement.service.ts index 9869e8a0e..6d8139469 100644 --- a/apps/nestjs-backend/src/features/field/field-calculate/field-supplement.service.ts +++ b/apps/nestjs-backend/src/features/field/field-calculate/field-supplement.service.ts @@ -269,9 +269,13 @@ export class FieldSupplementService { private async prepareUpdateLinkField(tableId: string, fieldRo: IFieldRo, oldFieldVo: IFieldVo) { const newOptionsRo = fieldRo.options as ILinkFieldOptionsRo; const oldOptions = oldFieldVo.options as ILinkFieldOptions; + // isOneWay may be undefined or false, so we should convert it to boolean + const oldIsOneWay = Boolean(oldOptions.isOneWay); + const newIsOneWay = Boolean(newOptionsRo.isOneWay); if ( oldOptions.foreignTableId === newOptionsRo.foreignTableId && - oldOptions.relationship === newOptionsRo.relationship + oldOptions.relationship === newOptionsRo.relationship && + oldIsOneWay !== newIsOneWay ) { return { ...oldFieldVo, diff --git a/apps/nestjs-backend/src/features/field/field.service.ts b/apps/nestjs-backend/src/features/field/field.service.ts index 3d5773f58..5e82a0731 100644 --- a/apps/nestjs-backend/src/features/field/field.service.ts +++ b/apps/nestjs-backend/src/features/field/field.service.ts @@ -18,7 +18,7 @@ import { InjectModel } from 'nest-knexjs'; import { ClsService } from 'nestjs-cls'; import { InjectDbProvider } from '../../db-provider/db.provider'; import { IDbProvider } from '../../db-provider/db.provider.interface'; -import type { IAdapterService } from '../../share-db/interface'; +import type { IReadonlyAdapterService } from '../../share-db/interface'; import { RawOpType } from '../../share-db/interface'; import type { IClsStore } from '../../types/cls'; import { convertNameToValidCharacter } from '../../utils/name-conversion'; @@ -31,7 +31,7 @@ import { dbType2knexFormat } from './util'; type IOpContext = ISetFieldPropertyOpContext; @Injectable() -export class FieldService implements IAdapterService { +export class FieldService implements IReadonlyAdapterService { private logger = new Logger(FieldService.name); constructor( @@ -160,7 +160,7 @@ export class FieldService implements IAdapterService { throw new BadRequestException(`Db Field name ${newDbFieldName} already exists in this table`); } - const alterTableSql = this.dbProvider.renameColumnName( + const alterTableSql = this.dbProvider.renameColumn( table.dbTableName, dbFieldName, newDbFieldName diff --git a/apps/nestjs-backend/src/features/graph/graph.service.ts b/apps/nestjs-backend/src/features/graph/graph.service.ts index a5293078f..460760d61 100644 --- a/apps/nestjs-backend/src/features/graph/graph.service.ts +++ b/apps/nestjs-backend/src/features/graph/graph.service.ts @@ -1,5 +1,5 @@ import { BadRequestException, Injectable, Logger } from '@nestjs/common'; -import type { IFieldRo, ILinkFieldOptions, ITinyRecord, IConvertFieldRo } from '@teable/core'; +import type { IFieldRo, ILinkFieldOptions, IRecord, IConvertFieldRo } from '@teable/core'; import { FieldType, Relationship } from '@teable/core'; import { PrismaService } from '@teable/db-main-prisma'; import type { @@ -109,7 +109,7 @@ export class GraphService { fieldMap: IFieldMap, tableMap: { [dbTableName: string]: { dbTableName: string; name: string } }, selectedCell: { recordId: string; fieldId: string }, - dbTableName2recordMap: { [dbTableName: string]: Record } + dbTableName2recordMap: { [dbTableName: string]: Record } ) { const nodes: IGraphNode[] = []; const combos: IGraphCombo[] = []; diff --git a/apps/nestjs-backend/src/features/import/open-api/import-open-api.service.ts b/apps/nestjs-backend/src/features/import/open-api/import-open-api.service.ts index cc86c18f1..22ef55ead 100644 --- a/apps/nestjs-backend/src/features/import/open-api/import-open-api.service.ts +++ b/apps/nestjs-backend/src/features/import/open-api/import-open-api.service.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable, Logger } from '@nestjs/common'; import { FieldKeyType } from '@teable/core'; import type { IAnalyzeRo, IImportOptionRo } from '@teable/core'; import { RecordOpenApiService } from '../../record/open-api/record-open-api.service'; @@ -8,7 +8,7 @@ import { importerFactory } from './import.class'; @Injectable() export class ImportOpenApiService { - // private logger = new Logger(ImportOpenApiService.name); + private logger = new Logger(ImportOpenApiService.name); constructor( private readonly tableOpenApiService: TableOpenApiService, private readonly recordOpenApiService: RecordOpenApiService @@ -16,72 +16,80 @@ export class ImportOpenApiService { async analyze(analyzeRo: IAnalyzeRo) { const { attachmentUrl, fileType } = analyzeRo; + const importer = importerFactory(fileType, { url: attachmentUrl, - fileType, + type: fileType, }); return await importer.genColumns(); } async createTableFromImport(baseId: string, importRo: IImportOptionRo) { - // TODO support groups const { attachmentUrl, fileType, worksheets } = importRo; - const { - options: { importData, useFirstRowAsHeader }, - columns: columnInfo, - name, - } = worksheets[0]; - const importer = importerFactory(fileType, { url: attachmentUrl, - fileType, - }); - const fieldsRo = columnInfo.map((col, index) => { - return { - ...col, - isPrimary: index === 0 ? true : null, - }; + type: fileType, }); - // create table with column - const table = await this.tableOpenApiService.createTable(baseId, { - name: name || 'import table', - fields: fieldsRo, - views: DEFAULT_VIEWS, - records: [], - }); - const { fields } = table; + const tableResult = []; + + for (const [sheetKey, value] of Object.entries(worksheets)) { + const { importData, useFirstRowAsHeader, columns: columnInfo, name } = value; + const fieldsRo = columnInfo.map((col, index) => { + return { + ...col, + isPrimary: index === 0 ? true : null, + }; + }); - if (importData) { - await importer.streamParse( - { - skipFirstNLines: useFirstRowAsHeader ? 1 : 0, - }, - async (result) => { - // fill data - const records = result.map((row) => { - const res: { fields: Record } = { - fields: {}, - }; - columnInfo.forEach((col, index) => { - res.fields[fields[index].id] = row[col.sourceColumnIndex]; + // create table with column + const table = await this.tableOpenApiService.createTable(baseId, { + name: name, + fields: fieldsRo, + views: DEFAULT_VIEWS, + records: [], + }); + + tableResult.push(table); + + const { fields } = table; + + if (importData) { + importer.parse( + { + skipFirstNLines: useFirstRowAsHeader ? 1 : 0, + key: sheetKey, + }, + async (result) => { + const currentResult = result[sheetKey]; + // fill data + const records = currentResult.map((row) => { + const res: { fields: Record } = { + fields: {}, + }; + columnInfo.forEach((col, index) => { + res.fields[fields[index].id] = row[col.sourceColumnIndex]; + }); + return res; }); - return res; - }); - if (records.length === 0) { - return; + if (records.length === 0) { + return; + } + try { + await this.recordOpenApiService.multipleCreateRecords(table.id, { + fieldKeyType: FieldKeyType.Id, + typecast: true, + records, + }); + } catch (e) { + this.logger.error((e as Error)?.message, 'Import: Records'); + } } - await this.recordOpenApiService.multipleCreateRecords(table.id, { - fieldKeyType: FieldKeyType.Id, - typecast: true, - records, - }); - } - ); + ); + } } - - return [table]; + return tableResult; } } diff --git a/apps/nestjs-backend/src/features/import/open-api/import.class.ts b/apps/nestjs-backend/src/features/import/open-api/import.class.ts index c443ebbd4..44926b9fe 100644 --- a/apps/nestjs-backend/src/features/import/open-api/import.class.ts +++ b/apps/nestjs-backend/src/features/import/open-api/import.class.ts @@ -1,101 +1,150 @@ import { BadRequestException } from '@nestjs/common'; -import type { IValidateTypes } from '@teable/core'; +import type { IValidateTypes, IAnalyzeVo } from '@teable/core'; import { getUniqName, FieldType, SUPPORTEDTYPE, importTypeMap } from '@teable/core'; -import { axios } from '@teable/openapi'; -import { zip } from 'lodash'; +import { zip, toString, intersection } from 'lodash'; +import fetch from 'node-fetch'; import Papa from 'papaparse'; +import * as XLSX from 'xlsx'; import type { ZodType } from 'zod'; import z from 'zod'; const validateZodSchemaMap: Record = { - [FieldType.Checkbox]: z.boolean(), + [FieldType.Checkbox]: z.union([z.string(), z.boolean()]).refine((value: unknown) => { + if (typeof value === 'boolean') { + return true; + } + if ( + typeof value === 'string' && + (value.toLowerCase() === 'false' || value.toLowerCase() === 'true') + ) { + return true; + } + return false; + }), [FieldType.Date]: z.coerce.date(), - [FieldType.Number]: z.number(), + [FieldType.Number]: z.coerce.number(), [FieldType.LongText]: z .string() .refine((value) => z.string().safeParse(value) && /\n/.test(value)), [FieldType.SingleLineText]: z.string(), }; +interface IImportConstructorParams { + url: string; + type: SUPPORTEDTYPE; +} + +interface IParseResult { + [x: string]: unknown[][]; +} + export abstract class Importer { public static CHUNK_SIZE = 1024 * 1024 * 1; public static DEFAULT_COLUMN_TYPE: IValidateTypes = FieldType.SingleLineText; - constructor(public config: { url: string }) {} + constructor(public config: IImportConstructorParams) {} - abstract getFile(): unknown; + abstract parse( + ...args: [options?: unknown, cb?: (chunk: Record) => Promise] + ): Promise; - abstract parse(options?: unknown): Promise; + abstract getSupportedFieldTypes(): IValidateTypes[]; - abstract streamParse( - options: unknown, - fn: (chunk: Papa.ParseResult['data']) => Promise - ): void; + async getFile() { + const { url, type } = this.config; + const { body: stream, headers } = await fetch(url); - abstract getSupportedFieldTypes(): IValidateTypes[]; + const supportType = importTypeMap[type].accept.split(','); + + const fileFormat = headers + .get('content-type') + ?.split(';') + ?.map((item: string) => item.trim()); + + // if (!fileFormat?.length) { + // throw new BadRequestException( + // `Input url is not a standard document service without right content-type` + // ); + // } + + if (fileFormat?.length && !intersection(fileFormat, supportType).length) { + throw new BadRequestException( + `File format is not supported, only ${supportType.join(',')} are supported,` + ); + } + + return stream; + } async genColumns() { const supportTypes = this.getSupportedFieldTypes(); - const columnInfo = (await this.parse()) as string[]; - const zipColumnInfo = zip(...columnInfo); - const existNames: string[] = []; - const calculatedColumnHeaders = zipColumnInfo.map((column, index) => { - let isColumnEmpty = true; - let validatingFieldTypes = [...supportTypes]; - for (let i = 0; i < column.length; i++) { - if (validatingFieldTypes.length <= 1) { - break; - } + const parseResult = await this.parse(); + const result: IAnalyzeVo['worksheets'] = {}; - // ignore empty value and first row causing first row as header - if (column[i] === '' || column[i] == null || i === 0) { - continue; - } + for (const [sheetName, cols] of Object.entries(parseResult)) { + const zipColumnInfo = zip(...cols); + const existNames: string[] = []; + const calculatedColumnHeaders = zipColumnInfo.map((column, index) => { + let isColumnEmpty = true; + let validatingFieldTypes = [...supportTypes]; + for (let i = 0; i < column.length; i++) { + if (validatingFieldTypes.length <= 1) { + break; + } - // when the whole columns aren't empty should flag - isColumnEmpty = false; + // ignore empty value and first row causing first row as header + if (column[i] === '' || column[i] == null || i === 0) { + continue; + } - // when one of column's value validates long text, then break; - if (validateZodSchemaMap[FieldType.LongText].safeParse(column[i]).success) { - validatingFieldTypes = [FieldType.LongText]; - break; - } + // when the whole columns aren't empty should flag + isColumnEmpty = false; - const matchTypes = validatingFieldTypes.filter((type) => { - const schema = validateZodSchemaMap[type]; - return schema.safeParse(column[i]).success; - }); + // when one of column's value validates long text, then break; + if (validateZodSchemaMap[FieldType.LongText].safeParse(column[i]).success) { + validatingFieldTypes = [FieldType.LongText]; + break; + } - validatingFieldTypes = matchTypes; - } + const matchTypes = validatingFieldTypes.filter((type) => { + const schema = validateZodSchemaMap[type]; + return schema.safeParse(column[i]).success; + }); + + validatingFieldTypes = matchTypes; + } - // empty columns should be default type - validatingFieldTypes = !isColumnEmpty ? validatingFieldTypes : [Importer.DEFAULT_COLUMN_TYPE]; + // empty columns should be default type + validatingFieldTypes = !isColumnEmpty + ? validatingFieldTypes + : [Importer.DEFAULT_COLUMN_TYPE]; - const name = getUniqName(column?.[0] ?? `Field ${index}`, existNames); + const name = getUniqName(toString(column?.[0]) ?? `Field ${index}`, existNames); - existNames.push(name); + existNames.push(name); - return { - type: validatingFieldTypes[0] || Importer.DEFAULT_COLUMN_TYPE, - name: name.toString(), + return { + type: validatingFieldTypes[0] || Importer.DEFAULT_COLUMN_TYPE, + name: name.toString(), + }; + }); + + result[sheetName] = { + name: sheetName, + columns: calculatedColumnHeaders, }; - }); + } + return { - worksheets: [ - { - name: 'import table', - columns: calculatedColumnHeaders, - }, - ], + worksheets: result, }; } } export class CsvImporter extends Importer { - public static readonly SUPPORTFILETYPE = ['text/csv']; public static readonly CHECK_LINES = 5000; + public static readonly DEFAULT_SHEETKEY = 'Import Table'; // order make sence public static readonly SUPPORTEDTYPE: IValidateTypes[] = [ FieldType.Checkbox, @@ -104,93 +153,138 @@ export class CsvImporter extends Importer { FieldType.LongText, FieldType.SingleLineText, ]; - constructor(public config: { url: string; fileType: SUPPORTEDTYPE }) { - super(config); - } getSupportedFieldTypes() { return CsvImporter.SUPPORTEDTYPE; } - async getFile() { - const { url, fileType } = this.config; - const { data: stream } = await axios.get(url, { - responseType: 'stream', - }); - const fileFormat = stream?.headers?.['content-type']?.split(';')?.[0]; - const supportType = importTypeMap[fileType].acceptHeaders; + parse(): Promise; + parse( + options: Papa.ParseConfig & { skipFirstNLines: number; key: string }, + cb: (chunk: Record) => Promise + ): Promise; + async parse( + ...args: [ + options?: Papa.ParseConfig & { skipFirstNLines: number; key: string }, + cb?: (chunk: Record) => Promise, + ] + ): Promise { + const [options, cb] = args; + const stream = await this.getFile(); - if (fileFormat && !supportType.includes(fileFormat)) { - throw new BadRequestException( - `File format is not supported, only ${supportType.join(',')} are supported,` - ); + // chunk parse + if (options && cb) { + return new Promise((resolve, reject) => { + let isFirst = true; + Papa.parse(stream, { + download: false, + dynamicTyping: true, + chunkSize: Importer.CHUNK_SIZE, + chunk: (chunk, parser) => { + (async () => { + const newChunk = [...chunk.data] as unknown[][]; + if (isFirst && options.skipFirstNLines) { + newChunk.splice(0, 1); + isFirst = false; + } + parser.pause(); + await cb({ [CsvImporter.DEFAULT_SHEETKEY]: newChunk }); + parser.resume(); + })(); + }, + complete: () => { + resolve({}); + }, + error: (err) => { + reject(err); + }, + }); + }); + } else { + return new Promise((resolve, reject) => { + Papa.parse(stream, { + download: false, + dynamicTyping: true, + preview: CsvImporter.CHECK_LINES, + complete: (result) => { + resolve({ + [CsvImporter.DEFAULT_SHEETKEY]: result.data, + }); + }, + error: (err) => { + reject(err); + }, + }); + }); } - - return stream; } - async parse(): Promise { - const stream = await this.getFile(); - const data: Papa.ParseResult['data'] = []; - return new Promise((resolve, reject) => { - Papa.parse(stream, { - download: false, - dynamicTyping: true, - preview: CsvImporter.CHECK_LINES, - chunkSize: Importer.CHUNK_SIZE, - chunk: (chunk) => { - data.push(...chunk.data); - }, - complete: () => { - resolve(data); - }, - error: (err) => { - reject(err); - }, +} + +export class ExcelImporter extends Importer { + public static readonly SUPPORTEDTYPE: IValidateTypes[] = [ + FieldType.Checkbox, + FieldType.Number, + FieldType.Date, + FieldType.SingleLineText, + FieldType.LongText, + ]; + + parse(): Promise; + parse( + options: { skipFirstNLines: number; key: string }, + cb: (chunk: Record) => Promise + ): Promise; + + async parse( + options?: { skipFirstNLines: number; key: string }, + cb?: (chunk: Record) => Promise + ): Promise { + const fileSteam = await this.getFile(); + + const asyncRs = async (stream: NodeJS.ReadableStream): Promise => + new Promise((res, rej) => { + const buffers: Buffer[] = []; + stream.on('data', function (data) { + buffers.push(data); + }); + stream.on('end', function () { + const buf = Buffer.concat(buffers); + const workbook = XLSX.read(buf, { dense: true }); + const result: IParseResult = {}; + Object.keys(workbook.Sheets).forEach((name) => { + result[name] = workbook.Sheets[name]['!data']?.map((item) => + item.map((v) => v.w) + ) as unknown[][]; + }); + res(result); + }); + stream.on('error', (e) => { + rej(e); + }); }); - }); + + const parseResult = await asyncRs(fileSteam); + + if (options && cb) { + const { skipFirstNLines, key } = options; + if (skipFirstNLines) { + parseResult[key].splice(0, 1); + } + return await cb(parseResult); + } + + return parseResult; } - async streamParse( - options: Papa.ParseConfig & { skipFirstNLines: number }, - cb: (chunk: unknown[][]) => Promise - ) { - const stream = await this.getFile(); - return new Promise((resolve, reject) => { - let isFirst = true; - Papa.parse(stream, { - download: false, - dynamicTyping: true, - chunkSize: Importer.CHUNK_SIZE, - chunk: (chunk, parser) => { - (async () => { - const newChunk = [...chunk.data] as unknown[][]; - if (isFirst && options.skipFirstNLines) { - newChunk.splice(0, 1); - isFirst = false; - } - parser.pause(); - await cb(newChunk); - parser.resume(); - })(); - }, - complete: () => { - resolve({}); - }, - error: (err) => { - reject(err); - }, - }); - }); + getSupportedFieldTypes() { + return CsvImporter.SUPPORTEDTYPE; } } -export const importerFactory = ( - type: SUPPORTEDTYPE, - config: { url: string; fileType: SUPPORTEDTYPE } -) => { +export const importerFactory = (type: SUPPORTEDTYPE, config: IImportConstructorParams) => { switch (type) { case SUPPORTEDTYPE.CSV: return new CsvImporter(config); case SUPPORTEDTYPE.EXCEL: - throw new Error('not support'); + return new ExcelImporter(config); default: throw new Error('not support'); } diff --git a/apps/nestjs-backend/src/features/mail-sender/mail-sender.service.ts b/apps/nestjs-backend/src/features/mail-sender/mail-sender.service.ts index bf2063066..96e2c7d69 100644 --- a/apps/nestjs-backend/src/features/mail-sender/mail-sender.service.ts +++ b/apps/nestjs-backend/src/features/mail-sender/mail-sender.service.ts @@ -30,12 +30,13 @@ export class MailSenderService { const { name, email, inviteUrl, spaceName } = info; return { subject: `${name} (${email}) invited you to their space ${spaceName} - ${this.baseConfig.brandName}`, - template: 'invite', + template: 'normal', context: { name, email, spaceName, inviteUrl, + partialBody: 'invite', }, }; } @@ -56,23 +57,23 @@ export class MailSenderService { fromUserName, refRecord: { baseId, tableId, fieldName, tableName, recordIds }, } = info; - let subject, template; + let subject, partialBody; const refLength = recordIds.length; const viewRecordUrlPrefix = `${this.mailConfig.origin}/base/${baseId}/${tableId}`; if (refLength <= 1) { subject = `${fromUserName} added you to the ${fieldName} field of a record in ${tableName}`; - template = 'collaborator-cell-tag'; + partialBody = 'collaborator-cell-tag'; } else { subject = `${fromUserName} added you to ${refLength} records in ${tableName}`; - template = 'collaborator-multi-row-tag'; + partialBody = 'collaborator-multi-row-tag'; } return { notifyMessage: subject, subject: `${subject} - ${this.baseConfig.brandName}`, - template, + template: 'normal', context: { notifyId, fromUserName, @@ -81,6 +82,21 @@ export class MailSenderService { fieldName, recordIds, viewRecordUrlPrefix, + partialBody, + }, + }; + } + + resetPasswordEmailOptions(info: { name: string; email: string; resetPasswordUrl: string }) { + const { name, email, resetPasswordUrl } = info; + return { + subject: `Reset your password - ${this.baseConfig.brandName}`, + template: 'normal', + context: { + name, + email, + resetPasswordUrl, + partialBody: 'reset-password', }, }; } diff --git a/apps/nestjs-backend/src/features/mail-sender/templates/pages/collaborator-cell-tag.hbs b/apps/nestjs-backend/src/features/mail-sender/templates/pages/collaborator-cell-tag.hbs deleted file mode 100644 index 09844cd26..000000000 --- a/apps/nestjs-backend/src/features/mail-sender/templates/pages/collaborator-cell-tag.hbs +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - Invitation Email - - - - - - - -
- - - {{> header }} - - - - - - - - {{> footer }} - -
- - diff --git a/apps/nestjs-backend/src/features/mail-sender/templates/pages/collaborator-multi-row-tag.hbs b/apps/nestjs-backend/src/features/mail-sender/templates/pages/collaborator-multi-row-tag.hbs deleted file mode 100644 index f3ae48550..000000000 --- a/apps/nestjs-backend/src/features/mail-sender/templates/pages/collaborator-multi-row-tag.hbs +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - Invitation Email - - - - - - - -
- - - {{> header }} - - - - - - - - {{> footer }} - -
- - diff --git a/apps/nestjs-backend/src/features/mail-sender/templates/pages/invite.hbs b/apps/nestjs-backend/src/features/mail-sender/templates/pages/normal.hbs similarity index 76% rename from apps/nestjs-backend/src/features/mail-sender/templates/pages/invite.hbs rename to apps/nestjs-backend/src/features/mail-sender/templates/pages/normal.hbs index 9058202df..19368ad1a 100644 --- a/apps/nestjs-backend/src/features/mail-sender/templates/pages/invite.hbs +++ b/apps/nestjs-backend/src/features/mail-sender/templates/pages/normal.hbs @@ -84,20 +84,8 @@ border="0" cellpadding="0" cellspacing="0"> {{> header }} - - - - -

Invitation to Collaborate

-

{{name}} ({{email}}) has invited you to - collaborate - on their space {{spaceName}}.

-
Accept - Invitation - - - + + {{> (lookup . 'partialBody') }} {{> footer }} diff --git a/apps/nestjs-backend/src/features/mail-sender/templates/partials/collaborator-cell-tag.hbs b/apps/nestjs-backend/src/features/mail-sender/templates/partials/collaborator-cell-tag.hbs new file mode 100644 index 000000000..f574cac75 --- /dev/null +++ b/apps/nestjs-backend/src/features/mail-sender/templates/partials/collaborator-cell-tag.hbs @@ -0,0 +1,25 @@ + + +

+ {{fromUserName}} added you to the {{fieldName}} field of a + record + in + {{tableName}}. +

+ View record + + + diff --git a/apps/nestjs-backend/src/features/mail-sender/templates/partials/collaborator-multi-row-tag.hbs b/apps/nestjs-backend/src/features/mail-sender/templates/partials/collaborator-multi-row-tag.hbs new file mode 100644 index 000000000..9db03778e --- /dev/null +++ b/apps/nestjs-backend/src/features/mail-sender/templates/partials/collaborator-multi-row-tag.hbs @@ -0,0 +1,19 @@ + + +

+ {{fromUserName}} added you to {{refLength}} records in + {{tableName}}: +

+ {{#each recordIds}} + The {{../fieldName}} field of a record: + {{../viewRecordUrlPrefix}}?recordId={{this}}&fromNotify={{../notifyId}} + +
+
+ {{/each}} + + diff --git a/apps/nestjs-backend/src/features/mail-sender/templates/partials/invite.hbs b/apps/nestjs-backend/src/features/mail-sender/templates/partials/invite.hbs new file mode 100644 index 000000000..b3c2ec6ee --- /dev/null +++ b/apps/nestjs-backend/src/features/mail-sender/templates/partials/invite.hbs @@ -0,0 +1,11 @@ + + +

Invitation to Collaborate

+

{{name}} ({{email}}) has invited you to + collaborate + on their space {{spaceName}}.

+ Accept + Invitation + + diff --git a/apps/nestjs-backend/src/features/mail-sender/templates/partials/reset-password.hbs b/apps/nestjs-backend/src/features/mail-sender/templates/partials/reset-password.hbs new file mode 100644 index 000000000..e18da8db5 --- /dev/null +++ b/apps/nestjs-backend/src/features/mail-sender/templates/partials/reset-password.hbs @@ -0,0 +1,7 @@ + + +

Reset Your Password

+

If you did not request this change, please ignore this email. Otherwise, click the button below to reset your password.

+ Reset Password + + diff --git a/apps/nestjs-backend/src/features/notification/notification.service.ts b/apps/nestjs-backend/src/features/notification/notification.service.ts index b7822fe6f..976f8f89a 100644 --- a/apps/nestjs-backend/src/features/notification/notification.service.ts +++ b/apps/nestjs-backend/src/features/notification/notification.service.ts @@ -202,7 +202,7 @@ export class NotificationService { case NotificationTypeEnum.CollaboratorMultiRowTag: { const { baseId, tableId, recordId } = urlMeta || {}; - return `${origin}/base/${baseId}/${tableId}/${recordId ? `default/${recordId}` : ''}`; + return `${origin}/base/${baseId}/${tableId}?recordId=${recordId}`; } } } diff --git a/apps/nestjs-backend/src/features/record/open-api/record-open-api.controller.ts b/apps/nestjs-backend/src/features/record/open-api/record-open-api.controller.ts index 07cb01492..7a6f2ac3d 100644 --- a/apps/nestjs-backend/src/features/record/open-api/record-open-api.controller.ts +++ b/apps/nestjs-backend/src/features/record/open-api/record-open-api.controller.ts @@ -45,12 +45,12 @@ export class RecordOpenApiController { @Permissions('record|update') @Patch(':recordId') - async updateRecordById( + async updateRecord( @Param('tableId') tableId: string, @Param('recordId') recordId: string, @Body(new ZodValidationPipe(updateRecordRoSchema)) updateRecordRo: IUpdateRecordRo ): Promise { - return await this.recordOpenApiService.updateRecordById(tableId, recordId, updateRecordRo); + return await this.recordOpenApiService.updateRecord(tableId, recordId, updateRecordRo); } @Permissions('record|create') diff --git a/apps/nestjs-backend/src/features/record/open-api/record-open-api.module.ts b/apps/nestjs-backend/src/features/record/open-api/record-open-api.module.ts index 0762ef099..573602be7 100644 --- a/apps/nestjs-backend/src/features/record/open-api/record-open-api.module.ts +++ b/apps/nestjs-backend/src/features/record/open-api/record-open-api.module.ts @@ -1,13 +1,22 @@ import { Module } from '@nestjs/common'; import { AttachmentsStorageModule } from '../../attachments/attachments-storage.module'; import { FieldCalculateModule } from '../../field/field-calculate/field-calculate.module'; +import { ViewOpenApiModule } from '../../view/open-api/view-open-api.module'; +import { ViewModule } from '../../view/view.module'; import { RecordCalculateModule } from '../record-calculate/record-calculate.module'; import { RecordModule } from '../record.module'; import { RecordOpenApiController } from './record-open-api.controller'; import { RecordOpenApiService } from './record-open-api.service'; @Module({ - imports: [RecordModule, RecordCalculateModule, FieldCalculateModule, AttachmentsStorageModule], + imports: [ + RecordModule, + RecordCalculateModule, + FieldCalculateModule, + AttachmentsStorageModule, + ViewModule, + ViewOpenApiModule, + ], controllers: [RecordOpenApiController], providers: [RecordOpenApiService], exports: [RecordOpenApiService], diff --git a/apps/nestjs-backend/src/features/record/open-api/record-open-api.service.ts b/apps/nestjs-backend/src/features/record/open-api/record-open-api.service.ts index 421e8d628..570c4c0a3 100644 --- a/apps/nestjs-backend/src/features/record/open-api/record-open-api.service.ts +++ b/apps/nestjs-backend/src/features/record/open-api/record-open-api.service.ts @@ -3,6 +3,7 @@ import type { ICreateRecordsRo, ICreateRecordsVo, IRecord, + IRecordInsertOrderRo, IUpdateRecordRo, IUpdateRecordsRo, } from '@teable/core'; @@ -12,6 +13,8 @@ import { forEach, map } from 'lodash'; import { AttachmentsStorageService } from '../../attachments/attachments-storage.service'; import { FieldConvertingService } from '../../field/field-calculate/field-converting.service'; import { createFieldInstanceByRaw } from '../../field/model/factory'; +import { ViewOpenApiService } from '../../view/open-api/view-open-api.service'; +import { ViewService } from '../../view/view.service'; import { RecordCalculateService } from '../record-calculate/record-calculate.service'; import { RecordService } from '../record.service'; import { TypeCastAndValidate } from '../typecast.validate'; @@ -23,7 +26,9 @@ export class RecordOpenApiService { private readonly prismaService: PrismaService, private readonly recordService: RecordService, private readonly fieldConvertingService: FieldConvertingService, - private readonly attachmentsStorageService: AttachmentsStorageService + private readonly attachmentsStorageService: AttachmentsStorageService, + private readonly viewService: ViewService, + private readonly viewOpenApiService: ViewOpenApiService ) {} async multipleCreateRecords( @@ -31,29 +36,58 @@ export class RecordOpenApiService { createRecordsRo: ICreateRecordsRo ): Promise { return await this.prismaService.$tx(async () => { - return await this.createRecords( - tableId, - createRecordsRo.records, - createRecordsRo.fieldKeyType, - createRecordsRo.typecast - ); + return await this.createRecords(tableId, createRecordsRo); }); } + private async getRecordOrderIndexes( + tableId: string, + orderRo: IRecordInsertOrderRo, + recordCount: number + ) { + const dbTableName = await this.recordService.getDbTableName(tableId); + + const indexField = await this.viewService.getOrCreateViewIndexField( + dbTableName, + orderRo.viewId + ); + let indexes: number[] = []; + await this.viewOpenApiService.updateRecordOrdersInner({ + tableId, + dbTableName, + itemLength: recordCount, + indexField, + orderRo, + update: async (result) => { + indexes = result; + }, + }); + + return indexes; + } + async createRecords( tableId: string, - recordsRo: { id?: string; fields: Record }[], - fieldKeyType: FieldKeyType = FieldKeyType.Name, - typecast?: boolean + createRecordsRo: ICreateRecordsRo ): Promise { + console.log('createRecordsRo', createRecordsRo); + const { fieldKeyType = FieldKeyType.Name, records, typecast, order } = createRecordsRo; const typecastRecords = await this.validateFieldsAndTypecast( tableId, - recordsRo, + records, fieldKeyType, typecast ); - return await this.recordCalculateService.createRecords(tableId, typecastRecords, fieldKeyType); + const indexes = order && (await this.getRecordOrderIndexes(tableId, order, records.length)); + const orderIndex = indexes ? { viewId: order.viewId, indexes } : undefined; + + return await this.recordCalculateService.createRecords( + tableId, + typecastRecords, + fieldKeyType, + orderIndex + ); } async updateRecords(tableId: string, updateRecordsRo: IUpdateRecordsRo) { @@ -150,7 +184,7 @@ export class RecordOpenApiService { })); } - async updateRecordById( + async updateRecord( tableId: string, recordId: string, updateRecordRo: IUpdateRecordRo diff --git a/apps/nestjs-backend/src/features/record/record-calculate/record-calculate.service.ts b/apps/nestjs-backend/src/features/record/record-calculate/record-calculate.service.ts index a7fd1ecac..9b6fc8b17 100644 --- a/apps/nestjs-backend/src/features/record/record-calculate/record-calculate.service.ts +++ b/apps/nestjs-backend/src/features/record/record-calculate/record-calculate.service.ts @@ -235,9 +235,9 @@ export class RecordCalculateService { recordsRo: { id?: string; fields: Record; - recordOrder?: Record; }[], - fieldKeyType: FieldKeyType = FieldKeyType.Name + fieldKeyType: FieldKeyType = FieldKeyType.Name, + orderIndex?: { viewId: string; indexes: number[] } ): Promise { if (recordsRo.length === 0) { throw new BadRequestException('Create records is empty'); @@ -248,11 +248,10 @@ export class RecordCalculateService { return RecordOpBuilder.creator.build({ id: recordId, fields: {}, - recordOrder: record.recordOrder ?? {}, }); }); - await this.recordService.batchCreateRecords(tableId, emptyRecords); + await this.recordService.batchCreateRecords(tableId, emptyRecords, orderIndex); // submit auto fill changes const plainRecords = await this.appendDefaultValue( diff --git a/apps/nestjs-backend/src/features/record/record.service.ts b/apps/nestjs-backend/src/features/record/record.service.ts index e9994fc57..92fa557b9 100644 --- a/apps/nestjs-backend/src/features/record/record.service.ts +++ b/apps/nestjs-backend/src/features/record/record.service.ts @@ -17,7 +17,6 @@ import type { IRecord, IRecordsVo, ISetRecordOpContext, - ISetRecordOrderOpContext, IShareViewMeta, ISnapshotBase, ISortItem, @@ -42,12 +41,12 @@ import { Knex } from 'knex'; import { keyBy } from 'lodash'; import { InjectModel } from 'nest-knexjs'; import { ClsService } from 'nestjs-cls'; +import { ThresholdConfig, IThresholdConfig } from '../../configs/threshold.config'; import { InjectDbProvider } from '../../db-provider/db.provider'; import { IDbProvider } from '../../db-provider/db.provider.interface'; import type { IAdapterService } from '../../share-db/interface'; import { RawOpType } from '../../share-db/interface'; import type { IClsStore } from '../../types/cls'; -import { getViewOrderFieldName } from '../../utils'; import { Timing } from '../../utils/timing'; import { AttachmentsStorageService } from '../attachments/attachments-storage.service'; import StorageAdapter from '../attachments/plugins/adapter'; @@ -69,53 +68,11 @@ export class RecordService implements IAdapterService { private readonly batchService: BatchService, private readonly attachmentStorageService: AttachmentsStorageService, private readonly cls: ClsService, + @InjectModel('CUSTOM_KNEX') private readonly knex: Knex, @InjectDbProvider() private readonly dbProvider: IDbProvider, - @InjectModel('CUSTOM_KNEX') private readonly knex: Knex + @ThresholdConfig() private readonly thresholdConfig: IThresholdConfig ) {} - private async getRowOrderFieldNames(tableId: string) { - // get rowIndexFieldName by select all views, combine field prefix and ids; - const views = await this.prismaService.txClient().view.findMany({ - where: { - tableId, - deletedTime: null, - }, - select: { - id: true, - }, - }); - - return views.map((view) => `${ROW_ORDER_FIELD_PREFIX}_${view.id}`); - } - - // get fields create by users - private async getUserFields(tableId: string, createRecordsRo: ICreateRecordsRo) { - const fieldIdSet = createRecordsRo.records.reduce>((acc, record) => { - const fieldIds = Object.keys(record.fields); - fieldIds.forEach((fieldId) => acc.add(fieldId)); - return acc; - }, new Set()); - - const userFieldIds = Array.from(fieldIdSet); - - const userFields = await this.prismaService.txClient().field.findMany({ - where: { - tableId, - id: { in: userFieldIds }, - }, - select: { - id: true, - dbFieldName: true, - }, - }); - - if (userFields.length !== userFieldIds.length) { - throw new BadRequestException('some fields not found'); - } - - return userFields; - } - private dbRecord2RecordFields( record: IRecord['fields'], fields: IFieldInstance[], @@ -134,7 +91,7 @@ export class RecordService implements IAdapterService { }, {}); } - private async getAllRecordCount(dbTableName: string) { + async getAllRecordCount(dbTableName: string) { const sqlNative = this.knex(dbTableName).count({ count: '*' }).toSQL().toNative(); const queryResult = await this.prismaService @@ -173,51 +130,6 @@ export class RecordService implements IAdapterService { return dbValueMatrix; } - async multipleCreateRecordTransaction(tableId: string, createRecordsRo: ICreateRecordsRo) { - const { dbTableName } = await this.prismaService.txClient().tableMeta.findUniqueOrThrow({ - where: { - id: tableId, - }, - select: { - dbTableName: true, - }, - }); - - const userFields = await this.getUserFields(tableId, createRecordsRo); - const rowOrderFieldNames = await this.getRowOrderFieldNames(tableId); - - const allDbFieldNames = [ - ...userFields.map((field) => field.dbFieldName), - ...rowOrderFieldNames, - ...['__id', '__created_time', '__created_by', '__version'], - ]; - - const dbValueMatrix = await this.getDbValueMatrix( - dbTableName, - userFields, - rowOrderFieldNames, - createRecordsRo - ); - - const dbFieldSQL = allDbFieldNames.join(', '); - const dbValuesSQL = dbValueMatrix - .map((dbValues) => `(${dbValues.map((value) => JSON.stringify(value)).join(', ')})`) - .join(',\n'); - - return await this.prismaService.txClient().$executeRawUnsafe(` - INSERT INTO ${dbTableName} (${dbFieldSQL}) - VALUES - ${dbValuesSQL}; - `); - } - - // we have to support multiple action, because users will do it in batch - async multipleCreateRecords(tableId: string, createRecordsRo: ICreateRecordsRo) { - return await this.prismaService.$tx(async () => { - return this.multipleCreateRecordTransaction(tableId, createRecordsRo); - }); - } - async getDbTableName(tableId: string) { const tableMeta = await this.prismaService .txClient() @@ -412,6 +324,7 @@ export class RecordService implements IAdapterService { return { queryBuilder, + dbTableName, filter, orderBy, groupBy, @@ -419,6 +332,20 @@ export class RecordService implements IAdapterService { }; } + async getBasicOrderIndexField(dbTableName: string, viewId: string | undefined) { + const columnName = `${ROW_ORDER_FIELD_PREFIX}_${viewId}`; + const exists = await this.dbProvider.checkColumnExist( + dbTableName, + columnName, + this.prismaService.txClient() + ); + + if (exists) { + return columnName; + } + return '__auto_number'; + } + /** * Builds a query based on filtering and sorting criteria. * @@ -438,10 +365,8 @@ export class RecordService implements IAdapterService { > ): Promise { // Prepare the base query builder, filtering conditions, sorting rules, grouping rules and field mapping - const { queryBuilder, filter, orderBy, groupBy, fieldMap } = await this.prepareQuery( - tableId, - query - ); + const { dbTableName, queryBuilder, filter, orderBy, groupBy, fieldMap } = + await this.prepareQuery(tableId, query); // Retrieve the current user's ID to build user-related query conditions const currentUserId = this.cls.get('user.id'); @@ -460,8 +385,10 @@ export class RecordService implements IAdapterService { .sortQuery(queryBuilder, fieldMap, [...(groupBy ?? []), ...orderBy]) .appendSortBuilder(); + const basicSortIndex = await this.getBasicOrderIndexField(dbTableName, query.viewId); + // view sorting added by default - queryBuilder.orderBy(getViewOrderFieldName(query.viewId), 'asc'); + queryBuilder.orderBy(basicSortIndex, 'asc'); this.logger.debug('buildFilterSortQuery: %s', queryBuilder.toQuery()); // If you return `queryBuilder` directly and use `await` to receive it, @@ -469,21 +396,6 @@ export class RecordService implements IAdapterService { return { queryBuilder }; } - async setRecordOrder( - version: number, - recordId: string, - dbTableName: string, - viewId: string, - order: number - ) { - const sqlNative = this.knex(dbTableName) - .update({ [getViewOrderFieldName(viewId)]: order, __version: version }) - .where({ __id: recordId }) - .toSQL() - .toNative(); - return this.prismaService.txClient().$executeRawUnsafe(sqlNative.sql, ...sqlNative.bindings); - } - async setRecord( version: number, tableId: string, @@ -621,8 +533,12 @@ export class RecordService implements IAdapterService { } @Timing() - async batchCreateRecords(tableId: string, records: IRecord[]) { - const snapshots = await this.createBatch(tableId, records); + async batchCreateRecords( + tableId: string, + records: IRecord[], + orderIndex?: { viewId: string; indexes: number[] } + ) { + const snapshots = await this.createBatch(tableId, records, orderIndex); const dataList = snapshots.map((snapshot) => ({ docId: snapshot.__id, @@ -636,8 +552,51 @@ export class RecordService implements IAdapterService { await this.createBatch(tableId, [snapshot]); } - private async createBatch(tableId: string, records: IRecord[]) { + async creditCheck(tableId: string) { + if (!this.thresholdConfig.maxFreeRowLimit) { + return; + } + + const table = await this.prismaService.txClient().tableMeta.findFirstOrThrow({ + where: { id: tableId, deletedTime: null }, + select: { dbTableName: true, base: { select: { space: { select: { credit: true } } } } }, + }); + + const rowCount = await this.getAllRecordCount(table.dbTableName); + + const maxRowCount = + table.base.space.credit == null + ? this.thresholdConfig.maxFreeRowLimit + : table.base.space.credit; + + if (rowCount >= maxRowCount) { + this.logger.log(`Exceed row count: ${maxRowCount}`, 'creditCheck'); + throw new BadRequestException( + `Exceed max row limit: ${maxRowCount}, please contact us to increase the limit` + ); + } + } + + private async getAllViewIndexesField(dbTableName: string) { + const query = this.dbProvider.columnInfo(dbTableName); + const columns = await this.prismaService.txClient().$queryRawUnsafe<{ name: string }[]>(query); + return columns + .filter((column) => column.name.startsWith(ROW_ORDER_FIELD_PREFIX)) + .map((column) => column.name) + .reduce<{ [viewId: string]: string }>((acc, cur) => { + const viewId = cur.substring(ROW_ORDER_FIELD_PREFIX.length + 1); + acc[viewId] = cur; + return acc; + }, {}); + } + + private async createBatch( + tableId: string, + records: IRecord[], + orderIndex?: { viewId: string; indexes: number[] } + ) { const userId = this.cls.get('user.id'); + await this.creditCheck(tableId); const dbTableName = await this.getDbTableName(tableId); const maxRecordOrder = await this.getMaxRecordOrder(dbTableName); @@ -647,14 +606,16 @@ export class RecordService implements IAdapterService { select: { id: true }, }); + const allViewIndexes = await this.getAllViewIndexesField(dbTableName); + const snapshots = records - .map((snapshot, i) => - views.reduce<{ [viewId: string]: number }>((pre, cur) => { - const viewOrderFieldName = getViewOrderFieldName(cur.id); - if (snapshot.recordOrder[cur.id] !== undefined) { - pre[viewOrderFieldName] = snapshot.recordOrder[cur.id]; - } else { - pre[viewOrderFieldName] = maxRecordOrder + i; + .map((_, i) => + views.reduce<{ [viewIndexFieldName: string]: number }>((pre, cur) => { + const viewIndexFieldName = allViewIndexes[cur.id]; + if (cur.id === orderIndex?.viewId) { + pre[viewIndexFieldName] = orderIndex.indexes[i]; + } else if (viewIndexFieldName) { + pre[viewIndexFieldName] = maxRecordOrder + i; } return pre; }, {}) @@ -692,7 +653,7 @@ export class RecordService implements IAdapterService { version: number, tableId: string, recordId: string, - opContexts: (ISetRecordOrderOpContext | ISetRecordOpContext)[] + opContexts: ISetRecordOpContext[] ) { const dbTableName = await this.getDbTableName(tableId); if (opContexts[0].name === OpName.SetRecord) { @@ -703,14 +664,6 @@ export class RecordService implements IAdapterService { recordId, opContexts as ISetRecordOpContext[] ); - return; - } - - if (opContexts[0].name === OpName.SetRecordOrder) { - for (const opContext of opContexts as ISetRecordOrderOpContext[]) { - const { viewId, newOrder } = opContext; - await this.setRecordOrder(version, recordId, dbTableName, viewId, newOrder); - } } } @@ -829,16 +782,8 @@ export class RecordService implements IAdapterService { const projectionInner = await this.projectionFormPermission(tableId, fieldKeyType, projection); const dbTableName = await this.getDbTableName(tableId); - const allViews = await this.prismaService.txClient().view.findMany({ - where: { tableId, deletedTime: null }, - select: { id: true }, - }); - const fieldNameOfViewOrder = allViews.map((view) => getViewOrderFieldName(view.id)); - const fields = await this.getFieldsByProjection(tableId, projectionInner, fieldKeyType); - const fieldNames = fields - .map((f) => f.dbFieldName) - .concat([...preservedDbFieldNames, ...fieldNameOfViewOrder]); + const fieldNames = fields.map((f) => f.dbFieldName).concat(Array.from(preservedDbFieldNames)); const nativeQuery = this.knex(dbTableName) .select(fieldNames) @@ -876,13 +821,6 @@ export class RecordService implements IAdapterService { return recordIdsMap[a.__id] - recordIdsMap[b.__id]; }) .map((record) => { - const recordOrder = fieldNameOfViewOrder.reduce<{ [viewId: string]: number }>( - (acc, vFieldName, index) => { - acc[allViews[index].id] = record[vFieldName] as number; - return acc; - }, - {} - ); const recordFields = this.dbRecord2RecordFields(record, fields, fieldKeyType, cellFormat); const name = recordFields[primaryField[fieldKeyType]]; return { @@ -901,7 +839,6 @@ export class RecordService implements IAdapterService { lastModifiedTime: record.__last_modified_time?.toISOString(), createdBy: record.__created_by, lastModifiedBy: record.__last_modified_by || undefined, - recordOrder, }, }; }); diff --git a/apps/nestjs-backend/src/features/selection/selection.service.spec.ts b/apps/nestjs-backend/src/features/selection/selection.service.spec.ts index 6f2d4d801..ff65be25f 100644 --- a/apps/nestjs-backend/src/features/selection/selection.service.spec.ts +++ b/apps/nestjs-backend/src/features/selection/selection.service.spec.ts @@ -80,7 +80,6 @@ describe('selectionService', () => { const mockSelectionCtxRecords = [ { id: 'record1', - recordOrder: {}, fields: { field1: '1', field2: '2', @@ -89,7 +88,6 @@ describe('selectionService', () => { }, { id: 'record2', - recordOrder: {}, fields: { field1: '1', field2: '2', @@ -190,10 +188,9 @@ describe('selectionService', () => { // Verify the multipleCreateRecords call expect(recordOpenApiService.createRecords).toHaveBeenCalledTimes(1); - expect(recordOpenApiService.createRecords).toHaveBeenCalledWith( - tableId, - Array.from({ length: numRowsToExpand }, () => ({ fields: {} })) - ); + expect(recordOpenApiService.createRecords).toHaveBeenCalledWith(tableId, { + records: Array.from({ length: numRowsToExpand }, () => ({ fields: {} })), + }); // Verify the result expect(result).toEqual(expectedRecords); @@ -356,9 +353,9 @@ describe('selectionService', () => { ].map(createFieldInstanceByVo); const records = [ - { id: 'record1', recordOrder: {}, fields: {} }, - { id: 'record2', recordOrder: {}, fields: {} }, - { id: 'record3', recordOrder: {}, fields: {} }, + { id: 'record1', fields: {} }, + { id: 'record2', fields: {} }, + { id: 'record3', fields: {} }, ]; // Execute the method diff --git a/apps/nestjs-backend/src/features/selection/selection.service.ts b/apps/nestjs-backend/src/features/selection/selection.service.ts index d3ff8b151..734eeb7ba 100644 --- a/apps/nestjs-backend/src/features/selection/selection.service.ts +++ b/apps/nestjs-backend/src/features/selection/selection.service.ts @@ -285,7 +285,7 @@ export class SelectionService { return []; } const records = Array.from({ length: numRowsToExpand }, () => ({ fields: {} })); - const createdRecords = await this.recordOpenApiService.createRecords(tableId, records); + const createdRecords = await this.recordOpenApiService.createRecords(tableId, { records }); return createdRecords.records.map(({ id, fields }) => ({ id, fields })); } diff --git a/apps/nestjs-backend/src/features/share/share.service.ts b/apps/nestjs-backend/src/features/share/share.service.ts index 1bc778184..7f7690c82 100644 --- a/apps/nestjs-backend/src/features/share/share.service.ts +++ b/apps/nestjs-backend/src/features/share/share.service.ts @@ -129,7 +129,10 @@ export class ShareService { const { tableId } = shareInfo; const { fields } = shareViewFormSubmitRo; const { records } = await this.prismaService.$tx(async () => { - return await this.recordOpenApiService.createRecords(tableId, [{ fields }], FieldKeyType.Id); + return await this.recordOpenApiService.createRecords(tableId, { + records: [{ fields }], + fieldKeyType: FieldKeyType.Id, + }); }); if (records.length === 0) { throw new InternalServerErrorException('The number of successful submit records is 0'); diff --git a/apps/nestjs-backend/src/features/space/space.service.ts b/apps/nestjs-backend/src/features/space/space.service.ts index 59209aef3..61e3cf54c 100644 --- a/apps/nestjs-backend/src/features/space/space.service.ts +++ b/apps/nestjs-backend/src/features/space/space.service.ts @@ -170,9 +170,10 @@ export class SpaceService { deletedTime: null, }, orderBy: { - createdTime: 'asc', + order: 'asc', }, }); + return baseList.map((base) => ({ ...base, role: roleMap[base.id] || roleMap[base.spaceId] })); } } diff --git a/apps/nestjs-backend/src/features/table/open-api/table-open-api.controller.ts b/apps/nestjs-backend/src/features/table/open-api/table-open-api.controller.ts index d252d42c9..0ab60ad97 100644 --- a/apps/nestjs-backend/src/features/table/open-api/table-open-api.controller.ts +++ b/apps/nestjs-backend/src/features/table/open-api/table-open-api.controller.ts @@ -16,12 +16,12 @@ import { ITableDescriptionRo, ITableIconRo, ITableNameRo, - ITableOrderRo, + IUpdateOrderRo, sqlQuerySchema, tableDescriptionRoSchema, tableIconRoSchema, tableNameRoSchema, - tableOrderRoSchema, + updateOrderRoSchema, } from '@teable/openapi'; import { ZodValidationPipe } from '../../../zod.validation.pipe'; import { Permissions } from '../../auth/decorators/permissions.decorator'; @@ -111,9 +111,9 @@ export class TableController { async updateOrder( @Param('baseId') baseId: string, @Param('tableId') tableId: string, - @Body(new ZodValidationPipe(tableOrderRoSchema)) tableOrderRo: ITableOrderRo + @Body(new ZodValidationPipe(updateOrderRoSchema)) updateOrderRo: IUpdateOrderRo ) { - return await this.tableOpenApiService.updateOrder(baseId, tableId, tableOrderRo.order); + return await this.tableOpenApiService.updateOrder(baseId, tableId, updateOrderRo); } @Post() diff --git a/apps/nestjs-backend/src/features/table/open-api/table-open-api.service.ts b/apps/nestjs-backend/src/features/table/open-api/table-open-api.service.ts index a3478baf5..4ab244273 100644 --- a/apps/nestjs-backend/src/features/table/open-api/table-open-api.service.ts +++ b/apps/nestjs-backend/src/features/table/open-api/table-open-api.service.ts @@ -14,9 +14,11 @@ import type { } from '@teable/core'; import { FieldKeyType, FieldType } from '@teable/core'; import { PrismaService } from '@teable/db-main-prisma'; +import type { IUpdateOrderRo } from '@teable/openapi'; import { ThresholdConfig, IThresholdConfig } from '../../../configs/threshold.config'; import { InjectDbProvider } from '../../../db-provider/db.provider'; import { IDbProvider } from '../../../db-provider/db.provider.interface'; +import { updateOrder } from '../../../utils/update-order'; import { LinkService } from '../../calculation/link.service'; import { FieldCreatingService } from '../../field/field-calculate/field-creating.service'; import { FieldSupplementService } from '../../field/field-calculate/field-supplement.service'; @@ -69,7 +71,7 @@ export class TableOpenApiService { } private async createRecords(tableId: string, data: ICreateRecordsRo) { - return this.recordOpenApiService.createRecords(tableId, data.records, data.fieldKeyType); + return this.recordOpenApiService.createRecords(tableId, data); } private async prepareFields(tableId: string, fieldRos: IFieldRo[]) { @@ -352,18 +354,70 @@ export class TableOpenApiService { }); } - async updateOrder(baseId: string, tableId: string, order: number) { - const orderExist = await this.prismaService.tableMeta.findFirst({ - where: { baseId, order, deletedTime: null }, + async shuffle(baseId: string) { + const tables = await this.prismaService.tableMeta.findMany({ + where: { baseId, deletedTime: null }, select: { id: true }, + orderBy: { order: 'asc' }, }); - if (orderExist) { - throw new BadRequestException('Table order could not be duplicate'); - } + this.logger.log(`lucky table shuffle! ${baseId}`, 'shuffle'); await this.prismaService.$tx(async () => { - await this.tableService.updateTable(baseId, tableId, { order }); + for (let i = 0; i < tables.length; i++) { + const table = tables[i]; + await this.tableService.updateTable(baseId, table.id, { order: i }); + } + }); + } + + async updateOrder(baseId: string, tableId: string, orderRo: IUpdateOrderRo) { + const { anchorId, position } = orderRo; + + const table = await this.prismaService.tableMeta + .findFirstOrThrow({ + select: { order: true, id: true }, + where: { baseId, id: tableId, deletedTime: null }, + }) + .catch(() => { + throw new NotFoundException(`Table ${tableId} not found`); + }); + + const anchorTable = await this.prismaService.tableMeta + .findFirstOrThrow({ + select: { order: true, id: true }, + where: { baseId, id: anchorId, deletedTime: null }, + }) + .catch(() => { + throw new NotFoundException(`Anchor ${anchorId} not found`); + }); + + await updateOrder({ + parentId: baseId, + position, + item: table, + anchorItem: anchorTable, + getNextItem: async (whereOrder, align) => { + return this.prismaService.tableMeta.findFirst({ + select: { order: true, id: true }, + where: { + baseId, + deletedTime: null, + order: whereOrder, + }, + orderBy: { order: align }, + }); + }, + update: async ( + parentId: string, + id: string, + data: { newOrder: number; oldOrder: number } + ) => { + await this.prismaService.$tx(async () => { + await this.tableService.updateTable(parentId, id, { order: data.newOrder }); + }); + }, + shuffle: this.shuffle.bind(this), }); } } diff --git a/apps/nestjs-backend/src/features/table/table.service.ts b/apps/nestjs-backend/src/features/table/table.service.ts index c158d7a7f..5aa496fe6 100644 --- a/apps/nestjs-backend/src/features/table/table.service.ts +++ b/apps/nestjs-backend/src/features/table/table.service.ts @@ -2,7 +2,6 @@ import { BadRequestException, Injectable, Logger, NotFoundException } from '@nes import type { ICreateTableRo, IOtOperation, - ISetTablePropertyOpContext, ISnapshotBase, ITableFullVo, ITableVo, @@ -14,17 +13,15 @@ import { getUniqName, IdPrefix, nullsToUndefined, - tablePropertyKeySchema, } from '@teable/core'; import type { Prisma } from '@teable/db-main-prisma'; import { PrismaService } from '@teable/db-main-prisma'; import { Knex } from 'knex'; import { InjectModel } from 'nest-knexjs'; import { ClsService } from 'nestjs-cls'; -import { fromZodError } from 'zod-validation-error'; import { InjectDbProvider } from '../../db-provider/db.provider'; import { IDbProvider } from '../../db-provider/db.provider.interface'; -import type { IAdapterService } from '../../share-db/interface'; +import type { IReadonlyAdapterService } from '../../share-db/interface'; import { RawOpType } from '../../share-db/interface'; import type { IClsStore } from '../../types/cls'; import { convertNameToValidCharacter } from '../../utils/name-conversion'; @@ -35,7 +32,7 @@ import { RecordService } from '../record/record.service'; import { ViewService } from '../view/view.service'; @Injectable() -export class TableService implements IAdapterService { +export class TableService implements IReadonlyAdapterService { private logger = new Logger(TableService.name); constructor( @@ -357,34 +354,6 @@ export class TableService implements IAdapterService { }); } - async update( - version: number, - baseId: string, - tableId: string, - opContexts: ISetTablePropertyOpContext[] - ) { - const userId = this.cls.get('user.id'); - - for (const opContext of opContexts) { - const { key, newValue } = opContext; - const result = tablePropertyKeySchema.safeParse({ [key]: newValue }); - if (!result.success) { - throw new BadRequestException(fromZodError(result.error).message); - } - - // skip undefined value - const parsedValue = result.data[key]; - if (parsedValue === undefined) { - continue; - } - - await this.prismaService.txClient().tableMeta.update({ - where: { id: tableId, baseId }, - data: { [key]: parsedValue, version, lastModifiedBy: userId }, - }); - } - } - async getSnapshotBulk(baseId: string, ids: string[]): Promise[]> { const tables = await this.prismaService.txClient().tableMeta.findMany({ where: { baseId, id: { in: ids }, deletedTime: null }, @@ -403,7 +372,6 @@ export class TableService implements IAdapterService { ...table, description: table.description ?? undefined, icon: table.icon ?? undefined, - order: table.order, lastModifiedTime: tableTime[i] || table.createdTime.toISOString(), defaultViewId: tableDefaultViewIds[i], }, diff --git a/apps/nestjs-backend/src/features/user/user.service.ts b/apps/nestjs-backend/src/features/user/user.service.ts index 3d221cb62..26d328cde 100644 --- a/apps/nestjs-backend/src/features/user/user.service.ts +++ b/apps/nestjs-backend/src/features/user/user.service.ts @@ -1,16 +1,21 @@ +import https from 'https'; import { join } from 'path'; import { Injectable } from '@nestjs/common'; -import { generateSpaceId, minidenticon, SpaceRole } from '@teable/core'; +import { + generateAccountId, + generateSpaceId, + generateUserId, + minidenticon, + SpaceRole, +} from '@teable/core'; import type { Prisma } from '@teable/db-main-prisma'; import { PrismaService } from '@teable/db-main-prisma'; import { type ICreateSpaceRo, type IUserNotifyMeta, UploadType } from '@teable/openapi'; import { ClsService } from 'nestjs-cls'; import sharp from 'sharp'; import type { IClsStore } from '../../types/cls'; -import { FileUtils } from '../../utils'; import { getFullStorageUrl } from '../../utils/full-storage-url'; import StorageAdapter from '../attachments/plugins/adapter'; -import { LocalStorage } from '../attachments/plugins/local'; import { InjectStorageAdapter } from '../attachments/plugins/storage'; @Injectable() @@ -67,7 +72,10 @@ export class UserService { return space; } - async createUser(user: Prisma.UserCreateInput) { + async createUser( + user: Prisma.UserCreateInput, + account?: Omit + ) { // defaults const defaultNotifyMeta: IUserNotifyMeta = { email: true, @@ -75,6 +83,7 @@ export class UserService { user = { ...user, + id: user.id ?? generateUserId(), notifyMeta: JSON.stringify(defaultNotifyMeta), }; @@ -85,17 +94,19 @@ export class UserService { avatar, }; } - // default space created - return await this.prismaService.$tx(async (prisma) => { - const newUser = await prisma.user.create({ data: user }); - const { id, name } = newUser; - await this.cls.runWith(this.cls.get(), async () => { - this.cls.set('user.id', id); - await this.createSpaceBySignup({ name: `${name}'s space` }); + const newUser = await this.prismaService.txClient().user.create({ data: user }); + const { id, name } = newUser; + if (account) { + await this.prismaService.txClient().account.create({ + data: { id: generateAccountId(), ...account, userId: id }, }); - return newUser; + } + await this.cls.runWith(this.cls.get(), async () => { + this.cls.set('user.id', id); + await this.createSpaceBySignup({ name: `${name}'s space` }); }); + return newUser; } async updateUserName(id: string, name: string) { @@ -107,29 +118,19 @@ export class UserService { }); } - async updateAvatar(id: string, avatarFile: Express.Multer.File) { + async updateAvatar(id: string, avatarFile: { path: string; mimetype: string; size: number }) { const path = join(StorageAdapter.getDir(UploadType.Avatar), id); const bucket = StorageAdapter.getBucket(UploadType.Avatar); - const url = await this.storageAdapter.uploadFileWidthPath(bucket, path, avatarFile.path, { - // eslint-disable-next-line @typescript-eslint/naming-convention - 'Content-Type': avatarFile.mimetype, - }); - - const { size, mimetype, path: filePath } = avatarFile; - let hash, width, height; - - const storage = this.storageAdapter; - if (storage instanceof LocalStorage) { - hash = await FileUtils.getHash(filePath); - const fileMate = await storage.getFileMate(filePath); - width = fileMate.width; - height = fileMate.height; - } else { - const objectMeta = await storage.getObjectMeta(bucket, path, id); - hash = objectMeta.hash; - width = objectMeta.width; - height = objectMeta.height; - } + const { hash, url } = await this.storageAdapter.uploadFileWidthPath( + bucket, + path, + avatarFile.path, + { + // eslint-disable-next-line @typescript-eslint/naming-convention + 'Content-Type': avatarFile.mimetype, + } + ); + const { size, mimetype } = avatarFile; await this.mountAttachment(id, { bucket, @@ -138,8 +139,6 @@ export class UserService { mimetype, token: id, path, - width, - height, }); await this.prismaService.txClient().user.update({ @@ -186,24 +185,95 @@ export class UserService { .resize(svgSize[0], svgSize[1]) .flatten({ background: '#f0f0f0' }) .png({ quality: 90 }); + const mimetype = 'image/png'; const { size } = await svgObject.metadata(); const svgBuffer = await svgObject.toBuffer(); - const svgHash = await FileUtils.getHash(svgBuffer); + + const { url, hash } = await this.storageAdapter.uploadFile(bucket, path, svgBuffer, { + // eslint-disable-next-line @typescript-eslint/naming-convention + 'Content-Type': mimetype, + }); await this.mountAttachment(id, { bucket: bucket, - hash: svgHash, + hash: hash, size: size, - mimetype: 'image/png', + mimetype: mimetype, token: id, path: path, width: svgSize[0], height: svgSize[1], }); - return this.storageAdapter.uploadFile(bucket, path, svgBuffer, { - // eslint-disable-next-line @typescript-eslint/naming-convention - 'Content-Type': 'image/png', + return url; + } + + private async uploadAvatarByUrl(userId: string, url: string) { + return new Promise((resolve, reject) => { + https + .get(url, async (stream) => { + const contentType = stream?.headers?.['content-type']?.split(';')?.[0]; + const size = stream?.headers?.['content-length']?.split(';')?.[0]; + const path = join(StorageAdapter.getDir(UploadType.Avatar), userId); + const bucket = StorageAdapter.getBucket(UploadType.Avatar); + + const { url, hash } = await this.storageAdapter.uploadFile(bucket, path, stream, { + // eslint-disable-next-line @typescript-eslint/naming-convention + 'Content-Type': contentType, + }); + + await this.mountAttachment(userId, { + bucket: bucket, + hash: hash, + size: size ? parseInt(size) : undefined, + mimetype: contentType, + token: userId, + path: path, + }); + resolve(url); + }) + .on('error', (error) => { + reject(error); + }); + }); + } + + async findOrCreateUser(user: { + name: string; + email: string; + provider: string; + providerId: string; + type: string; + avatarUrl?: string; + }) { + return this.prismaService.$tx(async () => { + const { email, name, provider, providerId, type, avatarUrl } = user; + // account exist check + const existAccount = await this.prismaService.txClient().account.findFirst({ + where: { provider, providerId }, + }); + if (existAccount) { + return await this.getUserById(existAccount.userId); + } + + // user exist check + const existUser = await this.getUserByEmail(email); + if (!existUser) { + const userId = generateUserId(); + let avatar: string | undefined = undefined; + if (avatarUrl) { + avatar = await this.uploadAvatarByUrl(userId, avatarUrl); + } + return await this.createUser( + { id: userId, email, name, avatar }, + { provider, providerId, type } + ); + } + + await this.prismaService.txClient().account.create({ + data: { id: generateAccountId(), provider, providerId, type, userId: existUser.id }, + }); + return existUser; }); } } diff --git a/apps/nestjs-backend/src/features/view/model/factory.ts b/apps/nestjs-backend/src/features/view/model/factory.ts index 7bd4b3b32..b51ce7541 100644 --- a/apps/nestjs-backend/src/features/view/model/factory.ts +++ b/apps/nestjs-backend/src/features/view/model/factory.ts @@ -38,7 +38,6 @@ export function createViewVoByRaw(viewRaw: View): IViewVo { shareId: viewRaw.shareId || undefined, shareMeta: JSON.parse(viewRaw.shareMeta as string) || undefined, enableShare: viewRaw.enableShare || undefined, - order: viewRaw.order, createdBy: viewRaw.createdBy, lastModifiedBy: viewRaw.lastModifiedBy || undefined, createdTime: viewRaw.createdTime.toISOString(), diff --git a/apps/nestjs-backend/src/features/view/open-api/view-open-api.controller.ts b/apps/nestjs-backend/src/features/view/open-api/view-open-api.controller.ts index b7b7ba45c..859b0ce73 100644 --- a/apps/nestjs-backend/src/features/view/open-api/view-open-api.controller.ts +++ b/apps/nestjs-backend/src/features/view/open-api/view-open-api.controller.ts @@ -14,9 +14,7 @@ import { viewGroupRoSchema, } from '@teable/core'; import { - IViewOrderRo, viewNameRoSchema, - viewOrderRoSchema, IViewNameRo, viewDescriptionRoSchema, IViewDescriptionRo, @@ -26,6 +24,10 @@ import { IViewSortRo, viewOptionsRoSchema, IViewOptionsRo, + updateOrderRoSchema, + IUpdateOrderRo, + updateRecordOrdersRoSchema, + IUpdateRecordOrdersRo, } from '@teable/openapi'; import type { EnableShareViewVo } from '@teable/openapi'; import { ZodValidationPipe } from '../../..//zod.validation.pipe'; @@ -207,12 +209,23 @@ export class ViewOpenApiController { async updateViewOrder( @Param('tableId') tableId: string, @Param('viewId') viewId: string, - @Body(new ZodValidationPipe(viewOrderRoSchema)) - updateOrderRo: IViewOrderRo + @Body(new ZodValidationPipe(updateOrderRoSchema)) + updateOrderRo: IUpdateOrderRo ): Promise { return await this.viewOpenApiService.updateViewOrder(tableId, viewId, updateOrderRo); } + @Permissions('view|update') + @Put('/:viewId/record-order') + async updateRecordOrders( + @Param('tableId') tableId: string, + @Param('viewId') viewId: string, + @Body(new ZodValidationPipe(updateRecordOrdersRoSchema)) + updateRecordOrdersRo: IUpdateRecordOrdersRo + ): Promise { + return await this.viewOpenApiService.updateRecordOrders(tableId, viewId, updateRecordOrdersRo); + } + @Permissions('view|update') @Post('/:viewId/refresh-share-id') async refreshShareId( diff --git a/apps/nestjs-backend/src/features/view/open-api/view-open-api.service.ts b/apps/nestjs-backend/src/features/view/open-api/view-open-api.service.ts index 7a6423c12..c6a883e36 100644 --- a/apps/nestjs-backend/src/features/view/open-api/view-open-api.service.ts +++ b/apps/nestjs-backend/src/features/view/open-api/view-open-api.service.ts @@ -24,10 +24,11 @@ import { validateOptionsType, } from '@teable/core'; import { PrismaService } from '@teable/db-main-prisma'; -import type { IViewOrderRo } from '@teable/openapi'; +import type { IUpdateOrderRo, IUpdateRecordOrdersRo } from '@teable/openapi'; import { Knex } from 'knex'; import { InjectModel } from 'nest-knexjs'; import { Timing } from '../../../utils/timing'; +import { updateMultipleOrders, updateOrder } from '../../../utils/update-order'; import { FieldService } from '../../field/field.service'; import { RecordService } from '../../record/record.service'; import { ViewService } from '../view.service'; @@ -64,12 +65,31 @@ export class ViewOpenApiService { await this.viewService.deleteView(tableId, viewId); } + private updateRecordOrderSql(orderRawSql: string, dbTableName: string, indexField: string) { + return this.knex + .raw( + ` + UPDATE :dbTableName: + SET :indexField: = temp_order.new_order + FROM ( + SELECT __id, ROW_NUMBER() OVER (ORDER BY ${orderRawSql}) AS new_order FROM :dbTableName: + ) AS temp_order + WHERE :dbTableName:.__id = temp_order.__id AND :dbTableName:.:indexField: != temp_order.new_order; + `, + { + dbTableName, + indexField, + } + ) + .toQuery(); + } + @Timing() async manualSort(tableId: string, viewId: string, viewOrderRo: IManualSortRo) { const { sortObjs } = viewOrderRo; const dbTableName = await this.recordService.getDbTableName(tableId); const fields = await this.fieldService.getFieldsByQuery(tableId, { viewId }); - const fieldIndexId = this.viewService.getRowIndexFieldName(viewId); + const indexField = await this.viewService.getOrCreateViewIndexField(dbTableName, viewId); const fieldMap = fields.reduce( (map, field) => { @@ -102,23 +122,6 @@ export class ViewOpenApiService { // ensure order stable orderRawSql += this.knex.raw(`, ?? ASC`, ['__auto_number']).toQuery(); - const updateRecordsOrderSql = this.knex - .raw( - ` - UPDATE :dbTableName: - SET :fieldIndexId: = temp_order.new_order - FROM ( - SELECT __id, ROW_NUMBER() OVER (ORDER BY ${orderRawSql}) AS new_order FROM :dbTableName: - ) AS temp_order - WHERE :dbTableName:.__id = temp_order.__id AND :dbTableName:.:fieldIndexId: != temp_order.new_order; - `, - { - dbTableName: dbTableName, - fieldIndexId: fieldIndexId, - } - ) - .toQuery(); - // build ops const newSort = { sortObjs: sortObjs, @@ -126,7 +129,9 @@ export class ViewOpenApiService { }; await this.prismaService.$tx(async (prisma) => { - await prisma.$executeRawUnsafe(updateRecordsOrderSql); + await prisma.$executeRawUnsafe( + this.updateRecordOrderSql(orderRawSql, dbTableName, indexField) + ); await this.viewService.updateViewSort(tableId, viewId, newSort); }); } @@ -250,37 +255,205 @@ export class ViewOpenApiService { }); } - async updateViewOrder(tableId: string, viewId: string, orderRo: IViewOrderRo) { - const { order } = orderRo; - + /** + * shuffle view order + */ + async shuffle(tableId: string) { const views = await this.prismaService.view.findMany({ - select: { order: true, id: true }, where: { tableId, deletedTime: null }, + select: { id: true, order: true }, + orderBy: { order: 'asc' }, }); - const curView = views.find(({ id }) => id === viewId); + this.logger.log(`lucky view shuffle! ${tableId}`, 'shuffle'); - if (!curView) { - throw new BadRequestException('View not found in the table'); - } + await this.prismaService.$tx(async () => { + for (let i = 0; i < views.length; i++) { + const view = views[i]; + await this.viewService.updateViewByOps(tableId, view.id, [ + ViewOpBuilder.editor.setViewProperty.build({ + key: 'order', + newValue: i, + oldValue: view.order, + }), + ]); + } + }); + } + + async updateViewOrder(tableId: string, viewId: string, orderRo: IUpdateOrderRo) { + const { anchorId, position } = orderRo; - const orders = views.filter(({ id }) => id !== viewId).map(({ order }) => order); + const view = await this.prismaService.view + .findFirstOrThrow({ + select: { order: true, id: true }, + where: { tableId, id: viewId, deletedTime: null }, + }) + .catch(() => { + throw new NotFoundException(`View ${viewId} not found in the table`); + }); - if (orders.includes(order)) { - // validate repeatability, because of order should be unique key - throw new BadRequestException('View order could not be duplicate'); + const anchorView = await this.prismaService.view + .findFirstOrThrow({ + select: { order: true, id: true }, + where: { tableId, id: anchorId, deletedTime: null }, + }) + .catch(() => { + throw new NotFoundException(`Anchor ${anchorId} not found in the table`); + }); + + await updateOrder({ + parentId: tableId, + position, + item: view, + anchorItem: anchorView, + getNextItem: async (whereOrder, align) => { + return this.prismaService.view.findFirst({ + select: { order: true, id: true }, + where: { + tableId, + deletedTime: null, + order: whereOrder, + }, + orderBy: { order: align }, + }); + }, + update: async ( + parentId: string, + id: string, + data: { newOrder: number; oldOrder: number } + ) => { + const ops = ViewOpBuilder.editor.setViewProperty.build({ + key: 'order', + newValue: data.newOrder, + oldValue: data.oldOrder, + }); + + await this.prismaService.$tx(async () => { + await this.viewService.updateViewByOps(parentId, id, [ops]); + }); + }, + shuffle: this.shuffle.bind(this), + }); + } + + /** + * shuffle record order + */ + async shuffleRecords(dbTableName: string, indexField: string) { + const recordCount = await this.recordService.getAllRecordCount(dbTableName); + if (recordCount > 100_000) { + throw new BadRequestException('Not enough gap to move the row here'); } - const { order: oldOrder } = curView; + const sql = this.updateRecordOrderSql( + this.knex.raw(`?? ASC`, [indexField]).toQuery(), + dbTableName, + indexField + ); - const ops = ViewOpBuilder.editor.setViewProperty.build({ - key: 'order', - newValue: order, - oldValue: oldOrder, + await this.prismaService.$executeRawUnsafe(sql); + } + + async updateRecordOrdersInner(props: { + tableId: string; + dbTableName: string; + itemLength: number; + indexField: string; + orderRo: { + anchorId: string; + position: 'before' | 'after'; + }; + update: (indexes: number[]) => Promise; + }) { + const { tableId, itemLength, dbTableName, indexField, orderRo, update } = props; + const { anchorId, position } = orderRo; + + const anchorRecordSql = this.knex(dbTableName) + .select({ + id: '__id', + order: indexField, + }) + .where('__id', anchorId) + .toQuery(); + + const anchorRecord = await this.prismaService + .txClient() + .$queryRawUnsafe<{ id: string; order: number }[]>(anchorRecordSql) + .then((res) => { + return res[0]; + }); + + if (!anchorRecord) { + throw new NotFoundException(`Anchor ${anchorId} not found in the table`); + } + + await updateMultipleOrders({ + parentId: tableId, + position, + itemLength, + anchorItem: anchorRecord, + getNextItem: async (whereOrder, align) => { + const nextRecordSql = this.knex(dbTableName) + .select({ + id: '__id', + order: indexField, + }) + .where( + indexField, + whereOrder.lt != null ? '<' : '>', + (whereOrder.lt != null ? whereOrder.lt : whereOrder.gt) as number + ) + .orderBy(indexField, align) + .limit(1) + .toQuery(); + return this.prismaService + .txClient() + .$queryRawUnsafe<{ id: string; order: number }[]>(nextRecordSql) + .then((res) => { + return res[0]; + }); + }, + update, + shuffle: async () => { + await this.shuffleRecords(dbTableName, indexField); + }, }); + } - await this.prismaService.$tx(async () => { - await this.viewService.updateViewByOps(tableId, viewId, [ops]); + async updateRecordOrders(tableId: string, viewId: string, orderRo: IUpdateRecordOrdersRo) { + const dbTableName = await this.recordService.getDbTableName(tableId); + + const indexField = await this.viewService.getOrCreateViewIndexField(dbTableName, viewId); + const recordIds = orderRo.recordIds; + + await this.updateRecordOrdersInner({ + tableId, + dbTableName, + itemLength: recordIds.length, + indexField, + orderRo, + update: async (indexes) => { + // for notify view update only + const ops = ViewOpBuilder.editor.setViewProperty.build({ + key: 'lastModifiedTime', + newValue: new Date().toISOString(), + }); + + await this.prismaService.$tx(async (prisma) => { + await this.viewService.updateViewByOps(tableId, viewId, [ops]); + for (let i = 0; i < recordIds.length; i++) { + const recordId = recordIds[i]; + const updateRecordSql = this.knex(dbTableName) + .update({ + [indexField]: indexes[i], + }) + .where('__id', recordId) + .toQuery(); + await prisma.$executeRawUnsafe(updateRecordSql); + } + }); + }, }); } diff --git a/apps/nestjs-backend/src/features/view/view.module.ts b/apps/nestjs-backend/src/features/view/view.module.ts index f7a096352..6a678ee31 100644 --- a/apps/nestjs-backend/src/features/view/view.module.ts +++ b/apps/nestjs-backend/src/features/view/view.module.ts @@ -1,10 +1,11 @@ import { Module } from '@nestjs/common'; +import { DbProvider } from '../../db-provider/db.provider'; import { CalculationModule } from '../calculation/calculation.module'; import { ViewService } from './view.service'; @Module({ imports: [CalculationModule], - providers: [ViewService], + providers: [ViewService, DbProvider], exports: [ViewService], }) export class ViewModule {} diff --git a/apps/nestjs-backend/src/features/view/view.service.ts b/apps/nestjs-backend/src/features/view/view.service.ts index 009ef9d5a..1dccc20eb 100644 --- a/apps/nestjs-backend/src/features/view/view.service.ts +++ b/apps/nestjs-backend/src/features/view/view.service.ts @@ -8,6 +8,7 @@ import type { IUpdateViewColumnMetaOpContext, ISetViewPropertyOpContext, IColumnMeta, + IViewPropertyKeys, } from '@teable/core'; import { getUniqName, @@ -15,7 +16,7 @@ import { generateViewId, OpName, ViewOpBuilder, - viewRoSchema, + viewVoSchema, } from '@teable/core'; import type { Prisma } from '@teable/db-main-prisma'; import { PrismaService } from '@teable/db-main-prisma'; @@ -24,7 +25,9 @@ import { isEmpty, merge } from 'lodash'; import { InjectModel } from 'nest-knexjs'; import { ClsService } from 'nestjs-cls'; import { fromZodError } from 'zod-validation-error'; -import type { IAdapterService } from '../../share-db/interface'; +import { InjectDbProvider } from '../../db-provider/db.provider'; +import { IDbProvider } from '../../db-provider/db.provider.interface'; +import type { IReadonlyAdapterService } from '../../share-db/interface'; import { RawOpType } from '../../share-db/interface'; import type { IClsStore } from '../../types/cls'; import { BatchService } from '../calculation/batch.service'; @@ -34,12 +37,13 @@ import { createViewInstanceByRaw, createViewVoByRaw } from './model/factory'; type IViewOpContext = IUpdateViewColumnMetaOpContext | ISetViewPropertyOpContext; @Injectable() -export class ViewService implements IAdapterService { +export class ViewService implements IReadonlyAdapterService { constructor( private readonly cls: ClsService, private readonly batchService: BatchService, private readonly prismaService: PrismaService, - @InjectModel('CUSTOM_KNEX') private readonly knex: Knex + @InjectModel('CUSTOM_KNEX') private readonly knex: Knex, + @InjectDbProvider() private readonly dbProvider: IDbProvider ) {} getRowIndexFieldName(viewId: string) { @@ -54,20 +58,75 @@ export class ViewService implements IAdapterService { const viewRaws = await this.prismaService.txClient().view.findMany({ where: { tableId, deletedTime: null }, select: { name: true, order: true }, + orderBy: { order: 'asc' }, }); - let { name, order } = viewRo; + let { name } = viewRo; const names = viewRaws.map((view) => view.name); name = getUniqName(name ?? 'New view', names); - if (order == null) { - const maxOrder = viewRaws[viewRaws.length - 1]?.order; - order = maxOrder == null ? 0 : maxOrder + 1; - } + const maxOrder = viewRaws[viewRaws.length - 1]?.order; + const order = maxOrder == null ? 0 : maxOrder + 1; + return { name, order }; } + async existIndex(dbTableName: string, viewId: string) { + const columnName = this.getRowIndexFieldName(viewId); + const exists = await this.dbProvider.checkColumnExist( + dbTableName, + columnName, + this.prismaService.txClient() + ); + + if (exists) { + return columnName; + } + } + + async createViewIndexField(dbTableName: string, viewId: string) { + const prisma = this.prismaService.txClient(); + + const rowIndexFieldName = this.getRowIndexFieldName(viewId); + + // add a field for maintain row order number + const addRowIndexColumnSql = this.knex.schema + .alterTable(dbTableName, (table) => { + table.double(rowIndexFieldName); + }) + .toQuery(); + await prisma.$executeRawUnsafe(addRowIndexColumnSql); + + // fill initial order for every record, with auto increment integer + const updateRowIndexSql = this.knex(dbTableName) + .update({ + [rowIndexFieldName]: this.knex.ref('__auto_number'), + }) + .toQuery(); + await prisma.$executeRawUnsafe(updateRowIndexSql); + + // create index + const createRowIndexSQL = this.knex.schema + .alterTable(dbTableName, (table) => { + table.index(rowIndexFieldName, this.getRowIndexFieldIndexName(viewId)); + }) + .toQuery(); + await prisma.$executeRawUnsafe(createRowIndexSQL); + console.log('addRowIndexColumnSql', addRowIndexColumnSql); + console.log('createViewIndexField', createRowIndexSQL); + return rowIndexFieldName; + } + + async getOrCreateViewIndexField(dbTableName: string, viewId: string) { + const indexFieldName = await this.existIndex(dbTableName, viewId); + console.log('exits', indexFieldName); + if (indexFieldName) { + return indexFieldName; + } + return this.createViewIndexField(dbTableName, viewId); + } + async createDbView(tableId: string, viewRo: IViewRo) { const userId = this.cls.get('user.id'); const { description, type, options, sort, filter, group, columnMeta } = viewRo; @@ -101,46 +160,7 @@ export class ViewService implements IAdapterService { columnMeta: mergedColumnMeta ? JSON.stringify(mergedColumnMeta) : JSON.stringify({}), }; - const { dbTableName } = await prisma.tableMeta.findUniqueOrThrow({ - where: { - id: tableId, - }, - select: { - dbTableName: true, - }, - }); - - const rowIndexFieldName = this.getRowIndexFieldName(viewId); - - // 1. create a new view in view model - const viewData = await prisma.view.create({ data }); - // const columnMeta = await this.updateViewColumnMetaOrderByViewId(tableId, viewId); - - // 2. add a field for maintain row order number - const addRowIndexColumnSql = this.knex.schema - .alterTable(dbTableName, (table) => { - table.double(rowIndexFieldName); - }) - .toQuery(); - await prisma.$executeRawUnsafe(addRowIndexColumnSql); - - // 3. fill initial order for every record, with auto increment integer - const updateRowIndexSql = this.knex(dbTableName) - .update({ - [rowIndexFieldName]: this.knex.ref('__auto_number'), - }) - .toQuery(); - await prisma.$executeRawUnsafe(updateRowIndexSql); - - // 4. create index - const createRowIndexSQL = this.knex.schema - .alterTable(dbTableName, (table) => { - table.index(rowIndexFieldName, this.getRowIndexFieldIndexName(viewId)); - }) - .toQuery(); - await prisma.$executeRawUnsafe(createRowIndexSQL); - - return viewData; + return await prisma.view.create({ data }); } async getViewById(viewId: string): Promise { @@ -326,11 +346,11 @@ export class ViewService implements IAdapterService { continue; } const { key, newValue } = opContext; - const result = viewRoSchema.partial().safeParse({ [key]: newValue }); + const result = viewVoSchema.partial().safeParse({ [key]: newValue }); if (!result.success) { throw new BadRequestException(fromZodError(result.error).message); } - const parsedValue = result.data[key]; + const parsedValue = result.data[key] as IViewPropertyKeys; await this.prismaService.txClient().view.update({ where: { id: viewId }, data: { diff --git a/apps/nestjs-backend/src/share-db/interface.ts b/apps/nestjs-backend/src/share-db/interface.ts index 3319d60c9..1cd2d4d12 100644 --- a/apps/nestjs-backend/src/share-db/interface.ts +++ b/apps/nestjs-backend/src/share-db/interface.ts @@ -1,17 +1,7 @@ import type { ISnapshotBase } from '@teable/core'; import type { CreateOp, DB, DeleteOp, EditOp } from 'sharedb'; -export interface IAdapterService { - create(collectionId: string, snapshot: unknown): Promise; - - del(version: number, collectionId: string, docId: string): Promise; - - update( - version: number, - collectionId: string, - docId: string, - opContexts: unknown[] - ): Promise; +export interface IReadonlyAdapterService { getSnapshotBulk( collectionId: string, ids: string[], @@ -25,6 +15,19 @@ export interface IAdapterService { ): Promise<{ ids: string[]; extra?: unknown }>; } +export interface IAdapterService extends IReadonlyAdapterService { + create(collectionId: string, snapshot: unknown): Promise; + + del(version: number, collectionId: string, docId: string): Promise; + + update( + version: number, + collectionId: string, + docId: string, + opContexts: unknown[] + ): Promise; +} + export interface IShareDbConfig { db: DB; } diff --git a/apps/nestjs-backend/src/share-db/share-db.adapter.ts b/apps/nestjs-backend/src/share-db/share-db.adapter.ts index 1204e079b..201dcdbbe 100644 --- a/apps/nestjs-backend/src/share-db/share-db.adapter.ts +++ b/apps/nestjs-backend/src/share-db/share-db.adapter.ts @@ -20,7 +20,7 @@ import { RecordService } from '../features/record/record.service'; import { TableService } from '../features/table/table.service'; import { ViewService } from '../features/view/view.service'; import type { IClsStore } from '../types/cls'; -import type { IAdapterService } from './interface'; +import type { IAdapterService, IReadonlyAdapterService } from './interface'; import { WsAuthService } from './ws-auth.service'; export interface ICollectionSnapshot { @@ -52,6 +52,13 @@ export class ShareDbAdapter extends ShareDb.DB { } getService(type: IdPrefix): IAdapterService { + if (IdPrefix.Record === type) { + return this.recordService; + } + throw new Error(`QueryType: ${type} has no adapter service implementation`); + } + + getReadonlyService(type: IdPrefix): IReadonlyAdapterService { switch (type) { case IdPrefix.View: return this.viewService; @@ -62,7 +69,7 @@ export class ShareDbAdapter extends ShareDb.DB { case IdPrefix.Table: return this.tableService; } - throw new Error(`QueryType: ${type} has no service implementation`); + throw new Error(`QueryType: ${type} has no readonly adapter service implementation`); } query = async ( @@ -118,7 +125,7 @@ export class ShareDbAdapter extends ShareDb.DB { const [docType, collectionId] = collection.split('_'); - const queryResult = await this.getService(docType as IdPrefix).getDocIdsByQuery( + const queryResult = await this.getReadonlyService(docType as IdPrefix).getDocIdsByQuery( collectionId, query ); @@ -289,7 +296,7 @@ export class ShareDbAdapter extends ShareDb.DB { try { const [docType, collectionId] = collection.split('_'); - const snapshotData = await this.getService(docType as IdPrefix).getSnapshotBulk( + const snapshotData = await this.getReadonlyService(docType as IdPrefix).getSnapshotBulk( collectionId, ids, projection && projection['$submit'] ? undefined : projection diff --git a/apps/nestjs-backend/src/utils/index.ts b/apps/nestjs-backend/src/utils/index.ts index b417962b6..39355d08e 100644 --- a/apps/nestjs-backend/src/utils/index.ts +++ b/apps/nestjs-backend/src/utils/index.ts @@ -1,4 +1,3 @@ export * from './name-conversion'; -export * from './view-order-field-name'; export * from './string-hash'; export * from './file-utils'; diff --git a/apps/nestjs-backend/src/utils/update-order.spec.ts b/apps/nestjs-backend/src/utils/update-order.spec.ts new file mode 100644 index 000000000..8b60fe49d --- /dev/null +++ b/apps/nestjs-backend/src/utils/update-order.spec.ts @@ -0,0 +1,203 @@ +import { updateOrder, updateMultipleOrders } from './update-order'; // Adjust the import path as necessary + +describe('updateOrder', () => { + // Mock dependencies + const getNextItemMock = vi.fn(); + const updateMock = vi.fn(); + const shuffleMock = vi.fn(); + + afterEach(() => { + vi.clearAllMocks(); + }); + + it('correctly handles reordering before the anchor item', async () => { + // Setup for case 1 + getNextItemMock.mockResolvedValueOnce({ id: '2', order: 2 }); + const params = { + parentId: 'parent1', + position: 'before' as const, + item: { id: 'item1', order: 4 }, + anchorItem: { id: 'anchor', order: 3 }, + getNextItem: getNextItemMock, + update: updateMock, + shuffle: shuffleMock, + }; + + await updateOrder(params); + + // Verify getNextItem was called correctly + expect(getNextItemMock).toHaveBeenCalledWith({ lt: 3 }, 'desc'); + // Verify update was called with expected arguments + expect(updateMock).toHaveBeenCalledWith('parent1', 'item1', { + newOrder: 2.5, + oldOrder: 4, + }); + // Verify shuffle was not called + expect(shuffleMock).not.toHaveBeenCalled(); + }); + + it('correctly handles reordering after the anchor item', async () => { + // Setup for case 2 + getNextItemMock.mockResolvedValueOnce({ id: '4', order: 4 }); + const params = { + parentId: 'parent1', + position: 'after' as const, + item: { id: 'item1', order: 2 }, + anchorItem: { id: 'anchor', order: 3 }, + getNextItem: getNextItemMock, + update: updateMock, + shuffle: shuffleMock, + }; + + await updateOrder(params); + + // Verify getNextItem was called correctly + expect(getNextItemMock).toHaveBeenCalledWith({ gt: 3 }, 'asc'); + // Verify update was called with expected arguments + expect(updateMock).toHaveBeenCalledWith('parent1', 'item1', { + newOrder: 3.5, + oldOrder: 2, + }); + // Verify shuffle was not called + expect(shuffleMock).not.toHaveBeenCalled(); + }); + + it('handles null from getNextItem correctly, indicating no next item', async () => { + // Setup: getNextItem returns null + getNextItemMock.mockResolvedValueOnce(null); + const params = { + parentId: 'parent1', + position: 'after' as const, // Can test 'before' in a similar manner with adjusted logic + item: { id: 'item1', order: 4 }, + anchorItem: { id: 'anchor', order: 5 }, + getNextItem: getNextItemMock, + update: updateMock, + shuffle: shuffleMock, + }; + + await updateOrder(params); + + // When there's no item after the anchor, we expect the item to move just after the anchor + expect(updateMock).toHaveBeenCalledWith('parent1', 'item1', { newOrder: 6, oldOrder: 4 }); + expect(shuffleMock).not.toHaveBeenCalled(); + }); + + it('calls shuffle when the new order is too close to the anchor order', async () => { + // Setup: getNextItem returns a value that would cause a shuffle due to close orders + getNextItemMock.mockResolvedValueOnce({ id: 'anchor', order: 3 - Number.EPSILON }); + const params = { + parentId: 'parent1', + position: 'before' as const, + item: { id: 'item1', order: 4 }, + anchorItem: { id: 'anchor', order: 3 }, + getNextItem: getNextItemMock, + update: updateMock, + shuffle: shuffleMock, + }; + + // it will not be endless loop, because getNextItemMock will return null in the next call + await updateOrder(params); + + // Verify shuffle is called due to the order being too close + expect(shuffleMock).toHaveBeenCalledOnce(); + expect(updateMock).toHaveBeenCalledOnce(); // Ensure update is called after shuffle + }); +}); + +describe('update multiple order', () => { + // Mock dependencies + const getNextItemMock = vi.fn(); + const updateMock = vi.fn(); + const shuffleMock = vi.fn(); + + afterEach(() => { + vi.clearAllMocks(); + }); + + it('correctly handles reordering before the anchor item', async () => { + // Setup for case 1 + getNextItemMock.mockResolvedValueOnce({ id: '2', order: 2 }); + const params = { + parentId: 'parent1', + position: 'before' as const, + itemLength: 3, + anchorItem: { id: 'anchor', order: 3 }, + getNextItem: getNextItemMock, + update: updateMock, + shuffle: shuffleMock, + }; + + await updateMultipleOrders(params); + + // Verify getNextItem was called correctly + expect(getNextItemMock).toHaveBeenCalledWith({ lt: 3 }, 'desc'); + // Verify update was called with expected arguments + expect(updateMock).toHaveBeenCalledWith([2.25, 2.5, 2.75]); + // Verify shuffle was not called + expect(shuffleMock).not.toHaveBeenCalled(); + }); + + it('correctly handles reordering after the anchor item', async () => { + // Setup for case 2 + getNextItemMock.mockResolvedValueOnce({ id: '4', order: 4 }); + const params = { + parentId: 'parent1', + position: 'after' as const, + itemLength: 3, + anchorItem: { id: 'anchor', order: 3 }, + getNextItem: getNextItemMock, + update: updateMock, + shuffle: shuffleMock, + }; + + await updateMultipleOrders(params); + + // Verify getNextItem was called correctly + expect(getNextItemMock).toHaveBeenCalledWith({ gt: 3 }, 'asc'); + // Verify update was called with expected arguments + expect(updateMock).toHaveBeenCalledWith([3.25, 3.5, 3.75]); + // Verify shuffle was not called + expect(shuffleMock).not.toHaveBeenCalled(); + }); + + it('handles null from getNextItem correctly, indicating no next item', async () => { + // Setup: getNextItem returns null + getNextItemMock.mockResolvedValueOnce(null); + const params = { + parentId: 'parent1', + position: 'after' as const, + itemLength: 3, + anchorItem: { id: 'anchor', order: 7 }, + getNextItem: getNextItemMock, + update: updateMock, + shuffle: shuffleMock, + }; + + await updateMultipleOrders(params); + + // When there's no item after the anchor, we expect the item to move just after the anchor + expect(updateMock).toHaveBeenCalledWith([7.25, 7.5, 7.75]); + expect(shuffleMock).not.toHaveBeenCalled(); + }); + + it('calls shuffle when the new order is too close to the anchor order', async () => { + // Setup: getNextItem returns a value that would cause a shuffle due to close orders + getNextItemMock.mockResolvedValueOnce({ id: 'anchor', order: 3 - Number.EPSILON }); + const params = { + parentId: 'parent1', + position: 'before' as const, + itemLength: 1, + anchorItem: { id: 'anchor', order: 3 }, + getNextItem: getNextItemMock, + update: updateMock, + shuffle: shuffleMock, + }; + + // it will not be endless loop, because getNextItemMock will return null in the next call + await updateMultipleOrders(params); + + // Verify shuffle is called due to the order being too close + expect(shuffleMock).toHaveBeenCalledOnce(); + expect(updateMock).toHaveBeenCalledOnce(); // Ensure update is called after shuffle + }); +}); diff --git a/apps/nestjs-backend/src/utils/update-order.ts b/apps/nestjs-backend/src/utils/update-order.ts new file mode 100644 index 000000000..4f34b2ae5 --- /dev/null +++ b/apps/nestjs-backend/src/utils/update-order.ts @@ -0,0 +1,106 @@ +/** + * if we have [1,2,3,4,5] + * -------------------------------- + * case 1: + * anchorId = 3, position = 'before', order = 2 + * pick the order < 3, we have [1, 2] + * orderBy desc, we have [2, 1] + * pick the first one, we have 2 + * -------------------------------- + * case 2: + * anchorId = 3, position = 'after', order = 2 + * pick the order > 3, we have [4, 5] + * orderBy asc, we have [4, 5] + * pick the first one, we have 4 + */ +export async function updateOrder(params: { + parentId: string; + position: 'before' | 'after'; + item: { id: string; order: number }; + anchorItem: { id: string; order: number }; + getNextItem: ( + whereOrder: { lt?: number; gt?: number }, + align: 'desc' | 'asc' + ) => Promise<{ id: string; order: number } | null>; + update: ( + parentId: string, + id: string, + data: { newOrder: number; oldOrder: number } + ) => Promise; + shuffle: (parentId: string) => Promise; +}) { + const { parentId, position, item, anchorItem, getNextItem, update, shuffle } = params; + const nextView = await getNextItem( + { [position === 'before' ? 'lt' : 'gt']: anchorItem.order }, + position === 'before' ? 'desc' : 'asc' + ); + + const order = nextView + ? (nextView.order + anchorItem.order) / 2 + : anchorItem.order + (position === 'before' ? -1 : 1); + + const { id, order: oldOrder } = item; + + if (Math.abs(order - anchorItem.order) < Number.EPSILON * 2) { + await shuffle(parentId); + // recursive call + await updateOrder(params); + return; + } + await update(parentId, id, { newOrder: order, oldOrder }); +} + +/** + * if we have [1,2,3,4,5] + * -------------------------------- + * case 1: + * anchor = 3, position = 'before', item.length = 2 + * pick the order < 3, we have [1, 2] + * orderBy desc, we have [2, 1] + * pick the first one, we have 2 for the next order + * gap = ABS((anchor - next) / (item.length + 1)) = (3 - 2) / (2 + 1) = 0.333 + * new item orders = next + gap * item.index = [2.333, 2.667] + * -------------------------------- + * case 2: + * anchor = 3, position = 'after', item.length = 2 + * pick the order > 3, we have [4, 5] + * orderBy asc, we have [4, 5] + * pick the first one, we have 4 for the next order + * gap = ABS((anchor - next) / (item.length + 1)) = ABS((3 - 4) / (2 + 1)) = 0.333 + * new item orders = anchor + gap * item.index = [3.333, 3.667] + */ +export async function updateMultipleOrders(params: { + parentId: string; + position: 'before' | 'after'; + itemLength: number; + anchorItem: { id: string; order: number }; + getNextItem: ( + whereOrder: { lt?: number; gt?: number }, + align: 'desc' | 'asc' + ) => Promise<{ id: string; order: number } | null>; + update: (indexes: number[]) => Promise; + shuffle: (parentId: string) => Promise; +}) { + const { parentId, position, itemLength, anchorItem, getNextItem, update, shuffle } = params; + const nextView = await getNextItem( + { [position === 'before' ? 'lt' : 'gt']: anchorItem.order }, + position === 'before' ? 'desc' : 'asc' + ); + + const nextOrder = nextView ? nextView.order : anchorItem.order + (position === 'before' ? -1 : 1); + const gap = Math.abs((anchorItem.order - nextOrder) / (itemLength + 1)); + + if (gap < Number.EPSILON * 2) { + await shuffle(parentId); + // recursive call + await updateMultipleOrders(params); + return; + } + + const orderBase = position === 'before' ? nextOrder : anchorItem.order; + const newItems = Array.from({ length: itemLength }).map( + (_, index) => orderBase + gap * (index + 1) + ); + + await update(newItems); +} diff --git a/apps/nestjs-backend/src/utils/view-order-field-name.ts b/apps/nestjs-backend/src/utils/view-order-field-name.ts deleted file mode 100644 index f0203063c..000000000 --- a/apps/nestjs-backend/src/utils/view-order-field-name.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { ROW_ORDER_FIELD_PREFIX } from '../features/view/constant'; - -export function getViewOrderFieldName(viewId?: string) { - return viewId ? `${ROW_ORDER_FIELD_PREFIX}_${viewId}` : '__auto_number'; -} diff --git a/apps/nestjs-backend/test/credit.e2e-spec.ts b/apps/nestjs-backend/test/credit.e2e-spec.ts new file mode 100644 index 000000000..a6f5d1829 --- /dev/null +++ b/apps/nestjs-backend/test/credit.e2e-spec.ts @@ -0,0 +1,91 @@ +/* eslint-disable sonarjs/no-duplicate-string */ +import type { INestApplication } from '@nestjs/common'; +import type { ITableFullVo } from '@teable/core'; +import { FieldKeyType } from '@teable/core'; +import { PrismaService } from '@teable/db-main-prisma'; +import { createBase, createSpace, deleteBase, deleteSpace } from '@teable/openapi'; +import { createRecords, createTable, deleteTable, initApp } from './utils/init-app'; + +describe('Credit limit (e2e)', () => { + let app: INestApplication; + let prisma: PrismaService; + beforeAll(async () => { + process.env.MAX_FREE_ROW_LIMIT = '10'; + const appCtx = await initApp(); + app = appCtx.app; + prisma = app.get(PrismaService); + }); + + afterAll(async () => { + process.env.MAX_FREE_ROW_LIMIT = undefined; + await app.close(); + }); + + describe('max row limit', () => { + let table: ITableFullVo; + let spaceId: string; + let baseId: string; + beforeEach(async () => { + const space = await createSpace({ + name: 'space1', + }); + spaceId = space.data.id; + const base = await createBase({ + spaceId, + }); + baseId = base.data.id; + table = await createTable(baseId, { name: 'table1' }); + }); + + afterEach(async () => { + await deleteTable(baseId, table.id); + await deleteBase(baseId); + await deleteSpace(spaceId); + }); + + it('should create a record', async () => { + // create 6 record succeed, 3(default) + 7 = 10 + await createRecords(table.id, { + fieldKeyType: FieldKeyType.Name, + records: Array.from({ length: 7 }).map(() => ({ fields: {} })), + }); + + // limit exceed + await createRecords( + table.id, + { + fieldKeyType: FieldKeyType.Name, + records: [{ fields: {} }], + }, + 400 + ); + }); + + it('should create a record with credit', async () => { + prisma.space.update({ + where: { + id: spaceId, + }, + data: { + credit: 11, + }, + }); + + // create 6 record succeed, 3(default) + 8 = 11 + await createRecords(table.id, { + fieldKeyType: FieldKeyType.Name, + records: Array.from({ length: 8 }).map(() => ({ fields: {} })), + }); + + // limit exceed + await createRecords( + table.id, + { + fieldKeyType: FieldKeyType.Name, + records: [{ fields: {} }], + }, + 400 + ); + }); + }); +}); diff --git a/apps/nestjs-backend/test/db-connection.e2e-spec.ts b/apps/nestjs-backend/test/db-connection.e2e-spec.ts index 1206ed7e1..f54fdad2c 100644 --- a/apps/nestjs-backend/test/db-connection.e2e-spec.ts +++ b/apps/nestjs-backend/test/db-connection.e2e-spec.ts @@ -22,7 +22,7 @@ describe.skip('OpenAPI Db Connection (e2e)', () => { }); it('should manage a db connection', async () => { - console.log('PUBLIC_DATABASE_ADDRESS', process.env.PUBLIC_DATABASE_ADDRESS); + console.log('PUBLIC_DATABASE_PROXY', process.env.PUBLIC_DATABASE_PROXY); if (globalThis.testConfig.driver !== DriverClient.Pg) { expect(true).toBeTruthy(); diff --git a/apps/nestjs-backend/test/field-converting.e2e-spec.ts b/apps/nestjs-backend/test/field-converting.e2e-spec.ts index 50ce1d1b9..12a12c555 100644 --- a/apps/nestjs-backend/test/field-converting.e2e-spec.ts +++ b/apps/nestjs-backend/test/field-converting.e2e-spec.ts @@ -223,8 +223,26 @@ describe('OpenAPI Freely perform column transformations (e2e)', () => { }, }; - const { newField } = await expectUpdate(table1, linkFieldRo, linkFieldRo2); + const linkField = await createField(table1.id, linkFieldRo); + await updateRecordByApi(table1.id, table1.records[0].id, linkField.id, { + id: table2.records[0].id, + }); + + const newField = await convertField(table1.id, linkField.id, linkFieldRo2); + expect(newField.name).toEqual('other name'); + + const { name: _, ...newFieldOthers } = newField; + const { name: _0, ...oldFieldOthers } = linkField; + + expect(newFieldOthers).toEqual(oldFieldOthers); + + const table2Records = await getRecords(table2.id, { fieldKeyType: FieldKeyType.Id }); + expect( + table2Records.records[0].fields[ + (linkField.options as ILinkFieldOptions).symmetricFieldId as string + ] + ).toMatchObject([{ id: table1.records[0].id }]); }); it('should modify rollup field name', async () => { diff --git a/apps/nestjs-backend/test/order-update.e2e-spec.ts b/apps/nestjs-backend/test/order-update.e2e-spec.ts new file mode 100644 index 000000000..2e82b518c --- /dev/null +++ b/apps/nestjs-backend/test/order-update.e2e-spec.ts @@ -0,0 +1,277 @@ +import type { INestApplication } from '@nestjs/common'; +import type { ITableFullVo } from '@teable/core'; +import { ViewType } from '@teable/core'; +import type { ICreateBaseVo, ICreateSpaceVo } from '@teable/openapi'; +import { + createBase, + createSpace, + createTable, + deleteBase, + deleteSpace, + getBaseList, + getTableList, + updateBaseOrder, + updateRecordOrders, + updateTableOrder, + updateViewOrder, +} from '@teable/openapi'; +import { + initApp, + createView, + deleteTable, + getViews, + getRecords, + createRecords, +} from './utils/init-app'; + +describe('order update', () => { + let app: INestApplication; + beforeAll(async () => { + const appCtx = await initApp(); + app = appCtx.app; + }); + + afterAll(async () => { + await app.close(); + }); + + describe('record', () => { + const baseId = globalThis.testConfig.baseId; + let table: ITableFullVo; + beforeEach(async () => { + table = (await createTable(baseId, { name: 'table1' })).data; + }); + + afterEach(async () => { + await deleteTable(baseId, table.id); + }); + + it('should update record order', async () => { + const viewId = table.views[0].id; + const record1 = { id: table.records[0].id }; + const record2 = { id: table.records[1].id }; + const record3 = { id: table.records[2].id }; + + await updateRecordOrders(table.id, viewId, { + anchorId: record2.id, + position: 'before', + recordIds: [record3.id], + }); + const data1 = await getRecords(table.id, { viewId }); + expect(data1.records).toMatchObject([record1, record3, record2]); + + await updateRecordOrders(table.id, viewId, { + anchorId: record1.id, + position: 'before', + recordIds: [record3.id, record2.id], + }); + const data2 = await getRecords(table.id, { viewId }); + expect(data2.records).toMatchObject([record3, record2, record1]); + + await updateRecordOrders(table.id, viewId, { + anchorId: record1.id, + position: 'after', + recordIds: [record3.id, record2.id], + }); + const data3 = await getRecords(table.id, { viewId }); + expect(data3.records).toMatchObject([record1, record3, record2]); + + await updateRecordOrders(table.id, viewId, { + anchorId: record3.id, + position: 'after', + recordIds: [record2.id, record3.id], + }); + const data4 = await getRecords(table.id, { viewId }); + expect(data4.records).toMatchObject([record1, record2, record3]); + + const result = await createRecords(table.id, { + records: [{ fields: {} }], + order: { + viewId, + anchorId: record1.id, + position: 'before', + }, + }); + const data5 = await getRecords(table.id, { viewId }); + expect(data5.records).toMatchObject([ + { id: result.records[0].id }, + record1, + record2, + record3, + ]); + }); + + it('should create record with order', async () => { + const viewId = table.views[0].id; + const record1 = { id: table.records[0].id }; + const record2 = { id: table.records[1].id }; + const record3 = { id: table.records[2].id }; + + const result = await createRecords(table.id, { + records: [{ fields: {} }], + order: { + viewId, + anchorId: record1.id, + position: 'before', + }, + }); + const data1 = await getRecords(table.id, { viewId }); + expect(data1.records).toMatchObject([ + { id: result.records[0].id }, + record1, + record2, + record3, + ]); + + const result2 = await createRecords(table.id, { + records: [{ fields: {} }], + order: { + viewId, + anchorId: record3.id, + position: 'after', + }, + }); + const data2 = await getRecords(table.id, { viewId }); + expect(data2.records).toMatchObject([ + { id: result.records[0].id }, + record1, + record2, + record3, + { id: result2.records[0].id }, + ]); + }); + }); + + describe('view', () => { + const baseId = globalThis.testConfig.baseId; + let table: ITableFullVo; + beforeEach(async () => { + table = (await createTable(baseId, { name: 'table1' })).data; + }); + + afterEach(async () => { + await deleteTable(baseId, table.id); + }); + + it('should update view order', async () => { + const view1 = { id: table.views[0].id }; + + const view2 = { + id: ( + await createView(table.id, { + name: 'view', + type: ViewType.Grid, + }) + ).id, + }; + + const view3 = { + id: ( + await createView(table.id, { + name: 'view', + type: ViewType.Grid, + }) + ).id, + }; + + await updateViewOrder(table.id, view3.id, { anchorId: view2.id, position: 'before' }); + const views = await getViews(table.id); + expect(views).toMatchObject([view1, view3, view2]); + + await updateViewOrder(table.id, view3.id, { anchorId: view1.id, position: 'before' }); + const views2 = await getViews(table.id); + expect(views2).toMatchObject([view3, view1, view2]); + + await updateViewOrder(table.id, view3.id, { anchorId: view1.id, position: 'after' }); + const views3 = await getViews(table.id); + expect(views3).toMatchObject([view1, view3, view2]); + + await updateViewOrder(table.id, view3.id, { anchorId: view2.id, position: 'after' }); + const views4 = await getViews(table.id); + expect(views4).toMatchObject([view1, view2, view3]); + }); + }); + + describe('table', () => { + const spaceId = globalThis.testConfig.spaceId; + let base: ICreateBaseVo; + beforeEach(async () => { + base = (await createBase({ spaceId, name: 'base1' })).data; + }); + + afterEach(async () => { + await deleteBase(base.id); + }); + + it('should update table order', async () => { + const table1 = { + id: (await createTable(base.id)).data.id, + }; + + const table2 = { + id: (await createTable(base.id)).data.id, + }; + + const table3 = { + id: (await createTable(base.id)).data.id, + }; + + await updateTableOrder(base.id, table3.id, { anchorId: table2.id, position: 'before' }); + const tables = (await getTableList(base.id)).data; + expect(tables).toMatchObject([table1, table3, table2]); + + await updateTableOrder(base.id, table3.id, { anchorId: table1.id, position: 'before' }); + const tables2 = (await getTableList(base.id)).data; + expect(tables2).toMatchObject([table3, table1, table2]); + + await updateTableOrder(base.id, table3.id, { anchorId: table1.id, position: 'after' }); + const tables3 = (await getTableList(base.id)).data; + expect(tables3).toMatchObject([table1, table3, table2]); + + await updateTableOrder(base.id, table3.id, { anchorId: table2.id, position: 'after' }); + const tables4 = (await getTableList(base.id)).data; + expect(tables4).toMatchObject([table1, table2, table3]); + }); + }); + + describe('base', () => { + let space: ICreateSpaceVo; + beforeEach(async () => { + space = (await createSpace({})).data; + }); + + afterEach(async () => { + await deleteSpace(space.id); + }); + + it('should update base order', async () => { + const base1 = { + id: (await createBase({ spaceId: space.id })).data.id, + }; + + const base2 = { + id: (await createBase({ spaceId: space.id })).data.id, + }; + + const base3 = { + id: (await createBase({ spaceId: space.id })).data.id, + }; + + await updateBaseOrder({ baseId: base3.id, anchorId: base2.id, position: 'before' }); + const bases = (await getBaseList({ spaceId: space.id })).data; + expect(bases).toMatchObject([base1, base3, base2]); + + await updateBaseOrder({ baseId: base3.id, anchorId: base1.id, position: 'before' }); + const bases2 = (await getBaseList({ spaceId: space.id })).data; + expect(bases2).toMatchObject([base3, base1, base2]); + + await updateBaseOrder({ baseId: base3.id, anchorId: base1.id, position: 'after' }); + const bases3 = (await getBaseList({ spaceId: space.id })).data; + expect(bases3).toMatchObject([base1, base3, base2]); + + await updateBaseOrder({ baseId: base3.id, anchorId: base2.id, position: 'after' }); + const bases4 = (await getBaseList({ spaceId: space.id })).data; + expect(bases4).toMatchObject([base1, base2, base3]); + }); + }); +}); diff --git a/apps/nestjs-backend/test/record.e2e-spec.ts b/apps/nestjs-backend/test/record.e2e-spec.ts index e079f68f5..10dcccfde 100644 --- a/apps/nestjs-backend/test/record.e2e-spec.ts +++ b/apps/nestjs-backend/test/record.e2e-spec.ts @@ -13,7 +13,6 @@ import { getField, getRecord, getRecords, - getViews, initApp, updateRecord, updateRecordByApi, @@ -122,23 +121,6 @@ describe('OpenAPI RecordController (e2e)', () => { expect(res2.records[0].fields[table.fields[0].id]).toEqual(value2); }); - it('should create a record with order', async () => { - const viewResponse = await getViews(table.id); - const viewId = viewResponse[0].id; - const res = await createRecords(table.id, { - records: [ - { - fields: {}, - recordOrder: { - [viewId]: 0.6, - }, - }, - ], - }); - - expect(res.records[0].recordOrder[viewId]).toEqual(0.6); - }); - it('should update record', async () => { const record = await updateRecordByApi( table.id, diff --git a/apps/nestjs-backend/test/reference.e2e-spec.ts.bak b/apps/nestjs-backend/test/reference.e2e-spec.ts.bak index 34ac3181d..1b3e70994 100644 --- a/apps/nestjs-backend/test/reference.e2e-spec.ts.bak +++ b/apps/nestjs-backend/test/reference.e2e-spec.ts.bak @@ -462,17 +462,14 @@ describe('Reference Service (e2e)', () => { idC1: { id: 'idC1', fields: { fieldC: 'CX', manyToOneB: { title: 'C1, C2', id: 'idB1' } }, - recordOrder: {}, }, idC2: { id: 'idC2', fields: { fieldC: 'C2', manyToOneB: { title: 'C1, C2', id: 'idB1' } }, - recordOrder: {}, }, idC3: { id: 'idC3', fields: { fieldC: 'C3', manyToOneB: { title: 'C3', id: 'idB2' } }, - recordOrder: {}, }, idB1: { id: 'idB1', @@ -484,7 +481,6 @@ describe('Reference Service (e2e)', () => { { title: 'C2', id: 'idC2' }, ], }, - recordOrder: {}, }, idB2: { id: 'idB2', @@ -493,7 +489,6 @@ describe('Reference Service (e2e)', () => { manyToOneA: { title: 'A1', id: 'idA1' }, oneToManyC: [{ title: 'C3', id: 'idC3' }], }, - recordOrder: {}, }, idA1: { id: 'idA1', @@ -504,7 +499,6 @@ describe('Reference Service (e2e)', () => { { title: 'C3', id: 'idB2' }, ], }, - recordOrder: {}, }, }; // topoOrder Graph: @@ -722,7 +716,7 @@ describe('Reference Service (e2e)', () => { }; const recordMap = { // use new value fieldA: 1 here - idA1: { id: 'idA1', fields: { fieldA: 1, fieldB: null, fieldC: 'X' }, recordOrder: {} }, + idA1: { id: 'idA1', fields: { fieldA: 1, fieldB: null, fieldC: 'X' } }, }; // topoOrder Graph: // A.fieldA -> A.fieldB diff --git a/apps/nestjs-backend/test/sort.e2e-spec.ts b/apps/nestjs-backend/test/sort.e2e-spec.ts index a0e87992b..1ea98963e 100644 --- a/apps/nestjs-backend/test/sort.e2e-spec.ts +++ b/apps/nestjs-backend/test/sort.e2e-spec.ts @@ -2,7 +2,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import type { INestApplication } from '@nestjs/common'; import type { IFieldRo, IGetRecordsRo, ISortItem, ITableFullVo } from '@teable/core'; -import { FieldType, CellValueType, SortFunc } from '@teable/core'; +import { CellValueType, SortFunc, FieldType } from '@teable/core'; import { updateViewSort as apiSetViewSort } from '@teable/openapi'; import { isEmpty, orderBy } from 'lodash'; import type { SingleSelectOptionsDto } from '../src/features/field/model/field-dto/single-select-field.dto'; @@ -202,6 +202,33 @@ describe('OpenAPI Sort (e2e) Base CellValueType', () => { expect(ascOriginRecords).toEqual(ascManualSortRecords); expect(descOriginRecords).toEqual(descManualSortRecords); }); + + test('view sort property should be merged after by interface parameter orderBy', async () => { + const { id: subTableId, fields: fields2, defaultViewId } = table; + const field = fields2.find( + (field) => field.type === FieldType.Number + ) as ITableFullVo['fields'][number]; + const { id: fieldId } = field; + + const booleanField = fields2.find((field) => field.type === FieldType.Checkbox); + const { id: booleanFieldId } = booleanField!; + + const ascOrders: IGetRecordsRo['orderBy'] = [{ fieldId, order: SortFunc.Asc }]; + const descOrders: IGetRecordsRo['orderBy'] = [ + { fieldId: booleanFieldId, order: SortFunc.Desc }, + ]; + await setRecordsOrder(subTableId, defaultViewId!, ascOrders); + const originRecords = await getSortRecords(subTableId, { + viewId: defaultViewId, + orderBy: descOrders, + }); + const manualSortRecords = getRecordsByOrder( + originRecords, + [...descOrders, ...ascOrders], + fields2 + ); + expect(originRecords).toEqual(manualSortRecords); + }); }); describe('OpenAPI Sort (e2e) Multiple CellValueType', () => { diff --git a/apps/nestjs-backend/test/table-import.e2e-spec.ts b/apps/nestjs-backend/test/table-import.e2e-spec.ts index 226ce44fc..420d7194c 100644 --- a/apps/nestjs-backend/test/table-import.e2e-spec.ts +++ b/apps/nestjs-backend/test/table-import.e2e-spec.ts @@ -1,4 +1,6 @@ import fs from 'fs'; +import os from 'node:os'; +import path from 'path'; import type { INestApplication } from '@nestjs/common'; import { SUPPORTEDTYPE } from '@teable/core'; import { @@ -9,17 +11,103 @@ import { importTableFromFile as apiImportTableFromFile, getTableById as apiGetTableById, } from '@teable/openapi'; +import * as XLSX from 'xlsx'; +import { CsvImporter } from '../src/features/import/open-api/import.class'; import { initApp, deleteTable } from './utils/init-app'; -let app: INestApplication; -const baseId = globalThis.testConfig.baseId; -const csvTmpPath = 'test.csv'; -const textTmpPath = 'test.txt'; +enum TestFileFormat { + 'CSV' = 'csv', + 'TSV' = 'tsv', + 'TXT' = 'txt', + 'XLSX' = 'xlsx', +} + +const testFileFormats = [ + TestFileFormat.CSV, + TestFileFormat.TSV, + TestFileFormat.TXT, + TestFileFormat.XLSX, +]; + +interface ITestFile { + [key: string]: { + path: string; + url: string; + }; +} const data = `field_1,field_2,field_3,field_4,field_5,field_6 1,string_1,true,2022-11-10 16:00:00,,"long text" 2,string_2,false,2022-11-11 16:00:00,,`; +const tsvData = `field_1 field_2 field_3 field_4 field_5 field_6 +1 string_1 true 2022-11-10 16:00:00 "long\ntext" +2 string_2 false 2022-11-11 16:00:00 `; +const defaultTestSheetKey = 'Sheet1'; +const workbook = XLSX.utils.book_new(); + +const worksheet = XLSX.utils.aoa_to_sheet([ + ['field_1', 'field_2', 'field_3', 'field_4', 'field_5', 'field_6'], + [1, 'string_1', true, '2022-11-10 16:00:00', '', `long\ntext`], + [2, 'string_2', false, '2022-11-11 16:00:00', '', ''], +]); + +XLSX.utils.book_append_sheet(workbook, worksheet, defaultTestSheetKey); + +let app: INestApplication; +let testFiles: ITestFile = {}; +const baseId = globalThis.testConfig.baseId; +const genTestFiles = async () => { + const result: ITestFile = {}; + const fileDataMap = { + [TestFileFormat.CSV]: data, + [TestFileFormat.TSV]: tsvData, + [TestFileFormat.TXT]: data, + [TestFileFormat.XLSX]: await XLSX.write(workbook, { type: 'buffer', bookType: 'xlsx' }), + }; + const contentTypeMap = { + [TestFileFormat.CSV]: 'text/csv', + [TestFileFormat.TSV]: 'text/tab-separated-values', + [TestFileFormat.TXT]: 'text/plain', + [TestFileFormat.XLSX]: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }; + const tmpDir = os.tmpdir(); + for (let i = 0; i < testFileFormats.length; i++) { + const format = testFileFormats[i]; + const tmpPath = path.resolve(path.join(tmpDir, `test.${format}`)); + const data = fileDataMap[format]; + const contentType = contentTypeMap[format]; + + fs.writeFileSync(tmpPath, data); + + const file = fs.readFileSync(tmpPath); + const stats = fs.statSync(tmpPath); + + const { token, requestHeaders } = ( + await apiGetSignature( + { + type: 1, + contentLength: stats.size, + contentType: contentType, + }, + undefined + ) + ).data; + + await apiUploadFile(token, file, requestHeaders); + + const { + data: { presignedUrl }, + } = await apiNotify(token); + + result[format] = { + path: tmpPath, + url: presignedUrl, + }; + } + return result; +}; + const assertHeaders = [ { type: 'number', @@ -46,61 +134,20 @@ const assertHeaders = [ name: 'field_6', }, ]; -let csvUrl: string; -let textUrl: string; beforeAll(async () => { const appCtx = await initApp(); app = appCtx.app; - fs.writeFileSync(csvTmpPath, data); - const fileData = fs.readFileSync(csvTmpPath); - const fileStats = fs.statSync(csvTmpPath); - - fs.writeFileSync(textTmpPath, data); - const textFileData = fs.readFileSync(textTmpPath); - const textStats = fs.statSync(textTmpPath); - - const { token, requestHeaders } = ( - await apiGetSignature( - { - type: 1, - contentLength: fileStats.size, - contentType: 'text/csv', - }, - undefined - ) - ).data; - - const { token: txtToken, requestHeaders: txtRequestHeaders } = ( - await apiGetSignature( - { - type: 1, - contentLength: textStats.size, - contentType: 'text/plain', - }, - undefined - ) - ).data; - - await apiUploadFile(token, fileData, requestHeaders); - - await apiUploadFile(txtToken, textFileData, txtRequestHeaders); - - const res = await apiNotify(token); - const txtRes = await apiNotify(txtToken); - csvUrl = res.data.presignedUrl; - textUrl = txtRes.data.presignedUrl; + testFiles = await genTestFiles(); }); afterAll(async () => { await app.close(); - fs.unlink(csvTmpPath, (err) => { - if (err) throw err; - console.log('delete csv tmp file success!'); - }); - fs.unlink(textTmpPath, (err) => { - if (err) throw err; - console.log('delete csv tmp file success!'); + testFileFormats.forEach((type) => { + fs.unlink(testFiles[type].path, (err) => { + if (err) throw err; + console.log(`delete ${type} test file success!`); + }); }); }); @@ -109,17 +156,17 @@ describe('/import/analyze OpenAPI ImportController (e2e) Get a column info from const { data: { worksheets }, } = await apiAnalyzeFile({ - attachmentUrl: csvUrl, + attachmentUrl: testFiles[TestFileFormat.CSV].url, fileType: SUPPORTEDTYPE.CSV, }); - const calculatedColumnHeaders = worksheets[0].columns; + const calculatedColumnHeaders = worksheets[CsvImporter.DEFAULT_SHEETKEY].columns; expect(calculatedColumnHeaders).toEqual(assertHeaders); }); it(`should return 400, when url file type is not csv`, async () => { await expect( apiAnalyzeFile({ - attachmentUrl: textUrl, + attachmentUrl: testFiles[TestFileFormat.TXT].url, fileType: SUPPORTEDTYPE.CSV, }) ).rejects.toMatchObject({ @@ -127,168 +174,157 @@ describe('/import/analyze OpenAPI ImportController (e2e) Get a column info from code: 'validation_error', }); }); + + it(`should return column header info from excel file`, async () => { + const { + data: { worksheets }, + } = await apiAnalyzeFile({ + attachmentUrl: testFiles[TestFileFormat.XLSX].url, + fileType: SUPPORTEDTYPE.EXCEL, + }); + const calculatedColumnHeaders = worksheets['Sheet1'].columns; + expect(calculatedColumnHeaders).toEqual(assertHeaders); + }); }); describe('/import/{baseId} OpenAPI ImportController (e2e) (Post)', () => { const tableIds: string[] = []; + const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); afterAll(async () => { tableIds.forEach((tableId) => { deleteTable(baseId, tableId); }); }); - - it(`should create a new Table from csv file`, async () => { + // TODO fix sqlite error, cancel tmp delay + it(`should create a new Table from csv/tsv/excel file`, async () => { const { data: { worksheets }, } = await apiAnalyzeFile({ - attachmentUrl: csvUrl, + attachmentUrl: testFiles[TestFileFormat.CSV].url, fileType: SUPPORTEDTYPE.CSV, }); - const calculatedColumnHeaders = worksheets[0].columns; + const calculatedColumnHeaders = worksheets[CsvImporter.DEFAULT_SHEETKEY].columns; const table = await apiImportTableFromFile(baseId, { - attachmentUrl: csvUrl, + attachmentUrl: testFiles[TestFileFormat.CSV].url, fileType: SUPPORTEDTYPE.CSV, - worksheets: [ - { - name: 'sheet1', + worksheets: { + [CsvImporter.DEFAULT_SHEETKEY]: { + name: CsvImporter.DEFAULT_SHEETKEY, columns: calculatedColumnHeaders.map((column, index) => ({ ...column, sourceColumnIndex: index, })), - options: { - useFirstRowAsHeader: true, - importData: true, - }, + useFirstRowAsHeader: true, + importData: true, }, - ], + }, }); const { fields, id } = table.data[0]; + tableIds.push(id); const createdFields = fields.map((field) => ({ type: field.type, name: field.name, })); - const { - data: { records }, - } = await apiGetTableById(baseId, table.data[0].id, { + const res = await apiGetTableById(baseId, table.data[0].id, { includeContent: true, }); - tableIds.push(id); - const filledRecords = records?.map((rec) => { - const newRec = { ...rec.fields }; - newRec['field_4'] = +new Date(newRec['field_4'] as string); - return { ...newRec }; - }); - const assertRecords = [ - { - field_1: 1, - field_2: 'string_1', - field_3: true, - field_4: +new Date(new Date('2022-11-10 16:00:00').toUTCString()), - field_6: 'long\ntext', - }, - { - field_1: 2, - field_2: 'string_2', - field_4: +new Date(new Date('2022-11-11 16:00:00').toUTCString()), - }, - ]; + expect(createdFields).toEqual(assertHeaders); - expect(records?.length).toBe(2); - expect(filledRecords).toEqual(assertRecords); - }); + expect(res).toMatchObject({ + status: 200, + statusText: 'OK', + }); + + await delay(1000); - it(`should create a new Table from csv file only fields without data`, async () => { const { - data: { worksheets }, + data: { worksheets: worksheets1 }, } = await apiAnalyzeFile({ - attachmentUrl: csvUrl, - fileType: SUPPORTEDTYPE.CSV, + attachmentUrl: testFiles[TestFileFormat.XLSX].url, + fileType: SUPPORTEDTYPE.EXCEL, }); - const calculatedColumnHeaders = worksheets[0].columns; + const calculatedColumnHeaders1 = worksheets1[defaultTestSheetKey].columns; - const table = await apiImportTableFromFile(baseId, { - attachmentUrl: csvUrl, - fileType: SUPPORTEDTYPE.CSV, - worksheets: [ - { - name: 'sheet1', - columns: calculatedColumnHeaders.map((column, index) => ({ + const table1 = await apiImportTableFromFile(baseId, { + attachmentUrl: testFiles[TestFileFormat.XLSX].url, + fileType: SUPPORTEDTYPE.EXCEL, + worksheets: { + [defaultTestSheetKey]: { + name: defaultTestSheetKey, + columns: calculatedColumnHeaders1.map((column, index) => ({ ...column, sourceColumnIndex: index, })), - options: { - useFirstRowAsHeader: true, - importData: false, - }, + useFirstRowAsHeader: true, + importData: true, }, - ], + }, }); - const { fields, id } = table.data[0]; + const { fields: fields1, id: id1 } = table1.data[0]; + tableIds.push(id1); - const createdFields = fields.map((field) => ({ + const createdFields1 = fields1.map((field) => ({ type: field.type, name: field.name, })); - const { - data: { records }, - } = await apiGetTableById(baseId, table.data[0].id, { + const res1 = await apiGetTableById(baseId, table1.data[0].id, { includeContent: true, }); - tableIds.push(id); - expect(createdFields).toEqual(assertHeaders); - expect(records?.length).toBe(0); - }); + expect(createdFields1).toEqual(assertHeaders); + expect(res1).toMatchObject({ + status: 200, + statusText: 'OK', + }); + + await delay(1000); - it(`should create a new Table from csv file useFirstRowAsHeader: false`, async () => { const { - data: { worksheets }, + data: { worksheets: worksheet2 }, } = await apiAnalyzeFile({ - attachmentUrl: csvUrl, + attachmentUrl: testFiles[TestFileFormat.TSV].url, fileType: SUPPORTEDTYPE.CSV, }); + const calculatedColumnHeaders2 = worksheet2[CsvImporter.DEFAULT_SHEETKEY].columns; - const calculatedColumnHeaders = worksheets[0].columns; - - const table = await apiImportTableFromFile(baseId, { - attachmentUrl: csvUrl, + const table2 = await apiImportTableFromFile(baseId, { + attachmentUrl: testFiles[TestFileFormat.TSV].url, fileType: SUPPORTEDTYPE.CSV, - worksheets: [ - { - name: 'sheet1', - columns: calculatedColumnHeaders.map((column, index) => ({ + worksheets: { + [CsvImporter.DEFAULT_SHEETKEY]: { + name: defaultTestSheetKey, + columns: calculatedColumnHeaders2.map((column, index) => ({ ...column, sourceColumnIndex: index, })), - options: { - useFirstRowAsHeader: false, - importData: true, - }, + useFirstRowAsHeader: true, + importData: true, }, - ], + }, }); - const { fields, id } = table.data[0]; + const { fields: fields2, id: id2 } = table2.data[0]; + tableIds.push(id2); - const createdFields = fields.map((field) => ({ + const createdFields2 = fields2.map((field) => ({ type: field.type, name: field.name, })); - const { - data: { records }, - } = await apiGetTableById(baseId, table.data[0].id, { + const res2 = await apiGetTableById(baseId, table2.data[0].id, { includeContent: true, }); - tableIds.push(id); - expect(createdFields).toEqual(assertHeaders); - expect(records?.length).toBe(3); + expect(createdFields2).toEqual(assertHeaders); + expect(res2).toMatchObject({ + status: 200, + statusText: 'OK', + }); }); }); diff --git a/apps/nestjs-backend/test/table.e2e-spec.ts b/apps/nestjs-backend/test/table.e2e-spec.ts index 458ade5b8..3eada72e3 100644 --- a/apps/nestjs-backend/test/table.e2e-spec.ts +++ b/apps/nestjs-backend/test/table.e2e-spec.ts @@ -8,7 +8,6 @@ import { updateTableDescription, updateTableIcon, updateTableName, - updateTableOrder, deleteTable as apiDeleteTable, } from '@teable/openapi'; import { DB_PROVIDER_SYMBOL } from '../src/db-provider/db.provider'; @@ -129,11 +128,13 @@ describe('OpenAPI TableController (e2e)', () => { }); afterAll(async () => { - await deleteTable(baseId, tableId); - await app.close(); }); + afterEach(async () => { + await deleteTable(baseId, tableId); + }); + it('/api/table/ (POST) with assertData data', async () => { let eventCount = 0; event.once(Events.TABLE_CREATE, async (payload: TableCreateEvent) => { @@ -228,14 +229,12 @@ describe('OpenAPI TableController (e2e)', () => { await updateTableName(baseId, tableId, { name: 'newTableName' }); await updateTableDescription(baseId, tableId, { description: 'newDescription' }); await updateTableIcon(baseId, tableId, { icon: '😀' }); - await updateTableOrder(baseId, tableId, { order: 1.11 }); const table = await getTable(baseId, tableId); expect(table.name).toEqual('newTableName'); expect(table.description).toEqual('newDescription'); expect(table.icon).toEqual('😀'); - expect(table.order).toEqual(1.11); }); it('should delete table and clean up link and lookup fields', async () => { diff --git a/apps/nestjs-backend/test/utils/init-app.ts b/apps/nestjs-backend/test/utils/init-app.ts index 80212eae7..cb50c686c 100644 --- a/apps/nestjs-backend/test/utils/init-app.ts +++ b/apps/nestjs-backend/test/utils/init-app.ts @@ -276,6 +276,7 @@ export async function createRecords( ): Promise { try { const res = await apiCreateRecords(tableId, { + ...recordsRo, fieldKeyType: recordsRo.fieldKeyType ?? FieldKeyType.Id, records: recordsRo.records, typecast: recordsRo.typecast ?? false, diff --git a/apps/nestjs-backend/test/utils/record-mock.ts b/apps/nestjs-backend/test/utils/record-mock.ts index 68e925dc4..5f57c3325 100644 --- a/apps/nestjs-backend/test/utils/record-mock.ts +++ b/apps/nestjs-backend/test/utils/record-mock.ts @@ -1,5 +1,5 @@ import { faker } from '@faker-js/faker'; -import type { Field, View } from '@prisma/client'; +import type { Field } from '@prisma/client'; import { PrismaClient } from '@prisma/client'; import type { IRatingFieldOptions, ISelectFieldOptions } from '@teable/core'; import { parseDsn, IdPrefix, Colors, FieldType, generateRecordId } from '@teable/core'; @@ -84,15 +84,6 @@ async function generateFieldData(params: { }, {}); } -async function generateViewRowIndex(params: { views: View[]; rowCount: number; i: number }) { - const { views, rowCount, i } = params; - - return views.reduce<{ [vieOrderKey: string]: number }>((pre, cur) => { - pre[`__row_${cur.id}`] = Number(rowCount) + i; - return pre; - }, {}); -} - export async function seeding(tableId: string, mockDataNum: number) { const databaseUrl = process.env.PRISMA_DATABASE_URL!; console.log('database-url: ', databaseUrl); @@ -132,20 +123,14 @@ export async function seeding(tableId: string, mockDataNum: number) { }); console.log(`Table: ${tableName}, mockDataNum: ${mockDataNum}`); - const views = await prisma.view.findMany({ where: { tableId } }); const knex = Knex({ client: driver, }); - const [{ count: rowCount }] = await prisma.$queryRawUnsafe<{ count: number }[]>( - knex(dbTableName).count({ count: '*' }).toQuery() - ); - console.time(`Table: ${tableName}, Ready Install Data`); const data: { [dbFieldName: string]: unknown }[] = []; for (let i = 0; i < mockDataNum; i++) { const fieldData = await generateFieldData({ mockDataNum, fields, selectOptions }); - const viewRowIndex = await generateViewRowIndex({ views, rowCount, i: i + 1 }); data.push({ __id: generateRecordId(), @@ -153,7 +138,6 @@ export async function seeding(tableId: string, mockDataNum: number) { __created_by: 'admin', __last_modified_by: 'admin', __version: 1, - ...viewRowIndex, ...fieldData, }); } diff --git a/apps/nestjs-backend/test/view-order.e2e-spec.ts b/apps/nestjs-backend/test/view-order.e2e-spec.ts deleted file mode 100644 index 4ee1908e2..000000000 --- a/apps/nestjs-backend/test/view-order.e2e-spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import type { INestApplication } from '@nestjs/common'; -import { ViewType } from '@teable/core'; -import { updateViewOrder as apiSetViewOrder } from '@teable/openapi'; -import { initApp, createTable, deleteTable, getViews } from './utils/init-app'; - -let app: INestApplication; -const baseId = globalThis.testConfig.baseId; - -beforeAll(async () => { - const appCtx = await initApp(); - app = appCtx.app; -}); - -afterAll(async () => { - await app.close(); -}); - -describe('/table/{tableId}/view/{viewId}/order OpenAPI ViewController (e2e) order (Patch) update grid view order', () => { - let tableId: string; - let viewId: string; - let viewIds: string[]; - beforeAll(async () => { - const result = await createTable(baseId, { - name: 'Table', - views: [{ type: ViewType.Grid }, { type: ViewType.Form }], - }); - tableId = result.id; - viewId = result.defaultViewId!; - viewIds = result.views.map((view) => view.id); - }); - afterAll(async () => { - await deleteTable(baseId, tableId); - }); - - it(`should update view order`, async () => { - const view2Id = viewIds[1]; - - const assertViews = [view2Id, viewId]; - await apiSetViewOrder(tableId, view2Id, { order: -1 }); - - const result = await getViews(tableId); - - const views = result.map(({ id }) => id); - - expect(result[0].order).toBe(-1); - expect(assertViews).toEqual(views); - }); - - it(`should return 400, when update duplicate order`, async () => { - const view2Id = viewIds[1]; - await expect(apiSetViewOrder(tableId, view2Id, { order: 0 })).rejects.toMatchObject({ - status: 400, - }); - }); -}); diff --git a/apps/nestjs-backend/vitest-e2e.config.ts b/apps/nestjs-backend/vitest-e2e.config.ts index 6b07792c7..e0f1f98f8 100644 --- a/apps/nestjs-backend/vitest-e2e.config.ts +++ b/apps/nestjs-backend/vitest-e2e.config.ts @@ -1,34 +1,25 @@ import swc from 'unplugin-swc'; -import { defineConfig } from 'vitest/config'; +import { configDefaults, defineConfig } from 'vitest/config'; const timeout = process.env.CI ? 30000 : 10000; const testFiles = ['**/test/**/*.{e2e-test,e2e-spec}.{js,ts}']; export default defineConfig({ plugins: [swc.vite({})], + cacheDir: '../../.cache/vitest/nestjs-backend/e2e', test: { globals: true, environment: 'node', setupFiles: './vitest-e2e.setup.ts', testTimeout: timeout, passWithNoTests: true, - cache: { - dir: '../../.cache/vitest/nestjs-backend/e2e', - }, coverage: { provider: 'v8', - reporter: ['text', 'clover'], - extension: ['js', 'ts'], - all: true, + extension: ['.js', '.ts'], }, logHeapUsage: true, reporters: ['verbose'], include: testFiles, - exclude: [ - '**/node_modules/**', - '**/dist/**', - '**/.next/**', - '**/.{idea,git,cache,output,temp}/**', - ], + exclude: [...configDefaults.exclude, '**/.next/**'], }, }); diff --git a/apps/nestjs-backend/vitest.config.ts b/apps/nestjs-backend/vitest.config.ts index a10316d70..cc2d9c718 100644 --- a/apps/nestjs-backend/vitest.config.ts +++ b/apps/nestjs-backend/vitest.config.ts @@ -1,11 +1,12 @@ import swc from 'unplugin-swc'; import tsconfigPaths from 'vite-tsconfig-paths'; -import { defineConfig } from 'vitest/config'; +import { configDefaults, defineConfig } from 'vitest/config'; const testFiles = ['**/src/**/*.{test,spec}.{js,ts}']; export default defineConfig({ plugins: [swc.vite({}), tsconfigPaths()], + cacheDir: '../../.cache/vitest/nestjs-backend/unit', test: { globals: true, environment: 'node', @@ -15,22 +16,16 @@ export default defineConfig({ singleThread: true, }, }, - cache: { - dir: '../../.cache/vitest/nestjs-backend/unit', - }, coverage: { provider: 'v8', - reporter: ['text', 'clover'], - extension: ['js', 'ts'], - all: true, + extension: ['.js', '.ts'], + include: ['src/**/*'], }, include: testFiles, exclude: [ + ...configDefaults.exclude, '**/*.controller.spec.ts', // exclude controller test - '**/node_modules/**', - '**/dist/**', '**/.next/**', - '**/.{idea,git,cache,output,temp}/**', ], }, }); diff --git a/apps/nextjs-app/.env b/apps/nextjs-app/.env index 8c2ec661c..027ec572a 100644 --- a/apps/nextjs-app/.env +++ b/apps/nextjs-app/.env @@ -6,7 +6,6 @@ NEXT_BUILD_ENV_SOURCEMAPS=false #NEXT_BUILD_ENV_LINT=false #NEXT_BUILD_ENV_TYPECHECK=false NEXT_BUILD_ENV_CSP=true -NEXT_BUILD_ENV_IMAGES_ALL_REMOTE=false NEXT_BUILD_ENV_SENTRY_ENABLED=true NEXT_BUILD_ENV_SENTRY_UPLOAD_DRY_RUN=true #NEXT_BUILD_ENV_SENTRY_DEBUG=false @@ -15,6 +14,7 @@ NEXT_BUILD_ENV_SENTRY_UPLOAD_DRY_RUN=true # ↓↓↓↓↓↓↓↓ frontend(nextjs) env ↓↓↓↓↓↓↓↓ NEXT_PUBLIC_SENTRY_DSN= +NEXT_ENV_IMAGES_ALL_REMOTE=false # ↓↓↓↓↓↓↓↓ backend(nestjs) env ↓↓↓↓↓↓↓↓ diff --git a/apps/nextjs-app/.env.development b/apps/nextjs-app/.env.development index 4735f9d31..1fe259c04 100644 --- a/apps/nextjs-app/.env.development +++ b/apps/nextjs-app/.env.development @@ -1,13 +1,13 @@ ####################################################################################### # BUILD ENVIRONMENT - Consumed by next.config.mjs during build and development # ####################################################################################### +NEXT_BUILD_ENV_CSP=false NEXT_BUILD_ENV_SENTRY_ENABLED=false NEXT_BUILD_ENV_SENTRY_UPLOAD_DRY_RUN=false -NEXT_BUILD_ENV_IMAGES_ALL_REMOTE=true ####################################################################################### # ↓↓↓↓↓↓↓↓ frontend(nextjs) env ↓↓↓↓↓↓↓↓ - +NEXT_ENV_IMAGES_ALL_REMOTE=true # ↓↓↓↓↓↓↓↓ backend(nestjs) env ↓↓↓↓↓↓↓↓ NEXTJS_DIR=../nextjs-app @@ -25,7 +25,7 @@ STORAGE_PREFIX=http://127.0.0.1:3000 # DATABASE_URL # @see https://www.prisma.io/docs/reference/database-reference/connection-urls#examples PRISMA_DATABASE_URL=postgresql://teable:teable@127.0.0.1:5432/teable?schema=public&statement_cache_size=1 -PUBLIC_DATABASE_ADDRESS=${PRISMA_DATABASE_URL} +PUBLIC_DATABASE_PROXY=127.0.0.1:5432 API_DOC_DISENABLED=false API_DOC_ENABLED_SNIPPET=false diff --git a/apps/nextjs-app/.env.example b/apps/nextjs-app/.env.example index 387237537..30ffd101e 100644 --- a/apps/nextjs-app/.env.example +++ b/apps/nextjs-app/.env.example @@ -8,13 +8,13 @@ NEXT_BUILD_ENV_SOURCEMAPS=false NEXT_BUILD_ENV_LINT=false NEXT_BUILD_ENV_TYPECHECK=false NEXT_BUILD_ENV_CSP=true -NEXT_BUILD_ENV_IMAGES_ALL_REMOTE=true NEXT_BUILD_ENV_SENTRY_ENABLED=false NEXT_BUILD_ENV_SENTRY_UPLOAD_DRY_RUN=true NEXT_BUILD_ENV_SENTRY_DEBUG=false NEXT_BUILD_ENV_SENTRY_TRACING=false # ↓↓↓↓↓↓↓↓ frontend(nextjs) env ↓↓↓↓↓↓↓↓ +NEXT_ENV_IMAGES_ALL_REMOTE=true # set metrics id MICROSOFT_CLARITY_ID=your-metrics-id @@ -65,18 +65,31 @@ ESTIMATE_CALC_CEL_PER_MS=3 BIG_TRANSACTION_TIMEOUT=600000 # the maximum number of base db connections a user can make DEFAULT_MAX_BASE_DB_CONNECTIONS=3 +# the maxium row limit when space has no credit, ingore it when you don't want to limit it +MAX_FREE_ROW_LIMIT=100000 # your redis cache connection uri BACKEND_CACHE_PROVIDER=redis -BACKEND_CACHE_REDIS_URI=redis://:teable@127.0.0.1:6379/0 +BACKEND_CACHE_REDIS_URI=redis://default:teable@127.0.0.1:6379/0 # DATABASE_URL # @see https://www.prisma.io/docs/reference/database-reference/connection-urls#examples PRISMA_DATABASE_URL=file:../../db/main.db # for external database access -PUBLIC_DATABASE_ADDRESS=${PRISMA_DATABASE_URL} +PUBLIC_DATABASE_PROXY=127.0.0.1:5432 API_DOC_DISENABLED=false OPENAI_API_KEY= OPENAI_API_ENDPOINT= + +# Social signin providers +# github +BACKEND_GITHUB_CLIENT_ID=github_client_id +BACKEND_GITHUB_CLIENT_SECRET=github_client_secret +# google +BACKEND_GOOGLE_CLIENT_ID=google_client_id +BACKEND_GOOGLE_CLIENT_SECRET=google_client_secret +BACKEND_GOOGLE_CALLBACK_URL=https://app.teable.io/api/auth/google/callback +# separated by ',' +SOCIAL_AUTH_PROVIDERS=github,google diff --git a/apps/nextjs-app/.env.test b/apps/nextjs-app/.env.test index 1d0bd8c4d..2e900b7b8 100644 --- a/apps/nextjs-app/.env.test +++ b/apps/nextjs-app/.env.test @@ -3,7 +3,7 @@ # ↓↓↓↓↓↓↓↓ backend(nestjs) env ↓↓↓↓↓↓↓↓ NEXTJS_DIR=../nextjs-app -TEST_LOG_LEVEL=log,error +TEST_LOG_LEVEL=error PORT=3000 SOCKET_PORT=3001 @@ -17,7 +17,7 @@ STORAGE_PREFIX=http://127.0.0.1:3000 # DATABASE_URL # @see https://www.prisma.io/docs/reference/database-reference/connection-urls#examples PRISMA_DATABASE_URL=postgresql://teable:teable@127.0.0.1:5432/teable?schema=public&statement_cache_size=1 -PUBLIC_DATABASE_ADDRESS=${PRISMA_DATABASE_URL} +PUBLIC_DATABASE_PROXY=127.0.0.1:5432 BACKEND_CACHE_PROVIDER=memory API_DOC_DISENABLED=false diff --git a/apps/nextjs-app/README.md b/apps/nextjs-app/README.md index 2664644cd..611d1604e 100644 --- a/apps/nextjs-app/README.md +++ b/apps/nextjs-app/README.md @@ -1,133 +1,5 @@ # The web-app -

- - build - -

+You don't need start this app when developing locally, it's started by the `nestjs-backend`. -## Intro - -Basic demo nextjs nextjs-app, part of the [teable](https://github.com/teableio/teable). - -- Home: [Demo/Vercel](https://monorepo-nextjs-app.vercel.app) -- SSR-I18n: [Demo/Vercel english](https://monorepo-nextjs-app.vercel.app/en/home) | [Demo/vercel french](https://monorepo-nextjs-app.vercel.app/fr/home) -- API: [Demo rest/Vercel](https://monorepo-nextjs-app.vercel.app/api/rest/post/1) -- [Changelog](https://github.com/teableio/teable/blob/main/apps/nextjs-app/CHANGELOG.md) - -## Quick start - -> For rest/api database access be sure to start `docker-compose up main-db`, -> see detailed instructions (seeding, docker, supabase...) in the [@teable/db-main-prisma README](https://github.com/teableio/teable/blob/main/packages/db-main-prisma/README.md). - -```bash -$ yarn install -$ cd apps/nextjs-app -$ yarn dev -``` - -### Features - -> Some common features that have been enabled to widen monorepo testing scenarios. - -- [x] Api routes: some api routes for rest. -- [x] I18n: based on [next-i18next](https://github.com/isaachinman/next-i18next) - -- [x] Styling: [Tailwind v3](https://tailwindcss.com/) with JIT mode enabled and common plugins. -- [x] Security: [next-secure-headers](https://github.com/jagaapple/next-secure-headers) with basic defaults. -- [x] Seo: [next-seo](https://github.com/garmeeh/next-seo) -- [x] Tests: [jest](https://jestjs.io/) + [ts-jest](https://github.com/kulshekhar/ts-jest) + [@testing-library/react](https://testing-library.com/) -- [x] E2E: [Playwright](https://playwright.dev/) - -### Monorepo deps - -This app relies on packages in the monorepo, see detailed instructions in [README.md](https://github.com/teableio/teable) - -```json5 -{ - dependencies: { - "@teable/sdk": "workspace:*", - "@teable/db-main-prisma": "workspace:*", - "@teable/ui-lib": "workspace:*", - }, -} -``` - -And their counterparts in [tsconfig.json](./tsconfig.json) - -```json5 -{ - "compilerOptions": { - "baseUrl": "./src", - "paths": { - "@teable/ui-lib/*": ["../../../packages/ui-lib/src/*"], - "@teable/ui-lib": ["../../../packages/ui-lib/src/index"], - "@teable/sdk/*": ["../../../packages/sdk/src/*"], - "@teable/sdk": ["../../../packages/sdk/src/index"], - "@teable/db-main-prisma/*": ["../../../packages/db-main-prisma/src/*"], - "@teable/db-main-prisma": ["../../../packages/db-main-prisma/src/index"], - }, - }, -} -``` - -## API routes - -### Rest api - -Try this route http://localhost:3000/api/rest/poem - -### Graphql (sdl) - -In development just open http://localhost:3000/api/graphql-sdl to have the graphiql console. - -Try - -```gql -query { - allPoems { - id - title - } -} -``` - -## Some tips - -### I18N & typings - -Translations are handled by [next-i18next](https://github.com/isaachinman/next-i18next). -See the [next-i18next.config.js](./next-i18next.config.js). -The keys autocompletion and typechecks are enabled in [./src/typings/react-i18next.d.ts](./src/typings/react-i18next.d.ts). - -## Structure - -``` -. -├── apps -│ └── nextjs-app -│ ├── public/ -│ │ └── locales/ -│ ├── src/ -│ │ ├── backend/* (backend code) -│ │ ├── components/* -│ │ ├── features/* (regrouped by context) -│ │ └── pages/api (api routes) -│ ├── .env -│ ├── .env.development -│ ├── (.env.local)* -│ ├── next.config.mjs -│ ├── next-i18next.config.js -│ ├── tsconfig.json (local paths enabled) -│ └── tailwind.config.js -└── packages (monorepo's packages that this app is using) - ├── sdk - ├── main-db-prisma - └── ui-lib -``` - -### Develop - -``` -$ yarn dev -``` +all env is maintained in the .env\* file, it is shared with the backend. diff --git a/apps/nextjs-app/next.config.js b/apps/nextjs-app/next.config.js index 628eafa9a..4a372ad8f 100644 --- a/apps/nextjs-app/next.config.js +++ b/apps/nextjs-app/next.config.js @@ -30,8 +30,8 @@ const NEXT_BUILD_ENV_SOURCEMAPS = trueEnv.includes( ); const NEXT_BUILD_ENV_CSP = trueEnv.includes(process.env?.NEXT_BUILD_ENV_CSP ?? 'true'); -const NEXT_BUILD_ENV_IMAGES_ALL_REMOTE = trueEnv.includes( - process.env?.NEXT_BUILD_ENV_IMAGES_ALL_REMOTE ?? 'true' +const NEXT_ENV_IMAGES_ALL_REMOTE = trueEnv.includes( + process.env?.NEXT_ENV_IMAGES_ALL_REMOTE ?? 'true' ); const NEXT_BUILD_ENV_SENTRY_ENABLED = trueEnv.includes( @@ -147,7 +147,7 @@ const nextConfig = { dangerouslyAllowSVG: false, disableStaticImages: false, contentSecurityPolicy: "default-src 'self'; script-src 'none'; sandbox;", - remotePatterns: NEXT_BUILD_ENV_IMAGES_ALL_REMOTE + remotePatterns: NEXT_ENV_IMAGES_ALL_REMOTE ? [ { protocol: 'http', @@ -210,7 +210,7 @@ const nextConfig = { return isProd ? [] : [socketProxy]; }, - // @link https://nextjs.org/docs/api-reference/next.config.js/rewrites + // @link https://nextjs.org/docs/api-reference/next.config.js/headers async headers() { return [ { diff --git a/apps/nextjs-app/package.json b/apps/nextjs-app/package.json index 978869209..6696a7887 100644 --- a/apps/nextjs-app/package.json +++ b/apps/nextjs-app/package.json @@ -35,15 +35,9 @@ "check-size": "size-limit --highlight-less", "clean": "rimraf ./.next ./out ./coverage ./tsconfig.tsbuildinfo ./node_modules/.cache ./.eslintcache", "clean:backend": "rimraf --no-glob ./main", - "prebuild:electron": "tsc --project ./electron-src/tsconfig.json", - "dev": "yarn prebuild:electron && electron .", - "build:electron": "yarn clean && yarn build && yarn run prebuild:electron", - "pack-app": "yarn build:electron && electron-builder --dir", - "dist": "yarn build:electron && electron-builder", - "dist:debug": "lldb ./dist/mac-arm64/nextjs-app.app", - "dist:unpack": "npx asar extract ./dist/mac-arm64/nextjs-app.app/Contents/Resources/app.asar ./dist/unpack", "test": "run-s test-unit", - "test-unit": "vitest run", + "test-unit": "vitest run --silent", + "test-unit-cover": "pnpm test-unit --coverage", "typecheck": "tsc --project ./tsconfig.json --noEmit", "lint": "eslint . --ext .ts,.tsx,.js,.jsx,.cjs,.mjs,.mdx --cache --cache-location ../../.cache/eslint/nextjs-app.eslintcache", "fix-all-files": "eslint . --ext .ts,.tsx,.js,.jsx,.cjs,.mjs,.mdx --fix", @@ -53,7 +47,7 @@ "@next/bundle-analyzer": "14.1.3", "@next/env": "14.1.3", "@playwright/test": "1.41.2", - "@size-limit/file": "11.0.2", + "@size-limit/file": "11.1.1", "@svgr/webpack": "8.1.0", "@testing-library/dom": "9.3.4", "@testing-library/jest-dom": "6.4.2", @@ -61,7 +55,7 @@ "@testing-library/user-event": "14.5.2", "@types/cors": "2.8.17", "@types/express": "4.17.21", - "@types/lodash": "4.14.202", + "@types/lodash": "4.17.0", "@types/node": "20.9.0", "@types/nprogress": "0.2.3", "@types/react": "18.2.64", @@ -70,6 +64,7 @@ "@types/react-syntax-highlighter": "15.5.11", "@types/react-test-renderer": "18.0.7", "@types/sharedb": "3.3.10", + "@vitest/coverage-v8": "1.4.0", "@vitejs/plugin-react-swc": "3.6.0", "autoprefixer": "10.4.18", "cross-env": "7.0.3", @@ -79,31 +74,31 @@ "eslint": "8.57.0", "eslint-config-next": "14.1.3", "get-tsconfig": "4.7.3", - "happy-dom": "13.6.2", + "happy-dom": "14.0.0", "npm-run-all2": "6.1.2", - "postcss": "8.4.35", + "postcss": "8.4.36", "postcss-flexbugs-fixes": "5.0.2", - "postcss-preset-env": "9.5.0", + "postcss-preset-env": "9.5.2", "prettier": "3.2.5", "rimraf": "5.0.5", - "size-limit": "11.0.2", + "size-limit": "11.1.1", "symlink-dir": "5.2.1", "sync-directory": "6.0.5", "ts-node": "10.9.2", "typescript": "5.4.2", "vite-plugin-svgr": "4.2.0", - "vite-tsconfig-paths": "4.3.1", - "vitest": "1.3.1" + "vite-tsconfig-paths": "4.3.2", + "vitest": "1.4.0" }, "dependencies": { "@antv/g6": "4.8.24", "@asteasolutions/zod-to-openapi": "6.4.0", "@belgattitude/http-exception": "1.5.0", - "@codemirror/autocomplete": "6.13.0", + "@codemirror/autocomplete": "6.15.0", "@codemirror/commands": "6.3.3", "@codemirror/language": "6.10.1", "@codemirror/state": "6.4.1", - "@codemirror/view": "6.25.1", + "@codemirror/view": "6.26.0", "@dnd-kit/core": "6.1.0", "@dnd-kit/sortable": "8.0.0", "@dnd-kit/utilities": "3.2.2", @@ -113,8 +108,8 @@ "@hookform/resolvers": "3.3.4", "@nem035/gpt-3-encoder": "1.1.7", "@radix-ui/react-icons": "1.3.0", - "@sentry/nextjs": "7.105.0", - "@sentry/react": "7.105.0", + "@sentry/nextjs": "7.107.0", + "@sentry/react": "7.107.0", "@tailwindcss/container-queries": "0.1.1", "@tanstack/react-query": "4.36.1", "@tanstack/react-table": "8.11.7", @@ -125,7 +120,7 @@ "@teable/sdk": "workspace:^", "@teable/ui-lib": "workspace:^", "allotment": "1.20.0", - "axios": "1.6.7", + "axios": "1.6.8", "class-variance-authority": "0.7.0", "classnames": "2.5.1", "dayjs": "1.11.10", @@ -135,12 +130,12 @@ "express": "4.18.3", "filesize": "10.1.0", "fuse.js": "7.0.0", - "i18next": "23.10.0", + "i18next": "23.10.1", "is-port-reachable": "3.1.0", "knex": "3.1.0", "lodash": "4.17.21", "lru-cache": "10.2.0", - "lucide-react": "0.349.0", + "lucide-react": "0.358.0", "next": "14.1.3", "next-i18next": "15.2.0", "next-secure-headers": "2.2.0", @@ -154,10 +149,10 @@ "react-dom": "18.2.0", "react-error-boundary": "4.0.13", "react-grid-layout": "1.4.4", - "react-hook-form": "7.51.0", + "react-hook-form": "7.51.1", "react-hotkeys-hook": "4.5.0", - "react-i18next": "14.0.8", - "react-joyride": "2.7.4", + "react-i18next": "14.1.0", + "react-joyride": "2.8.0", "react-markdown": "9.0.1", "react-resizable": "3.0.5", "react-responsive-carousel": "3.2.23", @@ -165,24 +160,16 @@ "react-syntax-highlighter": "15.5.0", "react-textarea-autosize": "8.5.3", "react-use": "17.5.0", - "recharts": "2.12.2", + "recharts": "2.12.3", "reconnecting-websocket": "4.4.0", "reflect-metadata": "0.2.1", "remark-gfm": "4.0.0", "sharedb": "4.1.2", "tailwind-scrollbar": "3.1.0", "tailwindcss": "3.4.1", - "type-fest": "4.11.1", + "type-fest": "4.12.0", "zod": "3.22.4", "zod-validation-error": "3.0.3", "zustand": "4.5.2" - }, - "build": { - "electronVersion": "20.3.6", - "asar": false, - "files": [ - "**/*", - "!.env.development" - ] } } diff --git a/apps/nextjs-app/src/components/Error.tsx b/apps/nextjs-app/src/components/Error.tsx new file mode 100644 index 000000000..5f95fba65 --- /dev/null +++ b/apps/nextjs-app/src/components/Error.tsx @@ -0,0 +1,22 @@ +import { cn } from '@teable/ui-lib/shadcn'; + +interface IErrorProps { + className?: string; + error?: string; +} + +export const Error = (props: IErrorProps) => { + const { error, className } = props; + + return ( +
+ {error} +
+ ); +}; diff --git a/apps/nextjs-app/src/features/app/blocks/import-table/FileItem.tsx b/apps/nextjs-app/src/features/app/blocks/import-table/FileItem.tsx deleted file mode 100644 index 892a26db8..000000000 --- a/apps/nextjs-app/src/features/app/blocks/import-table/FileItem.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { generateAttachmentId } from '@teable/core'; -import { X } from '@teable/icons'; -import type { INotifyVo } from '@teable/openapi'; -import { UploadType } from '@teable/openapi'; -import { getFieldIconString } from '@teable/sdk'; -import { AttachmentManager } from '@teable/sdk/components'; -import { Progress } from '@teable/ui-lib'; -import { toast } from '@teable/ui-lib/shadcn/ui/sonner'; -import { filesize } from 'filesize'; -import { useTranslation } from 'next-i18next'; -import { useEffect, useState } from 'react'; - -interface IFileItemProps { - file: File; - accept?: string; - onClose: () => void; - onFinished: (result: INotifyVo) => void; -} - -export const FileItem = (props: IFileItemProps) => { - const { file, onClose, onFinished, accept } = props; - const { name, size, type } = file; - - const { t } = useTranslation(['table']); - const [process, setProcess] = useState(0); - - useEffect(() => { - if (accept && type !== accept) { - onClose(); - toast.error(t('table:import.form.error.errorFileFormat')); - return; - } - - const attchmentManager = new AttachmentManager(1); - attchmentManager.upload([{ id: generateAttachmentId(), instance: file }], UploadType.Table, { - successCallback: (_, result) => { - onFinished?.(result); - }, - progressCallback: (_, process) => { - setProcess(process); - }, - }); - }, [accept, file, onClose, onFinished, t, type]); - - return ( - <> -
- {name} -
{name}
-
{filesize(size)}
- onClose()} - /> -
- {} - - ); -}; diff --git a/apps/nextjs-app/src/features/app/blocks/import-table/TableImport.tsx b/apps/nextjs-app/src/features/app/blocks/import-table/TableImport.tsx index 0c92be9af..0fdd0c2b8 100644 --- a/apps/nextjs-app/src/features/app/blocks/import-table/TableImport.tsx +++ b/apps/nextjs-app/src/features/app/blocks/import-table/TableImport.tsx @@ -1,13 +1,14 @@ import { useMutation } from '@tanstack/react-query'; +import { importTypeMap } from '@teable/core'; import type { - IAnalyzeColumn, IImportOptionRo, IAnalyzeRo, - IImportColumn, + IImportSheetItem, + SUPPORTEDTYPE, + IAnalyzeVo, IImportOption, } from '@teable/core'; -import { FieldType } from '@teable/core'; -import { SUPPORTEDTYPE } from '@teable/core/src/import/types'; + import { analyzeFile, importTableFromFile } from '@teable/openapi'; import type { INotifyVo } from '@teable/openapi'; import { useBase } from '@teable/sdk'; @@ -30,21 +31,19 @@ import { AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, - Input, } from '@teable/ui-lib'; -import { uniqBy } from 'lodash'; +import { toast } from '@teable/ui-lib/shadcn/ui/sonner'; import { useRouter } from 'next/router'; import { useTranslation } from 'next-i18next'; import { useState, useRef, useCallback } from 'react'; -import { z } from 'zod'; -import { CollapsePanel } from './CollapsePanel'; -import { FileItem } from './FileItem'; -import { PreviewColumn } from './PreviewColumn'; -import { Upload } from './Upload'; +import { FieldConfigPanel } from './field-config-panel'; +import { UploadPanel } from './upload-panel'; +import { UrlPanel } from './UrlPanel'; interface ITableImportProps { open?: boolean; children?: React.ReactElement; + fileType: SUPPORTEDTYPE; onOpenChange?: (open: boolean) => void; } @@ -62,69 +61,18 @@ export const TableImport = (props: ITableImportProps) => { const router = useRouter(); const { t } = useTranslation(['table']); const [step, setStep] = useState(Step.UPLOAD); - const { children, open, onOpenChange } = props; + const { children, open, onOpenChange, fileType } = props; const [errorMessage, setErrorMessage] = useState(''); - const [linkUrl, setLinkUrl] = useState(''); const [alterDialogVisible, setAlterDialogVisible] = useState(false); - const [files, setFiles] = useState(null); + const [file, setFile] = useState(null); const [fileInfo, setFileInfo] = useState({} as IAnalyzeRo); - const initCaculatedColumns = useRef([]); - const [caculatedColumns, setCalculateColumns] = useState([]); - const [importOptions, setImportOptions] = useState({ - autoSelectType: true, - useFirstRowAsHeader: true, - importData: true, - }); + const primitiveWorkSheets = useRef({}); + const [workSheets, setWorkSheets] = useState({}); const closeDialog = () => { dialogOpenProxy(false); }; - const columnsChangeHandler = (newColumns: IImportColumn[]) => { - const uniqueData = uniqBy(newColumns, 'name'); - if (newColumns.length !== uniqueData.length) { - setErrorMessage('field name should be unique'); - } else { - setErrorMessage(''); - } - setCalculateColumns(newColumns); - }; - - const optionChangeHandler = (options: ITableImportOptions, propertyName: string) => { - setImportOptions(options); - if (propertyName === 'autoSelectType') { - if (!options.autoSelectType) { - const newColumns = caculatedColumns?.map((item) => ({ - ...item, - type: FieldType.LongText, - })); - setCalculateColumns(newColumns); - } else { - const newColumns = caculatedColumns?.map((item) => ({ - ...item, - type: initCaculatedColumns.current[item.sourceColumnIndex].type, - })); - setCalculateColumns(newColumns); - } - } - - if (propertyName === 'useFirstRowAsHeader') { - if (!options.useFirstRowAsHeader) { - const newColumns = caculatedColumns?.map((item, index) => ({ - ...item, - name: `${t('table:import.form.defaultFieldName')} ${index + 1}`, - })); - setCalculateColumns(newColumns); - } else { - const newColumns = caculatedColumns?.map((item) => ({ - ...item, - name: initCaculatedColumns.current[item.sourceColumnIndex].name, - })); - setCalculateColumns(newColumns); - } - } - }; - const { mutateAsync, isLoading } = useMutation({ mutationFn: async ({ baseId, importRo }: { baseId: string; importRo: IImportOptionRo }) => { return (await importTableFromFile(baseId, importRo)).data; @@ -146,19 +94,23 @@ export const TableImport = (props: ITableImportProps) => { }); const importTable = async () => { + for (const [, value] of Object.entries(workSheets)) { + const { columns } = value; + + if (columns.some((col) => !col.name)) { + setErrorMessage(t('table:import.form.error.fieldNameEmpty')); + return; + } + if (new Set(columns.map((col) => col.name.trim())).size !== columns.length) { + setErrorMessage(t('table:import.form.error.uniqueFieldName')); + return; + } + } + mutateAsync({ baseId: base.id, importRo: { - worksheets: [ - { - name: 'import table', - columns: caculatedColumns, - options: { - importData: importOptions.importData, - useFirstRowAsHeader: importOptions.useFirstRowAsHeader, - }, - }, - ], + worksheets: workSheets, ...fileInfo, }, }); @@ -176,16 +128,19 @@ export const TableImport = (props: ITableImportProps) => { data: { worksheets }, } = data; - // TODO support groups - const calculatedColumnHeaders = worksheets?.[0].columns || []; - const columnHeaderWithIndex = calculatedColumnHeaders.map((col, index) => ({ - ...col, - sourceColumnIndex: index, - })); - setCalculateColumns(columnHeaderWithIndex); + const workSheetsWithIndex: IImportOptionRo['worksheets'] = {}; + for (const [key, value] of Object.entries(worksheets)) { + const item = { ...value, importData: true, useFirstRowAsHeader: true } as IImportSheetItem; + item.columns = item.columns.map((col, index) => ({ + ...col, + sourceColumnIndex: index, + })); + + workSheetsWithIndex[key] = item; + } + setWorkSheets(workSheetsWithIndex); + primitiveWorkSheets.current = worksheets; setStep(Step.CONFIG); - initCaculatedColumns.current = calculatedColumnHeaders; - setErrorMessage(''); }, }); @@ -195,10 +150,10 @@ export const TableImport = (props: ITableImportProps) => { await analyzeByUrl({ attachmentUrl: presignedUrl, - fileType: SUPPORTEDTYPE.CSV, + fileType, }); }, - [analyzeByUrl] + [analyzeByUrl, fileType] ); const dialogOpenProxy = (open: boolean) => { @@ -209,129 +164,73 @@ export const TableImport = (props: ITableImportProps) => { onOpenChange?.(open); }; + const fieldChangeHandler = (value: IImportOptionRo['worksheets']) => { + setWorkSheets(value); + }; + return ( <> {children && {children}} {open && ( - - + + {step === Step.UPLOAD && ( - {t('table:import.title.localFile')} + {t('table:import.title.localFile')} {t('table:import.title.linkUrl')} )} - + {step === Step.UPLOAD && ( -
- {!files?.length && ( - { - setFiles(files); - }} - > -
- -
-
- )} - {files?.length && - Array.from(files).map((file) => ( - setFiles(null)} - onFinished={fileFinishedHandler} - /> - ))} -
- )} - {step === Step.CONFIG && ( -
-
-

{t('table:import.title.importTitle')}

-
+ { + const { exceedSize, accept } = importTypeMap[fileType]; -
- -
+ const acceptGroup = accept.split(','); - {errorMessage &&

{errorMessage}

} + if (file && !acceptGroup.includes(file.type)) { + toast.error(t('table:import.form.error.errorFileFormat')); + return; + } - -
+ if (exceedSize && file && file.size > exceedSize * 1024 * 1024) { + toast.error(`${t('table:import.tips.fileExceedSizeTip')} ${exceedSize}MB`); + return; + } + + setFile(file); + }} + onClose={() => setFile(null)} + analyzeLoading={analyzeLoading} + onFinished={fileFinishedHandler} + > + )} + {step === Step.CONFIG && ( + )}
{step === Step.UPLOAD && ( -
-

{t('table:import.title.linkUrlInputTitle')}

-
- { - const { value } = e.target; - setLinkUrl(value); - }} - /> - -
- {errorMessage &&

{errorMessage}

} -
+ )} {step === Step.CONFIG && ( -
-
-

{t('table:import.title.importTitle')}

-
- -
- -
- - {errorMessage &&

{errorMessage}

} - - -
+ )}
@@ -345,7 +244,7 @@ export const TableImport = (props: ITableImportProps) => { size="sm" className="ml-1" onClick={() => importTable()} - disabled={!!errorMessage || isLoading} + disabled={isLoading} > {isLoading && } {t('table:import.title.import')} diff --git a/apps/nextjs-app/src/features/app/blocks/import-table/UrlPanel.tsx b/apps/nextjs-app/src/features/app/blocks/import-table/UrlPanel.tsx new file mode 100644 index 000000000..294cda109 --- /dev/null +++ b/apps/nextjs-app/src/features/app/blocks/import-table/UrlPanel.tsx @@ -0,0 +1,85 @@ +import type { UseMutateAsyncFunction } from '@tanstack/react-query'; +import type { SUPPORTEDTYPE, FieldType } from '@teable/core'; +import { importTypeMap } from '@teable/core'; +import { Input, Button, Spin } from '@teable/ui-lib'; +import type { AxiosResponse } from 'axios'; +import { useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { z } from 'zod'; + +interface IUrlPanel { + fileType: SUPPORTEDTYPE; + analyzeFn: UseMutateAsyncFunction< + AxiosResponse< + { + worksheets: Record< + string, + { + name: string; + columns: { + name: string; + type: FieldType; + }[]; + } + >; + }, + unknown + >, + unknown, + { + fileType: SUPPORTEDTYPE; + attachmentUrl: string; + }, + unknown + >; + isFinished: boolean; +} + +const UrlPanel = (props: IUrlPanel) => { + const { fileType, analyzeFn, isFinished } = props; + const [linkUrl, setLinkUrl] = useState(''); + const [errorMessage, setErrorMessage] = useState(''); + const { t } = useTranslation(['table']); + + return ( +
+

{t('table:import.title.linkUrlInputTitle')}

+
+ { + const { value } = e.target; + setLinkUrl(value); + }} + /> + +
+ {errorMessage &&

{errorMessage}

} +
+ ); +}; + +export { UrlPanel }; diff --git a/apps/nextjs-app/src/features/app/blocks/import-table/CollapsePanel.tsx b/apps/nextjs-app/src/features/app/blocks/import-table/field-config-panel/CollapsePanel.tsx similarity index 72% rename from apps/nextjs-app/src/features/app/blocks/import-table/CollapsePanel.tsx rename to apps/nextjs-app/src/features/app/blocks/import-table/field-config-panel/CollapsePanel.tsx index eae460630..12bc410e6 100644 --- a/apps/nextjs-app/src/features/app/blocks/import-table/CollapsePanel.tsx +++ b/apps/nextjs-app/src/features/app/blocks/import-table/field-config-panel/CollapsePanel.tsx @@ -9,10 +9,10 @@ import { import classNames from 'classnames'; import { useTranslation } from 'next-i18next'; import { useState } from 'react'; -import type { ITableImportOptions } from './TableImport'; +import type { ITableImportOptions } from '../TableImport'; interface ICollapsePanel { - onChange: (value: ITableImportOptions, propertyName: keyof ITableImportOptions) => void; + onChange: (value: boolean, propertyName: keyof ITableImportOptions) => void; options: ITableImportOptions; } @@ -43,15 +43,7 @@ export const CollapsePanel = (props: ICollapsePanel) => { - onChange( - { - ...options, - autoSelectType: value, - }, - 'autoSelectType' - ) - } + onCheckedChange={(value) => onChange(value, 'autoSelectType')} /> {t('table:import.options.autoSelectFieldOptionName')} @@ -63,15 +55,7 @@ export const CollapsePanel = (props: ICollapsePanel) => { - onChange( - { - ...options, - useFirstRowAsHeader: value, - }, - 'useFirstRowAsHeader' - ) - } + onCheckedChange={(value) => onChange(value, 'useFirstRowAsHeader')} /> {t('table:import.options.useFirstRowAsHeaderOptionName')} @@ -83,15 +67,7 @@ export const CollapsePanel = (props: ICollapsePanel) => { - onChange( - { - ...options, - importData: value, - }, - 'importData' - ) - } + onCheckedChange={(value) => onChange(value, 'importData')} /> {t('table:import.options.importDataOptionName')} diff --git a/apps/nextjs-app/src/features/app/blocks/import-table/field-config-panel/FieldConfigPanel.tsx b/apps/nextjs-app/src/features/app/blocks/import-table/field-config-panel/FieldConfigPanel.tsx new file mode 100644 index 000000000..175001ed0 --- /dev/null +++ b/apps/nextjs-app/src/features/app/blocks/import-table/field-config-panel/FieldConfigPanel.tsx @@ -0,0 +1,127 @@ +import { FieldType } from '@teable/core'; +import type { IImportOption, IImportOptionRo, IImportSheetItem } from '@teable/core'; +import { Button } from '@teable/ui-lib'; +import classNames from 'classnames'; +import { useState, useRef } from 'react'; +import { useTranslation } from 'react-i18next'; +import { CollapsePanel } from './CollapsePanel'; +import { PreviewColumn } from './PreviewColumn'; + +export type ITableImportOptions = IImportOption & { + autoSelectType: boolean; +}; + +interface IFieldConfigPanel { + workSheets: IImportOptionRo['worksheets']; + errorMessage: string; + onChange: (sheets: IImportOptionRo['worksheets']) => void; +} + +const FieldConfigPanel = (props: IFieldConfigPanel) => { + const { onChange, workSheets, errorMessage } = props; + const { t } = useTranslation(['table']); + const [autoSelectTypes, setAutoSelectTypes] = useState>({}); + const [selectedSheetKey, setSelectedSheetKey] = useState(Object.keys(workSheets)[0]); + const lastColumnsMap = useRef>(workSheets); + + const data = workSheets[selectedSheetKey]; + + const options = { + importData: data.importData, + useFirstRowAsHeader: data.useFirstRowAsHeader, + autoSelectType: autoSelectTypes[selectedSheetKey] ?? true, + }; + + const sheets = Object.keys(workSheets); + + const columnHandler = (columns: IImportSheetItem['columns']) => { + const newSheets = { ...workSheets }; + newSheets[selectedSheetKey].columns = columns; + onChange(newSheets); + }; + + const optionHandler = (value: boolean, propertyName: keyof ITableImportOptions) => { + const updateSheet = () => { + const newSheets = { + ...workSheets, + [selectedSheetKey]: { ...workSheets[selectedSheetKey], [propertyName]: value }, + }; + onChange(newSheets); + }; + switch (propertyName) { + case 'importData': + updateSheet(); + break; + case 'autoSelectType': + { + const newColumns = !value + ? data.columns.map((column) => ({ + ...column, + type: FieldType.SingleLineText, + })) + : lastColumnsMap.current[selectedSheetKey].columns; + setAutoSelectTypes({ ...autoSelectTypes, [selectedSheetKey]: value }); + onChange({ + ...workSheets, + [selectedSheetKey]: { ...workSheets[selectedSheetKey], columns: newColumns }, + }); + } + break; + case 'useFirstRowAsHeader': + { + const newColumns = !value + ? data.columns.map((column, index) => ({ + ...column, + name: `${t('table:import.form.defaultFieldName')} ${index + 1}`, + })) + : lastColumnsMap.current[selectedSheetKey].columns; + + onChange({ + ...workSheets, + [selectedSheetKey]: { + ...workSheets[selectedSheetKey], + [propertyName]: value, + columns: newColumns, + }, + }); + } + break; + default: + break; + } + }; + + return ( +
+
+

{t('table:import.title.importTitle')}

+
+ +
+ {sheets.map((sheetKey) => ( + + ))} +
+ +
+ +
+ + {errorMessage &&

{errorMessage}

} + + +
+ ); +}; + +export { FieldConfigPanel }; diff --git a/apps/nextjs-app/src/features/app/blocks/import-table/PreviewColumn.tsx b/apps/nextjs-app/src/features/app/blocks/import-table/field-config-panel/PreviewColumn.tsx similarity index 87% rename from apps/nextjs-app/src/features/app/blocks/import-table/PreviewColumn.tsx rename to apps/nextjs-app/src/features/app/blocks/import-table/field-config-panel/PreviewColumn.tsx index c2d27e408..40cf8400f 100644 --- a/apps/nextjs-app/src/features/app/blocks/import-table/PreviewColumn.tsx +++ b/apps/nextjs-app/src/features/app/blocks/import-table/field-config-panel/PreviewColumn.tsx @@ -38,22 +38,6 @@ export const PreviewColumn = (props: IPreviewColumnProps) => { [getFieldStatic] ); - // todo narrow primary key - // const primaryCandidates = useMemo( - // () => - // PRIMARY_SUPPORTED_TYPES.map<{ value: FieldType; label: string; icon: JSX.Element }>( - // (type) => { - // const { title, Icon } = getFieldStatic(type, false); - // return { - // value: type, - // label: title, - // icon: , - // }; - // } - // ), - // [getFieldStatic] - // ); - const onChangeHandler = (data: IImportColumn[]) => { onChange(data); }; diff --git a/apps/nextjs-app/src/features/app/blocks/import-table/field-config-panel/index.ts b/apps/nextjs-app/src/features/app/blocks/import-table/field-config-panel/index.ts new file mode 100644 index 000000000..e48d609b9 --- /dev/null +++ b/apps/nextjs-app/src/features/app/blocks/import-table/field-config-panel/index.ts @@ -0,0 +1,3 @@ +export * from './CollapsePanel'; +export * from './FieldConfigPanel'; +export * from './PreviewColumn'; diff --git a/apps/nextjs-app/src/features/app/blocks/import-table/index.ts b/apps/nextjs-app/src/features/app/blocks/import-table/index.ts index b8a07fd11..bd0e8e5e0 100644 --- a/apps/nextjs-app/src/features/app/blocks/import-table/index.ts +++ b/apps/nextjs-app/src/features/app/blocks/import-table/index.ts @@ -1,2 +1 @@ export * from './TableImport'; -export * from './Upload'; diff --git a/apps/nextjs-app/src/features/app/blocks/import-table/upload-panel/Process.tsx b/apps/nextjs-app/src/features/app/blocks/import-table/upload-panel/Process.tsx new file mode 100644 index 000000000..8e81fb5e5 --- /dev/null +++ b/apps/nextjs-app/src/features/app/blocks/import-table/upload-panel/Process.tsx @@ -0,0 +1,34 @@ +import { X } from '@teable/icons'; +import { getFieldIconString } from '@teable/sdk'; +import { Progress } from '@teable/ui-lib'; +import { filesize } from 'filesize'; + +interface IFileItemProps { + file: File; + process: number; + onClose: () => void; +} + +export const Process = (props: IFileItemProps) => { + const { file, onClose, process } = props; + const { name, size, type } = file; + + return ( + <> +
+ {name} +
{name}
+
{filesize(size)}
+ onClose()} + /> +
+ {} + + ); +}; diff --git a/apps/nextjs-app/src/features/app/blocks/import-table/Upload.tsx b/apps/nextjs-app/src/features/app/blocks/import-table/upload-panel/Trigger.tsx similarity index 65% rename from apps/nextjs-app/src/features/app/blocks/import-table/Upload.tsx rename to apps/nextjs-app/src/features/app/blocks/import-table/upload-panel/Trigger.tsx index be838b4de..6a53d2e14 100644 --- a/apps/nextjs-app/src/features/app/blocks/import-table/Upload.tsx +++ b/apps/nextjs-app/src/features/app/blocks/import-table/upload-panel/Trigger.tsx @@ -1,17 +1,20 @@ +import { importTypeMap } from '@teable/core'; +import type { SUPPORTEDTYPE } from '@teable/core'; import { useRef } from 'react'; import { useDropArea } from 'react-use'; interface IUploadProps { - accept?: React.InputHTMLAttributes['accept']; - onChange: (file: File[] | null) => void; + fileType: SUPPORTEDTYPE; + onChange: (file: File | null) => void; children: React.ReactElement; } -export const Upload = (props: IUploadProps) => { - const { onChange, children, accept } = props; +export const Trigger = (props: IUploadProps) => { + const { onChange, children, fileType } = props; const uploadRef = useRef(null); + const [bound] = useDropArea({ - onFiles: onChange, + onFiles: (files: File[]) => onChange(files[0]), }); return ( @@ -20,12 +23,13 @@ export const Upload = (props: IUploadProps) => { className="hidden" ref={uploadRef} type="file" - accept={accept} + accept={importTypeMap[fileType].accept} multiple={false} autoComplete="off" tabIndex={-1} onChange={(e) => { - e.target.files && onChange(Array.from(e.target.files)); + const files = (e.target.files && Array.from(e.target.files)) || null; + files && onChange(files[0]); }} >
void; + onFinished: (result: INotifyVo) => void; + onChange: (file: File | null) => void; +} +const attchmentManager = new AttachmentManager(1); + +const UploadPanel = (props: IUploadPanelProps) => { + const { file, fileType, onChange, onFinished, onClose, analyzeLoading } = props; + const { t } = useTranslation(['table']); + const [process, setProcess] = useState(0); + + return ( +
+ {!file ? ( + { + if (file) { + attchmentManager.upload( + [{ id: generateAttachmentId(), instance: file }], + UploadType.Table, + { + successCallback: (_, result) => { + onFinished?.(result); + }, + progressCallback: (_, process) => { + setProcess(process); + }, + } + ); + } + onChange(file); + }} + > +
+ +
+
+ ) : ( + <> + + {analyzeLoading && ( +
+ + {t('table:import.tips.analyzing')} +
+ )} + + )} +
+ ); +}; + +export { UploadPanel }; diff --git a/apps/nextjs-app/src/features/app/blocks/import-table/upload-panel/index.ts b/apps/nextjs-app/src/features/app/blocks/import-table/upload-panel/index.ts new file mode 100644 index 000000000..8fdd98a94 --- /dev/null +++ b/apps/nextjs-app/src/features/app/blocks/import-table/upload-panel/index.ts @@ -0,0 +1,3 @@ +export * from './Process'; +export * from './Trigger'; +export * from './UploadPanel'; diff --git a/apps/nextjs-app/src/features/app/blocks/space/DraggableBaseGrid.tsx b/apps/nextjs-app/src/features/app/blocks/space/DraggableBaseGrid.tsx index d4dc376b0..272b7ee05 100644 --- a/apps/nextjs-app/src/features/app/blocks/space/DraggableBaseGrid.tsx +++ b/apps/nextjs-app/src/features/app/blocks/space/DraggableBaseGrid.tsx @@ -1,7 +1,7 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import type { IGetBaseVo } from '@teable/openapi'; -import { updateBase } from '@teable/openapi'; -import { swapReorder, useIsHydrated } from '@teable/sdk'; +import { updateBaseOrder } from '@teable/openapi'; +import { useIsHydrated } from '@teable/sdk'; import { DndKitContext, Droppable, Draggable } from '@teable/ui-lib/base'; import type { DragEndEvent } from '@teable/ui-lib/base'; import { useEffect, useState } from 'react'; @@ -21,12 +21,12 @@ const DraggableBaseGrid = (props: IDraggableBaseGridProps) => { if (!bases?.length) { return; } - const newBases = bases.sort((a, b) => a.order - b.order); - setInnerBases(newBases); + + setInnerBases(bases); }, [bases]); const { mutateAsync: updateBaseFn } = useMutation({ - mutationFn: updateBase, + mutationFn: updateBaseOrder, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['base-list'], @@ -46,17 +46,17 @@ const DraggableBaseGrid = (props: IDraggableBaseGridProps) => { const list = [...innerBases]; const [base] = list.splice(from, 1); - const newOrder = swapReorder(1, from, to, innerBases.length, (index: number) => { - return innerBases[index].order; - })[0]; - - if (newOrder === base.order) { - return; - } list.splice(to, 0, base); setInnerBases(list); - updateBaseFn({ baseId: base.id, updateBaseRo: { order: newOrder } }); + + const baseIndex = list.findIndex((v) => v.id === base.id); + + if (baseIndex == 0) { + await updateBaseFn({ baseId: base.id, anchorId: list[1].id, position: 'before' }); + } else { + await updateBaseFn({ baseId: base.id, anchorId: list[baseIndex - 1].id, position: 'after' }); + } }; return ( diff --git a/apps/nextjs-app/src/features/app/blocks/table-list/DraggableList.tsx b/apps/nextjs-app/src/features/app/blocks/table-list/DraggableList.tsx index 0d2cb310c..b5a74036c 100644 --- a/apps/nextjs-app/src/features/app/blocks/table-list/DraggableList.tsx +++ b/apps/nextjs-app/src/features/app/blocks/table-list/DraggableList.tsx @@ -1,4 +1,4 @@ -import { useTableId, useTables, useIsHydrated, swapReorder } from '@teable/sdk'; +import { useTableId, useTables, useIsHydrated } from '@teable/sdk'; import { DndKitContext, Droppable, @@ -34,16 +34,15 @@ export const DraggableList = () => { const list = [...tables]; const [table] = list.splice(from, 1); - const newOrder = swapReorder(1, from, to, tables.length, (index: number) => { - return tables[index].order; - })[0]; - - if (newOrder === table.order) { - return; - } list.splice(to, 0, table); setInnerTables(list); - table.updateOrder(newOrder); + + const tableIndex = list.findIndex((v) => v.id === table.id); + if (tableIndex == 0) { + await table.updateOrder({ anchorId: list[1].id, position: 'before' }); + } else { + await table.updateOrder({ anchorId: list[tableIndex - 1].id, position: 'after' }); + } }; return isHydrated ? ( diff --git a/apps/nextjs-app/src/features/app/blocks/table-list/TableList.tsx b/apps/nextjs-app/src/features/app/blocks/table-list/TableList.tsx index dd80f4f14..ac2ae089d 100644 --- a/apps/nextjs-app/src/features/app/blocks/table-list/TableList.tsx +++ b/apps/nextjs-app/src/features/app/blocks/table-list/TableList.tsx @@ -1,4 +1,5 @@ -import { File, FileCsv } from '@teable/icons'; +import { SUPPORTEDTYPE } from '@teable/core'; +import { File, FileCsv, FileExcel } from '@teable/icons'; import { useConnection, useTablePermission } from '@teable/sdk'; import { DropdownMenu, @@ -24,6 +25,11 @@ export const TableList: React.FC = () => { const permission = useTablePermission(); const { t } = useTranslation(['table']); const [dialogVisible, setDialogVisible] = useState(false); + const [fileType, setFileType] = useState(SUPPORTEDTYPE.CSV); + const importFile = (type: SUPPORTEDTYPE) => { + setDialogVisible(true); + setFileType(type); + }; return (
@@ -48,17 +54,30 @@ export const TableList: React.FC = () => { {t('table:import.menu.addFromOtherSource')} - setDialogVisible(true)}> + importFile(SUPPORTEDTYPE.CSV)} + > + importFile(SUPPORTEDTYPE.EXCEL)} + > + + {dialogVisible && ( setDialogVisible(open)} > diff --git a/apps/nextjs-app/src/features/app/blocks/table-list/TableListItem.tsx b/apps/nextjs-app/src/features/app/blocks/table-list/TableListItem.tsx index 76ca60223..769543902 100644 --- a/apps/nextjs-app/src/features/app/blocks/table-list/TableListItem.tsx +++ b/apps/nextjs-app/src/features/app/blocks/table-list/TableListItem.tsx @@ -61,12 +61,7 @@ export const TableListItem: React.FC = ({ table, isActive, className, is )} onClick={navigateHandler} > - {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */} -
{ - e.stopPropagation(); - }} - > +
{/* eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */}
e.stopPropagation()}> { } return ( - <> + // eslint-disable-next-line jsx-a11y/no-static-element-interactions +
e.stopPropagation()}> {menuPermission.deleteTable && ( @@ -114,6 +115,6 @@ export const TableOperation = (props: ITableOperationProps) => { onCancel={() => setDeleteConfirm(false)} onConfirm={deleteTable} /> - +
); }; diff --git a/apps/nextjs-app/src/features/app/blocks/table/table-header/Collaborators.tsx b/apps/nextjs-app/src/features/app/blocks/table/table-header/Collaborators.tsx index 358b4b139..b422dfc26 100644 --- a/apps/nextjs-app/src/features/app/blocks/table/table-header/Collaborators.tsx +++ b/apps/nextjs-app/src/features/app/blocks/table/table-header/Collaborators.tsx @@ -22,7 +22,7 @@ interface CollaboratorsProps { maxAvatarLen?: number; } -type ICollaboratorUser = Omit; +type ICollaboratorUser = Omit; export const Collaborators: React.FC = ({ className, maxAvatarLen = 3 }) => { const router = useRouter(); diff --git a/apps/nextjs-app/src/features/app/blocks/view/grid/GridViewBase.tsx b/apps/nextjs-app/src/features/app/blocks/view/grid/GridViewBase.tsx index fda843730..2b1073694 100644 --- a/apps/nextjs-app/src/features/app/blocks/view/grid/GridViewBase.tsx +++ b/apps/nextjs-app/src/features/app/blocks/view/grid/GridViewBase.tsx @@ -54,10 +54,12 @@ import { import { Skeleton, useToast } from '@teable/ui-lib'; import { isEqual, keyBy, uniqueId, groupBy } from 'lodash'; import { useRouter } from 'next/router'; +import { useTranslation } from 'next-i18next'; import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { usePrevious, useMount, useClickAway } from 'react-use'; import { ExpandRecordContainer } from '@/features/app/components/ExpandRecordContainer'; import type { IExpandRecordContainerRef } from '@/features/app/components/ExpandRecordContainer/types'; +import { tableConfig } from '@/features/i18n/table.config'; import { FieldOperator } from '../../../components/field-setting'; import { useFieldSettingStore } from '../field/useFieldSettingStore'; import { PrefillingRowContainer } from './components'; @@ -74,6 +76,7 @@ const { scrollBuffer, columnAppendBtnWidth } = GRID_DEFAULT; export const GridViewBase: React.FC = (props: IGridViewProps) => { const { onRowExpand } = props; + const { t } = useTranslation(tableConfig.i18nNamespaces); const router = useRouter(); const gridRef = useRef(null); const prefillingGridRef = useRef(null); @@ -505,7 +508,7 @@ export const GridViewBase: React.FC = (props: IGridViewProps) => if (type === RegionType.RowHeaderDragHandler && isAutoSort) { openTooltip({ id: componentId, - text: 'Automatic sorting is turned on, manual sorting is not available', + text: t('table:view.dragToolTip'), position: bounds, }); } diff --git a/apps/nextjs-app/src/features/app/blocks/view/grid/components/RecordMenu.tsx b/apps/nextjs-app/src/features/app/blocks/view/grid/components/RecordMenu.tsx index d2dde7025..68e2c8c52 100644 --- a/apps/nextjs-app/src/features/app/blocks/view/grid/components/RecordMenu.tsx +++ b/apps/nextjs-app/src/features/app/blocks/view/grid/components/RecordMenu.tsx @@ -2,7 +2,7 @@ import { FieldKeyType } from '@teable/core'; import { Trash, Copy, ArrowUp, ArrowDown } from '@teable/icons'; import { deleteRecords } from '@teable/openapi'; import { SelectionRegionType } from '@teable/sdk/components'; -import { useTableId, useTablePermission, useViewId } from '@teable/sdk/hooks'; +import { useTableId, useTablePermission, useView } from '@teable/sdk/hooks'; import { Record } from '@teable/sdk/model'; import { Command, @@ -10,6 +10,10 @@ import { CommandItem, CommandList, CommandSeparator, + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, } from '@teable/ui-lib/shadcn'; import classNames from 'classnames'; import { useTranslation } from 'next-i18next'; @@ -42,7 +46,8 @@ export const RecordMenu = () => { const { recordMenu, closeRecordMenu, selection } = useGridViewStore(); const { t } = useTranslation(tableConfig.i18nNamespaces); const tableId = useTableId(); - const viewId = useViewId(); + const view = useView(); + const viewId = view?.id; const permission = useTablePermission(); const { copy } = useSelectionOperation(); const recordMenuRef = useRef(null); @@ -53,12 +58,12 @@ export const RecordMenu = () => { if (recordMenu == null) return null; - const { records, neighborRecords, onAfterInsertCallback } = recordMenu; - + const { records, onAfterInsertCallback } = recordMenu; if (!records?.length) return null; const visible = Boolean(recordMenu); const position = recordMenu?.position; + const isAutoSort = view?.sort && !view.sort?.manualSort; const style = position ? { left: position.x, @@ -66,7 +71,7 @@ export const RecordMenu = () => { } : {}; - const onInsertRecord = async (sort: number) => { + const onInsertRecord = async (anchorId: string, position: 'before' | 'after') => { if (!tableId || !viewId) return; const res = await Record.createRecords(tableId, { @@ -74,9 +79,13 @@ export const RecordMenu = () => { records: [ { fields: {}, - recordOrder: { [viewId]: sort }, }, ], + order: { + viewId, + anchorId, + position, + }, }); const record = res.data.records[0]; @@ -99,19 +108,10 @@ export const RecordMenu = () => { name: t('table:menu.insertRecordAbove'), icon: , hidden: records.length !== 1 || !permission['record|create'], + disabled: isAutoSort, onClick: async () => { if (!tableId || !viewId) return; - let finalSort; - const [aboveRecord] = neighborRecords; - const sort = records[0].recordOrder[viewId]; - - if (aboveRecord == null) { - finalSort = sort - 1; - } else { - const aboveSort = aboveRecord.recordOrder[viewId]; - finalSort = (sort + aboveSort) / 2; - } - await onInsertRecord(finalSort); + await onInsertRecord(records[0].id, 'before'); }, }, { @@ -119,19 +119,10 @@ export const RecordMenu = () => { name: t('table:menu.insertRecordBelow'), icon: , hidden: records.length !== 1 || !permission['record|create'], + disabled: isAutoSort, onClick: async () => { if (!tableId || !viewId) return; - let finalSort; - const [, blewRecord] = neighborRecords; - const sort = records[0].recordOrder[viewId]; - - if (blewRecord == null) { - finalSort = sort + 1; - } else { - const aboveSort = blewRecord.recordOrder[viewId]; - finalSort = (sort + aboveSort) / 2; - } - await onInsertRecord(finalSort); + await onInsertRecord(records[0].id, 'after'); }, }, ], @@ -177,18 +168,28 @@ export const RecordMenu = () => { return ( - {items.map(({ type, name, icon, className, onClick }) => ( + {items.map(({ type, name, icon, className, disabled, onClick }) => ( { await onClick(); closeRecordMenu(); }} > - {icon} - {name} + + + + {icon} + {name} + + + {t('table:view.insertToolTip')} + + + ))} diff --git a/apps/nextjs-app/src/features/app/blocks/view/grid/hooks/useSelectionOperation.ts b/apps/nextjs-app/src/features/app/blocks/view/grid/hooks/useSelectionOperation.ts index 05a330733..b3b99315d 100644 --- a/apps/nextjs-app/src/features/app/blocks/view/grid/hooks/useSelectionOperation.ts +++ b/apps/nextjs-app/src/features/app/blocks/view/grid/hooks/useSelectionOperation.ts @@ -122,10 +122,12 @@ export const useSelectionOperation = (filter?: IFilter) => { const handleTextPaste = useCallback( async (selection: CombinedSelection, toaster: ReturnType) => { const clipboardContent = await navigator.clipboard.read(); - const hasHtml = clipboardContent[0].types.includes('text/html'); - const text = await (await clipboardContent[0].getType('text/plain')).text(); + const hasHtml = clipboardContent[0].types.includes(ClipboardTypes.html); + const text = clipboardContent[0].types.includes(ClipboardTypes.text) + ? await (await clipboardContent[0].getType(ClipboardTypes.text)).text() + : ''; const html = hasHtml - ? await (await clipboardContent[0].getType('text/html')).text() + ? await (await clipboardContent[0].getType(ClipboardTypes.html)).text() : undefined; const header = extractTableHeader(html); diff --git a/apps/nextjs-app/src/features/app/blocks/view/list/DraggableWrapper.tsx b/apps/nextjs-app/src/features/app/blocks/view/list/DraggableWrapper.tsx index 5e8072efe..9bf8a087f 100644 --- a/apps/nextjs-app/src/features/app/blocks/view/list/DraggableWrapper.tsx +++ b/apps/nextjs-app/src/features/app/blocks/view/list/DraggableWrapper.tsx @@ -1,6 +1,5 @@ import type { IViewInstance } from '@teable/sdk'; import { useViews } from '@teable/sdk'; -import { swapReorder } from '@teable/sdk/utils'; import { DndKitContext, Draggable, Droppable } from '@teable/ui-lib/base/dnd-kit'; import type { SortingStrategy, DragEndEvent, useSortable } from '@teable/ui-lib/base/dnd-kit'; import type { ReactElement } from 'react'; @@ -38,15 +37,18 @@ export const DraggableWrapper = ({ return; } - const newOrder = swapReorder(1, from, to, views?.length, (index) => views?.[index].order)[0]; - const view = views[from]; newViews.splice(to, 0, moveView); setInnerViews(newViews); + const viewIndex = newViews.findIndex((v) => v.id === view.id); - await view?.updateOrder(newOrder); + if (viewIndex == 0) { + await view?.updateOrder({ anchorId: newViews[1].id, position: 'before' }); + } else { + await view?.updateOrder({ anchorId: newViews[viewIndex - 1].id, position: 'after' }); + } }; return ( diff --git a/apps/nextjs-app/src/features/app/components/setting/Account.tsx b/apps/nextjs-app/src/features/app/components/setting/Account.tsx index 05ea28958..e85dd810e 100644 --- a/apps/nextjs-app/src/features/app/components/setting/Account.tsx +++ b/apps/nextjs-app/src/features/app/components/setting/Account.tsx @@ -14,6 +14,7 @@ import { import { useTranslation } from 'next-i18next'; import React from 'react'; import { UserAvatar } from '@/features/app/components/user/UserAvatar'; +import { AddPassword } from './account/AddPassword'; import { ChangePasswordDialog } from './account/ChangePasswordDialog'; export const Account: React.FC = () => { @@ -87,7 +88,10 @@ export const Account: React.FC = () => {
-

{t('settings.account.securityTitle')}

+

+ {t('settings.account.securityTitle')} + {!sessionUser.hasPassword && } +

@@ -96,22 +100,23 @@ export const Account: React.FC = () => {
{sessionUser.email}
-
-
- -
- {t('settings.account.passwordDesc')} + {sessionUser.hasPassword && ( +
+
+ +
+ {t('settings.account.passwordDesc')} +
+ + +
- - - -
+ )}
-
); }; diff --git a/apps/nextjs-app/src/features/app/components/setting/account/AddPassword.tsx b/apps/nextjs-app/src/features/app/components/setting/account/AddPassword.tsx new file mode 100644 index 000000000..9bb79989e --- /dev/null +++ b/apps/nextjs-app/src/features/app/components/setting/account/AddPassword.tsx @@ -0,0 +1,118 @@ +import { useMutation } from '@tanstack/react-query'; +import { addPassword } from '@teable/openapi'; +import { passwordSchema } from '@teable/openapi/src/auth/types'; +import { useSession } from '@teable/sdk/hooks'; +import { Spin } from '@teable/ui-lib/base'; +import { + Button, + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, + Input, + Label, + useToast, +} from '@teable/ui-lib/shadcn'; +import { useTranslation } from 'next-i18next'; +import { useEffect, useState } from 'react'; +import { Error } from '@/components/Error'; + +export const AddPassword = () => { + const [newPassword, setNewPassword] = useState(''); + const [confirmPassword, setConfirmPassword] = useState(''); + const { t } = useTranslation('common'); + const [error, setError] = useState(''); + const [open, setOpen] = useState(false); + const { toast } = useToast(); + const { refresh } = useSession(); + + const { mutateAsync: addPasswordMutate, isLoading } = useMutation({ + mutationFn: addPassword, + onSuccess: () => { + toast({ title: t('settings.account.addPasswordSuccess.title') }); + setOpen(false); + refresh(); + }, + }); + + useEffect(() => { + if (newPassword && confirmPassword && newPassword !== confirmPassword) { + setError(t('settings.account.addPasswordError.disMatch')); + return; + } + if (newPassword && confirmPassword && !passwordSchema.safeParse(newPassword).success) { + setError(t('settings.account.addPasswordError.invalid')); + return; + } + setError(''); + }, [newPassword, confirmPassword, t]); + + const handleSubmit = () => { + if (error || !newPassword || !confirmPassword || isLoading) { + return; + } + addPasswordMutate({ password: newPassword }); + }; + + return ( + + + + + + + + {t('settings.account.addPassword.title')} + + + {t('settings.account.addPassword.desc')} + + +
+
+
+ + setNewPassword(e.target.value)} + aria-autocomplete="inline" + /> +
+
+ + setConfirmPassword(e.target.value)} + aria-autocomplete="inline" + /> +
+
+ +
+ + + +
+
+ ); +}; diff --git a/apps/nextjs-app/src/features/auth/components/LayoutMain.tsx b/apps/nextjs-app/src/features/auth/components/LayoutMain.tsx new file mode 100644 index 000000000..53b9d3e34 --- /dev/null +++ b/apps/nextjs-app/src/features/auth/components/LayoutMain.tsx @@ -0,0 +1,16 @@ +import { Card } from '@teable/ui-lib/shadcn'; +import { TeableFooter } from './TeableFooter'; + +interface ILayoutMainProps { + children?: React.ReactNode | React.ReactNode[]; +} + +export const LayoutMain = (props: ILayoutMainProps) => { + const { children } = props; + return ( +
+ {children} + +
+ ); +}; diff --git a/apps/nextjs-app/src/features/auth/components/SignForm.tsx b/apps/nextjs-app/src/features/auth/components/SignForm.tsx index 275f8ef9c..d91fcb4a9 100644 --- a/apps/nextjs-app/src/features/auth/components/SignForm.tsx +++ b/apps/nextjs-app/src/features/auth/components/SignForm.tsx @@ -5,10 +5,12 @@ import { signup, signin, signinSchema, signupSchema } from '@teable/openapi'; import { Spin } from '@teable/ui-lib/base'; import { Button, Input, Label } from '@teable/ui-lib/shadcn'; import classNames from 'classnames'; +import Link from 'next/link'; import { useTranslation } from 'next-i18next'; import type { FC } from 'react'; import { useCallback, useMemo, useState } from 'react'; import { fromZodError } from 'zod-validation-error'; +import { Error as ErrorCom } from '@/components/Error'; import { authConfig } from '../../i18n/auth.config'; export interface ISignForm { @@ -86,31 +88,37 @@ export const SignForm: FC = (props) => {
- +
+ + + {t('auth:forgetPassword.trigger')} + +
- - {error && ( -
- {error} -
- )} +
+ + +
diff --git a/apps/nextjs-app/src/features/auth/components/SocialAuth.tsx b/apps/nextjs-app/src/features/auth/components/SocialAuth.tsx new file mode 100644 index 000000000..1addfe03d --- /dev/null +++ b/apps/nextjs-app/src/features/auth/components/SocialAuth.tsx @@ -0,0 +1,55 @@ +import { GithubLogo, GoogleLogo } from '@teable/icons'; +import { Button, Separator } from '@teable/ui-lib/shadcn'; +import { useRouter } from 'next/router'; +import { useMemo } from 'react'; +import { useEnv } from '@/features/app/hooks/useEnv'; + +const providersAll = [ + { + id: 'github', + text: 'Github', + Icon: GithubLogo, + authUrl: '/api/auth/github', + }, + { + id: 'google', + text: 'Google', + Icon: GoogleLogo, + authUrl: '/api/auth/google', + }, +]; + +export const SocialAuth = () => { + const { socialAuthProviders } = useEnv(); + const router = useRouter(); + const redirect = router.query.redirect as string; + + const providers = useMemo( + () => providersAll.filter((provider) => socialAuthProviders?.includes(provider.id)), + [socialAuthProviders] + ); + + const onClick = (authUrl: string) => { + window.location.href = redirect + ? `${authUrl}?redirect_uri=${encodeURIComponent(redirect)}` + : authUrl; + }; + + if (!providers.length) { + return; + } + + return ( + <> + +
+ {providers.map(({ id, text, Icon, authUrl }) => ( + + ))} +
+ + ); +}; diff --git a/apps/nextjs-app/src/features/auth/components/TeableFooter.tsx b/apps/nextjs-app/src/features/auth/components/TeableFooter.tsx new file mode 100644 index 000000000..53de4e432 --- /dev/null +++ b/apps/nextjs-app/src/features/auth/components/TeableFooter.tsx @@ -0,0 +1,27 @@ +import { TeableNew } from '@teable/icons'; +import { cn } from '@teable/ui-lib/shadcn'; +import { useTranslation } from 'next-i18next'; +import { authConfig } from '@/features/i18n/auth.config'; + +interface ITeableHeaderProps { + className?: string; + enableClick?: boolean; +} + +export const TeableFooter = (props: ITeableHeaderProps) => { + const { className, enableClick } = props; + const { t } = useTranslation(authConfig.i18nNamespaces); + + return ( +
+ + {t('common:brand')} +
+ ); +}; diff --git a/apps/nextjs-app/src/features/auth/pages/ForgetPasswordPage.tsx b/apps/nextjs-app/src/features/auth/pages/ForgetPasswordPage.tsx new file mode 100644 index 000000000..bb9eaa1b8 --- /dev/null +++ b/apps/nextjs-app/src/features/auth/pages/ForgetPasswordPage.tsx @@ -0,0 +1,75 @@ +import { useMutation } from '@tanstack/react-query'; +import { sendResetPasswordEmail } from '@teable/openapi'; +import { Spin } from '@teable/ui-lib/base'; +import { Button, Input, Label, Separator, useToast } from '@teable/ui-lib/shadcn'; +import { useTranslation } from 'next-i18next'; +import { useState } from 'react'; +import { z } from 'zod'; +import { Error } from '@/components/Error'; +import { authConfig } from '@/features/i18n/auth.config'; +import { LayoutMain } from '../components/LayoutMain'; + +export const ForgetPasswordPage = () => { + const [error, setError] = useState(); + const [email, setEmail] = useState(); + const { t } = useTranslation(authConfig.i18nNamespaces); + const { toast } = useToast(); + + const { mutateAsync: sendResetPasswordEmailMutate, isLoading } = useMutation({ + mutationFn: sendResetPasswordEmail, + onSuccess: () => { + toast({ + title: t('auth:forgetPassword.success.title'), + description: t('auth:forgetPassword.success.description'), + }); + }, + }); + + const emailOnChange = (event: React.ChangeEvent) => { + const value = event.target.value; + setEmail(value); + setError(''); + }; + + const validEmail = (e: React.FocusEvent) => { + const value = e.target.value; + if (!value) { + return setError(t('auth:forgetPassword.errorRequiredEmail')); + } + if (!z.string().email().safeParse(value).success) { + return setError(t('auth:forgetPassword.errorInvalidEmail')); + } + }; + + return ( + +

{t('auth:forgetPassword.header')}

+

{t('auth:forgetPassword.description')}

+
+ +
+ + +
+ + +
+
+ ); +}; diff --git a/apps/nextjs-app/src/features/auth/pages/LoginPage.tsx b/apps/nextjs-app/src/features/auth/pages/LoginPage.tsx index f927f77b0..98a3362e0 100644 --- a/apps/nextjs-app/src/features/auth/pages/LoginPage.tsx +++ b/apps/nextjs-app/src/features/auth/pages/LoginPage.tsx @@ -9,6 +9,7 @@ import { useState, type FC, useCallback } from 'react'; import { authConfig } from '@/features/i18n/auth.config'; import type { ISignForm } from '../components/SignForm'; import { SignForm } from '../components/SignForm'; +import { SocialAuth } from '../components/SocialAuth'; const queryClient = createQueryClient(); @@ -36,11 +37,10 @@ export const LoginPage: FC = () => {
- +
+ + +
); diff --git a/apps/nextjs-app/src/features/auth/pages/ResetPasswordPage.tsx b/apps/nextjs-app/src/features/auth/pages/ResetPasswordPage.tsx new file mode 100644 index 000000000..39f3bb645 --- /dev/null +++ b/apps/nextjs-app/src/features/auth/pages/ResetPasswordPage.tsx @@ -0,0 +1,83 @@ +import { useMutation } from '@tanstack/react-query'; +import { resetPassword } from '@teable/openapi'; +import { passwordSchema } from '@teable/openapi/src/auth/types'; +import { Spin } from '@teable/ui-lib/base'; +import { Button, Input, Label, Separator, useToast } from '@teable/ui-lib/shadcn'; +import { useRouter } from 'next/router'; +import { useTranslation } from 'next-i18next'; +import { useState } from 'react'; +import { fromZodError } from 'zod-validation-error'; +import { Error } from '@/components/Error'; +import { authConfig } from '@/features/i18n/auth.config'; +import { LayoutMain } from '../components/LayoutMain'; + +export const ResetPasswordPage = () => { + const [error, setError] = useState(); + const [password, setPassword] = useState(); + const router = useRouter(); + const code = router.query.code as string; + const { t } = useTranslation(authConfig.i18nNamespaces); + const { toast } = useToast(); + + const { mutateAsync: resetPasswordMutate, isLoading } = useMutation({ + mutationFn: resetPassword, + onSuccess: () => { + toast({ + title: t('auth:resetPassword.success.title'), + description: t('auth:resetPassword.success.description'), + }); + setTimeout(() => { + router.push('/auth/login'); + }, 2000); + }, + }); + + const passwordOnChange = (event: React.ChangeEvent) => { + const value = event.target.value; + setPassword(value); + setError(undefined); + }; + + const validPassword = (e: React.FocusEvent) => { + const value = e.target.value; + if (!value) { + return setError(t('auth:resetPassword.error.requiredPassword')); + } + const res = passwordSchema.safeParse(value); + if (!res.success) { + return setError(fromZodError(res.error).message); + } + }; + + return ( + +

{t('auth:resetPassword.header')}

+

{t('auth:resetPassword.description')}

+
+ +
+ + +
+ + +
+
+ ); +}; diff --git a/apps/nextjs-app/src/lib/server-env.ts b/apps/nextjs-app/src/lib/server-env.ts index 2c69258d1..97e3fdb60 100644 --- a/apps/nextjs-app/src/lib/server-env.ts +++ b/apps/nextjs-app/src/lib/server-env.ts @@ -3,6 +3,8 @@ import React from 'react'; export interface IServerEnv { templateSiteLink?: string; microsoftClarityId?: string; + sentryDsn?: string; + socialAuthProviders?: string[]; } export const EnvContext = React.createContext({}); diff --git a/apps/nextjs-app/src/pages/_app.tsx b/apps/nextjs-app/src/pages/_app.tsx index 99fca3d10..71c266698 100644 --- a/apps/nextjs-app/src/pages/_app.tsx +++ b/apps/nextjs-app/src/pages/_app.tsx @@ -114,6 +114,7 @@ MyApp.getInitialProps = async (appContext: AppContext) => { templateSiteLink: process.env.TEMPLATE_SITE_LINK, microsoftClarityId: process.env.MICROSOFT_CLARITY_ID, sentryDsn: process.env.SENTRY_DSN, + socialAuthProviders: process.env.SOCIAL_AUTH_PROVIDERS?.split(','), }, }; if (!isLoginPage && !needLoginPage) { diff --git a/apps/nextjs-app/src/pages/auth/forget-password.tsx b/apps/nextjs-app/src/pages/auth/forget-password.tsx new file mode 100644 index 000000000..87b3e2df6 --- /dev/null +++ b/apps/nextjs-app/src/pages/auth/forget-password.tsx @@ -0,0 +1,24 @@ +import { QueryClientProvider } from '@tanstack/react-query'; +import { createQueryClient } from '@teable/sdk/context'; +import type { GetServerSideProps } from 'next'; +import { ForgetPasswordPage } from '@/features/auth/pages/ForgetPasswordPage'; +import { authConfig } from '@/features/i18n/auth.config'; +import { getTranslationsProps } from '@/lib/i18n'; + +export default function ForgetPasswordRoute() { + const queryClient = createQueryClient(); + return ( + + + + ); +} + +export const getServerSideProps: GetServerSideProps = async (context) => { + const { i18nNamespaces } = authConfig; + return { + props: { + ...(await getTranslationsProps(context, i18nNamespaces)), + }, + }; +}; diff --git a/apps/nextjs-app/src/pages/auth/reset-password.tsx b/apps/nextjs-app/src/pages/auth/reset-password.tsx new file mode 100644 index 000000000..b264ed9e2 --- /dev/null +++ b/apps/nextjs-app/src/pages/auth/reset-password.tsx @@ -0,0 +1,24 @@ +import { QueryClientProvider } from '@tanstack/react-query'; +import { createQueryClient } from '@teable/sdk/context'; +import type { GetServerSideProps } from 'next'; +import { ResetPasswordPage } from '@/features/auth/pages/ResetPasswordPage'; +import { authConfig } from '@/features/i18n/auth.config'; +import { getTranslationsProps } from '@/lib/i18n'; + +export default function ForgetPasswordRoute() { + const queryClient = createQueryClient(); + return ( + + + + ); +} + +export const getServerSideProps: GetServerSideProps = async (context) => { + const { i18nNamespaces } = authConfig; + return { + props: { + ...(await getTranslationsProps(context, i18nNamespaces)), + }, + }; +}; diff --git a/apps/nextjs-app/src/types.d/react-i18next.d.ts b/apps/nextjs-app/src/types.d/next-i18next.d.ts similarity index 87% rename from apps/nextjs-app/src/types.d/react-i18next.d.ts rename to apps/nextjs-app/src/types.d/next-i18next.d.ts index 838463be8..58e1870de 100644 --- a/apps/nextjs-app/src/types.d/react-i18next.d.ts +++ b/apps/nextjs-app/src/types.d/next-i18next.d.ts @@ -4,10 +4,10 @@ * you can opt out by commenting the following code. * @link https://react.i18next.com/latest/typescript */ -import 'react-i18next'; +import 'next-i18next'; import type { I18nNamespaces } from '@teable/common-i18n'; -declare module 'react-i18next' { +declare module 'next-i18next' { interface CustomTypeOptions { defaultNS: 'common'; resources: I18nNamespaces; diff --git a/apps/nextjs-app/vitest.config.ts b/apps/nextjs-app/vitest.config.ts index a38a44368..fee1a3282 100644 --- a/apps/nextjs-app/vitest.config.ts +++ b/apps/nextjs-app/vitest.config.ts @@ -1,7 +1,7 @@ import react from '@vitejs/plugin-react-swc'; import svgr from 'vite-plugin-svgr'; import tsconfigPaths from 'vite-tsconfig-paths'; -import { defineConfig } from 'vitest/config'; +import { configDefaults, defineConfig } from 'vitest/config'; const testFiles = ['./src/**/*.{test,spec}.{js,jsx,ts,tsx}']; export default defineConfig({ @@ -15,25 +15,20 @@ export default defineConfig({ svgrOptions: {}, }), ], + cacheDir: '../../.cache/vitest/nextjs-app', test: { globals: true, environment: 'happy-dom', passWithNoTests: false, setupFiles: './config/tests/setupVitest.ts', - cache: { - dir: '../../.cache/vitest/nextjs-app', - }, coverage: { provider: 'v8', - reporter: ['text', 'clover'], - extension: ['js', 'jsx', 'ts', 'tsx'], + extension: ['.js', '.jsx', '.ts', '.tsx'], + include: ['src/**/*', 'config/**/*'], }, include: testFiles, - exclude: [ - '**/node_modules/**', - '**/dist/**', - '**/.next/**', - '**/.{idea,git,cache,output,temp}/**', - ], + exclude: [...configDefaults.exclude, '**/.next/**'], }, }); +// +// next-i18next.config.js diff --git a/docker-bake.hcl b/docker-bake.hcl index 8a0695b58..3c11c4cc6 100644 --- a/docker-bake.hcl +++ b/docker-bake.hcl @@ -14,12 +14,12 @@ target "teable" { context = "." dockerfile = "dockers/teable/Dockerfile" platforms = ["linux/amd64", "linux/arm64"] - tags = ["${IMAGE_REGISTRY}/teablecloud/teable:latest", "${IMAGE_REGISTRY}/teablecloud/teable:${IMAGE_TAG}"] + tags = ["${IMAGE_REGISTRY}/teableio/teable:latest", "${IMAGE_REGISTRY}/teableio/teable:${IMAGE_TAG}"] } target "teable-db-migrate" { context = "." dockerfile = "dockers/teable/Dockerfile.db-migrate" platforms = ["linux/amd64", "linux/arm64"] - tags = ["${IMAGE_REGISTRY}/teablecloud/teable-db-migrate:latest", "${IMAGE_REGISTRY}/teablecloud/teable-db-migrate:${IMAGE_TAG}"] + tags = ["${IMAGE_REGISTRY}/teableio/teable-db-migrate:latest", "${IMAGE_REGISTRY}/teableio/teable-db-migrate:${IMAGE_TAG}"] } \ No newline at end of file diff --git a/dockers/examples/cluster/.env b/dockers/examples/cluster/.env index 3c37c781f..2bc58a171 100644 --- a/dockers/examples/cluster/.env +++ b/dockers/examples/cluster/.env @@ -1,7 +1,51 @@ TIMEZONE=UTC +# Postgres +POSTGRES_HOST=teable-db +POSTGRES_PORT=5432 POSTGRES_DB=example POSTGRES_USER=example -POSTGRES_PASSWORD=cluster_replace_password +POSTGRES_PASSWORD=example2password -REDIS_PASSWORD=cluster_replace_password \ No newline at end of file +# Redis +REDIS_HOST=teable-cache +REDIS_PORT=6379 +REDIS_DB=0 +REDIS_PASSWORD=example2password + +# Minio +MINIO_SERVER_URL=http://127.0.0.1:9000 +MINIO_BROWSER_REDIRECT_URL=http://127.0.0.1:9000/minio/ui +MINIO_ACCESS_KEY=example2access +MINIO_SECRET_KEY=example2secret + +# App +PUBLIC_ORIGIN=http://127.0.0.1 +PRISMA_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} +PUBLIC_DATABASE_PROXY=127.0.0.1:42345 + +BACKEND_CACHE_PROVIDER=redis +BACKEND_CACHE_REDIS_URI=redis://default:${POSTGRES_PASSWORD}@${REDIS_HOST}:${REDIS_PORT}/${REDIS_DB} + +# Replace when using minio. +# For intranet: replace with the ip of the host where minio is currently deployed. +# For extranet: replace with minio's domain name or extranet ip. +BACKEND_STORAGE_PROVIDER=minio +BACKEND_STORAGE_PUBLIC_BUCKET=public +BACKEND_STORAGE_PRIVATE_BUCKET=private +BACKEND_STORAGE_MINIO_ENDPOINT= +BACKEND_STORAGE_MINIO_PORT=9000 +BACKEND_STORAGE_MINIO_USE_SSL=false +BACKEND_STORAGE_MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY} +BACKEND_STORAGE_MINIO_SECRET_KEY=${MINIO_SECRET_KEY} +STORAGE_PREFIX=http://:9000 + +# Need to support sending emails to enable the following configurations +# You need to modify the configuration according to the actual situation, otherwise it will not be able to send emails correctly. +#BACKEND_MAIL_HOST=smtp.teable.io +#BACKEND_MAIL_PORT=465 +#BACKEND_MAIL_SECURE=true +#BACKEND_MAIL_SENDER=noreply.teable.io +#BACKEND_MAIL_SENDER_NAME=Teable +#BACKEND_MAIL_AUTH_USER=username +#BACKEND_MAIL_AUTH_PASS=password diff --git a/dockers/examples/cluster/README.md b/dockers/examples/cluster/README.md index 6d1a05d89..c1d4c424b 100644 --- a/dockers/examples/cluster/README.md +++ b/dockers/examples/cluster/README.md @@ -1,9 +1,34 @@ -# Example with teable cluster +# Setup Instructions for Teable Cluster -Look into the `.env` file and update the vaiables before executing `docker compose up -d`. +Before executing `docker compose up -d`, ensure to update the variables in the `.env` file according to your +environment's requirements. -## Teable +## Teable Configuration -- Accessible via `http://127.0.0.1:80` -- Uses postgres db for storage -- Telemetry is disabled +- **Access URL:** Access the Teable interface via [http://127.0.0.1:80](http://127.0.0.1:80). +- **Database Storage:** Utilizes PostgreSQL database for data storage. +- **Telemetry:** Telemetry collection is disabled by default. + +## MinIO Endpoint Configuration + +When configuring the Teable cluster to use MinIO for storage, it's necessary to replace the +placeholder `` in the `.env` file with the appropriate endpoint: + +- **For Intranet Use:** Replace `` with the IP address of the host where MinIO is deployed. This setup + is recommended if MinIO and Teable are on the same network. + +- **For Extranet Use:** Replace `` with the domain name or extranet IP address of your MinIO instance. + Use this configuration if you need to access MinIO from outside your local network. + +## Public Database Proxy Configuration + +To ensure smooth native database connections, you need to set the `PUBLIC_DATABASE_PROXY` variable in the `.env` file to +its default value, `127.0.0.1:42345`. This port should match the port specified for the `teable-db` container in +the `docker-compose.yaml` file's `ports` attribute and can be adjusted to suit your needs. + +**Important Note:** When using ports `80` or `443`, it's essential to explicitly specify the port number in the URL. +Failing to do so is not allowed. This practice guarantees accurate address resolution and dependable connectivity, +providing a solid foundation for your database connections. + +Ensure to review and adjust these configurations to match your deployment environment before starting the Teable +cluster. diff --git a/dockers/examples/cluster/docker-compose.yaml b/dockers/examples/cluster/docker-compose.yaml index 3bf218a63..9da91d7db 100644 --- a/dockers/examples/cluster/docker-compose.yaml +++ b/dockers/examples/cluster/docker-compose.yaml @@ -8,15 +8,11 @@ services: restart: always expose: - '3000' - volumes: - - teable-data:/app/.assets:rw + env_file: + - .env environment: - TZ=${TIMEZONE} - - NODE_OPTIONS=--max-old-space-size=1024 - - PUBLIC_ORIGIN=http://127.0.0.1 - - PRISMA_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@teable-db:5432/${POSTGRES_DB} - - BACKEND_CACHE_PROVIDER=redis - - BACKEND_CACHE_REDIS_URI=redis://:${POSTGRES_PASSWORD}@teable-cache:6379/0 + - NEXT_ENV_IMAGES_ALL_REMOTE=true networks: - teable-cluster depends_on: @@ -34,10 +30,13 @@ services: teable-db: image: postgres:15.4 restart: always - expose: - - '5432' + ports: + - '42345:5432' volumes: - teable-db:/var/lib/postgresql/data:rw + # you may use a bind-mounted host directory instead, + # so that it is harder to accidentally remove the volume and lose all your data! + # - ./docker/db/data:/var/lib/postgresql/data:rw environment: - TZ=${TIMEZONE} - POSTGRES_DB=${POSTGRES_DB} @@ -51,6 +50,17 @@ services: timeout: 3s retries: 3 + teable-db-migrate: + image: ghcr.io/teableio/teable-db-migrate:latest + environment: + - TZ=${TIMEZONE} + - PRISMA_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + networks: + - teable-cluster + depends_on: + teable-db: + condition: service_healthy + teable-cache: image: redis:7.2.4 restart: always @@ -58,6 +68,9 @@ services: - '6379' volumes: - teable-cache:/data:rw + # you may use a bind-mounted host directory instead, + # so that it is harder to accidentally remove the volume and lose all your data! + # - ./docker/cache/data:/data:rw networks: - teable-cluster command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD} @@ -67,16 +80,40 @@ services: timeout: 3s retries: 3 - teable-db-migrate: - image: ghcr.io/teableio/teable-db-migrate:latest + teable-storage: + image: minio/minio:RELEASE.2024-02-17T01-15-57Z + expose: + - '9000' + - '9001' environment: - - TZ=${TIMEZONE} - - PRISMA_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@teable-db:5432/${POSTGRES_DB} + - MINIO_SERVER_URL=${MINIO_SERVER_URL} + - MINIO_BROWSER_REDIRECT_URL=${MINIO_BROWSER_REDIRECT_URL} + - MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY} + - MINIO_SECRET_KEY=${MINIO_SECRET_KEY} + volumes: + - teable-storage:/data:rw + # you may use a bind-mounted host directory instead, + # so that it is harder to accidentally remove the volume and lose all your data! + # - ./docker/storage/data:/data:rw networks: - teable-cluster + command: server /data --console-address ":9001" + + createbuckets: + image: minio/mc + networks: + - teable-cluster + entrypoint: > + /bin/sh -c " + /usr/bin/mc alias set teable-storage http://teable-storage:9000 ${MINIO_ACCESS_KEY} ${MINIO_SECRET_KEY}; + /usr/bin/mc mb teable-storage/public; + /usr/bin/mc anonymous set public teable-storage/public; + /usr/bin/mc mb teable-storage/private; + exit 0; + " depends_on: - teable-db: - condition: service_healthy + teable-storage: + condition: service_started teable-gateway: image: openresty/openresty:1.25.3.1-2-bookworm-fat @@ -84,6 +121,7 @@ services: ports: - '80:80' - '443:443' + - '9000:9000' volumes: - './gateway/conf.d:/etc/nginx/conf.d' networks: @@ -103,6 +141,6 @@ networks: driver: bridge volumes: - teable-data: {} teable-db: {} teable-cache: {} + teable-storage: {} diff --git a/dockers/examples/cluster/gateway/conf.d/minio.conf b/dockers/examples/cluster/gateway/conf.d/minio.conf new file mode 100644 index 000000000..156ef09e4 --- /dev/null +++ b/dockers/examples/cluster/gateway/conf.d/minio.conf @@ -0,0 +1,63 @@ +upstream storage_s3 { + server teable-storage:9000; +} + +upstream storage_console { + server teable-storage:9001; +} + +server { + server_name localhost; + listen 9000; + listen [::]:9000; + + # Allow special characters in headers + ignore_invalid_headers off; + # Allow any size file to be uploaded. + # Set to a value such as 1000m; to restrict file size to a specific value + client_max_body_size 0; + # Disable buffering + proxy_buffering off; + proxy_request_buffering off; + + location / { + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_connect_timeout 300; + # Default is HTTP/1, keepalive is only enabled in HTTP/1.1 + proxy_http_version 1.1; + proxy_set_header Connection ""; + chunked_transfer_encoding off; + + proxy_pass http://storage_s3; # This uses the upstream directive definition to load balance + } + + location /minio/ui/ { + rewrite ^/minio/ui/(.*) /$1 break; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-NginX-Proxy true; + + # This is necessary to pass the correct IP to be hashed + real_ip_header X-Real-IP; + + proxy_connect_timeout 300; + + # To support websockets in MinIO versions released after January 2023 + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + # Some environments may encounter CORS errors (Kubernetes + Nginx Ingress) + # Uncomment the following line to set the Origin request to an empty string + # proxy_set_header Origin ''; + + chunked_transfer_encoding off; + + proxy_pass http://storage_console; # This uses the upstream directive definition to load balance + } +} \ No newline at end of file diff --git a/dockers/examples/docker-swarm/.env b/dockers/examples/docker-swarm/.env index 8ecaa39d7..8d9247250 100644 --- a/dockers/examples/docker-swarm/.env +++ b/dockers/examples/docker-swarm/.env @@ -1,20 +1,27 @@ TIMEZONE=UTC +# Postgres POSTGRES_HOST=teable-db POSTGRES_PORT=5432 POSTGRES_DB=example POSTGRES_USER=example -POSTGRES_PASSWORD=swarm_replace_password +POSTGRES_PASSWORD=swarm2replace2password +# Redis REDIS_HOST=teable-cache REDIS_PORT=6379 REDIS_DB=0 -REDIS_PASSWORD=swarm_replace_password +REDIS_PASSWORD=swarm2replace2password -MINIO_ACCESS_KEY=swarm_replace_access -MINIO_SECRET_KEY=swarm_replace_secret +# Minio +MINIO_SERVER_URL=http://127.0.0.1:9000 +MINIO_BROWSER_REDIRECT_URL=http://127.0.0.1:9000/minio/ui +MINIO_ACCESS_KEY=swarm2replace2access +MINIO_SECRET_KEY=swarm2replace2secret +# App PUBLIC_ORIGIN=http://127.0.0.1 +PUBLIC_DATABASE_PROXY=127.0.0.1:42345 BACKEND_STORAGE_PROVIDER=minio BACKEND_STORAGE_PUBLIC_BUCKET=public @@ -22,4 +29,14 @@ BACKEND_STORAGE_PRIVATE_BUCKET=private BACKEND_STORAGE_MINIO_ENDPOINT=127.0.0.1 BACKEND_STORAGE_MINIO_PORT=9000 BACKEND_STORAGE_MINIO_USE_SSL=false -STORAGE_PREFIX=http://127.0.0.1 \ No newline at end of file +STORAGE_PREFIX=http://127.0.0.1:9000 + +# Need to support sending emails to enable the following configurations +# You need to modify the configuration according to the actual situation, otherwise it will not be able to send emails correctly. +#BACKEND_MAIL_HOST=smtp.teable.io +#BACKEND_MAIL_PORT=465 +#BACKEND_MAIL_SECURE=true +#BACKEND_MAIL_SENDER=noreply.teable.io +#BACKEND_MAIL_SENDER_NAME=Teable +#BACKEND_MAIL_AUTH_USER=username +#BACKEND_MAIL_AUTH_PASS=password \ No newline at end of file diff --git a/dockers/examples/docker-swarm/deploy.sh b/dockers/examples/docker-swarm/deploy.sh index 70caa57ea..071189495 100755 --- a/dockers/examples/docker-swarm/deploy.sh +++ b/dockers/examples/docker-swarm/deploy.sh @@ -7,7 +7,7 @@ create_network() { export_env_vars() { if [ -f .env ]; then # see https://github.com/moby/moby/issues/29133 - export $(cat .env | xargs) + export $(grep -v '^#' .env | xargs) else echo ".env file not found, skipping export." fi diff --git a/dockers/examples/docker-swarm/docker-compose.app.yml b/dockers/examples/docker-swarm/docker-compose.app.yml index d66520ebc..8832ec3ee 100644 --- a/dockers/examples/docker-swarm/docker-compose.app.yml +++ b/dockers/examples/docker-swarm/docker-compose.app.yml @@ -15,11 +15,12 @@ services: - '3000' environment: - TZ=${TIMEZONE} - - NODE_OPTIONS=--max-old-space-size=1024 + - NEXT_ENV_IMAGES_ALL_REMOTE=true - PUBLIC_ORIGIN=${PUBLIC_ORIGIN} - PRISMA_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + - PUBLIC_DATABASE_PROXY=${PUBLIC_DATABASE_PROXY} - BACKEND_CACHE_PROVIDER=redis - - BACKEND_CACHE_REDIS_URI=redis://:${POSTGRES_PASSWORD}@${REDIS_HOST}:${REDIS_PORT}/${REDIS_DB} + - BACKEND_CACHE_REDIS_URI=redis://default:${POSTGRES_PASSWORD}@${REDIS_HOST}:${REDIS_PORT}/${REDIS_DB} - BACKEND_STORAGE_PROVIDER=${BACKEND_STORAGE_PROVIDER} - BACKEND_STORAGE_PUBLIC_BUCKET=${BACKEND_STORAGE_PUBLIC_BUCKET} - BACKEND_STORAGE_PRIVATE_BUCKET=${BACKEND_STORAGE_PRIVATE_BUCKET} @@ -29,6 +30,13 @@ services: - BACKEND_STORAGE_MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY} - BACKEND_STORAGE_MINIO_SECRET_KEY=${MINIO_SECRET_KEY} - STORAGE_PREFIX=${STORAGE_PREFIX} + # - BACKEND_MAIL_HOST=${BACKEND_MAIL_HOST} + # - BACKEND_MAIL_PORT=${BACKEND_MAIL_PORT} + # - BACKEND_MAIL_SECURE=${BACKEND_MAIL_SECURE} + # - BACKEND_MAIL_SENDER=${BACKEND_MAIL_SENDER} + # - BACKEND_MAIL_SENDER_NAME=${BACKEND_MAIL_SENDER_NAME} + # - BACKEND_MAIL_AUTH_USER=${BACKEND_MAIL_AUTH_USER} + # - BACKEND_MAIL_AUTH_PASS=${BACKEND_MAIL_AUTH_PASS} networks: - teable-swarm healthcheck: diff --git a/dockers/examples/docker-swarm/docker-compose.kit.yml b/dockers/examples/docker-swarm/docker-compose.kit.yml index bd8a00a7a..d120daa1a 100644 --- a/dockers/examples/docker-swarm/docker-compose.kit.yml +++ b/dockers/examples/docker-swarm/docker-compose.kit.yml @@ -3,8 +3,8 @@ version: '3.9' services: teable-db: image: postgres:15.4 - expose: - - '5432' + ports: + - '42345:5432' volumes: - teable-db:/var/lib/postgresql/data:rw environment: @@ -52,6 +52,8 @@ services: - '9000' - '9001' environment: + - MINIO_SERVER_URL=${MINIO_SERVER_URL} + - MINIO_BROWSER_REDIRECT_URL=${MINIO_BROWSER_REDIRECT_URL} - MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY} - MINIO_SECRET_KEY=${MINIO_SECRET_KEY} volumes: diff --git a/dockers/examples/docker-swarm/gateway/conf.d/minio.conf b/dockers/examples/docker-swarm/gateway/conf.d/minio.conf index e99a3ea66..156ef09e4 100644 --- a/dockers/examples/docker-swarm/gateway/conf.d/minio.conf +++ b/dockers/examples/docker-swarm/gateway/conf.d/minio.conf @@ -11,10 +11,17 @@ server { listen 9000; listen [::]:9000; - location / { - proxy_pass http://storage_s3; + # Allow special characters in headers + ignore_invalid_headers off; + # Allow any size file to be uploaded. + # Set to a value such as 1000m; to restrict file size to a specific value + client_max_body_size 0; + # Disable buffering + proxy_buffering off; + proxy_request_buffering off; - proxy_set_header Host $host; + location / { + proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; @@ -24,15 +31,12 @@ server { proxy_http_version 1.1; proxy_set_header Connection ""; chunked_transfer_encoding off; - } -} -server { - server_name localhost; - listen 9001; - listen [::]:9001; + proxy_pass http://storage_s3; # This uses the upstream directive definition to load balance + } - location / { + location /minio/ui/ { + rewrite ^/minio/ui/(.*) /$1 break; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; diff --git a/dockers/examples/standalone/.env b/dockers/examples/standalone/.env index 13344e84e..d8f59ead9 100644 --- a/dockers/examples/standalone/.env +++ b/dockers/examples/standalone/.env @@ -1,5 +1,23 @@ TIMEZONE=UTC +# Postgres +POSTGRES_HOST=teable-db +POSTGRES_PORT=5432 POSTGRES_DB=example POSTGRES_USER=example -POSTGRES_PASSWORD=standalone_replace_password \ No newline at end of file +POSTGRES_PASSWORD=example2password + +# App +PUBLIC_ORIGIN=http://127.0.0.1:3000 +PRISMA_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} +PUBLIC_DATABASE_PROXY=127.0.0.1:42345 + +# Need to support sending emails to enable the following configurations +# You need to modify the configuration according to the actual situation, otherwise it will not be able to send emails correctly. +#BACKEND_MAIL_HOST=smtp.teable.io +#BACKEND_MAIL_PORT=465 +#BACKEND_MAIL_SECURE=true +#BACKEND_MAIL_SENDER=noreply.teable.io +#BACKEND_MAIL_SENDER_NAME=Teable +#BACKEND_MAIL_AUTH_USER=username +#BACKEND_MAIL_AUTH_PASS=password \ No newline at end of file diff --git a/dockers/examples/standalone/docker-compose.yaml b/dockers/examples/standalone/docker-compose.yaml index b0d72bcb3..694b0083b 100644 --- a/dockers/examples/standalone/docker-compose.yaml +++ b/dockers/examples/standalone/docker-compose.yaml @@ -7,25 +7,31 @@ services: ports: - '3000:3000' volumes: - - teable_data:/app/.assets:rw + - teable-data:/app/.assets:rw + # you may use a bind-mounted host directory instead, + # so that it is harder to accidentally remove the volume and lose all your data! + # - ./docker/teable/data:/app/.assets:rw + env_file: + - .env environment: - TZ=${TIMEZONE} - - NODE_OPTIONS=--max-old-space-size=1024 - - PUBLIC_ORIGIN=http://127.0.0.1:3000 - - PRISMA_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@teable_db:5432/${POSTGRES_DB} + - NEXT_ENV_IMAGES_ALL_REMOTE=true networks: - teable-standalone depends_on: - teable_db_migrate: + teable-db-migrate: condition: service_completed_successfully - teable_db: + teable-db: image: postgres:15.4 restart: always - expose: - - '5432' + ports: + - '42345:5432' volumes: - - teable_db:/var/lib/postgresql/data:rw + - teable-db:/var/lib/postgresql/data:rw + # you may use a bind-mounted host directory instead, + # so that it is harder to accidentally remove the volume and lose all your data! + # - ./docker/db/data:/var/lib/postgresql/data:rw environment: - TZ=${TIMEZONE} - POSTGRES_DB=${POSTGRES_DB} @@ -39,22 +45,22 @@ services: timeout: 3s retries: 3 - teable_db_migrate: + teable-db-migrate: image: ghcr.io/teableio/teable-db-migrate:latest environment: - TZ=${TIMEZONE} - - PRISMA_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@teable_db:5432/${POSTGRES_DB} + - PRISMA_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} networks: - teable-standalone depends_on: - teable_db: + teable-db: condition: service_healthy networks: teable-standalone: - name: teable_standalone_network + name: teable-standalone-network driver: bridge volumes: - teable_data: {} - teable_db: {} + teable-data: {} + teable-db: {} diff --git a/dockers/teable/Dockerfile b/dockers/teable/Dockerfile index 6fac0f432..8f91b4268 100644 --- a/dockers/teable/Dockerfile +++ b/dockers/teable/Dockerfile @@ -1,4 +1,5 @@ ARG NODE_VERSION=20.9.0 +ARG BUILD_VERSION="1.0.0-alpha" ################################################################### # Stage 1: Install all workspaces (dev)dependencies # @@ -31,23 +32,24 @@ RUN pnpm -F @teable/db-main-prisma prisma-generate --schema ./prisma/postgres/sc FROM deps AS builder ARG INTEGRATION_TEST -ARG BUILD_VERSION="1.0.0-alpha" +ARG BUILD_VERSION +ARG ENABLE_CSP=true ARG SENTRY_ENABLED=true ARG SENTRY_TRACING=true -ENV NODE_ENV=production -ENV NEXT_BUILD_ENV_TYPECHECK=false -ENV NEXT_BUILD_ENV_LINT=false -ENV NEXT_BUILD_ENV_OUTPUT=classic -ENV NEXT_BUILD_ENV_SENTRY_ENABLED=$SENTRY_ENABLED -ENV NEXT_BUILD_ENV_SENTRY_TRACING=$SENTRY_TRACING +ENV NODE_ENV=production \ + NEXT_BUILD_ENV_CSP=${ENABLE_CSP} \ + NEXT_BUILD_ENV_TYPECHECK=false \ + NEXT_BUILD_ENV_LINT=false \ + NEXT_BUILD_ENV_SENTRY_ENABLED=${SENTRY_ENABLED} \ + NEXT_BUILD_ENV_SENTRY_TRACING=${SENTRY_TRACING} WORKDIR /app COPY --from=deps --link /workspace-install ./ RUN set -eux; \ - sed -i~ '$a\NEXT_PUBLIC_BUILD_VERSION=$BUILD_VERSION' apps/nextjs-app/.env + echo "NEXT_PUBLIC_BUILD_VERSION=\"${BUILD_VERSION}\"" >> apps/nextjs-app/.env # Distinguish whether it is an integration test operation RUN if [ -n "$INTEGRATION_TEST" ]; then \ @@ -80,9 +82,9 @@ RUN pnpm -F @teable/db-main-prisma prisma-generate --schema ./prisma/postgres/sc FROM node:${NODE_VERSION}-bookworm-slim AS runner -ENV NODE_ENV=production -ENV TZ=UTC -ENV PORT=${NEXTJS_APP_PORT:-3000} +ENV TZ=UTC \ + NODE_ENV=production \ + PORT=${NEXTJS_APP_PORT:-3000} RUN npm install zx -g && \ apt-get update && apt-get install -y curl openssl && \ diff --git a/dockers/teable/Dockerfile.db-migrate b/dockers/teable/Dockerfile.db-migrate index 8cf2d4f53..5c9d5ec85 100644 --- a/dockers/teable/Dockerfile.db-migrate +++ b/dockers/teable/Dockerfile.db-migrate @@ -1,7 +1,9 @@ ARG NODE_VERSION=20.9.0 -ARG PRISMA_VERSION=5.10.2 +ARG PRISMA_VERSION=5.11.0 +ARG BUILD_VERSION="1.0.0-alpha" FROM node:${NODE_VERSION}-bookworm AS prisma +ARG PRISMA_VERSION RUN corepack enable && \ npm add @prisma/client@${PRISMA_VERSION} \ @@ -21,11 +23,12 @@ RUN cd sqlite_migrate && \ FROM node:${NODE_VERSION}-bookworm-slim AS runner - -ARG BUILD_VERSION="1.0.0-alpha" +ARG PRISMA_VERSION +ARG BUILD_VERSION ENV TZ=UTC ENV NODE_ENV=production +ENV BUILD_VERSION=$BUILD_VERSION RUN npm install zx @soluble/dsn-parser @prisma/client@${PRISMA_VERSION} prisma@${PRISMA_VERSION} -g && \ apt-get update && apt-get install -y openssl netcat-traditional wget && \ diff --git a/package.json b/package.json index 44377ded5..77b100a00 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "g:test": "pnpm g:test-e2e && pnpm g:test-unit", "g:test-e2e": "pnpm -r test-e2e", "g:test-unit": "pnpm -r --parralel test-unit", + "g:test-unit-cover": "pnpm -r --parralel test-unit-cover", "g:typecheck": "pnpm -r --parralel typecheck", "generate-openapi-types": "node scripts/generate-openapi-types.mjs", "install:playwright": "playwright install", @@ -50,15 +51,15 @@ "devDependencies": { "@changesets/changelog-github": "0.5.0", "@changesets/cli": "2.27.1", - "@commitlint/cli": "19.0.3", - "@commitlint/config-conventional": "19.0.3", + "@commitlint/cli": "19.2.1", + "@commitlint/config-conventional": "19.1.0", "@teable/eslint-config-bases": "workspace:^", "@types/shell-quote": "1.7.5", "eslint": "8.57.0", "husky": "9.0.11", "lint-staged": "15.2.2", "npm-run-all2": "6.1.2", - "openapi-typescript": "6.7.4", + "openapi-typescript": "6.7.5", "prettier": "3.2.5", "rimraf": "5.0.5", "shell-quote": "1.8.1", @@ -70,5 +71,5 @@ "pnpm": ">=8.15.0", "npm": "please-use-pnpm" }, - "packageManager": "pnpm@8.15.4" + "packageManager": "pnpm@8.15.5" } diff --git a/packages/common-i18n/src/locales/en/auth.json b/packages/common-i18n/src/locales/en/auth.json index 683f38b7c..561be7623 100644 --- a/packages/common-i18n/src/locales/en/auth.json +++ b/packages/common-i18n/src/locales/en/auth.json @@ -9,5 +9,35 @@ "label": { "email": "Email", "password": "Password" + }, + "placeholder": { + "password": "Enter your password...", + "email": "Enter your email..." + }, + "resetPassword": { + "header": "Set Your Password", + "description": "Enter a new password", + "label": "New password", + "error": { + "requiredPassword": "Enter password", + "invalidLink": "Invalid reset password link" + }, + "success": { + "title": "🎉 Reset password success", + "description": "Your password has been reset successfully. Will redirect you to the login page." + }, + "buttonText": "Send Reset password" + }, + "forgetPassword": { + "trigger": "Forgot password?", + "header": "Reset Your Password", + "description": "Please enter your email address below and we will send you a link to reset your password.", + "errorRequiredEmail": "Email is required", + "errorInvalidEmail": "Invalid email", + "buttonText": "Send Reset Email", + "success": { + "title": "🎉 Reset password email sent", + "description": "We've sent you an email with a link to reset your password. Please check your inbox." + } } } diff --git a/packages/common-i18n/src/locales/en/common.json b/packages/common-i18n/src/locales/en/common.json index 2cec98ffe..696cd3583 100644 --- a/packages/common-i18n/src/locales/en/common.json +++ b/packages/common-i18n/src/locales/en/common.json @@ -49,10 +49,23 @@ "invalidNew": "Your new password is invalid, minimum 8 chars." }, "changePasswordSuccess": { - "title": "Change password successfully.", + "title": "🎉 Change password successfully.", "desc": "You will be redirected to the login page in 2 seconds." }, - "manageToken": "Access Token" + "manageToken": "Access Token", + "addPassword": { + "title": "Add password", + "desc": "Set a permanent password to login to your account.", + "password": "Enter your password", + "confirm": "Confirm your password" + }, + "addPasswordError": { + "disMatch": "Your password does not match.", + "invalid": "Your password is invalid, minimum 8 chars." + }, + "addPasswordSuccess": { + "title": "🎉 Add password successfully." + } }, "notify": { "title": "My Notifications", diff --git a/packages/common-i18n/src/locales/en/table.json b/packages/common-i18n/src/locales/en/table.json index b4c422bda..478b97b62 100644 --- a/packages/common-i18n/src/locales/en/table.json +++ b/packages/common-i18n/src/locales/en/table.json @@ -116,13 +116,16 @@ }, "menu": { "addFromOtherSource": "Add from other sources", + "excelFile": "Microsoft Excel", "csvFile": "Csv file", "cancel": "Cancel", "leave": "Leave" }, "tips": { "importWayTip": "Click or drag file to this area to upload", - "leaveTip": "Your data will still be imported." + "leaveTip": "Your data will still be imported.", + "fileExceedSizeTip": "This type file size exceeds the limit of", + "analyzing": "analyzing" }, "options": { "autoSelectFieldOptionName": "Auto-select field types", @@ -134,7 +137,9 @@ "error": { "urlEmptyTip": "URL should not be empty!", "urlValidateTip": "Couldn't parse URL. Try a different URL!", - "errorFileFormat": "File format is incorrect!" + "errorFileFormat": "File format is incorrect!", + "uniqueFieldName": "Field name should be unique!", + "fieldNameEmpty": "Field name should not be empty!" } } }, @@ -175,7 +180,9 @@ }, "view": { "addRecord": "Add record", - "searchView": "Search view..." + "searchView": "Search view...", + "dragToolTip": "Automatic sorting is turned on, manual drag is not available", + "insertToolTip": "Automatic sorting is turned on, insert with order is not available" }, "lastModifiedTime": "Last modified time" } diff --git a/packages/common-i18n/src/locales/zh/auth.json b/packages/common-i18n/src/locales/zh/auth.json index bd3254ed1..4a088ff6c 100644 --- a/packages/common-i18n/src/locales/zh/auth.json +++ b/packages/common-i18n/src/locales/zh/auth.json @@ -9,5 +9,35 @@ "label": { "email": "邮箱", "password": "密码" + }, + "placeholder": { + "password": "请输入您的密码...", + "email": "请输入您的电子邮件地址..." + }, + "resetPassword": { + "header": "设置您的密码", + "description": "请输入一个新密码", + "label": "新密码", + "error": { + "requiredPassword": "请输入密码", + "invalidLink": "无效的重置密码链接" + }, + "success": { + "title": "🎉 重置密码成功", + "description": "您的密码已成功重置。我们将为您跳转到登录页面。" + }, + "buttonText": "发送重置密码邮件" + }, + "forgetPassword": { + "trigger": "忘记密码?", + "header": "重置您的密码", + "description": "请输入您的电子邮件地址,我们将向您发送一个链接,用于重置您的密码。", + "errorRequiredEmail": "电子邮件地址是必填项", + "errorInvalidEmail": "无效的电子邮件地址", + "buttonText": "发送重置邮件", + "success": { + "title": "🎉 重置密码邮件已发送", + "description": "我们已向您发送了一封包含重置密码链接的电子邮件。请检查您的收件箱。" + } } } diff --git a/packages/common-i18n/src/locales/zh/common.json b/packages/common-i18n/src/locales/zh/common.json index 918d7cd45..c66151fd5 100644 --- a/packages/common-i18n/src/locales/zh/common.json +++ b/packages/common-i18n/src/locales/zh/common.json @@ -49,10 +49,23 @@ "invalidNew": "您的新密码无效,至少需要8个字符。" }, "changePasswordSuccess": { - "title": "密码更改成功。", + "title": "🎉 密码更改成功。", "desc": "您将在2秒内重定向到登录页面。" }, - "manageToken": "开发者令牌" + "manageToken": "开发者令牌", + "addPassword": { + "title": "添加密码", + "desc": "设置一个永久密码以登录您的账户。", + "password": "输入您的密码", + "confirm": "确认您的密码" + }, + "addPasswordError": { + "disMatch": "您的密码不匹配。", + "invalid": "您的密码无效,至少需要8个字符。" + }, + "addPasswordSuccess": { + "title": "🎉 密码添加成功。" + } }, "notify": { "title": "我的通知", diff --git a/packages/common-i18n/src/locales/zh/table.json b/packages/common-i18n/src/locales/zh/table.json index 035962adf..9ddad298e 100644 --- a/packages/common-i18n/src/locales/zh/table.json +++ b/packages/common-i18n/src/locales/zh/table.json @@ -116,13 +116,16 @@ }, "menu": { "addFromOtherSource": "从第三方资源导入", - "csvFile": "csv 文件", + "excelFile": "Microsoft Excel", + "csvFile": "Csv 文件", "cancel": "取消", "leave": "取消" }, "tips": { "importWayTip": "点击或者拖拽到此区域上传", - "leaveTip": "你的数据仍然会被导入" + "leaveTip": "你的数据仍然会被导入", + "fileExceedSizeTip": "该类型文件限制文件大小为", + "analyzing": "分析中" }, "options": { "autoSelectFieldOptionName": "自动预测类型", @@ -134,7 +137,9 @@ "error": { "urlEmptyTip": "URL不能为空!", "urlValidateTip": "不能解析该URL,请重新输入!", - "errorFileFormat": "文件格式错误!" + "errorFileFormat": "文件格式错误!", + "uniqueFieldName": "字段名不能重复!", + "fieldNameEmpty": "字段名不能为空" } } }, @@ -170,12 +175,14 @@ "title": "数据库连接", "description": "你可以通过数据库连接来直接访问数据库", "noPermission": "你没有权限访问数据库连接", - "connectionCountTip": "最大数据库连接数为 {max} 当前已建立的连接数为 {current}", + "connectionCountTip": "最大数据库连接数为 {{max}} 当前已建立的连接数为 {{current}}", "helpLink": "https://help.teable.cn/gao-dai-ma-kai-fa/shu-ju-ku-lian-jie" }, "view": { "addRecord": "添加记录", - "searchView": "搜索视图..." + "searchView": "搜索视图...", + "dragToolTip": "自动排序已经打开,无法进行手动拖拽排序", + "insertToolTip": "自动排序已经打开,无法指定插入位置" }, "lastModifiedTime": "最近修改时间" } diff --git a/packages/core/package.json b/packages/core/package.json index 3d0fd30bd..ffbcc66cb 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -29,6 +29,7 @@ "check-size": "size-limit", "test": "run test-unit", "test-unit": "vitest run --silent", + "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" }, "dependencies": { @@ -37,7 +38,7 @@ "@types/color": "3.0.6", "@types/papaparse": "5.3.14", "antlr4ts": "0.5.0-alpha.4", - "axios": "1.6.7", + "axios": "1.6.8", "class-transformer": "0.5.1", "color": "4.2.3", "dayjs": "1.11.10", @@ -48,10 +49,11 @@ "zod": "3.22.4" }, "devDependencies": { - "@size-limit/file": "11.0.2", + "@size-limit/file": "11.1.1", "@teable/eslint-config-bases": "workspace:^", - "@types/lodash": "4.14.202", + "@types/lodash": "4.17.0", "@types/node": "20.9.0", + "@vitest/coverage-v8": "1.4.0", "antlr4ts-cli": "0.5.0-alpha.4", "cross-env": "7.0.3", "es-check": "7.1.1", @@ -59,9 +61,9 @@ "get-tsconfig": "4.7.3", "prettier": "3.2.5", "rimraf": "5.0.5", - "size-limit": "11.0.2", + "size-limit": "11.1.1", "typescript": "5.4.2", - "vite-tsconfig-paths": "4.3.1", - "vitest": "1.3.1" + "vite-tsconfig-paths": "4.3.2", + "vitest": "1.4.0" } } diff --git a/packages/core/src/formula/evaluate.ts b/packages/core/src/formula/evaluate.ts index 1ccd3be64..abf08b115 100644 --- a/packages/core/src/formula/evaluate.ts +++ b/packages/core/src/formula/evaluate.ts @@ -1,6 +1,6 @@ import { CharStreams, CommonTokenStream } from 'antlr4ts'; import type { FieldCore } from '../models/field/field'; -import type { ITinyRecord } from '../models/record/record.schema'; +import type { IRecord } from '../models/record/record.schema'; import { FormulaErrorListener } from './error.listener'; import { Formula } from './parser/Formula'; import { FormulaLexer } from './parser/FormulaLexer'; @@ -10,7 +10,7 @@ import { EvalVisitor } from './visitor'; export const evaluate = ( input: string, dependFieldMap: { [fieldId: string]: FieldCore }, - record?: ITinyRecord + record?: IRecord ): TypedValue => { const inputStream = CharStreams.fromString(input); const lexer = new FormulaLexer(inputStream); diff --git a/packages/core/src/formula/functions/common.ts b/packages/core/src/formula/functions/common.ts index 4b5d23284..b66c2ad7f 100644 --- a/packages/core/src/formula/functions/common.ts +++ b/packages/core/src/formula/functions/common.ts @@ -1,6 +1,6 @@ import type { CellValueType } from '../../models/field/constant'; import type { FieldCore } from '../../models/field/field'; -import type { ITinyRecord } from '../../models/record/record.schema'; +import type { IRecord } from '../../models/record/record.schema'; import type { TypedValue } from '../typed-value'; export enum FormulaFuncType { @@ -13,7 +13,7 @@ export enum FormulaFuncType { } export interface IFormulaContext { - record: ITinyRecord; + record: IRecord; dependencies: { [fieldId: string]: FieldCore }; } diff --git a/packages/core/src/formula/functions/date-time.spec.ts b/packages/core/src/formula/functions/date-time.spec.ts index d6cec8e41..44e600665 100644 --- a/packages/core/src/formula/functions/date-time.spec.ts +++ b/packages/core/src/formula/functions/date-time.spec.ts @@ -675,7 +675,6 @@ describe('DateTime', () => { id: 'recTest', fields: {}, createdTime: date, - recordOrder: { viwTest: 1 }, }; const context = { record, @@ -697,7 +696,6 @@ describe('DateTime', () => { fields: {}, createdTime: date, lastModifiedTime: date, - recordOrder: { viwTest: 1 }, }; const context = { record, diff --git a/packages/core/src/formula/functions/system.spec.ts b/packages/core/src/formula/functions/system.spec.ts index f5761f83a..f5deb6eeb 100644 --- a/packages/core/src/formula/functions/system.spec.ts +++ b/packages/core/src/formula/functions/system.spec.ts @@ -42,7 +42,6 @@ describe('SystemFunc', () => { id: 'recTest', fields: {}, createdTime: new Date().toISOString(), - recordOrder: { viwTest: 1 }, }; const context = { record, diff --git a/packages/core/src/formula/visitor.spec.ts b/packages/core/src/formula/visitor.spec.ts index 0e043e438..7ef8cbed5 100644 --- a/packages/core/src/formula/visitor.spec.ts +++ b/packages/core/src/formula/visitor.spec.ts @@ -17,7 +17,6 @@ describe('EvalVisitor', () => { fldMultipleLink: [{ id: 'recxxxxxxx' }, { id: 'recyyyyyyy', title: 'A2' }], }, createdTime: new Date().toISOString(), - recordOrder: { viwTest: 1 }, }; beforeAll(() => { diff --git a/packages/core/src/formula/visitor.ts b/packages/core/src/formula/visitor.ts index ddc7fbcec..59e2a0cbd 100644 --- a/packages/core/src/formula/visitor.ts +++ b/packages/core/src/formula/visitor.ts @@ -3,7 +3,7 @@ import { AbstractParseTreeVisitor } from 'antlr4ts/tree/AbstractParseTreeVisitor'; import { CellValueType } from '../models/field/constant'; import type { FieldCore } from '../models/field/field'; -import type { ITinyRecord } from '../models/record/record.schema'; +import type { IRecord } from '../models/record/record.schema'; import { FunctionName } from './functions/common'; import type { FormulaFunc } from './functions/common'; import { FUNCTIONS } from './functions/factory'; @@ -34,7 +34,7 @@ export class EvalVisitor private readonly converter = new TypedValueConverter(); constructor( private dependencies: { [fieldId: string]: FieldCore }, - private record?: ITinyRecord + private record?: IRecord ) { super(); } diff --git a/packages/core/src/import/constant.ts b/packages/core/src/import/constant.ts index df8c0ce1e..800c2e934 100644 --- a/packages/core/src/import/constant.ts +++ b/packages/core/src/import/constant.ts @@ -2,17 +2,14 @@ import { SUPPORTEDTYPE } from './types'; export const importTypeMap = { [SUPPORTEDTYPE.CSV]: { - accept: 'text/csv', + accept: 'text/csv,text/tab-separated-values', exampleUrl: 'https://www.example.com/file.csv', - acceptHeaders: ['text/csv', 'text/plain'], + exceedSize: null, }, [SUPPORTEDTYPE.EXCEL]: { accept: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel', exampleUrl: 'https://www.example.com/file.xlsx', - acceptHeaders: [ - 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'application/vnd.ms-excel', - ], + exceedSize: 5, }, }; diff --git a/packages/core/src/import/index.ts b/packages/core/src/import/index.ts index f0f3b8aea..52dcbe9c5 100644 --- a/packages/core/src/import/index.ts +++ b/packages/core/src/import/index.ts @@ -1,2 +1,2 @@ -export * from './types'; export * from './constant'; +export * from './types'; diff --git a/packages/core/src/import/types.ts b/packages/core/src/import/types.ts index 7808c7ad4..4bb35df6f 100644 --- a/packages/core/src/import/types.ts +++ b/packages/core/src/import/types.ts @@ -7,7 +7,7 @@ export enum SUPPORTEDTYPE { } export const analyzeRoSchema = z.object({ - attachmentUrl: z.string().url(), + attachmentUrl: z.string().url().trim(), fileType: z.nativeEnum(SUPPORTEDTYPE), }); @@ -17,12 +17,13 @@ export const analyzeColumnSchema = z.object({ }); export const analyzeVoSchema = z.object({ - worksheets: z - .object({ + worksheets: z.record( + z.string(), + z.object({ name: z.string(), columns: analyzeColumnSchema.array(), }) - .array(), + ), }); export type IAnalyzeRo = z.infer; @@ -42,19 +43,20 @@ export const importColumnSchema = analyzeColumnSchema.extend({ sourceColumnIndex: z.number(), }); -export const importOptionSchema = z.object({ +export const importSheetItem = z.object({ + name: z.string(), + columns: importColumnSchema.array(), useFirstRowAsHeader: z.boolean(), importData: z.boolean(), }); +export const importOptionSchema = importSheetItem.pick({ + useFirstRowAsHeader: true, + importData: true, +}); + export const importOptionRoSchema = z.object({ - worksheets: z - .object({ - name: z.string(), - columns: importColumnSchema.array(), - options: importOptionSchema, - }) - .array(), + worksheets: z.record(z.string(), importSheetItem), attachmentUrl: z.string().url(), fileType: z.nativeEnum(SUPPORTEDTYPE), }); @@ -63,4 +65,6 @@ export type IImportColumn = z.infer; export type IImportOptionRo = z.infer; +export type IImportSheetItem = z.infer; + export type IImportOption = z.infer; diff --git a/packages/core/src/models/field/derivate/abstract/formula.field.abstract.ts b/packages/core/src/models/field/derivate/abstract/formula.field.abstract.ts index dc8a912b6..fda4df560 100644 --- a/packages/core/src/models/field/derivate/abstract/formula.field.abstract.ts +++ b/packages/core/src/models/field/derivate/abstract/formula.field.abstract.ts @@ -6,7 +6,7 @@ import type { RootContext } from '../../../../formula/parser/Formula'; import { Formula } from '../../../../formula/parser/Formula'; import { FormulaLexer } from '../../../../formula/parser/FormulaLexer'; import { EvalVisitor } from '../../../../formula/visitor'; -import type { ITinyRecord } from '../../../record/record.schema'; +import type { IRecord } from '../../../record/record.schema'; import { CellValueType } from '../../constant'; import { FieldCore } from '../../field'; import type { INumberFormatting, IDatetimeFormatting, IUnionFormatting } from '../../formatting'; @@ -52,7 +52,7 @@ export abstract class FormulaAbstractCore extends FieldCore { return this._tree; } - evaluate(dependFieldMap: { [fieldId: string]: FieldCore }, record: ITinyRecord) { + evaluate(dependFieldMap: { [fieldId: string]: FieldCore }, record: IRecord) { const visitor = new EvalVisitor(dependFieldMap, record); return visitor.visit(this.tree); } diff --git a/packages/core/src/models/record/record.schema.spec.ts b/packages/core/src/models/record/record.schema.spec.ts index fc2184f2b..24199f025 100644 --- a/packages/core/src/models/record/record.schema.spec.ts +++ b/packages/core/src/models/record/record.schema.spec.ts @@ -86,7 +86,6 @@ describe('recordSchema', () => { lastModifiedTime: '2023-01-02T00:00:00.000Z', createdBy: 'user', lastModifiedBy: 'user', - recordOrder: { viwXXXXXXX: 1 }, }; it('validates successfully for valid data', () => { @@ -121,15 +120,6 @@ describe('recordSchema', () => { const result = recordSchema.safeParse(data); expect(result.success).toBe(true); }); - - it('fails for invalid recordOrder (non-number values)', () => { - const data = { ...validData, recordOrder: { viwXXXXXXX: 'invalidValue' } }; - const result = recordSchema.safeParse(data); - expect(result.success).toBe(false); - if (!result.success) { - expect(result.error.errors[0].message).toEqual('Expected number, received string'); - } - }); }); describe('recordsVoSchema', () => { @@ -140,7 +130,6 @@ describe('recordsVoSchema', () => { fields: { fldXXXXXXXXXXXXXXX: 'text value', }, - recordOrder: {}, }, ], offset: 'offset', diff --git a/packages/core/src/models/record/record.schema.ts b/packages/core/src/models/record/record.schema.ts index 2b1f8d26a..d04d5b81c 100644 --- a/packages/core/src/models/record/record.schema.ts +++ b/packages/core/src/models/record/record.schema.ts @@ -29,16 +29,10 @@ export const recordSchema = z.object({ lastModifiedBy: z.string().optional().openapi({ description: 'Last modified by, user name', }), - recordOrder: z.record(z.number()).openapi({ - description: - 'The object key is view id, and record is sorted by this order in each view by default', - }), }); export type IRecord = z.infer; -export type ITinyRecord = Omit; - export const fieldKeyTypeRoSchema = z .nativeEnum(FieldKeyType, { errorMap: () => ({ message: 'Error fieldKeyType, You should set it to "name" or "id"' }), @@ -225,7 +219,6 @@ export const recordsSchema = recordSchema.array().openapi({ fields: { 'single line text': 'text value', }, - recordOrder: {}, }, ], description: 'Array of record objects ', @@ -239,7 +232,6 @@ export const recordsVoSchema = z.object({ fields: { 'single line text': 'text value', }, - recordOrder: {}, }, ], description: 'Array of record objects ', @@ -252,14 +244,31 @@ export const recordsVoSchema = z.object({ export type IRecordsVo = z.infer; +export const recordInsertOrderRoSchema = z + .object({ + viewId: z.string().openapi({ + description: + 'You can only specify order in one view when create record, other views appear last by default', + }), + anchorId: z.string().openapi({ + description: 'The record id to anchor to', + }), + position: z.enum(['before', 'after']), + }) + .openapi({ + description: 'Where this record to insert to', + }); + +export type IRecordInsertOrderRo = z.infer; + export const createRecordsRoSchema = z .object({ fieldKeyType: fieldKeyTypeRoSchema, typecast: typecastSchema, + order: recordInsertOrderRoSchema.optional(), records: z .object({ fields: recordSchema.shape.fields, - recordOrder: z.record(z.number()).optional(), }) .array() .openapi({ diff --git a/packages/core/src/models/record/record.ts b/packages/core/src/models/record/record.ts index 225191552..d5288582f 100644 --- a/packages/core/src/models/record/record.ts +++ b/packages/core/src/models/record/record.ts @@ -20,8 +20,6 @@ export class RecordCore { createdTime!: Date; - recordOrder!: Record; - id!: string; isDeleted = false; diff --git a/packages/core/src/models/table/table.schema.ts b/packages/core/src/models/table/table.schema.ts index 708b26dc8..4608c1a2e 100644 --- a/packages/core/src/models/table/table.schema.ts +++ b/packages/core/src/models/table/table.schema.ts @@ -36,9 +36,7 @@ export const tableFullVoSchema = z records: recordSchema.array().openapi({ description: 'The records of the table.', }), - order: z.number().openapi({ - description: 'The order is a floating number, table will sort by it in the folder.', - }), + order: z.number().optional(), lastModifiedTime: z.string().optional().openapi({ description: 'The last modified time of the table.', }), @@ -69,7 +67,6 @@ export const tableRoSchema = tableFullVoSchema .partial({ name: true, dbTableName: true, - order: true, }) .merge( z.object({ @@ -89,10 +86,6 @@ export const tableRoSchema = tableFullVoSchema description: 'The record data of the table. If it is empty, 3 empty records will be generated by default.', }), - order: z.number().optional().openapi({ - description: - 'The order is a floating number, table will sort by it in the folder. If it is empty, table will be put to the last one.', - }), }) ) .openapi({ diff --git a/packages/core/src/models/table/table.ts b/packages/core/src/models/table/table.ts index 7cdce3b0d..e90264cf0 100644 --- a/packages/core/src/models/table/table.ts +++ b/packages/core/src/models/table/table.ts @@ -11,8 +11,6 @@ export class TableCore implements ITableVo { description?: string; - order!: number; - lastModifiedTime!: string; defaultViewId!: string; diff --git a/packages/core/src/models/view/sort/sort.schema.spec.ts b/packages/core/src/models/view/sort/sort.schema.spec.ts index 363147060..31d62ecef 100644 --- a/packages/core/src/models/view/sort/sort.schema.spec.ts +++ b/packages/core/src/models/view/sort/sort.schema.spec.ts @@ -48,12 +48,9 @@ describe('Sort mergeWithDefaultSort function test', () => { it('should return merged sort, when sort query exists and no same field items', async () => { const mergedSort = mergeWithDefaultSort(defaultViewSortString, querySort); const presetSort = [ + ...querySort, { fieldId: 'fld1xxx', order: 'asc' }, { fieldId: 'fld2xxx', order: 'desc' }, - { - fieldId: 'fld3xxx', - order: 'asc', - }, ]; expect(mergedSort).toEqual(presetSort); }); diff --git a/packages/core/src/models/view/sort/sort.ts b/packages/core/src/models/view/sort/sort.ts index 151d7af8f..7cccf059e 100644 --- a/packages/core/src/models/view/sort/sort.ts +++ b/packages/core/src/models/view/sort/sort.ts @@ -59,13 +59,15 @@ export function mergeWithDefaultSort( return []; } - let mergeSort = viewSort?.sortObjs || []; + const mergeSort = viewSort?.sortObjs || []; if (querySort?.length) { // merge the same fieldId item, query first - const map = new Map(mergeSort.map((sortItem) => [sortItem.fieldId, sortItem])); - querySort.forEach((sortItem) => map.set(sortItem.fieldId, sortItem)); - mergeSort = Array.from(map.values()); + const map = new Map(querySort.map((sortItem) => [sortItem.fieldId, sortItem])); + mergeSort.forEach((sortItem) => { + !map.has(sortItem.fieldId) && map.set(sortItem.fieldId, sortItem); + }); + return Array.from(map.values()); } return mergeSort; diff --git a/packages/core/src/models/view/view.schema.ts b/packages/core/src/models/view/view.schema.ts index 660f9980c..4ac2222f2 100644 --- a/packages/core/src/models/view/view.schema.ts +++ b/packages/core/src/models/view/view.schema.ts @@ -22,7 +22,7 @@ export const viewVoSchema = z.object({ name: z.string(), type: z.nativeEnum(ViewType), description: z.string().optional(), - order: z.number(), + order: z.number().optional(), options: viewOptionsSchema.optional(), sort: sortSchema.optional(), filter: filterSchema.optional(), @@ -56,5 +56,5 @@ export const viewRoSchema = viewVoSchema }); export type IViewRo = z.infer; -export type IViewPropertyKeys = keyof IViewRo; +export type IViewPropertyKeys = keyof IViewVo; export const VIEW_JSON_KEYS = ['options', 'sort', 'filter', 'group', 'shareMeta', 'columnMeta']; diff --git a/packages/core/src/models/view/view.ts b/packages/core/src/models/view/view.ts index cabf77ef7..6342cefaa 100644 --- a/packages/core/src/models/view/view.ts +++ b/packages/core/src/models/view/view.ts @@ -21,8 +21,6 @@ export abstract class ViewCore implements IViewVo { group?: IGroup; - order!: number; - shareId?: string; enableShare?: boolean; diff --git a/packages/core/src/op-builder/common.ts b/packages/core/src/op-builder/common.ts index 35cc9a99a..8617e5a08 100644 --- a/packages/core/src/op-builder/common.ts +++ b/packages/core/src/op-builder/common.ts @@ -3,7 +3,6 @@ export enum OpName { SetTableProperty = 'setTableProperty', SetRecord = 'setRecord', - SetRecordOrder = 'setRecordOrder', AddRecord = 'addRecord', AddField = 'addField', diff --git a/packages/core/src/op-builder/record/add-record.ts b/packages/core/src/op-builder/record/add-record.ts index a4939f662..a5dbd6656 100644 --- a/packages/core/src/op-builder/record/add-record.ts +++ b/packages/core/src/op-builder/record/add-record.ts @@ -10,7 +10,6 @@ export class AddRecordBuilder implements ICreateOpBuilder { return { id: record.id, fields: {}, - recordOrder: record.recordOrder ?? {}, }; } } diff --git a/packages/core/src/op-builder/record/index.ts b/packages/core/src/op-builder/record/index.ts index 65a4b5ea7..c63be85e2 100644 --- a/packages/core/src/op-builder/record/index.ts +++ b/packages/core/src/op-builder/record/index.ts @@ -1,4 +1,3 @@ export * from './add-record'; export * from './record-op-builder'; -export * from './set-record-order'; export * from './set-record'; diff --git a/packages/core/src/op-builder/record/record-op-builder.ts b/packages/core/src/op-builder/record/record-op-builder.ts index 1d57fdd66..c07bdcec8 100644 --- a/packages/core/src/op-builder/record/record-op-builder.ts +++ b/packages/core/src/op-builder/record/record-op-builder.ts @@ -3,12 +3,10 @@ import { OpName } from '../common'; import { OpBuilderAbstract } from '../op-builder.abstract'; import { AddRecordBuilder } from './add-record'; import { SetRecordBuilder } from './set-record'; -import { SetRecordOrderBuilder } from './set-record-order'; export class RecordOpBuilder { static editor = { [OpName.SetRecord]: new SetRecordBuilder(), - [OpName.SetRecordOrder]: new SetRecordOrderBuilder(), }; static creator = new AddRecordBuilder(); diff --git a/packages/core/src/op-builder/record/set-record-order.ts b/packages/core/src/op-builder/record/set-record-order.ts deleted file mode 100644 index 6b3594a00..000000000 --- a/packages/core/src/op-builder/record/set-record-order.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { IOtOperation } from '../../models'; -import { OpName, pathMatcher } from '../common'; -import type { IOpBuilder } from '../interface'; - -export interface ISetRecordOrderOpContext { - name: OpName.SetRecordOrder; - viewId: string; - newOrder: number; - oldOrder?: number; -} - -export class SetRecordOrderBuilder implements IOpBuilder { - name: OpName.SetRecordOrder = OpName.SetRecordOrder; - - build(params: { viewId: string; newOrder: number; oldOrder?: number }): IOtOperation { - const { viewId, newOrder, oldOrder } = params; - return { - p: ['recordOrder', viewId], - oi: newOrder, - ...(oldOrder ? { od: oldOrder } : {}), - }; - } - - detect(op: IOtOperation): ISetRecordOrderOpContext | null { - const { p, oi, od } = op; - - const result = pathMatcher<{ viewId: string }>(p, ['recordOrder', ':viewId']); - - if (!result) { - return null; - } - - return { - name: this.name, - viewId: result.viewId, - newOrder: oi, - oldOrder: od, - }; - } -} diff --git a/packages/core/src/utils/id-generator.ts b/packages/core/src/utils/id-generator.ts index be6b8c65b..832b84fdc 100644 --- a/packages/core/src/utils/id-generator.ts +++ b/packages/core/src/utils/id-generator.ts @@ -17,6 +17,7 @@ export enum IdPrefix { WorkflowDecision = 'wde', User = 'usr', + Account = 'aco', Invitation = 'inv', @@ -112,3 +113,7 @@ export function generateNotificationId() { export function generateAccessTokenId() { return IdPrefix.AccessToken + getRandomString(16); } + +export function generateAccountId() { + return IdPrefix.Account + getRandomString(16); +} diff --git a/packages/core/vitest.config.ts b/packages/core/vitest.config.ts index 0f594c0e2..a9acbc9ce 100644 --- a/packages/core/vitest.config.ts +++ b/packages/core/vitest.config.ts @@ -1,10 +1,11 @@ import tsconfigPaths from 'vite-tsconfig-paths'; -import { defineConfig } from 'vitest/config'; +import { defineConfig, configDefaults } from 'vitest/config'; const testFiles = ['./src/**/*.{test,spec}.{js,ts}']; export default defineConfig({ plugins: [tsconfigPaths()], + cacheDir: '../../.cache/vitest/core', test: { globals: true, environment: 'node', @@ -19,9 +20,6 @@ export default defineConfig({ enabled: true, }, }, */ - cache: { - dir: '../../.cache/vitest/core', - }, poolOptions: { threads: { singleThread: true, @@ -29,9 +27,8 @@ export default defineConfig({ }, coverage: { provider: 'v8', - reporter: ['text', 'clover'], - extension: ['js', 'ts'], - all: true, + extension: ['.js', '.ts'], + include: ['src/**/*'], }, // To mimic Jest behaviour regarding mocks. // @link https://vitest.dev/config/#clearmocks @@ -39,11 +36,6 @@ export default defineConfig({ mockReset: true, restoreMocks: true, include: testFiles, - exclude: [ - '**/node_modules/**', - '**/dist/**', - '**/.next/**', - '**/.{idea,git,cache,output,temp}/**', - ], + exclude: [...configDefaults.exclude, '**/.next/**'], }, }); diff --git a/packages/db-main-prisma/package.json b/packages/db-main-prisma/package.json index ff8f41638..2949acfe9 100644 --- a/packages/db-main-prisma/package.json +++ b/packages/db-main-prisma/package.json @@ -39,8 +39,8 @@ "nestjs-cls": "^4.0.0" }, "dependencies": { - "@prisma/client": "5.10.2", - "prisma": "5.10.2", + "@prisma/client": "5.11.0", + "prisma": "5.11.0", "nanoid": "3.3.7" }, "devDependencies": { diff --git a/packages/db-main-prisma/prisma/postgres/migrations/20240313062534_add_credit/migration.sql b/packages/db-main-prisma/prisma/postgres/migrations/20240313062534_add_credit/migration.sql new file mode 100644 index 000000000..cf9380ac8 --- /dev/null +++ b/packages/db-main-prisma/prisma/postgres/migrations/20240313062534_add_credit/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "space" ADD COLUMN "credit" INTEGER; diff --git a/packages/db-main-prisma/prisma/postgres/schema.prisma b/packages/db-main-prisma/prisma/postgres/schema.prisma index d039e6e15..cfc716d1f 100644 --- a/packages/db-main-prisma/prisma/postgres/schema.prisma +++ b/packages/db-main-prisma/prisma/postgres/schema.prisma @@ -12,6 +12,7 @@ datasource db { model Space { id String @id @default(cuid()) name String + credit Int? deletedTime DateTime? @map("deleted_time") createdTime DateTime @default(now()) @map("created_time") createdBy String @map("created_by") diff --git a/packages/db-main-prisma/prisma/sqlite/migrations/20240313061543_add_credit/migration.sql b/packages/db-main-prisma/prisma/sqlite/migrations/20240313061543_add_credit/migration.sql new file mode 100644 index 000000000..879a1ff0d --- /dev/null +++ b/packages/db-main-prisma/prisma/sqlite/migrations/20240313061543_add_credit/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "space" ADD COLUMN "credit" INTEGER; diff --git a/packages/db-main-prisma/prisma/sqlite/schema.prisma b/packages/db-main-prisma/prisma/sqlite/schema.prisma index eecf52bd5..110f981fe 100644 --- a/packages/db-main-prisma/prisma/sqlite/schema.prisma +++ b/packages/db-main-prisma/prisma/sqlite/schema.prisma @@ -12,6 +12,7 @@ datasource db { model Space { id String @id @default(cuid()) name String + credit Int? deletedTime DateTime? @map("deleted_time") createdTime DateTime @default(now()) @map("created_time") createdBy String @map("created_by") diff --git a/packages/db-main-prisma/prisma/template.prisma b/packages/db-main-prisma/prisma/template.prisma index c53e5d589..3c908e1ec 100644 --- a/packages/db-main-prisma/prisma/template.prisma +++ b/packages/db-main-prisma/prisma/template.prisma @@ -12,6 +12,7 @@ datasource db { model Space { id String @id @default(cuid()) name String + credit Int? deletedTime DateTime? @map("deleted_time") createdTime DateTime @default(now()) @map("created_time") createdBy String @map("created_by") diff --git a/packages/eslint-config-bases/package.json b/packages/eslint-config-bases/package.json index e8a5314d1..2e9afb798 100644 --- a/packages/eslint-config-bases/package.json +++ b/packages/eslint-config-bases/package.json @@ -74,8 +74,8 @@ "dependencies": { "@rushstack/eslint-patch": "1.6.1", "@tanstack/eslint-plugin-query": "4.36.1", - "@typescript-eslint/eslint-plugin": "7.0.2", - "@typescript-eslint/parser": "7.0.2", + "@typescript-eslint/eslint-plugin": "7.2.0", + "@typescript-eslint/parser": "7.2.0", "eslint-config-prettier": "9.1.0", "eslint-import-resolver-typescript": "3.6.1", "eslint-plugin-import": "2.29.1", diff --git a/packages/icons/package.json b/packages/icons/package.json index ca2a8aa70..7d22cae96 100644 --- a/packages/icons/package.json +++ b/packages/icons/package.json @@ -35,7 +35,7 @@ "@types/fs-extra": "11.0.4", "@types/node": "20.9.0", "@types/react": "18.2.64", - "axios": "1.6.7", + "axios": "1.6.8", "chalk": "5.3.0", "dotenv": "16.4.5", "eslint": "8.57.0", diff --git a/packages/icons/src/components/FileCsv.tsx b/packages/icons/src/components/FileCsv.tsx index 0a74926e5..b5b547699 100644 --- a/packages/icons/src/components/FileCsv.tsx +++ b/packages/icons/src/components/FileCsv.tsx @@ -24,7 +24,7 @@ const FileCsv = (props: SVGProps) => ( /> diff --git a/packages/icons/src/components/GithubLogo.tsx b/packages/icons/src/components/GithubLogo.tsx new file mode 100644 index 000000000..634a8ad03 --- /dev/null +++ b/packages/icons/src/components/GithubLogo.tsx @@ -0,0 +1,25 @@ +import * as React from 'react'; +import type { SVGProps } from 'react'; +const GithubLogo = (props: SVGProps) => ( + + + + + + + + + + +); +export default GithubLogo; diff --git a/packages/icons/src/components/GoogleLogo.tsx b/packages/icons/src/components/GoogleLogo.tsx new file mode 100644 index 000000000..9113536aa --- /dev/null +++ b/packages/icons/src/components/GoogleLogo.tsx @@ -0,0 +1,37 @@ +import * as React from 'react'; +import type { SVGProps } from 'react'; +const GoogleLogo = (props: SVGProps) => ( + + + + + + + + + + + + + +); +export default GoogleLogo; diff --git a/packages/icons/src/components/Import.tsx b/packages/icons/src/components/Import.tsx new file mode 100644 index 000000000..ed96fd26f --- /dev/null +++ b/packages/icons/src/components/Import.tsx @@ -0,0 +1,28 @@ +import * as React from 'react'; +import type { SVGProps } from 'react'; +const Import = (props: SVGProps) => ( + + + + +); +export default Import; diff --git a/packages/icons/src/index.ts b/packages/icons/src/index.ts index 1e4f47369..07cf4b734 100644 --- a/packages/icons/src/index.ts +++ b/packages/icons/src/index.ts @@ -57,11 +57,14 @@ export { default as FreezeColumn } from './components/FreezeColumn'; export { default as Frown } from './components/Frown'; export { default as Gauge } from './components/Gauge'; export { default as Github } from './components/Github'; +export { default as GithubLogo } from './components/GithubLogo'; +export { default as GoogleLogo } from './components/GoogleLogo'; export { default as Hash } from './components/Hash'; export { default as Heart } from './components/Heart'; export { default as HelpCircle } from './components/HelpCircle'; export { default as History } from './components/History'; export { default as Home } from './components/Home'; +export { default as Import } from './components/Import'; export { default as Inbox } from './components/Inbox'; export { default as Key } from './components/Key'; export { default as Layers } from './components/Layers'; diff --git a/packages/openapi/package.json b/packages/openapi/package.json index aed1ed62b..e69907721 100644 --- a/packages/openapi/package.json +++ b/packages/openapi/package.json @@ -23,7 +23,7 @@ "@asteasolutions/zod-to-openapi": "6.4.0", "@teable/core": "workspace:^", "@types/node": "20.9.0", - "axios": "1.6.7", + "axios": "1.6.8", "httpsnippet-lite": "3.0.5", "openapi-sampler": "1.4.0", "openapi3-ts": "4.2.2", diff --git a/packages/openapi/src/aggregation/get-aggregation.ts b/packages/openapi/src/aggregation/get-aggregation.ts index 0dd637761..2f779a3de 100644 --- a/packages/openapi/src/aggregation/get-aggregation.ts +++ b/packages/openapi/src/aggregation/get-aggregation.ts @@ -1,6 +1,6 @@ import type { RouteConfig } from '@asteasolutions/zod-to-openapi'; import type { IAggregationRo, IAggregationVo } from '@teable/core'; -import { aggregationRoSchema, aggregationVoSchema } from '@teable/core'; +import { aggregationVoSchema } from '@teable/core'; import { axios } from '../axios'; import { registerRoute, urlBuilder } from '../utils'; import { z } from '../zod'; diff --git a/packages/openapi/src/auth/add-password.ts b/packages/openapi/src/auth/add-password.ts new file mode 100644 index 000000000..7bf029ac0 --- /dev/null +++ b/packages/openapi/src/auth/add-password.ts @@ -0,0 +1,37 @@ +import { axios } from '../axios'; +import { registerRoute } from '../utils'; +import { z } from '../zod'; +import { passwordSchema } from './types'; + +export const ADD_PASSWORD = '/auth/add-password'; + +export const addPasswordRoSchema = z.object({ + password: passwordSchema, +}); + +export type IAddPasswordRo = z.infer; + +export const addPasswordRoute = registerRoute({ + method: 'post', + path: ADD_PASSWORD, + description: 'Add password', + request: { + body: { + content: { + 'application/json': { + schema: addPasswordRoSchema, + }, + }, + }, + }, + tags: ['auth'], + responses: { + 200: { + description: 'Successfully added password', + }, + }, +}); + +export const addPassword = async (ro: IAddPasswordRo) => { + return axios.post(ADD_PASSWORD, ro); +}; diff --git a/packages/openapi/src/auth/index.ts b/packages/openapi/src/auth/index.ts index 4ae2a5f6e..bd4d10573 100644 --- a/packages/openapi/src/auth/index.ts +++ b/packages/openapi/src/auth/index.ts @@ -3,3 +3,6 @@ export * from './signout'; export * from './signup'; export * from './user-me'; export * from './change-password'; +export * from './send-reset-password-email'; +export * from './reset-password'; +export * from './add-password'; diff --git a/packages/openapi/src/auth/reset-password.ts b/packages/openapi/src/auth/reset-password.ts new file mode 100644 index 000000000..29a006ab8 --- /dev/null +++ b/packages/openapi/src/auth/reset-password.ts @@ -0,0 +1,38 @@ +import { axios } from '../axios'; +import { registerRoute } from '../utils'; +import { z } from '../zod'; +import { passwordSchema } from './types'; + +export const RESET_PASSWORD = '/auth/reset-password'; + +export const resetPasswordRoSchema = z.object({ + password: passwordSchema, + code: z.string(), +}); + +export type IResetPasswordRo = z.infer; + +export const resetPasswordRoute = registerRoute({ + method: 'post', + path: RESET_PASSWORD, + description: 'Reset password', + request: { + body: { + content: { + 'application/json': { + schema: resetPasswordRoSchema, + }, + }, + }, + }, + tags: ['auth'], + responses: { + 200: { + description: 'Successfully reset password', + }, + }, +}); + +export const resetPassword = async (ro: IResetPasswordRo) => { + return axios.post(RESET_PASSWORD, ro); +}; diff --git a/packages/openapi/src/auth/send-reset-password-email.ts b/packages/openapi/src/auth/send-reset-password-email.ts new file mode 100644 index 000000000..df8f3ceae --- /dev/null +++ b/packages/openapi/src/auth/send-reset-password-email.ts @@ -0,0 +1,36 @@ +import { axios } from '../axios'; +import { registerRoute } from '../utils'; +import { z } from '../zod'; + +export const SEND_RESET_PASSWORD_EMAIL = '/auth/send-reset-password-email'; + +export const sendResetPasswordEmailRoSchema = z.object({ + email: z.string().email(), +}); + +export type ISendResetPasswordEmailRo = z.infer; + +export const sendResetPasswordEmailRoute = registerRoute({ + method: 'post', + path: SEND_RESET_PASSWORD_EMAIL, + description: 'Send reset password email', + request: { + body: { + content: { + 'application/json': { + schema: sendResetPasswordEmailRoSchema, + }, + }, + }, + }, + tags: ['auth'], + responses: { + 200: { + description: 'Successfully sent reset password email', + }, + }, +}); + +export const sendResetPasswordEmail = async (ro: ISendResetPasswordEmailRo) => { + return axios.post(SEND_RESET_PASSWORD_EMAIL, ro); +}; diff --git a/packages/openapi/src/auth/user-me.ts b/packages/openapi/src/auth/user-me.ts index ab82de850..a081be60a 100644 --- a/packages/openapi/src/auth/user-me.ts +++ b/packages/openapi/src/auth/user-me.ts @@ -13,6 +13,7 @@ export const userMeVoSchema = z.object({ email: z.string().email(), phone: z.string().nullable().optional(), notifyMeta: userNotifyMetaSchema, + hasPassword: z.boolean(), }); export type IUserMeVo = z.infer; diff --git a/packages/openapi/src/base/create-from-template.ts b/packages/openapi/src/base/create-from-template.ts index 8370415ef..05c77aff9 100644 --- a/packages/openapi/src/base/create-from-template.ts +++ b/packages/openapi/src/base/create-from-template.ts @@ -5,7 +5,7 @@ import { z } from '../zod'; import type { ICreateBaseVo } from './create'; import { createBaseVoSchema } from './create'; -export const CREATE_BASE_FROM_TEMPLATE = '/base/createFromTemplate'; +export const CREATE_BASE_FROM_TEMPLATE = '/base/create-from-template'; export const createBaseFromTemplateRoSchema = z.object({ spaceId: z.string(), diff --git a/packages/openapi/src/base/create.ts b/packages/openapi/src/base/create.ts index 21971a9c2..84495b56e 100644 --- a/packages/openapi/src/base/create.ts +++ b/packages/openapi/src/base/create.ts @@ -9,7 +9,6 @@ export const createBaseRoSchema = z.object({ spaceId: z.string(), name: z.string().optional(), icon: z.string().optional(), - order: z.number().optional(), }); export type ICreateBaseRo = z.infer; @@ -18,7 +17,6 @@ export const createBaseVoSchema = z.object({ id: z.string(), name: z.string(), spaceId: z.string(), - order: z.number(), }); export type ICreateBaseVo = z.infer; diff --git a/packages/openapi/src/base/get.ts b/packages/openapi/src/base/get.ts index 3b69537e2..83bfc10a8 100644 --- a/packages/openapi/src/base/get.ts +++ b/packages/openapi/src/base/get.ts @@ -10,7 +10,6 @@ export const getBaseVoSchema = z.object({ id: z.string(), name: z.string(), spaceId: z.string(), - order: z.number(), icon: z.string().nullable(), role: spaceRolesSchema, }); diff --git a/packages/openapi/src/base/index.ts b/packages/openapi/src/base/index.ts index 452e1cf63..c9bffd894 100644 --- a/packages/openapi/src/base/index.ts +++ b/packages/openapi/src/base/index.ts @@ -2,6 +2,7 @@ export * from './create'; export * from './delete'; export * from './get'; export * from './update'; +export * from './update-order'; export * from './all-list'; export * from './collaborator-get-list'; export * from './duplicate'; diff --git a/packages/openapi/src/base/update-order.ts b/packages/openapi/src/base/update-order.ts new file mode 100644 index 000000000..7d3b58cf0 --- /dev/null +++ b/packages/openapi/src/base/update-order.ts @@ -0,0 +1,42 @@ +import type { RouteConfig } from '@asteasolutions/zod-to-openapi'; +import { axios } from '../axios'; +import { registerRoute, urlBuilder } from '../utils'; +import type { IUpdateOrderRo } from '../view/update-order'; +import { updateOrderRoSchema } from '../view/update-order'; +import { z } from '../zod'; + +export const BASE_ORDER = '/base/{baseId}/order'; + +export const updateBaseOrderRoute: RouteConfig = registerRoute({ + method: 'put', + path: BASE_ORDER, + description: 'Update base order', + request: { + params: z.object({ + baseId: z.string(), + }), + body: { + content: { + 'application/json': { + schema: updateOrderRoSchema, + }, + }, + }, + }, + responses: { + 200: { + description: 'Successfully update.', + }, + }, + tags: ['base'], +}); + +export const updateBaseOrder = async (params: { baseId: string } & IUpdateOrderRo) => { + const { baseId, ...orderRo } = params; + return axios.put( + urlBuilder(BASE_ORDER, { + baseId, + }), + orderRo + ); +}; diff --git a/packages/openapi/src/base/update.ts b/packages/openapi/src/base/update.ts index 8013835c2..b41b4ce41 100644 --- a/packages/openapi/src/base/update.ts +++ b/packages/openapi/src/base/update.ts @@ -14,7 +14,6 @@ export const updateBaseVoSchema = z.object({ spaceId: z.string(), name: z.string(), icon: z.string().emoji().optional(), - order: z.number(), }); export type IUpdateBaseVo = z.infer; diff --git a/packages/openapi/src/field/update.ts b/packages/openapi/src/field/update.ts index 018cd32e7..c885f4f60 100644 --- a/packages/openapi/src/field/update.ts +++ b/packages/openapi/src/field/update.ts @@ -1,5 +1,5 @@ import type { RouteConfig } from '@asteasolutions/zod-to-openapi'; -import type { IFieldVo, IUpdateFieldRo } from '@teable/core'; +import type { IUpdateFieldRo } from '@teable/core'; import { updateFieldRoSchema } from '@teable/core'; import { axios } from '../axios'; import { registerRoute, urlBuilder } from '../utils'; @@ -35,7 +35,7 @@ export const UpdateFieldRoute: RouteConfig = registerRoute({ }); export const updateField = async (tableId: string, fieldId: string, fieldRo: IUpdateFieldRo) => { - return axios.patch( + return axios.patch( urlBuilder(UPDATE_FIELD, { tableId, fieldId, diff --git a/packages/openapi/src/space/get-base-list.ts b/packages/openapi/src/space/get-base-list.ts index f0d440056..1fbf5ecca 100644 --- a/packages/openapi/src/space/get-base-list.ts +++ b/packages/openapi/src/space/get-base-list.ts @@ -8,7 +8,7 @@ import { z } from '../zod'; export const GET_BASE_LIST = '/space/{spaceId}/base'; export const getBaseListRoSchema = z.object({ - spaceId: z.string().optional(), + spaceId: z.string(), }); export type IGetBasesListRo = z.infer; diff --git a/packages/openapi/src/table/update-order.ts b/packages/openapi/src/table/update-order.ts index 6d5f81d45..7013f03cf 100644 --- a/packages/openapi/src/table/update-order.ts +++ b/packages/openapi/src/table/update-order.ts @@ -1,16 +1,12 @@ import type { RouteConfig } from '@asteasolutions/zod-to-openapi'; import { axios } from '../axios'; import { registerRoute, urlBuilder } from '../utils'; +import type { IUpdateOrderRo } from '../view/update-order'; +import { updateOrderRoSchema } from '../view/update-order'; import { z } from '../zod'; export const TABLE_ORDER = '/base/{baseId}/table/{tableId}/order'; -export const tableOrderRoSchema = z.object({ - order: z.number(), -}); - -export type ITableOrderRo = z.infer; - export const updateTableOrderRoute: RouteConfig = registerRoute({ method: 'put', path: TABLE_ORDER, @@ -23,7 +19,7 @@ export const updateTableOrderRoute: RouteConfig = registerRoute({ body: { content: { 'application/json': { - schema: tableOrderRoSchema, + schema: updateOrderRoSchema, }, }, }, @@ -36,12 +32,16 @@ export const updateTableOrderRoute: RouteConfig = registerRoute({ tags: ['table'], }); -export const updateTableOrder = async (baseId: string, tableId: string, data: ITableOrderRo) => { +export const updateTableOrder = async ( + baseId: string, + tableId: string, + orderRo: IUpdateOrderRo +) => { return axios.put( urlBuilder(TABLE_ORDER, { baseId, tableId, }), - data + orderRo ); }; diff --git a/packages/openapi/src/view/index.ts b/packages/openapi/src/view/index.ts index 352e4416f..86c7755e3 100644 --- a/packages/openapi/src/view/index.ts +++ b/packages/openapi/src/view/index.ts @@ -9,6 +9,7 @@ export * from './update-sort'; export * from './update-group'; export * from './update-options'; export * from './update-order'; +export * from './update-record-order'; export * from './update-name'; export * from './update-description'; export * from './update-share-meta'; diff --git a/packages/openapi/src/view/update-order.ts b/packages/openapi/src/view/update-order.ts index 549b089fe..a006f1510 100644 --- a/packages/openapi/src/view/update-order.ts +++ b/packages/openapi/src/view/update-order.ts @@ -5,14 +5,13 @@ import { z } from '../zod'; export const VIEW_ORDER = '/table/{tableId}/view/{viewId}/order'; -export interface IViewOrderRo { - order: number; -} - -export const viewOrderRoSchema = z.object({ - order: z.number(), +export const updateOrderRoSchema = z.object({ + anchorId: z.string(), + position: z.enum(['before', 'after']), }); +export type IUpdateOrderRo = z.infer; + export const updateViewOrderRoute: RouteConfig = registerRoute({ method: 'put', path: VIEW_ORDER, @@ -25,7 +24,7 @@ export const updateViewOrderRoute: RouteConfig = registerRoute({ body: { content: { 'application/json': { - schema: viewOrderRoSchema, + schema: updateOrderRoSchema, }, }, }, @@ -38,7 +37,7 @@ export const updateViewOrderRoute: RouteConfig = registerRoute({ tags: ['view'], }); -export const updateViewOrder = async (tableId: string, viewId: string, orderRo: IViewOrderRo) => { +export const updateViewOrder = async (tableId: string, viewId: string, orderRo: IUpdateOrderRo) => { return axios.put( urlBuilder(VIEW_ORDER, { tableId, diff --git a/packages/openapi/src/view/update-record-order.ts b/packages/openapi/src/view/update-record-order.ts new file mode 100644 index 000000000..792141b5f --- /dev/null +++ b/packages/openapi/src/view/update-record-order.ts @@ -0,0 +1,58 @@ +import type { RouteConfig } from '@asteasolutions/zod-to-openapi'; +import { axios } from '../axios'; +import { registerRoute, urlBuilder } from '../utils'; +import { z } from '../zod'; + +export const updateRecordOrdersRoSchema = z.object({ + anchorId: z.string().openapi({ + description: 'Id of the record that you want to move other records around', + }), + position: z.enum(['before', 'after']), + recordIds: z.string().array().max(1000).openapi({ + description: 'Ids of those records you want to move', + maxLength: 1000, + }), +}); + +export type IUpdateRecordOrdersRo = z.infer; + +export const RECORD_ORDER = '/table/{tableId}/view/{viewId}/record-order'; + +export const updateRecordOrdersRoute: RouteConfig = registerRoute({ + method: 'put', + path: RECORD_ORDER, + description: 'Update record order in view', + request: { + params: z.object({ + tableId: z.string(), + viewId: z.string(), + }), + body: { + content: { + 'application/json': { + schema: updateRecordOrdersRoSchema, + }, + }, + }, + }, + responses: { + 200: { + description: 'Successfully update.', + }, + }, + tags: ['view'], +}); + +export const updateRecordOrders = async ( + tableId: string, + viewId: string, + orderRo: IUpdateRecordOrdersRo +) => { + return axios.put( + urlBuilder(RECORD_ORDER, { + tableId, + viewId, + }), + orderRo + ); +}; diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 1797aee76..33b0813aa 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -30,15 +30,16 @@ "typecheck": "tsc --project ./tsconfig.build.json --noEmit", "test": "run-s test-unit", "test-unit": "vitest run --silent", + "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.tsx,.js,.jsx,.cjs,.mjs --fix" }, "dependencies": { "@belgattitude/http-exception": "1.5.0", - "@codemirror/autocomplete": "6.13.0", + "@codemirror/autocomplete": "6.15.0", "@codemirror/commands": "6.3.3", "@codemirror/language": "6.10.1", "@codemirror/state": "6.4.1", - "@codemirror/view": "6.25.1", + "@codemirror/view": "6.26.0", "@dnd-kit/core": "6.1.0", "@dnd-kit/sortable": "8.0.0", "@dnd-kit/utilities": "3.2.2", @@ -52,18 +53,18 @@ "@teable/ui-lib": "workspace:*", "@types/mousetrap": "1.6.15", "antlr4ts": "0.5.0-alpha.4", - "axios": "1.6.7", + "axios": "1.6.8", "class-transformer": "0.5.1", "classnames": "2.5.1", "date-fns": "3.3.1", "dayjs": "1.11.10", "dequal": "2.0.3", "fuse.js": "7.0.0", - "immer": "10.0.3", + "immer": "10.0.4", "knex": "3.1.0", "lodash": "4.17.21", "lru-cache": "10.2.0", - "lucide-react": "0.349.0", + "lucide-react": "0.358.0", "mousetrap": "1.6.5", "react-day-picker": "8.10.0", "react-hammerjs": "1.0.1", @@ -85,13 +86,14 @@ "@teable/eslint-config-bases": "workspace:^", "@testing-library/jest-dom": "6.4.2", "@testing-library/react": "14.2.1", - "@types/lodash": "4.14.202", + "@types/lodash": "4.17.0", "@types/node": "20.9.0", "@types/react": "18.2.64", "@types/react-dom": "18.2.21", "@types/react-hammerjs": "1.0.7", "@types/scroller": "0.1.5", "@types/sharedb": "3.3.10", + "@vitest/coverage-v8": "1.4.0", "@vitejs/plugin-react-swc": "3.6.0", "cross-env": "7.0.3", "eslint": "8.57.0", @@ -105,7 +107,7 @@ "tailwindcss": "3.4.1", "typescript": "5.4.2", "vite-plugin-svgr": "4.2.0", - "vite-tsconfig-paths": "4.3.1", - "vitest": "1.3.1" + "vite-tsconfig-paths": "4.3.2", + "vitest": "1.4.0" } } diff --git a/packages/sdk/src/components/editor/formula/constants.ts b/packages/sdk/src/components/editor/formula/constants.ts index f5c67ae23..f1b2ac7ec 100644 --- a/packages/sdk/src/components/editor/formula/constants.ts +++ b/packages/sdk/src/components/editor/formula/constants.ts @@ -195,7 +195,7 @@ export const FORMULA_FUNCTIONS_MAP = new Map 1\nODD(-0.1) => -1', }, ], diff --git a/packages/sdk/src/components/grid-enhancements/hooks/use-grid-async-records.ts b/packages/sdk/src/components/grid-enhancements/hooks/use-grid-async-records.ts index a6a2b0e4f..8356a9a8e 100644 --- a/packages/sdk/src/components/grid-enhancements/hooks/use-grid-async-records.ts +++ b/packages/sdk/src/components/grid-enhancements/hooks/use-grid-async-records.ts @@ -2,11 +2,10 @@ import type { IRecord, IGetRecordsRo } from '@teable/core'; import { inRange, debounce } from 'lodash'; import { useCallback, useEffect, useRef, useState, useMemo } from 'react'; import type { IGridProps, IRectangle } from '../..'; +import { useTableId } from '../../../hooks'; import { useRecords } from '../../../hooks/use-records'; -import { useRowCount } from '../../../hooks/use-row-count'; import { useViewId } from '../../../hooks/use-view-id'; -import type { Record } from '../../../model'; -import { reorder } from '../../../utils'; +import { Record } from '../../../model'; // eslint-disable-next-line export const LOAD_PAGE_SIZE = 300; @@ -33,8 +32,8 @@ export const useGridAsyncRecords = ( ...initQuery, }); const recordsQuery = useMemo(() => ({ ...query, ...outerQuery }), [query, outerQuery]); + const tableId = useTableId(); const viewId = useViewId(); - const rowCount = useRowCount(); const queryRef = useRef(query); queryRef.current = query; const records = useRecords(recordsQuery, initRecords); @@ -124,34 +123,39 @@ export const useGridAsyncRecords = ( const onRowOrdered = useCallback( (rowIndexCollection: number[], newRowIndex: number) => { - const operationRecords: Record[] = []; + const operationRecordIds: string[] = []; for (const rowIndex of rowIndexCollection) { const record = loadedRecordMap[rowIndex]; if (!record) { throw new Error('Can not find record by index: ' + rowIndex); } - operationRecords.push(record); + operationRecordIds.push(record.id); } if (!viewId) { throw new Error('Can not find view id'); } - const newOrders = reorder( - rowIndexCollection.length, - newRowIndex, - rowCount ?? initRecords?.length ?? 0, - (index) => { - return loadedRecordMap[index].recordOrder[viewId]; - } - ); - - operationRecords.forEach((record, index) => { - record.updateRecordOrder(viewId, newOrders[index]); + if (newRowIndex === -1) { + Record.updateRecordOrders(tableId as string, viewId, { + anchorId: operationRecordIds[0], + position: 'before', + recordIds: operationRecordIds, + }); + return; + } + const record = loadedRecordMap[newRowIndex]; + if (!record) { + throw new Error("Can't find target record by index: " + newRowIndex); + } + Record.updateRecordOrders(tableId as string, viewId, { + anchorId: record.id, + position: 'after', + recordIds: operationRecordIds, }); }, - [loadedRecordMap, viewId, rowCount, initRecords?.length] + [viewId, loadedRecordMap, tableId] ); return { diff --git a/packages/sdk/src/context/__tests__/createSessionContext.tsx b/packages/sdk/src/context/__tests__/createSessionContext.tsx new file mode 100644 index 000000000..06bcbd987 --- /dev/null +++ b/packages/sdk/src/context/__tests__/createSessionContext.tsx @@ -0,0 +1,22 @@ +import { noop } from 'lodash'; +import { SessionContext, type ISessionContext } from '../session'; + +export const createSessionContext = (context: Partial = {}) => { + const defaultContext: ISessionContext = { + refresh: noop, + refreshAvatar: noop, + user: { + id: 'usrxxxxxx', + name: 'teable', + email: 'example@teable.io', + notifyMeta: {}, + hasPassword: true, + }, + }; + // eslint-disable-next-line react/display-name + return ({ children }: { children: React.ReactNode }) => ( + + {children} + + ); +}; diff --git a/packages/sdk/src/context/session/SessionContext.ts b/packages/sdk/src/context/session/SessionContext.ts index d5fbf0c68..569767e9a 100644 --- a/packages/sdk/src/context/session/SessionContext.ts +++ b/packages/sdk/src/context/session/SessionContext.ts @@ -8,9 +8,9 @@ export type ISession = { }; export type ISessionContext = ISession & { - refresh?: () => void; - refreshAvatar?: () => void; + refresh: () => void; + refreshAvatar: () => void; }; // eslint-disable-next-line @typescript-eslint/naming-convention -export const SessionContext = React.createContext({}); +export const SessionContext = React.createContext(null!); diff --git a/packages/sdk/src/context/session/SessionProvider.tsx b/packages/sdk/src/context/session/SessionProvider.tsx index 75b03e1c0..b47715ebf 100644 --- a/packages/sdk/src/context/session/SessionProvider.tsx +++ b/packages/sdk/src/context/session/SessionProvider.tsx @@ -40,7 +40,7 @@ export const SessionProvider: React.FC) => { + const AppProvider = createAppContext(appContext); + const SessionProvider = createSessionContext(); + + // eslint-disable-next-line react/display-name + return ({ children }: { children: React.ReactNode }) => ( + + {children} + + ); +}; + describe('useInstances hook', () => { const mockQueryMethods = { on: vi.fn(), @@ -75,14 +89,14 @@ describe('useInstances hook', () => { it('should initialize with initData when connected is false', () => { const { result } = renderHook(() => useInstances({ ...mockProps, initData }), { - wrapper: createAppContext({ ...mockAppContext, connected: false }), + wrapper: createUseInstancesWrap({ ...mockAppContext, connected: false }), }); expect(result.current).toEqual(initData.map((doc) => createTestInstance(doc))); }); it('should create a subscribe query with correct parameters', () => { renderHook(() => useInstances(mockProps), { - wrapper: createAppContext(mockAppContext), + wrapper: createUseInstancesWrap(mockAppContext), }); expect(mockAppContext.connection.createSubscribeQuery).toHaveBeenCalledWith( 'testCollection', @@ -92,7 +106,7 @@ describe('useInstances hook', () => { it('should update instances on ready event', () => { const { result } = renderHook(() => useInstances(mockProps), { - wrapper: createAppContext(mockAppContext), + wrapper: createUseInstancesWrap(mockAppContext), }); expect(result.current).toEqual([]); @@ -114,7 +128,7 @@ describe('useInstances hook', () => { ]; const { result } = renderHook(() => useInstances(mockProps), { - wrapper: createAppContext(mockAppContext), + wrapper: createUseInstancesWrap(mockAppContext), }); expect(result.current).toEqual([]); @@ -143,7 +157,7 @@ describe('useInstances hook', () => { ]; const { result } = renderHook(() => useInstances(mockProps), { - wrapper: createAppContext(mockAppContext), + wrapper: createUseInstancesWrap(mockAppContext), }); expect(result.current).toEqual([]); @@ -164,7 +178,7 @@ describe('useInstances hook', () => { const moveData = [initData[1], initData[0]]; const { result } = renderHook(() => useInstances(mockProps), { - wrapper: createAppContext(mockAppContext), + wrapper: createUseInstancesWrap(mockAppContext), }); expect(result.current).toEqual([]); @@ -181,7 +195,7 @@ describe('useInstances hook', () => { it('doc on op', () => { const { result } = renderHook(() => useInstances(mockProps), { - wrapper: createAppContext(mockAppContext), + wrapper: createUseInstancesWrap(mockAppContext), }); expect(result.current).toEqual([]); diff --git a/packages/sdk/src/model/base.ts b/packages/sdk/src/model/base.ts index addf08fbc..0c2f5bd27 100644 --- a/packages/sdk/src/model/base.ts +++ b/packages/sdk/src/model/base.ts @@ -7,17 +7,15 @@ export class Base implements IGetBaseVo { id: string; name: string; spaceId: string; - order: number; icon: string | null; role: SpaceRole; knex: Knex; constructor(base: IGetBaseVo, driver: DriverClient) { - const { id, name, order, spaceId, icon, role } = base; + const { id, name, spaceId, icon, role } = base; this.id = id; this.name = name; this.spaceId = spaceId; - this.order = order; this.icon = icon; this.role = role; this.knex = knex({ client: driver }); diff --git a/packages/sdk/src/model/record/record.ts b/packages/sdk/src/model/record/record.ts index 971a09dce..4dce4d1cb 100644 --- a/packages/sdk/src/model/record/record.ts +++ b/packages/sdk/src/model/record/record.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/naming-convention */ import type { IRecord } from '@teable/core'; import { RecordOpBuilder, RecordCore } from '@teable/core'; -import { createRecords, getRecords } from '@teable/openapi'; +import { createRecords, getRecords, updateRecordOrders } from '@teable/openapi'; import type { Doc } from 'sharedb/lib/client'; import { requestWrap } from '../../utils/requestWrap'; import type { IFieldInstance } from '../field/factory'; @@ -11,6 +11,8 @@ export class Record extends RecordCore { static getRecords = requestWrap(getRecords); + static updateRecordOrders = requestWrap(updateRecordOrders); + constructor( protected doc: Doc, protected fieldMap: { [fieldId: string]: IFieldInstance } @@ -35,22 +37,4 @@ export class Record extends RecordCore { return error; } } - - async updateRecordOrder(viewId: string, order: number) { - const operation = RecordOpBuilder.editor.setRecordOrder.build({ - viewId, - newOrder: order, - oldOrder: this.recordOrder[viewId], - }); - - try { - return await new Promise((resolve, reject) => { - this.doc.submitOp([operation], undefined, (error) => { - error ? reject(error) : resolve(undefined); - }); - }); - } catch (error) { - return error; - } - } } diff --git a/packages/sdk/src/model/table/table.ts b/packages/sdk/src/model/table/table.ts index 1768e6463..bce73504e 100644 --- a/packages/sdk/src/model/table/table.ts +++ b/packages/sdk/src/model/table/table.ts @@ -1,6 +1,14 @@ /* eslint-disable @typescript-eslint/naming-convention */ -import type { IFieldRo, IRecord, ITableVo, IUpdateFieldRo, IViewRo } from '@teable/core'; +import type { + IFieldRo, + IRecord, + IRecordInsertOrderRo, + ITableVo, + IUpdateFieldRo, + IViewRo, +} from '@teable/core'; import { FieldKeyType, TableCore } from '@teable/core'; +import type { IUpdateOrderRo } from '@teable/openapi'; import { createTable, deleteTable, @@ -57,8 +65,8 @@ export class Table extends TableCore { return requestWrap(updateTableIcon)(this.baseId, this.id, { icon }); } - async updateOrder(order: number) { - return requestWrap(updateTableOrder)(this.baseId, this.id, { order }); + async updateOrder(orderRo: IUpdateOrderRo) { + return requestWrap(updateTableOrder)(this.baseId, this.id, orderRo); } async createView(viewRo: IViewRo) { @@ -69,15 +77,15 @@ export class Table extends TableCore { return View.deleteView(this.id, viewId); } - async createRecord(recordFields: IRecord['fields'], recordOrder?: { [viewId: string]: number }) { + async createRecord(recordFields: IRecord['fields'], recordOrder?: IRecordInsertOrderRo) { return Record.createRecords(this.id, { fieldKeyType: FieldKeyType.Id, records: [ { fields: recordFields, - recordOrder, }, ], + order: recordOrder, }); } diff --git a/packages/sdk/src/model/view/view.ts b/packages/sdk/src/model/view/view.ts index 6fef85320..7fbe753aa 100644 --- a/packages/sdk/src/model/view/view.ts +++ b/packages/sdk/src/model/view/view.ts @@ -9,6 +9,7 @@ import type { IGroup, } from '@teable/core'; import { ViewCore } from '@teable/core'; +import type { IUpdateOrderRo } from '@teable/openapi'; import { createView, deleteView, @@ -73,8 +74,8 @@ export abstract class View extends ViewCore { return await requestWrap(updateViewGroup)(this.tableId, this.id, { group }); } - async updateOrder(order: number) { - return await requestWrap(updateViewOrder)(this.tableId, this.id, { order }); + async updateOrder(orderRo: IUpdateOrderRo) { + return await requestWrap(updateViewOrder)(this.tableId, this.id, orderRo); } async updateName(name: string) { diff --git a/packages/sdk/tsconfig.build.json b/packages/sdk/tsconfig.build.json index 8c8ce47b7..35453ba67 100644 --- a/packages/sdk/tsconfig.build.json +++ b/packages/sdk/tsconfig.build.json @@ -8,6 +8,6 @@ "jsx": "react-jsx", "paths": {} }, - "exclude": ["dist", "**/__tests__/*", "**/*spec.ts"], + "exclude": ["dist", "**/__tests__/*", "**/*spec.ts", "**/*spec.tsx"], "include": ["src"] } diff --git a/packages/sdk/vitest.config.ts b/packages/sdk/vitest.config.ts index 471d58da7..da4b4e506 100644 --- a/packages/sdk/vitest.config.ts +++ b/packages/sdk/vitest.config.ts @@ -1,7 +1,7 @@ import react from '@vitejs/plugin-react-swc'; import svgr from 'vite-plugin-svgr'; import tsconfigPaths from 'vite-tsconfig-paths'; -import { defineConfig } from 'vitest/config'; +import { configDefaults, defineConfig } from 'vitest/config'; const testFiles = ['./src/**/*.{test,spec}.{js,jsx,ts,tsx}']; export default defineConfig({ @@ -11,10 +11,11 @@ export default defineConfig({ }), tsconfigPaths(), svgr({ - // svgr options: https://react-svgr.com/docs/options/ + // svgr options: https://react-svgr.com/docs/options/include: ['src/**/*'], svgrOptions: {}, }), ], + cacheDir: '../../.cache/vitest/sdk', test: { globals: true, environment: 'happy-dom', @@ -23,20 +24,12 @@ export default defineConfig({ }, passWithNoTests: false, setupFiles: './config/tests/setupVitest.ts', - cache: { - dir: '../../.cache/vitest/sdk', - }, coverage: { provider: 'v8', - reporter: ['text', 'clover'], - extension: ['js', 'jsx', 'ts', 'tsx'], + extension: ['.js', '.jsx', '.ts', '.tsx'], + include: ['src/**/*'], }, include: testFiles, - exclude: [ - '**/node_modules/**', - '**/dist/**', - '**/.next/**', - '**/.{idea,git,cache,output,temp}/**', - ], + exclude: [...configDefaults.exclude, '**/.next/**'], }, }); diff --git a/packages/ui-lib/package.json b/packages/ui-lib/package.json index 691c3cf12..6f844cfaf 100644 --- a/packages/ui-lib/package.json +++ b/packages/ui-lib/package.json @@ -51,15 +51,15 @@ }, "devDependencies": { "@mdx-js/react": "3.0.1", - "@storybook/addon-actions": "7.6.17", - "@storybook/addon-docs": "7.6.17", - "@storybook/addon-essentials": "7.6.17", - "@storybook/addon-links": "7.6.17", + "@storybook/addon-actions": "8.0.1", + "@storybook/addon-docs": "8.0.1", + "@storybook/addon-essentials": "8.0.1", + "@storybook/addon-links": "8.0.1", "@storybook/addon-postcss": "2.0.0", - "@storybook/addon-storysource": "7.6.17", - "@storybook/builder-webpack5": "7.6.17", + "@storybook/addon-storysource": "8.0.1", + "@storybook/builder-webpack5": "8.0.1", "@storybook/manager-webpack5": "6.5.16", - "@storybook/react": "7.6.17", + "@storybook/react": "8.0.1", "@tailwindcss/aspect-ratio": "0.4.2", "@teable/eslint-config-bases": "workspace:^", "@testing-library/react": "14.2.1", @@ -72,7 +72,7 @@ "eslint": "8.57.0", "microbundle": "0.15.1", "npm-run-all2": "6.1.2", - "postcss": "8.4.35", + "postcss": "8.4.36", "postcss-flexbugs-fixes": "5.0.2", "prettier": "3.2.5", "react": "18.2.0", @@ -114,14 +114,15 @@ "@teable/icons": "workspace:^", "class-variance-authority": "0.7.0", "clsx": "2.1.0", - "cmdk": "0.2.1", + "cmdk": "1.0.0", + "date-fns": "3.3.1", "deepmerge": "4.3.1", - "next-themes": "0.2.1", + "next-themes": "0.3.0", "react-day-picker": "8.10.0", - "react-hook-form": "7.51.0", - "react-resizable-panels": "2.0.12", + "react-hook-form": "7.51.1", + "react-resizable-panels": "2.0.13", "sonner": "1.4.3", - "tailwind-merge": "2.2.1", + "tailwind-merge": "2.2.2", "tailwindcss-animate": "1.0.7", "zod": "3.22.4" } diff --git a/packages/ui-lib/src/base/selector/Selector.tsx b/packages/ui-lib/src/base/selector/Selector.tsx index 03943563a..ce232850f 100644 --- a/packages/ui-lib/src/base/selector/Selector.tsx +++ b/packages/ui-lib/src/base/selector/Selector.tsx @@ -11,7 +11,6 @@ import { CommandEmpty, CommandItem, CommandList, - CommandGroup, } from '../../shadcn'; export interface ISelectorItem { diff --git a/packages/ui-lib/src/shadcn/ui/command.tsx b/packages/ui-lib/src/shadcn/ui/command.tsx index ccde15e31..3134794fe 100644 --- a/packages/ui-lib/src/shadcn/ui/command.tsx +++ b/packages/ui-lib/src/shadcn/ui/command.tsx @@ -116,7 +116,7 @@ const CommandItem = React.forwardRef< =6.9.0'} @@ -3319,10 +3364,10 @@ packages: '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.24.0) '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.24.0) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.0) - babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.24.0) + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.0) babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.24.0) babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.24.0) - core-js-compat: 3.36.0 + core-js-compat: 3.36.1 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -3441,6 +3486,10 @@ packages: resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} dev: true + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + /@belgattitude/http-exception@1.5.0: resolution: {integrity: sha512-JIvW/VizUDrxYcXfguUuPjCRE8tJlXBVxXhxCaNldNsMyw/S9gJt5GumAxsIEKiFI94PT4CvHO2PTztnHbU0aw==} engines: {node: '>=14.16'} @@ -3648,8 +3697,8 @@ packages: prettier: 2.8.8 dev: true - /@codemirror/autocomplete@6.13.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1)(@lezer/common@1.2.1): - resolution: {integrity: sha512-SuDrho1klTINfbcMPnyro1ZxU9xJtwDMtb62R8TjL/tOl71IoOsvBo1a9x+hDvHhIzkTcJHy2VC+rmpGgYkRSw==} + /@codemirror/autocomplete@6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1): + resolution: {integrity: sha512-G2Zm0mXznxz97JhaaOdoEG2cVupn4JjPaS4AcNvZzhOsnnG9YVN68VzfoUw6dYTsIxT6a/cmoFEN47KAWhXaOg==} peerDependencies: '@codemirror/language': ^6.0.0 '@codemirror/state': ^6.0.0 @@ -3658,7 +3707,7 @@ packages: dependencies: '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.25.1 + '@codemirror/view': 6.26.0 '@lezer/common': 1.2.1 dev: false @@ -3667,7 +3716,7 @@ packages: dependencies: '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.25.1 + '@codemirror/view': 6.26.0 '@lezer/common': 1.2.1 dev: false @@ -3675,7 +3724,7 @@ packages: resolution: {integrity: sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ==} dependencies: '@codemirror/state': 6.4.1 - '@codemirror/view': 6.25.1 + '@codemirror/view': 6.26.0 '@lezer/common': 1.2.1 '@lezer/highlight': 1.2.0 '@lezer/lr': 1.4.0 @@ -3686,8 +3735,8 @@ packages: resolution: {integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==} dev: false - /@codemirror/view@6.25.1: - resolution: {integrity: sha512-2LXLxsQnHDdfGzDvjzAwZh2ZviNJm7im6tGpa0IONIDnFd8RZ80D2SNi8PDi6YjKcMoMRK20v6OmKIdsrwsyoQ==} + /@codemirror/view@6.26.0: + resolution: {integrity: sha512-nSSmzONpqsNzshPOxiKhK203R6BvABepugAe34QfQDbNDslyjkqBuKgrK5ZBvqNXpfxz5iLrlGTmEfhbQyH46A==} dependencies: '@codemirror/state': 6.4.1 style-mod: 4.1.2 @@ -3706,15 +3755,15 @@ packages: engines: {node: '>=0.1.90'} dev: true - /@commitlint/cli@19.0.3(@types/node@20.9.0)(typescript@5.4.2): - resolution: {integrity: sha512-mGhh/aYPib4Vy4h+AGRloMY+CqkmtdeKPV9poMcZeImF5e3knQ5VYaSeAM0mEzps1dbKsHvABwaDpafLUuM96g==} + /@commitlint/cli@19.2.1(@types/node@20.9.0)(typescript@5.4.2): + resolution: {integrity: sha512-cbkYUJsLqRomccNxvoJTyv5yn0bSy05BBizVyIcLACkRbVUqYorC351Diw/XFSWC/GtpwiwT2eOvQgFZa374bg==} engines: {node: '>=v18'} hasBin: true dependencies: '@commitlint/format': 19.0.3 - '@commitlint/lint': 19.0.3 - '@commitlint/load': 19.0.3(@types/node@20.9.0)(typescript@5.4.2) - '@commitlint/read': 19.0.3 + '@commitlint/lint': 19.1.0 + '@commitlint/load': 19.2.0(@types/node@20.9.0)(typescript@5.4.2) + '@commitlint/read': 19.2.1 '@commitlint/types': 19.0.3 execa: 8.0.1 yargs: 17.7.2 @@ -3723,8 +3772,8 @@ packages: - typescript dev: true - /@commitlint/config-conventional@19.0.3: - resolution: {integrity: sha512-vh0L8XeLaEzTe8VCxSd0gAFvfTK0RFolrzw4o431bIuWJfi/yRCHJlsDwus7wW2eJaFFDR0VFXJyjGyDQhi4vA==} + /@commitlint/config-conventional@19.1.0: + resolution: {integrity: sha512-KIKD2xrp6Uuk+dcZVj3++MlzIr/Su6zLE8crEDQCZNvWHNQSeeGbzOlNtsR32TUy6H3JbP7nWgduAHCaiGQ6EA==} engines: {node: '>=v18'} dependencies: '@commitlint/types': 19.0.3 @@ -3772,8 +3821,8 @@ packages: semver: 7.6.0 dev: true - /@commitlint/lint@19.0.3: - resolution: {integrity: sha512-uHPyRqIn57iIplYa5xBr6oNu5aPXKGC4WLeuHfqQHclwIqbJ33g3yA5fIA+/NYnp5ZM2EFiujqHFaVUYj6HlKA==} + /@commitlint/lint@19.1.0: + resolution: {integrity: sha512-ESjaBmL/9cxm+eePyEr6SFlBUIYlYpI80n+Ltm7IA3MAcrmiP05UMhJdAD66sO8jvo8O4xdGn/1Mt2G5VzfZKw==} engines: {node: '>=v18'} dependencies: '@commitlint/is-ignored': 19.0.3 @@ -3782,17 +3831,17 @@ packages: '@commitlint/types': 19.0.3 dev: true - /@commitlint/load@19.0.3(@types/node@20.9.0)(typescript@5.4.2): - resolution: {integrity: sha512-18Tk/ZcDFRKIoKfEcl7kC+bYkEQ055iyKmGsYDoYWpKf6FUvBrP9bIWapuy/MB+kYiltmP9ITiUx6UXtqC9IRw==} + /@commitlint/load@19.2.0(@types/node@20.9.0)(typescript@5.4.2): + resolution: {integrity: sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==} engines: {node: '>=v18'} dependencies: '@commitlint/config-validator': 19.0.3 '@commitlint/execute-rule': 19.0.0 - '@commitlint/resolve-extends': 19.0.3 + '@commitlint/resolve-extends': 19.1.0 '@commitlint/types': 19.0.3 chalk: 5.3.0 - cosmiconfig: 8.3.6(typescript@5.4.2) - cosmiconfig-typescript-loader: 5.0.0(@types/node@20.9.0)(cosmiconfig@8.3.6)(typescript@5.4.2) + cosmiconfig: 9.0.0(typescript@5.4.2) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.9.0)(cosmiconfig@9.0.0)(typescript@5.4.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -3815,18 +3864,19 @@ packages: conventional-commits-parser: 5.0.0 dev: true - /@commitlint/read@19.0.3: - resolution: {integrity: sha512-b5AflTyAXkUx5qKw4TkjjcOccXZHql3JqMi522knTQktq2AubKXFz60Sws+K4FsefwPws6fGz9mqiI/NvsvxFA==} + /@commitlint/read@19.2.1: + resolution: {integrity: sha512-qETc4+PL0EUv7Q36lJbPG+NJiBOGg7SSC7B5BsPWOmei+Dyif80ErfWQ0qXoW9oCh7GTpTNRoaVhiI8RbhuaNw==} engines: {node: '>=v18'} dependencies: '@commitlint/top-level': 19.0.0 '@commitlint/types': 19.0.3 + execa: 8.0.1 git-raw-commits: 4.0.0 minimist: 1.2.8 dev: true - /@commitlint/resolve-extends@19.0.3: - resolution: {integrity: sha512-18BKmta8OC8+Ub+Q3QGM9l27VjQaXobloVXOrMvu8CpEwJYv62vC/t7Ka5kJnsW0tU9q1eMqJFZ/nN9T/cOaIA==} + /@commitlint/resolve-extends@19.1.0: + resolution: {integrity: sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==} engines: {node: '>=v18'} dependencies: '@commitlint/config-validator': 19.0.3 @@ -3960,15 +4010,15 @@ packages: '@css-inline/css-inline-win32-x64-msvc': 0.13.0 dev: false - /@csstools/cascade-layer-name-parser@1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): - resolution: {integrity: sha512-xHxXavWvXB5nAA9IvZtjEzkONM3hPXpxqYK4cEw60LcqPiFjq7ZlEFxOyYFPrG4UdANKtnucNtRVDy7frjq6AA==} + /@csstools/cascade-layer-name-parser@1.0.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4): + resolution: {integrity: sha512-RRqNjxTZDUhx7pxYOBG/AkCVmPS3zYzfE47GEhIGkFuWFTQGJBgWOUUkKNo5MfxIfjDz5/1L3F3rF1oIsYaIpw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-parser-algorithms': ^2.6.0 - '@csstools/css-tokenizer': ^2.2.3 + '@csstools/css-parser-algorithms': ^2.6.1 + '@csstools/css-tokenizer': ^2.2.4 dependencies: - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 dev: true /@csstools/color-helpers@4.0.0: @@ -3976,413 +4026,413 @@ packages: engines: {node: ^14 || ^16 || >=18} dev: true - /@csstools/css-calc@1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): - resolution: {integrity: sha512-+7bUzB5I4cI97tKmBJA8ilTl/YRo6VAOdlrnd/4x2NyK60nvYurGKa5TZpE1zcgIrTC97iJRE0/V65feyFytuw==} + /@csstools/css-calc@1.2.0(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4): + resolution: {integrity: sha512-iQqIW5vDPqQdLx07/atCuNKDprhIWjB0b8XRhUyXZWBZYUG+9mNyFwyu30rypX84WLevVo25NYW2ipxR8WyseQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-parser-algorithms': ^2.6.0 - '@csstools/css-tokenizer': ^2.2.3 + '@csstools/css-parser-algorithms': ^2.6.1 + '@csstools/css-tokenizer': ^2.2.4 dependencies: - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 dev: true - /@csstools/css-color-parser@1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): - resolution: {integrity: sha512-5GEkuuUxD5dael3xoWjyf7gAPAi4pwm8X8JW/nUMhxntGY4Wo4Lp7vKlex4V5ZgTfAoov14rZFsZyOantdTatg==} + /@csstools/css-color-parser@1.6.2(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4): + resolution: {integrity: sha512-mlt0PomBlDXMGcbPAqCG36Fw35LZTtaSgCQCHEs4k8QTv1cUKe0rJDlFSJMHtqrgQiLC7LAAS9+s9kKQp2ou/Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-parser-algorithms': ^2.6.0 - '@csstools/css-tokenizer': ^2.2.3 + '@csstools/css-parser-algorithms': ^2.6.1 + '@csstools/css-tokenizer': ^2.2.4 dependencies: '@csstools/color-helpers': 4.0.0 - '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 + '@csstools/css-calc': 1.2.0(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 dev: true - /@csstools/css-parser-algorithms@2.6.0(@csstools/css-tokenizer@2.2.3): - resolution: {integrity: sha512-YfEHq0eRH98ffb5/EsrrDspVWAuph6gDggAE74ZtjecsmyyWpW768hOyiONa8zwWGbIWYfa2Xp4tRTrpQQ00CQ==} + /@csstools/css-parser-algorithms@2.6.1(@csstools/css-tokenizer@2.2.4): + resolution: {integrity: sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-tokenizer': ^2.2.3 + '@csstools/css-tokenizer': ^2.2.4 dependencies: - '@csstools/css-tokenizer': 2.2.3 + '@csstools/css-tokenizer': 2.2.4 dev: true - /@csstools/css-tokenizer@2.2.3: - resolution: {integrity: sha512-pp//EvZ9dUmGuGtG1p+n17gTHEOqu9jO+FiCUjNN3BDmyhdA2Jq9QsVeR7K8/2QCK17HSsioPlTW9ZkzoWb3Lg==} + /@csstools/css-tokenizer@2.2.4: + resolution: {integrity: sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw==} engines: {node: ^14 || ^16 || >=18} dev: true - /@csstools/media-query-list-parser@2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): - resolution: {integrity: sha512-DiD3vG5ciNzeuTEoh74S+JMjQDs50R3zlxHnBnfd04YYfA/kh2KiBCGhzqLxlJcNq+7yNQ3stuZZYLX6wK/U2g==} + /@csstools/media-query-list-parser@2.1.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4): + resolution: {integrity: sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-parser-algorithms': ^2.6.0 - '@csstools/css-tokenizer': ^2.2.3 + '@csstools/css-parser-algorithms': ^2.6.1 + '@csstools/css-tokenizer': ^2.2.4 dependencies: - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 dev: true - /@csstools/postcss-cascade-layers@4.0.3(postcss@8.4.35): + /@csstools/postcss-cascade-layers@4.0.3(postcss@8.4.36): resolution: {integrity: sha512-RbkQoOH23yGhWVetgBTwFgIOHEyU2tKMN7blTz/YAKKabR6tr9pP7mYS23Q9snFY2hr8WSaV8Le64KdM9BtUSA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15) - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.16) + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 dev: true - /@csstools/postcss-color-function@3.0.10(postcss@8.4.35): - resolution: {integrity: sha512-jxiXmSl4ZYX8KewFjL5ef6of9uW73VkaHeDb2tqb5q4ZDPYxjusNX1KJ8UXY8+7ydqS5QBo42tVMrSMGy+rDmw==} + /@csstools/postcss-color-function@3.0.12(postcss@8.4.36): + resolution: {integrity: sha512-amPGGDI4Xmgu7VN2ciKQe0pP/j5raaETT50nzbnkydp9FMw7imKxSUnXdVQU4NmRgpLKIc5Q7jox0MFhMBImIg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-color-parser': 1.6.2(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/postcss-progressive-custom-properties': 3.1.1(postcss@8.4.36) + '@csstools/utilities': 1.0.0(postcss@8.4.36) + postcss: 8.4.36 dev: true - /@csstools/postcss-color-mix-function@2.0.10(postcss@8.4.35): - resolution: {integrity: sha512-zeD856+FDCUjB077pPS+Z9OnTQnqpiJrao3TW+sasCb/gJ3vZCX7sRSRFsRUo0/MntTtJu9hkKv9eMkFmfjydA==} + /@csstools/postcss-color-mix-function@2.0.12(postcss@8.4.36): + resolution: {integrity: sha512-qpAEGwVVqHSa88i3gLb43IMpT4/LyZEE8HzZylQKKXFVJ7XykXaORTmXySxyH6H+flT+NyCnutKG2fegCVyCug==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-color-parser': 1.6.2(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/postcss-progressive-custom-properties': 3.1.1(postcss@8.4.36) + '@csstools/utilities': 1.0.0(postcss@8.4.36) + postcss: 8.4.36 dev: true - /@csstools/postcss-exponential-functions@1.0.4(postcss@8.4.35): - resolution: {integrity: sha512-frMf0CFVnZoGEKAHlxLy3s4g/tpjyFn5+A+h895UJNm9Uc+ewGT7+EeK7Kh9IHH4pD4FkaGW1vOQtER00PLurQ==} + /@csstools/postcss-exponential-functions@1.0.5(postcss@8.4.36): + resolution: {integrity: sha512-7S7I7KgwHWQYzJJAoIjRtUf7DQs1dxipeg1A6ikZr0PYapNJX7UHz0evlpE67SQqYj1xBs70gpG7xUv3uLp4PA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - postcss: 8.4.35 + '@csstools/css-calc': 1.2.0(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + postcss: 8.4.36 dev: true - /@csstools/postcss-font-format-keywords@3.0.2(postcss@8.4.35): + /@csstools/postcss-font-format-keywords@3.0.2(postcss@8.4.36): resolution: {integrity: sha512-E0xz2sjm4AMCkXLCFvI/lyl4XO6aN1NCSMMVEOngFDJ+k2rDwfr6NDjWljk1li42jiLNChVX+YFnmfGCigZKXw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/utilities': 1.0.0(postcss@8.4.36) + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-gamut-mapping@1.0.3(postcss@8.4.35): - resolution: {integrity: sha512-P0+ude1KyCy9LXOe2pHJmpcXK4q/OQbr2Sn2wQSssMw0rALGmny2MfHiCqEu8n6mf2cN6lWDZdzY8enBk8WHXQ==} + /@csstools/postcss-gamut-mapping@1.0.5(postcss@8.4.36): + resolution: {integrity: sha512-AJ74/4nHXgghLWY4/ydEhu3mzwN8c56EjIGrJsoEhKaNuGBAOtUfE5qbkc9XQQ0G2FMhHggqE+9eRrApeK7ebQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - postcss: 8.4.35 + '@csstools/css-color-parser': 1.6.2(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + postcss: 8.4.36 dev: true - /@csstools/postcss-gradients-interpolation-method@4.0.11(postcss@8.4.35): - resolution: {integrity: sha512-LFom5jCVUfzF+iuiOZvhvX7RRN8vc+tKpcKo9s4keEBAU2mPwV5/Fgz5iylEfXP/DZbEdq2C0At20urMi/lupw==} + /@csstools/postcss-gradients-interpolation-method@4.0.13(postcss@8.4.36): + resolution: {integrity: sha512-dBbyxs9g+mrIzmEH+UtrqJUmvcJB/60j0ijhBcVJMHCgl/rKjj8ey6r/pJOI0EhkVsckOu3Prc9AGzH88C+1pQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-color-parser': 1.6.2(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/postcss-progressive-custom-properties': 3.1.1(postcss@8.4.36) + '@csstools/utilities': 1.0.0(postcss@8.4.36) + postcss: 8.4.36 dev: true - /@csstools/postcss-hwb-function@3.0.9(postcss@8.4.35): - resolution: {integrity: sha512-S3/Z+mGHWIKAex7DLsHFDiku5lBEK34avT2My6sGPNCXB38TZjrKI0rd7JdN9oulem5sn+CU7oONyIftui24oQ==} + /@csstools/postcss-hwb-function@3.0.11(postcss@8.4.36): + resolution: {integrity: sha512-c36FtMFptwGn5CmsfdONA40IlWG2lHeoC/TDyED/7lwiTht5okxe6iLAa9t2LjBBo5AHQSHfeMvOASdXk/SHog==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-color-parser': 1.6.2(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/postcss-progressive-custom-properties': 3.1.1(postcss@8.4.36) + '@csstools/utilities': 1.0.0(postcss@8.4.36) + postcss: 8.4.36 dev: true - /@csstools/postcss-ic-unit@3.0.4(postcss@8.4.35): - resolution: {integrity: sha512-OB6ojl33/TQHhjVx1NI+n3EnYbdUM6Q/mSUv3WFATdcz7IrH/CmBaZt7P1R6j1Xdp58thIa6jm4Je7saGs+2AA==} + /@csstools/postcss-ic-unit@3.0.5(postcss@8.4.36): + resolution: {integrity: sha512-9CriM/zvKXa/lDARlxs/MgeyKE6ZmmX4V77VLD7VUxKLVSt0Go3NCy/gRMbwGzxbrk3iaHFXnFbc2lNw+/7jcg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/postcss-progressive-custom-properties': 3.1.1(postcss@8.4.36) + '@csstools/utilities': 1.0.0(postcss@8.4.36) + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-initial@1.0.1(postcss@8.4.35): + /@csstools/postcss-initial@1.0.1(postcss@8.4.36): resolution: {integrity: sha512-wtb+IbUIrIf8CrN6MLQuFR7nlU5C7PwuebfeEXfjthUha1+XZj2RVi+5k/lukToA24sZkYAiSJfHM8uG/UZIdg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true - /@csstools/postcss-is-pseudo-class@4.0.5(postcss@8.4.35): + /@csstools/postcss-is-pseudo-class@4.0.5(postcss@8.4.36): resolution: {integrity: sha512-qG3MI7IN3KY9UwdaE9E7G7sFydscVW7nAj5OGwaBP9tQPEEVdxXTGI+l1ZW5EUpZFSj+u3q/22fH5+8HI72+Bg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15) - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.16) + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 dev: true - /@csstools/postcss-light-dark-function@1.0.0(postcss@8.4.35): - resolution: {integrity: sha512-KHo633V16DGo6tmpr1ARAwO73CPBNmDI3PfSQYe7ZBMiv60WEizbcEroK75fHjxKYJ4tj9uCCzp5sYG4cEUqqw==} + /@csstools/postcss-light-dark-function@1.0.1(postcss@8.4.36): + resolution: {integrity: sha512-CJOcp+m7Njbu91HtYMMoYuZznsvNSpJtLiR/7BO8/bHTXYPiuAZfxunh7wXLkMbHd5dRBgAVAQZ+H4iFqrvWZw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/postcss-progressive-custom-properties': 3.1.1(postcss@8.4.36) + '@csstools/utilities': 1.0.0(postcss@8.4.36) + postcss: 8.4.36 dev: true - /@csstools/postcss-logical-float-and-clear@2.0.1(postcss@8.4.35): + /@csstools/postcss-logical-float-and-clear@2.0.1(postcss@8.4.36): resolution: {integrity: sha512-SsrWUNaXKr+e/Uo4R/uIsqJYt3DaggIh/jyZdhy/q8fECoJSKsSMr7nObSLdvoULB69Zb6Bs+sefEIoMG/YfOA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true - /@csstools/postcss-logical-overflow@1.0.1(postcss@8.4.35): + /@csstools/postcss-logical-overflow@1.0.1(postcss@8.4.36): resolution: {integrity: sha512-Kl4lAbMg0iyztEzDhZuQw8Sj9r2uqFDcU1IPl+AAt2nue8K/f1i7ElvKtXkjhIAmKiy5h2EY8Gt/Cqg0pYFDCw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true - /@csstools/postcss-logical-overscroll-behavior@1.0.1(postcss@8.4.35): + /@csstools/postcss-logical-overscroll-behavior@1.0.1(postcss@8.4.36): resolution: {integrity: sha512-+kHamNxAnX8ojPCtV8WPcUP3XcqMFBSDuBuvT6MHgq7oX4IQxLIXKx64t7g9LiuJzE7vd06Q9qUYR6bh4YnGpQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true - /@csstools/postcss-logical-resize@2.0.1(postcss@8.4.35): + /@csstools/postcss-logical-resize@2.0.1(postcss@8.4.36): resolution: {integrity: sha512-W5Gtwz7oIuFcKa5SmBjQ2uxr8ZoL7M2bkoIf0T1WeNqljMkBrfw1DDA8/J83k57NQ1kcweJEjkJ04pUkmyee3A==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-logical-viewport-units@2.0.6(postcss@8.4.35): - resolution: {integrity: sha512-6hV0ngZh8J7HqNY3kyt+z5ABN/XE18qvrU7ne4YSkKfltrWDnQgGiW/Q+h7bdQz8/W5juAefcdCCAJUIBE7erg==} + /@csstools/postcss-logical-viewport-units@2.0.7(postcss@8.4.36): + resolution: {integrity: sha512-L4G3zsp/bnU0+WXUyysihCUH14LkfMgUJsS9vKz3vCYbVobOTqQRoNXnEPpyNp8WYyolLqAWbGGJhVu8J6u2OQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-tokenizer': 2.2.3 - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-tokenizer': 2.2.4 + '@csstools/utilities': 1.0.0(postcss@8.4.36) + postcss: 8.4.36 dev: true - /@csstools/postcss-media-minmax@1.1.3(postcss@8.4.35): - resolution: {integrity: sha512-W9AFRQSLvT+Dxtp20AewzGTUxzkJ21XSKzqRALwQdAv0uJGXkR76qgdhkoX0L/tcV4gXtgDfVtGYL/x2Nz/M5Q==} + /@csstools/postcss-media-minmax@1.1.4(postcss@8.4.36): + resolution: {integrity: sha512-xl/PIO3TUbXO1ZA4SA6HCw+Q9UGe2cgeRKx3lHCzoNig2D4bT5vfVCOrwhxjUb09oHihc9eI3I0iIfVPiXaN1A==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/media-query-list-parser': 2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - postcss: 8.4.35 + '@csstools/css-calc': 1.2.0(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/media-query-list-parser': 2.1.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + postcss: 8.4.36 dev: true - /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.6(postcss@8.4.35): - resolution: {integrity: sha512-awc2qenSDvx6r+w6G9xxENp+LsbvHC8mMMV23KYmk4pR3YL8JxeKPDSiDhmqd93FQ9nNNDc/CaCQEcvP+GV4rw==} + /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.7(postcss@8.4.36): + resolution: {integrity: sha512-HBDAQw1K0NilcHGMUHv8jzf2mpOtcWTVKtuY3AeZ5TS1uyWWNVi5/yuA/tREPLU9WifNdqHQ+rfbsV/8zTIkTg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/media-query-list-parser': 2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - postcss: 8.4.35 + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/media-query-list-parser': 2.1.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + postcss: 8.4.36 dev: true - /@csstools/postcss-nested-calc@3.0.2(postcss@8.4.35): + /@csstools/postcss-nested-calc@3.0.2(postcss@8.4.36): resolution: {integrity: sha512-ySUmPyawiHSmBW/VI44+IObcKH0v88LqFe0d09Sb3w4B1qjkaROc6d5IA3ll9kjD46IIX/dbO5bwFN/swyoyZA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/utilities': 1.0.0(postcss@8.4.36) + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-normalize-display-values@3.0.2(postcss@8.4.35): + /@csstools/postcss-normalize-display-values@3.0.2(postcss@8.4.36): resolution: {integrity: sha512-fCapyyT/dUdyPtrelQSIV+d5HqtTgnNP/BEG9IuhgXHt93Wc4CfC1bQ55GzKAjWrZbgakMQ7MLfCXEf3rlZJOw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-oklab-function@3.0.10(postcss@8.4.35): - resolution: {integrity: sha512-s9trs1c+gUMtaTtwrrIpdVQkUbRuwi6bQ9rBHaqwt4kd3kEnEYfP85uLY1inFx6Rt8OM2XVg3PSYbfnFSAO51A==} + /@csstools/postcss-oklab-function@3.0.12(postcss@8.4.36): + resolution: {integrity: sha512-RNitTHamFvUUh8x+MJuPd2tCekYexUrylGKfUoor5D2GGcgzY1WB6Bl3pIj9t8bAq5h/lcacKaB2wmvUOTfGgQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-color-parser': 1.6.2(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/postcss-progressive-custom-properties': 3.1.1(postcss@8.4.36) + '@csstools/utilities': 1.0.0(postcss@8.4.36) + postcss: 8.4.36 dev: true - /@csstools/postcss-progressive-custom-properties@3.1.0(postcss@8.4.35): - resolution: {integrity: sha512-Mfb1T1BHa6pktLI+poMEHI7Q+VYvAsdwJZPFsSkIB2ZUsawCiPxXLw06BKSVPITxFlaY/FEUzfpyOTfX9YCE2w==} + /@csstools/postcss-progressive-custom-properties@3.1.1(postcss@8.4.36): + resolution: {integrity: sha512-cx/bZgj+MK8SpRZNTu2zGeVFMCQfhsaeuDhukAhfA53yykvIXaTIwLi5shW9hfkvPrkqBeFoiRAzq/qogxeHTA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-relative-color-syntax@2.0.10(postcss@8.4.35): - resolution: {integrity: sha512-IkTIk9Eq2VegSN4lgsljGY8boyfX3l3Pw58e+R9oyPe/Ye7r3NwuiQ3w0nkXoQ+RC+d240V6n7eZme2mEPqQvg==} + /@csstools/postcss-relative-color-syntax@2.0.12(postcss@8.4.36): + resolution: {integrity: sha512-VreDGDgE634niwCytLtkoE5kRxfva7bnMzSoyok7Eh9VPYFOm8CK/oJXt9y3df71Bxc9PG4KC8RA3CxTknudnw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-color-parser': 1.6.2(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/postcss-progressive-custom-properties': 3.1.1(postcss@8.4.36) + '@csstools/utilities': 1.0.0(postcss@8.4.36) + postcss: 8.4.36 dev: true - /@csstools/postcss-scope-pseudo-class@3.0.1(postcss@8.4.35): + /@csstools/postcss-scope-pseudo-class@3.0.1(postcss@8.4.36): resolution: {integrity: sha512-3ZFonK2gfgqg29gUJ2w7xVw2wFJ1eNWVDONjbzGkm73gJHVCYK5fnCqlLr+N+KbEfv2XbWAO0AaOJCFB6Fer6A==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 dev: true - /@csstools/postcss-stepped-value-functions@3.0.5(postcss@8.4.35): - resolution: {integrity: sha512-B8K8RaTrYVZLxbNzVUvFO3SlCDJDaUTAO7KRth05fa7f01ufPvb6ztdBuxSoRwOtmNp8iROxPJHOemWo2kBBtA==} + /@csstools/postcss-stepped-value-functions@3.0.6(postcss@8.4.36): + resolution: {integrity: sha512-rnyp8tWRuBXERTHVdB5hjUlif5dQgPcyN+BX55wUnYpZ3LN9QPfK2Z3/HUZymwyou8Gg6vhd6X2W+g1pLq1jYg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - postcss: 8.4.35 + '@csstools/css-calc': 1.2.0(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + postcss: 8.4.36 dev: true - /@csstools/postcss-text-decoration-shorthand@3.0.4(postcss@8.4.35): + /@csstools/postcss-text-decoration-shorthand@3.0.4(postcss@8.4.36): resolution: {integrity: sha512-yUZmbnUemgQmja7SpOZeU45+P49wNEgQguRdyTktFkZsHf7Gof+ZIYfvF6Cm+LsU1PwSupy4yUeEKKjX5+k6cQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: '@csstools/color-helpers': 4.0.0 - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-trigonometric-functions@3.0.5(postcss@8.4.35): - resolution: {integrity: sha512-RhBfQ0TsBudyPuoo8pXKdfQuUiQxMU/Sc5GyV57bWk93JbUHXq6b4CdPx+B/tHUeFKvocVJn/e2jbu96rh0d3Q==} + /@csstools/postcss-trigonometric-functions@3.0.6(postcss@8.4.36): + resolution: {integrity: sha512-i5Zd0bMJooZAn+ZcDmPij2WCkcOJJJ6opzK+QeDjxbMrYmoGQl0CY8FDHdeQyBF1Nly+Q0Fq3S7QfdNLKBBaCg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - postcss: 8.4.35 + '@csstools/css-calc': 1.2.0(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + postcss: 8.4.36 dev: true - /@csstools/postcss-unset-value@3.0.1(postcss@8.4.35): + /@csstools/postcss-unset-value@3.0.1(postcss@8.4.36): resolution: {integrity: sha512-dbDnZ2ja2U8mbPP0Hvmt2RMEGBiF1H7oY6HYSpjteXJGihYwgxgTr6KRbbJ/V6c+4wd51M+9980qG4gKVn5ttg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true - /@csstools/selector-resolve-nested@1.1.0(postcss-selector-parser@6.0.15): + /@csstools/selector-resolve-nested@1.1.0(postcss-selector-parser@6.0.16): resolution: {integrity: sha512-uWvSaeRcHyeNenKg8tp17EVDRkpflmdyvbE0DHo6D/GdBb6PDnCYYU6gRpXhtICMGMcahQmj2zGxwFM/WC8hCg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss-selector-parser: ^6.0.13 dependencies: - postcss-selector-parser: 6.0.15 + postcss-selector-parser: 6.0.16 dev: true - /@csstools/selector-specificity@3.0.2(postcss-selector-parser@6.0.15): + /@csstools/selector-specificity@3.0.2(postcss-selector-parser@6.0.16): resolution: {integrity: sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss-selector-parser: ^6.0.13 dependencies: - postcss-selector-parser: 6.0.15 + postcss-selector-parser: 6.0.16 dev: true - /@csstools/utilities@1.0.0(postcss@8.4.35): + /@csstools/utilities@1.0.0(postcss@8.4.36): resolution: {integrity: sha512-tAgvZQe/t2mlvpNosA4+CkMiZ2azISW5WPAcdSalZlEjQvUfghHxfQcrCiK/7/CrfAWVxyM88kGFYO82heIGDg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true /@dabh/diagnostics@2.0.3: @@ -4480,11 +4530,11 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.18.20: - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + /@esbuild/aix-ppc64@0.20.2: + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} - cpu: [arm64] - os: [android] + cpu: [ppc64] + os: [aix] requiresBuild: true dev: true optional: true @@ -4498,10 +4548,10 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.18.20: - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + /@esbuild/android-arm64@0.20.2: + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [android] requiresBuild: true dev: true @@ -4516,10 +4566,10 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.18.20: - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + /@esbuild/android-arm@0.20.2: + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} engines: {node: '>=12'} - cpu: [x64] + cpu: [arm] os: [android] requiresBuild: true dev: true @@ -4534,11 +4584,11 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.18.20: - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + /@esbuild/android-x64@0.20.2: + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] + cpu: [x64] + os: [android] requiresBuild: true dev: true optional: true @@ -4552,10 +4602,10 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.18.20: - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + /@esbuild/darwin-arm64@0.20.2: + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} engines: {node: '>=12'} - cpu: [x64] + cpu: [arm64] os: [darwin] requiresBuild: true dev: true @@ -4570,11 +4620,11 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.18.20: - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + /@esbuild/darwin-x64@0.20.2: + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] + cpu: [x64] + os: [darwin] requiresBuild: true dev: true optional: true @@ -4588,10 +4638,10 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.18.20: - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + /@esbuild/freebsd-arm64@0.20.2: + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} engines: {node: '>=12'} - cpu: [x64] + cpu: [arm64] os: [freebsd] requiresBuild: true dev: true @@ -4606,11 +4656,11 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.18.20: - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + /@esbuild/freebsd-x64@0.20.2: + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} engines: {node: '>=12'} - cpu: [arm64] - os: [linux] + cpu: [x64] + os: [freebsd] requiresBuild: true dev: true optional: true @@ -4624,10 +4674,10 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.18.20: - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + /@esbuild/linux-arm64@0.20.2: + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true @@ -4642,10 +4692,10 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.18.20: - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + /@esbuild/linux-arm@0.20.2: + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} engines: {node: '>=12'} - cpu: [ia32] + cpu: [arm] os: [linux] requiresBuild: true dev: true @@ -4660,10 +4710,10 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.18.20: - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + /@esbuild/linux-ia32@0.20.2: + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} engines: {node: '>=12'} - cpu: [loong64] + cpu: [ia32] os: [linux] requiresBuild: true dev: true @@ -4678,10 +4728,10 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.18.20: - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + /@esbuild/linux-loong64@0.20.2: + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} engines: {node: '>=12'} - cpu: [mips64el] + cpu: [loong64] os: [linux] requiresBuild: true dev: true @@ -4696,10 +4746,10 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.18.20: - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + /@esbuild/linux-mips64el@0.20.2: + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} engines: {node: '>=12'} - cpu: [ppc64] + cpu: [mips64el] os: [linux] requiresBuild: true dev: true @@ -4714,10 +4764,10 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.18.20: - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + /@esbuild/linux-ppc64@0.20.2: + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} engines: {node: '>=12'} - cpu: [riscv64] + cpu: [ppc64] os: [linux] requiresBuild: true dev: true @@ -4732,10 +4782,10 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.18.20: - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + /@esbuild/linux-riscv64@0.20.2: + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} engines: {node: '>=12'} - cpu: [s390x] + cpu: [riscv64] os: [linux] requiresBuild: true dev: true @@ -4750,10 +4800,10 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.18.20: - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + /@esbuild/linux-s390x@0.20.2: + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} engines: {node: '>=12'} - cpu: [x64] + cpu: [s390x] os: [linux] requiresBuild: true dev: true @@ -4768,11 +4818,11 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.18.20: - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + /@esbuild/linux-x64@0.20.2: + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} engines: {node: '>=12'} cpu: [x64] - os: [netbsd] + os: [linux] requiresBuild: true dev: true optional: true @@ -4786,11 +4836,11 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.18.20: - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + /@esbuild/netbsd-x64@0.20.2: + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} engines: {node: '>=12'} cpu: [x64] - os: [openbsd] + os: [netbsd] requiresBuild: true dev: true optional: true @@ -4804,11 +4854,11 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.18.20: - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + /@esbuild/openbsd-x64@0.20.2: + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} engines: {node: '>=12'} cpu: [x64] - os: [sunos] + os: [openbsd] requiresBuild: true dev: true optional: true @@ -4822,11 +4872,11 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.18.20: - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + /@esbuild/sunos-x64@0.20.2: + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} engines: {node: '>=12'} - cpu: [arm64] - os: [win32] + cpu: [x64] + os: [sunos] requiresBuild: true dev: true optional: true @@ -4840,10 +4890,10 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.18.20: - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + /@esbuild/win32-arm64@0.20.2: + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} engines: {node: '>=12'} - cpu: [ia32] + cpu: [arm64] os: [win32] requiresBuild: true dev: true @@ -4858,10 +4908,10 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.18.20: - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + /@esbuild/win32-ia32@0.20.2: + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} engines: {node: '>=12'} - cpu: [x64] + cpu: [ia32] os: [win32] requiresBuild: true dev: true @@ -4876,6 +4926,15 @@ packages: dev: true optional: true + /@esbuild/win32-x64@0.20.2: + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4923,12 +4982,14 @@ packages: resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} dependencies: '@floating-ui/utils': 0.2.1 + dev: false /@floating-ui/dom@1.6.3: resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} dependencies: '@floating-ui/core': 1.6.0 '@floating-ui/utils': 0.2.1 + dev: false /@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} @@ -4939,9 +5000,11 @@ packages: '@floating-ui/dom': 1.6.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + dev: false /@floating-ui/utils@0.2.1: resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + dev: false /@fontsource-variable/inter@5.0.17: resolution: {integrity: sha512-sa80nNnqF8kzhBvqusWiL9vlPMVpdmOwMmDBup46Jggsr1VBqo+YuzwB36Ls+X6uHJtb8Yv3ALBHL/zGmT862A==} @@ -4971,15 +5034,15 @@ packages: /@gilbarbara/types@0.2.2: resolution: {integrity: sha512-QuQDBRRcm1Q8AbSac2W1YElurOhprj3Iko/o+P1fJxUWS4rOGKMVli98OXS7uo4z+cKAif6a+L9bcZFSyauQpQ==} dependencies: - type-fest: 4.11.1 + type-fest: 4.12.0 dev: false - /@grpc/grpc-js@1.10.1: - resolution: {integrity: sha512-55ONqFytZExfOIjF1RjXPcVmT/jJqFzbbDqxK9jmRV4nxiYWtL9hENSW1Jfx0SdZfrvoqd44YJ/GJTqfRrawSQ==} - engines: {node: ^8.13.0 || >=10.10.0} + /@grpc/grpc-js@1.10.3: + resolution: {integrity: sha512-qiO9MNgYnwbvZ8MK0YLWbnGrNX3zTcj6/Ef7UHu5ZofER3e2nF3Y35GaPo9qNJJ/UJQKa4KL+z/F4Q8Q+uCdUQ==} + engines: {node: '>=12.10.0'} dependencies: '@grpc/proto-loader': 0.7.10 - '@types/node': 20.9.0 + '@js-sdsl/ordered-map': 4.4.2 dev: false /@grpc/proto-loader@0.7.10: @@ -5030,12 +5093,12 @@ packages: '@hapi/hoek': 9.3.0 dev: false - /@hookform/resolvers@3.3.4(react-hook-form@7.51.0): + /@hookform/resolvers@3.3.4(react-hook-form@7.51.1): resolution: {integrity: sha512-o5cgpGOuJYrd+iMKvkttOclgwRW86EsWJZZRC23prf0uU2i48Htq4PuT73AVb9ionFyZrwYEITuOFGF+BydEtQ==} peerDependencies: react-hook-form: ^7.0.0 dependencies: - react-hook-form: 7.51.0(react@18.2.0) + react-hook-form: 7.51.1(react@18.2.0) dev: false /@humanwhocodes/config-array@0.11.14: @@ -5258,17 +5321,6 @@ packages: wrap-ansi: 8.1.0 wrap-ansi-cjs: /wrap-ansi@7.0.0 - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} @@ -5281,41 +5333,6 @@ packages: '@sinclair/typebox': 0.27.8 dev: true - /@jest/transform@29.7.0: - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.24.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.5 - pirates: 4.0.6 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.9.0 - '@types/yargs': 17.0.32 - chalk: 4.1.2 - dev: true - /@jridgewell/gen-mapping@0.3.5: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -5332,8 +5349,8 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + /@jridgewell/source-map@0.3.6: + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 @@ -5354,8 +5371,13 @@ packages: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + /@js-sdsl/ordered-map@4.4.2: + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + dev: false + /@juggle/resize-observer@3.4.0: resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + dev: false /@keyv/redis@2.8.4: resolution: {integrity: sha512-osO4C+i+Gi844wHjvXuHwhl+sDx3289Of309ZlLcj6SJReTLmPXzNiVR81N88wOu5aC+lVFdmx9FUQkkjdbPRQ==} @@ -5392,8 +5414,8 @@ packages: '@lezer/common': 1.2.1 dev: false - /@ljharb/through@2.3.12: - resolution: {integrity: sha512-ajo/heTlG3QgC8EGP6APIejksVAYt4ayz4tqoP3MolFELzcH1x1fzwEYRJTPO0IELutZ5HQ0c26/GqAYy79u3g==} + /@ljharb/through@2.3.13: + resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 @@ -5440,16 +5462,6 @@ packages: - encoding - supports-color - /@mdx-js/react@2.3.0(react@18.2.0): - resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} - peerDependencies: - react: '>=16' - dependencies: - '@types/mdx': 2.0.11 - '@types/react': 18.2.64 - react: 18.2.0 - dev: true - /@mdx-js/react@3.0.1(@types/react@18.2.64)(react@18.2.0): resolution: {integrity: sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==} peerDependencies: @@ -5469,7 +5481,7 @@ packages: resolution: {integrity: sha512-dtOenP4ZAmsKXkobTDUCcbkQvPJbuJ6Kp/LHqWDYLK//XNgGs3Re8ymcQzyVhtph8JckdI3K8FR5Q+6mX7HnpQ==} dev: false - /@nestjs-modules/mailer@1.11.2(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(nodemailer@6.9.11): + /@nestjs-modules/mailer@1.11.2(@nestjs/common@10.3.4)(@nestjs/core@10.3.4)(nodemailer@6.9.12): resolution: {integrity: sha512-k07wyKbtCzxWMm6IqGwcGIisnXD/6sneGvUR8rBBZbxtLn1HE1FLGyiaXBrPui/0K7W41aS9x9jAIhfTawtlUg==} peerDependencies: '@nestjs/common': '>=7.0.9' @@ -5477,11 +5489,11 @@ packages: nodemailer: '>=6.4.6' dependencies: '@css-inline/css-inline': 0.13.0 - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/platform-express@10.3.3)(@nestjs/websockets@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.4(@nestjs/common@10.3.4)(@nestjs/platform-express@10.3.4)(@nestjs/websockets@10.3.4)(reflect-metadata@0.2.1)(rxjs@7.8.1) glob: 10.3.10 mjml: 4.15.3 - nodemailer: 6.9.11 + nodemailer: 6.9.12 preview-email: 3.0.19 optionalDependencies: '@types/ejs': 3.1.5 @@ -5493,19 +5505,19 @@ packages: - encoding dev: false - /@nestjs/axios@3.0.2(@nestjs/common@10.3.3)(axios@1.6.7)(rxjs@7.8.1): + /@nestjs/axios@3.0.2(@nestjs/common@10.3.4)(axios@1.6.8)(rxjs@7.8.1): resolution: {integrity: sha512-Z6GuOUdNQjP7FX+OuV2Ybyamse+/e0BFdTWBX5JxpBDKA+YkdLynDgG6HTF04zy6e9zPa19UX0WA2VDoehwhXQ==} peerDependencies: '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 axios: ^1.3.1 rxjs: ^6.0.0 || ^7.0.0 dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - axios: 1.6.7 + '@nestjs/common': 10.3.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + axios: 1.6.8 rxjs: 7.8.1 dev: false - /@nestjs/cli@10.3.2(@swc/core@1.4.5): + /@nestjs/cli@10.3.2(@swc/core@1.4.8): resolution: {integrity: sha512-aWmD1GLluWrbuC4a1Iz/XBk5p74Uj6nIVZj6Ov03JbTfgtWqGFLtXuMetvzMiHxfrHehx/myt2iKAPRhKdZvTg==} engines: {node: '>= 16.14'} hasBin: true @@ -5522,7 +5534,7 @@ packages: '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) '@angular-devkit/schematics-cli': 17.1.2(chokidar@3.6.0) '@nestjs/schematics': 10.1.1(chokidar@3.6.0)(typescript@5.3.3) - '@swc/core': 1.4.5 + '@swc/core': 1.4.8 chalk: 4.1.2 chokidar: 3.6.0 cli-table3: 0.6.3 @@ -5539,7 +5551,7 @@ packages: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.3.3 - webpack: 5.90.1(@swc/core@1.4.5) + webpack: 5.90.1(@swc/core@1.4.8) webpack-node-externals: 3.0.0 transitivePeerDependencies: - esbuild @@ -5547,8 +5559,8 @@ packages: - webpack-cli dev: true - /@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1): - resolution: {integrity: sha512-LAkTe8/CF0uNWM0ecuDwUNTHCi1lVSITmmR4FQ6Ftz1E7ujQCnJ5pMRzd8JRN14vdBkxZZ8VbVF0BDUKoKNxMQ==} + /@nestjs/common@10.3.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1): + resolution: {integrity: sha512-HmehujZhUZjf9TN2o0TyzWYNwEgyRYqZZ5qIcF/mCgIUZ4olIKlazna0kGK56FGlCvviHWNKQM5eTuVeTstIgA==} peerDependencies: class-transformer: '*' class-validator: '*' @@ -5568,13 +5580,13 @@ packages: tslib: 2.6.2 uid: 2.0.2 - /@nestjs/config@3.2.0(@nestjs/common@10.3.3)(rxjs@7.8.1): + /@nestjs/config@3.2.0(@nestjs/common@10.3.4)(rxjs@7.8.1): resolution: {integrity: sha512-BpYRn57shg7CH35KGT6h+hT7ZucB6Qn2B3NBNdvhD4ApU8huS5pX/Wc2e/aO5trIha606Bz2a9t9/vbiuTBTww==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 rxjs: ^7.1.0 dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) dotenv: 16.4.1 dotenv-expand: 10.0.0 lodash: 4.17.21 @@ -5582,8 +5594,8 @@ packages: uuid: 9.0.1 dev: false - /@nestjs/core@10.3.3(@nestjs/common@10.3.3)(@nestjs/platform-express@10.3.3)(@nestjs/websockets@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1): - resolution: {integrity: sha512-kxJWggQAPX3RuZx9JVec69eSLaYLNIox2emkZJpfBJ5Qq7cAq7edQIt1r4LGjTKq6kFubNTPsqhWf5y7yFRBPw==} + /@nestjs/core@10.3.4(@nestjs/common@10.3.4)(@nestjs/platform-express@10.3.4)(@nestjs/websockets@10.3.4)(reflect-metadata@0.2.1)(rxjs@7.8.1): + resolution: {integrity: sha512-rF0yebuHmMj+9/CkbjPWWMvlF5x8j5Biw2DRvbl8R8n2X3OdFBN+06x/9xm3/ZssR5tLoB9tsYspFUb+SvnnwA==} requiresBuild: true peerDependencies: '@nestjs/common': ^10.0.0 @@ -5600,9 +5612,9 @@ packages: '@nestjs/websockets': optional: true dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/platform-express': 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) - '@nestjs/websockets': 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/platform-express': 10.3.4(@nestjs/common@10.3.4)(@nestjs/core@10.3.4) + '@nestjs/websockets': 10.3.4(@nestjs/common@10.3.4)(@nestjs/core@10.3.4)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nuxtjs/opencollective': 0.3.2 fast-safe-stringify: 2.1.1 iterare: 1.2.1 @@ -5614,28 +5626,28 @@ packages: transitivePeerDependencies: - encoding - /@nestjs/event-emitter@2.0.4(@nestjs/common@10.3.3)(@nestjs/core@10.3.3): + /@nestjs/event-emitter@2.0.4(@nestjs/common@10.3.4)(@nestjs/core@10.3.4): resolution: {integrity: sha512-quMiw8yOwoSul0pp3mOonGz8EyXWHSBTqBy8B0TbYYgpnG1Ix2wGUnuTksLWaaBiiOTDhciaZ41Y5fJZsSJE1Q==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/platform-express@10.3.3)(@nestjs/websockets@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.4(@nestjs/common@10.3.4)(@nestjs/platform-express@10.3.4)(@nestjs/websockets@10.3.4)(reflect-metadata@0.2.1)(rxjs@7.8.1) eventemitter2: 6.4.9 dev: false - /@nestjs/jwt@10.2.0(@nestjs/common@10.3.3): + /@nestjs/jwt@10.2.0(@nestjs/common@10.3.4): resolution: {integrity: sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@types/jsonwebtoken': 9.0.5 jsonwebtoken: 9.0.2 dev: false - /@nestjs/mapped-types@2.0.5(@nestjs/common@10.3.3)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1): + /@nestjs/mapped-types@2.0.5(@nestjs/common@10.3.4)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1): resolution: {integrity: sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -5648,47 +5660,47 @@ packages: class-validator: optional: true dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) class-transformer: 0.5.1 class-validator: 0.14.1 reflect-metadata: 0.2.1 dev: false - /@nestjs/passport@10.0.3(@nestjs/common@10.3.3)(passport@0.7.0): + /@nestjs/passport@10.0.3(@nestjs/common@10.3.4)(passport@0.7.0): resolution: {integrity: sha512-znJ9Y4S8ZDVY+j4doWAJ8EuuVO7SkQN3yOBmzxbGaXbvcSwFDAdGJ+OMCg52NdzIO4tQoN4pYKx8W6M0ArfFRQ==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 passport: ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) passport: 0.7.0 dev: false - /@nestjs/platform-express@10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3): - resolution: {integrity: sha512-GGKSEU48Os7nYFIsUM0nutuFUGn5AbeP8gzFBiBCAtiuJWrXZXpZ58pMBYxAbMf7IrcOZFInHEukjHGAQU0OZw==} + /@nestjs/platform-express@10.3.4(@nestjs/common@10.3.4)(@nestjs/core@10.3.4): + resolution: {integrity: sha512-rzUUUZCGYNs/viT9I6W5izJ1+oYCG0ym/dAn31NmYJW9UchxJdX5PCJqWF8iIbys6JgfbdcapMR5t+L7OZsasQ==} peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/core': ^10.0.0 dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/platform-express@10.3.3)(@nestjs/websockets@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.4(@nestjs/common@10.3.4)(@nestjs/platform-express@10.3.4)(@nestjs/websockets@10.3.4)(reflect-metadata@0.2.1)(rxjs@7.8.1) body-parser: 1.20.2 cors: 2.8.5 - express: 4.18.2 + express: 4.18.3 multer: 1.4.4-lts.1 tslib: 2.6.2 transitivePeerDependencies: - supports-color - /@nestjs/platform-ws@10.3.3(@nestjs/common@10.3.3)(@nestjs/websockets@10.3.3)(rxjs@7.8.1): - resolution: {integrity: sha512-UMVW0Tai9wPJJakQdNOuSeuHHSbezIzHMiMUa75Nj9oYY1aiNkeN3QZKX2/fHPd6Zu1+RN10V6xayw2HOtn8zA==} + /@nestjs/platform-ws@10.3.4(@nestjs/common@10.3.4)(@nestjs/websockets@10.3.4)(rxjs@7.8.1): + resolution: {integrity: sha512-OhAMnqlPwWxym5SxvXjc60/p+Ln8drMQYT9avf5K2w2O0LSTdDdW4gf4KT5PN9ySCCxqQkDhzp706toDsY1KQA==} peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/websockets': ^10.0.0 rxjs: ^7.1.0 dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/websockets': 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/websockets': 10.3.4(@nestjs/common@10.3.4)(@nestjs/core@10.3.4)(reflect-metadata@0.2.1)(rxjs@7.8.1) rxjs: 7.8.1 tslib: 2.6.2 ws: 8.16.0 @@ -5712,7 +5724,7 @@ packages: - chokidar dev: true - /@nestjs/swagger@7.3.0(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1): + /@nestjs/swagger@7.3.0(@nestjs/common@10.3.4)(@nestjs/core@10.3.4)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1): resolution: {integrity: sha512-zLkfKZ+ioYsIZ3dfv7Bj8YHnZMNAGWFUmx2ZDuLp/fBE4P8BSjB7hldzDueFXsmwaPL90v7lgyd82P+s7KME1Q==} peerDependencies: '@fastify/static': ^6.0.0 || ^7.0.0 @@ -5730,9 +5742,9 @@ packages: optional: true dependencies: '@microsoft/tsdoc': 0.14.2 - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/platform-express@10.3.3)(@nestjs/websockets@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/mapped-types': 2.0.5(@nestjs/common@10.3.3)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1) + '@nestjs/common': 10.3.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.4(@nestjs/common@10.3.4)(@nestjs/platform-express@10.3.4)(@nestjs/websockets@10.3.4)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/mapped-types': 2.0.5(@nestjs/common@10.3.4)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1) class-transformer: 0.5.1 class-validator: 0.14.1 js-yaml: 4.1.0 @@ -5742,7 +5754,7 @@ packages: swagger-ui-dist: 5.11.2 dev: false - /@nestjs/terminus@10.2.3(@nestjs/axios@3.0.2)(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@prisma/client@5.10.2)(reflect-metadata@0.2.1)(rxjs@7.8.1): + /@nestjs/terminus@10.2.3(@nestjs/axios@3.0.2)(@nestjs/common@10.3.4)(@nestjs/core@10.3.4)(@prisma/client@5.11.0)(reflect-metadata@0.2.1)(rxjs@7.8.1): resolution: {integrity: sha512-iX7gXtAooePcyQqFt57aDke5MzgdkBeYgF5YsFNNFwOiAFdIQEhfv3PR0G+HlH9F6D7nBCDZt9U87Pks/qHijg==} peerDependencies: '@grpc/grpc-js': '*' @@ -5790,18 +5802,18 @@ packages: typeorm: optional: true dependencies: - '@nestjs/axios': 3.0.2(@nestjs/common@10.3.3)(axios@1.6.7)(rxjs@7.8.1) - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/platform-express@10.3.3)(@nestjs/websockets@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@prisma/client': 5.10.2(prisma@5.10.2) + '@nestjs/axios': 3.0.2(@nestjs/common@10.3.4)(axios@1.6.8)(rxjs@7.8.1) + '@nestjs/common': 10.3.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.4(@nestjs/common@10.3.4)(@nestjs/platform-express@10.3.4)(@nestjs/websockets@10.3.4)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@prisma/client': 5.11.0(prisma@5.11.0) boxen: 5.1.2 check-disk-space: 3.4.0 reflect-metadata: 0.2.1 rxjs: 7.8.1 dev: false - /@nestjs/testing@10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/platform-express@10.3.3): - resolution: {integrity: sha512-kX20GfjAImL5grd/i69uD/x7sc00BaqGcP2dRG3ilqshQUuy5DOmspLCr3a2C8xmVU7kzK4spT0oTxhe6WcCAA==} + /@nestjs/testing@10.3.4(@nestjs/common@10.3.4)(@nestjs/core@10.3.4)(@nestjs/platform-express@10.3.4): + resolution: {integrity: sha512-g3NQnRUFBcYF+ySkB7INg5RiV7CNfkP5zwaf3NFo0WjhBrfih9f1jMZ/19blLZ4djN/ngulYks2E3lzROAW8RQ==} peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/core': ^10.0.0 @@ -5813,14 +5825,14 @@ packages: '@nestjs/platform-express': optional: true dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/platform-express@10.3.3)(@nestjs/websockets@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/platform-express': 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) + '@nestjs/common': 10.3.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.4(@nestjs/common@10.3.4)(@nestjs/platform-express@10.3.4)(@nestjs/websockets@10.3.4)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/platform-express': 10.3.4(@nestjs/common@10.3.4)(@nestjs/core@10.3.4) tslib: 2.6.2 dev: true - /@nestjs/websockets@10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1): - resolution: {integrity: sha512-cR5cB0bLS87vd0iu7Nud/4x2EH1Vs0aIgwGWd0eH/5SAw0rrDNU81PiOde+rnMXETbxvSVfOZuLRyn7/WQtGUg==} + /@nestjs/websockets@10.3.4(@nestjs/common@10.3.4)(@nestjs/core@10.3.4)(reflect-metadata@0.2.1)(rxjs@7.8.1): + resolution: {integrity: sha512-ZGDY8t1bBYzY2xbOe2QOxYG+D6W1mALSS3VD/rcVW34oaysF4iQQEr4t2ktYLbPAuZlEvwM5EhutqCkBUsDw7Q==} peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/core': ^10.0.0 @@ -5831,8 +5843,8 @@ packages: '@nestjs/platform-socket.io': optional: true dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/platform-express@10.3.3)(@nestjs/websockets@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.4(@nestjs/common@10.3.4)(@nestjs/platform-express@10.3.4)(@nestjs/websockets@10.3.4)(reflect-metadata@0.2.1)(rxjs@7.8.1) iterare: 1.2.1 object-hash: 3.0.0 reflect-metadata: 0.2.1 @@ -6027,11 +6039,6 @@ packages: '@opentelemetry/api': 1.8.0 dev: false - /@opentelemetry/api@1.7.0: - resolution: {integrity: sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==} - engines: {node: '>=8.0.0'} - dev: false - /@opentelemetry/api@1.8.0: resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} engines: {node: '>=8.0.0'} @@ -6046,16 +6053,6 @@ packages: '@opentelemetry/api': 1.8.0 dev: false - /@opentelemetry/core@1.21.0(@opentelemetry/api@1.7.0): - resolution: {integrity: sha512-KP+OIweb3wYoP7qTYL/j5IpOlu52uxBv5M4+QhSmmUfLyTgu1OIS71msK3chFo1D6Y61BIH3wMiMYRCxJCQctA==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.8.0' - dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/semantic-conventions': 1.21.0 - dev: false - /@opentelemetry/core@1.22.0(@opentelemetry/api@1.8.0): resolution: {integrity: sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==} engines: {node: '>=14'} @@ -6072,7 +6069,7 @@ packages: peerDependencies: '@opentelemetry/api': ^1.0.0 dependencies: - '@grpc/grpc-js': 1.10.1 + '@grpc/grpc-js': 1.10.3 '@opentelemetry/api': 1.8.0 '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) '@opentelemetry/otlp-grpc-exporter-base': 0.49.1(@opentelemetry/api@1.8.0) @@ -6123,8 +6120,8 @@ packages: '@opentelemetry/semantic-conventions': 1.22.0 dev: false - /@opentelemetry/instrumentation-express@0.36.0(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-7sPiMPpYOTRw2+FXJc9RpHGsf8Mkfwz44TfxHOz0xxcuIz6Vb8sV3+qaXIGKT+gxS1YRaQQOHUSaP9rs1lNNPQ==} + /@opentelemetry/instrumentation-express@0.36.1(@opentelemetry/api@1.8.0): + resolution: {integrity: sha512-ltIE4kIMa+83QjW/p7oe7XCESF29w3FQ9/T1VgShdX7fzm56K2a0xfEX1vF8lnHRGERYxIWX9D086C6gJOjVGA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -6164,22 +6161,6 @@ packages: - supports-color dev: false - /@opentelemetry/instrumentation@0.48.0(@opentelemetry/api@1.7.0): - resolution: {integrity: sha512-sjtZQB5PStIdCw5ovVTDGwnmQC+GGYArJNgIcydrDSqUTdYBnMrN9P4pwQZgS3vTGIp+TU1L8vMXGe51NVmIKQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - dependencies: - '@opentelemetry/api': 1.7.0 - '@types/shimmer': 1.0.5 - import-in-the-middle: 1.7.1 - require-in-the-middle: 7.2.0 - semver: 7.6.0 - shimmer: 1.2.1 - transitivePeerDependencies: - - supports-color - dev: false - /@opentelemetry/instrumentation@0.49.1(@opentelemetry/api@1.8.0): resolution: {integrity: sha512-0DLtWtaIppuNNRRllSD4bjU8ZIiLp1cDXvJEbp752/Zf+y3gaLNaoGRGIlX4UHhcsrmtL+P2qxi3Hodi8VuKiQ==} engines: {node: '>=14'} @@ -6190,7 +6171,7 @@ packages: '@opentelemetry/api-logs': 0.49.1 '@types/shimmer': 1.0.5 import-in-the-middle: 1.7.1 - require-in-the-middle: 7.2.0 + require-in-the-middle: 7.2.1 semver: 7.6.0 shimmer: 1.2.1 transitivePeerDependencies: @@ -6213,7 +6194,7 @@ packages: peerDependencies: '@opentelemetry/api': ^1.0.0 dependencies: - '@grpc/grpc-js': 1.10.1 + '@grpc/grpc-js': 1.10.3 '@opentelemetry/api': 1.8.0 '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) '@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.8.0) @@ -6267,17 +6248,6 @@ packages: '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) dev: false - /@opentelemetry/resources@1.21.0(@opentelemetry/api@1.7.0): - resolution: {integrity: sha512-1Z86FUxPKL6zWVy2LdhueEGl9AHDJcx+bvHStxomruz6Whd02mE3lNUMjVJ+FGRoktx/xYQcxccYb03DiUP6Yw==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.8.0' - dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.7.0) - '@opentelemetry/semantic-conventions': 1.21.0 - dev: false - /@opentelemetry/resources@1.22.0(@opentelemetry/api@1.8.0): resolution: {integrity: sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==} engines: {node: '>=14'} @@ -6338,18 +6308,6 @@ packages: - supports-color dev: false - /@opentelemetry/sdk-trace-base@1.21.0(@opentelemetry/api@1.7.0): - resolution: {integrity: sha512-yrElGX5Fv0umzp8Nxpta/XqU71+jCAyaLk34GmBzNcrW43nqbrqvdPs4gj4MVy/HcTjr6hifCDCYA3rMkajxxA==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.8.0' - dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/core': 1.21.0(@opentelemetry/api@1.7.0) - '@opentelemetry/resources': 1.21.0(@opentelemetry/api@1.7.0) - '@opentelemetry/semantic-conventions': 1.21.0 - dev: false - /@opentelemetry/sdk-trace-base@1.22.0(@opentelemetry/api@1.8.0): resolution: {integrity: sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==} engines: {node: '>=14'} @@ -6377,11 +6335,6 @@ packages: semver: 7.6.0 dev: false - /@opentelemetry/semantic-conventions@1.21.0: - resolution: {integrity: sha512-lkC8kZYntxVKr7b8xmjCVUgE0a8xgDakPyDo9uSWavXPyYqLgYYGdEd2j8NxihRyb6UwpX3G/hFUF4/9q2V+/g==} - engines: {node: '>=14'} - dev: false - /@opentelemetry/semantic-conventions@1.22.0: resolution: {integrity: sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==} engines: {node: '>=14'} @@ -6405,12 +6358,12 @@ packages: playwright: 1.41.2 dev: true - /@polka/url@1.0.0-next.24: - resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} + /@polka/url@1.0.0-next.25: + resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} dev: true - /@prisma/client@5.10.2(prisma@5.10.2): - resolution: {integrity: sha512-ef49hzB2yJZCvM5gFHMxSFL9KYrIP9udpT5rYo0CsHD4P9IKj473MbhU1gjKKftiwWBTIyrt9jukprzZXazyag==} + /@prisma/client@5.11.0(prisma@5.11.0): + resolution: {integrity: sha512-SWshvS5FDXvgJKM/a0y9nDC1rqd7KG0Q6ZVzd+U7ZXK5soe73DJxJJgbNBt2GNXOa+ysWB4suTpdK5zfFPhwiw==} engines: {node: '>=16.13'} requiresBuild: true peerDependencies: @@ -6419,47 +6372,47 @@ packages: prisma: optional: true dependencies: - prisma: 5.10.2 + prisma: 5.11.0 dev: false - /@prisma/debug@5.10.2: - resolution: {integrity: sha512-bkBOmH9dpEBbMKFJj8V+Zp8IZHIBjy3fSyhLhxj4FmKGb/UBSt9doyfA6k1UeUREsMJft7xgPYBbHSOYBr8XCA==} + /@prisma/debug@5.11.0: + resolution: {integrity: sha512-N6yYr3AbQqaiUg+OgjkdPp3KPW1vMTAgtKX6+BiB/qB2i1TjLYCrweKcUjzOoRM5BriA4idrkTej9A9QqTfl3A==} dev: false - /@prisma/engines-version@5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9: - resolution: {integrity: sha512-uCy/++3Jx/O3ufM+qv2H1L4tOemTNqcP/gyEVOlZqTpBvYJUe0tWtW0y3o2Ueq04mll4aM5X3f6ugQftOSLdFQ==} + /@prisma/engines-version@5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102: + resolution: {integrity: sha512-WXCuyoymvrS4zLz4wQagSsc3/nE6CHy8znyiMv8RKazKymOMd5o9FP5RGwGHAtgoxd+aB/BWqxuP/Ckfu7/3MA==} dev: false - /@prisma/engines@5.10.2: - resolution: {integrity: sha512-HkSJvix6PW8YqEEt3zHfCYYJY69CXsNdhU+wna+4Y7EZ+AwzeupMnUThmvaDA7uqswiHkgm5/SZ6/4CStjaGmw==} + /@prisma/engines@5.11.0: + resolution: {integrity: sha512-gbrpQoBTYWXDRqD+iTYMirDlF9MMlQdxskQXbhARhG6A/uFQjB7DZMYocMQLoiZXO/IskfDOZpPoZE8TBQKtEw==} requiresBuild: true dependencies: - '@prisma/debug': 5.10.2 - '@prisma/engines-version': 5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9 - '@prisma/fetch-engine': 5.10.2 - '@prisma/get-platform': 5.10.2 + '@prisma/debug': 5.11.0 + '@prisma/engines-version': 5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102 + '@prisma/fetch-engine': 5.11.0 + '@prisma/get-platform': 5.11.0 dev: false - /@prisma/fetch-engine@5.10.2: - resolution: {integrity: sha512-dSmXcqSt6DpTmMaLQ9K8ZKzVAMH3qwGCmYEZr/uVnzVhxRJ1EbT/w2MMwIdBNq1zT69Rvh0h75WMIi0mrIw7Hg==} + /@prisma/fetch-engine@5.11.0: + resolution: {integrity: sha512-994viazmHTJ1ymzvWugXod7dZ42T2ROeFuH6zHPcUfp/69+6cl5r9u3NFb6bW8lLdNjwLYEVPeu3hWzxpZeC0w==} dependencies: - '@prisma/debug': 5.10.2 - '@prisma/engines-version': 5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9 - '@prisma/get-platform': 5.10.2 + '@prisma/debug': 5.11.0 + '@prisma/engines-version': 5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102 + '@prisma/get-platform': 5.11.0 dev: false - /@prisma/get-platform@5.10.2: - resolution: {integrity: sha512-nqXP6vHiY2PIsebBAuDeWiUYg8h8mfjBckHh6Jezuwej0QJNnjDiOq30uesmg+JXxGk99nqyG3B7wpcOODzXvg==} + /@prisma/get-platform@5.11.0: + resolution: {integrity: sha512-rxtHpMLxNTHxqWuGOLzR2QOyQi79rK1u1XYAVLZxDGTLz/A+uoDnjz9veBFlicrpWjwuieM4N6jcnjj/DDoidw==} dependencies: - '@prisma/debug': 5.10.2 + '@prisma/debug': 5.11.0 dev: false - /@prisma/instrumentation@5.10.2: - resolution: {integrity: sha512-5ncGbvwFQMmubMBbTJ38JS5CEKW5x9GTxVtCk37IQRHyqMdJkLyC86pfPdHHrCsozljG/DBcK/OdND0CF8rfLg==} + /@prisma/instrumentation@5.11.0: + resolution: {integrity: sha512-ou4nvDpNEY6+t3Dn9juOTz6tK33D0Y4XXkEZ2uPd8KH6Mqmc+4LYOOm470DP7noj7dyJjuGiM+wpPk//HKrcDg==} dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/instrumentation': 0.48.0(@opentelemetry/api@1.7.0) - '@opentelemetry/sdk-trace-base': 1.21.0(@opentelemetry/api@1.7.0) + '@opentelemetry/api': 1.8.0 + '@opentelemetry/instrumentation': 0.49.1(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0) transitivePeerDependencies: - supports-color dev: false @@ -6530,17 +6483,13 @@ packages: resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} dependencies: '@babel/runtime': 7.24.0 - - /@radix-ui/primitive@1.0.0: - resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} - dependencies: - '@babel/runtime': 7.24.0 dev: false /@radix-ui/primitive@1.0.1: resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} dependencies: '@babel/runtime': 7.24.0 + dev: false /@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==} @@ -6587,6 +6536,7 @@ packages: '@types/react-dom': 18.2.21 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + dev: false /@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==} @@ -6690,14 +6640,6 @@ packages: '@types/react-dom': 18.2.21 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - - /@radix-ui/react-compose-refs@1.0.0(react@18.2.0): - resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.0 - react: 18.2.0 dev: false /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.64)(react@18.2.0): @@ -6713,15 +6655,6 @@ packages: '@types/react': 18.2.64 react: 18.2.0 - /@radix-ui/react-context@1.0.0(react@18.2.0): - resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.0 - react: 18.2.0 - dev: false - /@radix-ui/react-context@1.0.1(@types/react@18.2.64)(react@18.2.0): resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} peerDependencies: @@ -6734,32 +6667,6 @@ packages: '@babel/runtime': 7.24.0 '@types/react': 18.2.64 react: 18.2.0 - - /@radix-ui/react-dialog@1.0.0(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/primitive': 1.0.0 - '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) - '@radix-ui/react-context': 1.0.0(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.0(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.0(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.0(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.0(react@18.2.0) - '@radix-ui/react-portal': 1.0.0(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.0(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.0(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.0(react@18.2.0) - aria-hidden: 1.2.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.4(@types/react@18.2.64)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' dev: false /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): @@ -6808,25 +6715,10 @@ packages: '@babel/runtime': 7.24.0 '@types/react': 18.2.64 react: 18.2.0 - - /@radix-ui/react-dismissable-layer@1.0.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/primitive': 1.0.0 - '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) - '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.0(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} + /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -6848,10 +6740,10 @@ packages: '@types/react-dom': 18.2.21 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true + dev: false - /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} + /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -6866,101 +6758,31 @@ packages: '@babel/runtime': 7.24.0 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.64)(react@18.2.0) + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.64)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) '@types/react': 18.2.64 '@types/react-dom': 18.2.21 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.64)(react@18.2.0): + resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} peerDependencies: '@types/react': '*' - '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: '@types/react': optional: true - '@types/react-dom': - optional: true dependencies: '@babel/runtime': 7.24.0 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) '@types/react': 18.2.64 - '@types/react-dom': 18.2.21 react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-focus-guards@1.0.0(react@18.2.0): - resolution: {integrity: sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.0 - react: 18.2.0 - dev: false - - /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.64)(react@18.2.0): - resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.0 - '@types/react': 18.2.64 - react: 18.2.0 - - /@radix-ui/react-focus-scope@1.0.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) - '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@types/react': 18.2.64 - '@types/react-dom': 18.2.21 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} peerDependencies: @@ -7021,16 +6843,6 @@ packages: react: 18.2.0 dev: false - /@radix-ui/react-id@1.0.0(react@18.2.0): - resolution: {integrity: sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) - react: 18.2.0 - dev: false - /@radix-ui/react-id@1.0.1(@types/react@18.2.64)(react@18.2.0): resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} peerDependencies: @@ -7044,6 +6856,7 @@ packages: '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.64)(react@18.2.0) '@types/react': 18.2.64 react: 18.2.0 + dev: false /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} @@ -7139,36 +6952,6 @@ packages: react-remove-scroll: 2.5.5(@types/react@18.2.64)(react@18.2.0) dev: false - /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.0 - '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.64 - '@types/react-dom': 18.2.21 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} peerDependencies: @@ -7199,39 +6982,6 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-portal@1.0.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.64 - '@types/react-dom': 18.2.21 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} peerDependencies: @@ -7253,19 +7003,6 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-presence@1.0.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: @@ -7288,18 +7025,6 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-primitive@1.0.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-slot': 1.0.0(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: @@ -7319,6 +7044,7 @@ packages: '@types/react-dom': 18.2.21 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + dev: false /@radix-ui/react-progress@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-5G6Om/tYSxjSeEdrb1VfKkfZfn/1IlPWd731h2RfPuSbIfNUgfqAwbKfJCg/PP6nuUCTrYzalwHSpSinoWoCag==} @@ -7399,6 +7125,7 @@ packages: '@types/react-dom': 18.2.21 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + dev: false /@radix-ui/react-scroll-area@1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw==} @@ -7429,47 +7156,6 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-select@1.2.2(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/number': 1.0.1 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.64 - '@types/react-dom': 18.2.21 - aria-hidden: 1.2.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.64)(react@18.2.0) - dev: true - /@radix-ui/react-select@2.0.0(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==} peerDependencies: @@ -7530,15 +7216,6 @@ packages: '@types/react-dom': 18.2.21 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - - /@radix-ui/react-slot@1.0.0(react@18.2.0): - resolution: {integrity: sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) - react: 18.2.0 dev: false /@radix-ui/react-slot@1.0.2(@types/react@18.2.64)(react@18.2.0): @@ -7642,83 +7319,6 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@types/react': 18.2.64 - '@types/react-dom': 18.2.21 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@types/react': 18.2.64 - '@types/react-dom': 18.2.21 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@radix-ui/react-toolbar@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.64)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-separator': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.64 - '@types/react-dom': 18.2.21 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - /@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==} peerDependencies: @@ -7751,15 +7351,6 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-use-callback-ref@1.0.0(react@18.2.0): - resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.0 - react: 18.2.0 - dev: false - /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.64)(react@18.2.0): resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: @@ -7772,15 +7363,6 @@ packages: '@babel/runtime': 7.24.0 '@types/react': 18.2.64 react: 18.2.0 - - /@radix-ui/react-use-controllable-state@1.0.0(react@18.2.0): - resolution: {integrity: sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) - react: 18.2.0 dev: false /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.64)(react@18.2.0): @@ -7796,15 +7378,6 @@ packages: '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) '@types/react': 18.2.64 react: 18.2.0 - - /@radix-ui/react-use-escape-keydown@1.0.0(react@18.2.0): - resolution: {integrity: sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) - react: 18.2.0 dev: false /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.64)(react@18.2.0): @@ -7820,14 +7393,6 @@ packages: '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) '@types/react': 18.2.64 react: 18.2.0 - - /@radix-ui/react-use-layout-effect@1.0.0(react@18.2.0): - resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.0 - react: 18.2.0 dev: false /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.64)(react@18.2.0): @@ -7842,6 +7407,7 @@ packages: '@babel/runtime': 7.24.0 '@types/react': 18.2.64 react: 18.2.0 + dev: false /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.64)(react@18.2.0): resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} @@ -7855,6 +7421,7 @@ packages: '@babel/runtime': 7.24.0 '@types/react': 18.2.64 react: 18.2.0 + dev: false /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.64)(react@18.2.0): resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} @@ -7869,6 +7436,7 @@ packages: '@radix-ui/rect': 1.0.1 '@types/react': 18.2.64 react: 18.2.0 + dev: false /@radix-ui/react-use-size@1.0.1(@types/react@18.2.64)(react@18.2.0): resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} @@ -7883,6 +7451,7 @@ packages: '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.64)(react@18.2.0) '@types/react': 18.2.64 react: 18.2.0 + dev: false /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} @@ -7903,11 +7472,13 @@ packages: '@types/react-dom': 18.2.21 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + dev: false /@radix-ui/rect@1.0.1: resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} dependencies: '@babel/runtime': 7.24.0 + dev: false /@redis/bloom@1.2.0(@redis/client@1.5.14): resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==} @@ -8076,6 +7647,7 @@ packages: estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 2.78.0 + dev: false /@rollup/pluginutils@5.1.0(rollup@2.79.1): resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} @@ -8092,104 +7664,104 @@ packages: rollup: 2.79.1 dev: true - /@rollup/rollup-android-arm-eabi@4.12.1: - resolution: {integrity: sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==} + /@rollup/rollup-android-arm-eabi@4.13.0: + resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.12.1: - resolution: {integrity: sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==} + /@rollup/rollup-android-arm64@4.13.0: + resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.12.1: - resolution: {integrity: sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==} + /@rollup/rollup-darwin-arm64@4.13.0: + resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.12.1: - resolution: {integrity: sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==} + /@rollup/rollup-darwin-x64@4.13.0: + resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.12.1: - resolution: {integrity: sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==} + /@rollup/rollup-linux-arm-gnueabihf@4.13.0: + resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.12.1: - resolution: {integrity: sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==} + /@rollup/rollup-linux-arm64-gnu@4.13.0: + resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.12.1: - resolution: {integrity: sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==} + /@rollup/rollup-linux-arm64-musl@4.13.0: + resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.12.1: - resolution: {integrity: sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==} + /@rollup/rollup-linux-riscv64-gnu@4.13.0: + resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.12.1: - resolution: {integrity: sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==} + /@rollup/rollup-linux-x64-gnu@4.13.0: + resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.12.1: - resolution: {integrity: sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==} + /@rollup/rollup-linux-x64-musl@4.13.0: + resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.12.1: - resolution: {integrity: sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==} + /@rollup/rollup-win32-arm64-msvc@4.13.0: + resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.12.1: - resolution: {integrity: sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==} + /@rollup/rollup-win32-ia32-msvc@4.13.0: + resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.12.1: - resolution: {integrity: sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==} + /@rollup/rollup-win32-x64-msvc@4.13.0: + resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} cpu: [x64] os: [win32] requiresBuild: true @@ -8206,45 +7778,45 @@ packages: selderee: 0.11.0 dev: false - /@sentry-internal/feedback@7.105.0: - resolution: {integrity: sha512-17doUQFKYgLfG7EmZXjZQ7HR/aBzuLDd+GVaCNthUPyiz/tltV7EFECDWwHpXqzQgYRgroSbY8PruMVujFGUUw==} + /@sentry-internal/feedback@7.107.0: + resolution: {integrity: sha512-okF0B9AJHrpkwNMxNs/Lffw3N5ZNbGwz4uvCfyOfnMxc7E2VfDM18QzUvTBRvNr3bA9wl+InJ+EMG3aZhyPunA==} engines: {node: '>=12'} dependencies: - '@sentry/core': 7.105.0 - '@sentry/types': 7.105.0 - '@sentry/utils': 7.105.0 + '@sentry/core': 7.107.0 + '@sentry/types': 7.107.0 + '@sentry/utils': 7.107.0 dev: false - /@sentry-internal/replay-canvas@7.105.0: - resolution: {integrity: sha512-XMBdkjIDhap5Gwrub5wlUJhuUVJM4aL4lZV8KcxJZZSXgXsnyGYbEh9SPZOHO05jtbxTxVeL3Pik5qtYjdGnPA==} + /@sentry-internal/replay-canvas@7.107.0: + resolution: {integrity: sha512-dmDL9g3QDfo7axBOsVnpiKdJ/DXrdeuRv1AqsLgwzJKvItsv0ZizX0u+rj5b1UoxcwbXRMxJ0hit5a1yt3t/ow==} engines: {node: '>=12'} dependencies: - '@sentry/core': 7.105.0 - '@sentry/replay': 7.105.0 - '@sentry/types': 7.105.0 - '@sentry/utils': 7.105.0 + '@sentry/core': 7.107.0 + '@sentry/replay': 7.107.0 + '@sentry/types': 7.107.0 + '@sentry/utils': 7.107.0 dev: false - /@sentry-internal/tracing@7.105.0: - resolution: {integrity: sha512-b+AFYB7Bc9vmyxl2jbmuT4esX5G0oPfpz35A0sxFzmJIhvMg1YMDNio2c81BtKN+VSPORCnKMLhfk3kyKKvWMQ==} + /@sentry-internal/tracing@7.107.0: + resolution: {integrity: sha512-le9wM8+OHBbq7m/8P7JUJ1UhSPIty+Z/HmRXc5Z64ODZcOwFV6TmDpYx729IXDdz36XUKmeI+BeM7yQdTTZPfQ==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.105.0 - '@sentry/types': 7.105.0 - '@sentry/utils': 7.105.0 + '@sentry/core': 7.107.0 + '@sentry/types': 7.107.0 + '@sentry/utils': 7.107.0 dev: false - /@sentry/browser@7.105.0: - resolution: {integrity: sha512-OlYJzsZG109T1VpZ7O7KXf9IXCUUpp41lkkQM7ICBOBsfiHRUKmV5piTGCG5UgAvyb/gI/I1uQQtO4jthcHKEA==} + /@sentry/browser@7.107.0: + resolution: {integrity: sha512-KnqaQDhxv6w9dJ+mYLsNwPeGZfgbpM3vaismBNyJCKLgWn2V75kxkSq+bDX8LQT/13AyK7iFp317L6P8EuNa3g==} engines: {node: '>=8'} dependencies: - '@sentry-internal/feedback': 7.105.0 - '@sentry-internal/replay-canvas': 7.105.0 - '@sentry-internal/tracing': 7.105.0 - '@sentry/core': 7.105.0 - '@sentry/replay': 7.105.0 - '@sentry/types': 7.105.0 - '@sentry/utils': 7.105.0 + '@sentry-internal/feedback': 7.107.0 + '@sentry-internal/replay-canvas': 7.107.0 + '@sentry-internal/tracing': 7.107.0 + '@sentry/core': 7.107.0 + '@sentry/replay': 7.107.0 + '@sentry/types': 7.107.0 + '@sentry/utils': 7.107.0 dev: false /@sentry/cli@1.77.3: @@ -8264,26 +7836,26 @@ packages: - supports-color dev: false - /@sentry/core@7.105.0: - resolution: {integrity: sha512-5xsaTG6jZincTeJUmZomlv20mVRZUEF1U/g89lmrSOybyk2+opEnB1JeBn4ODwnvmSik8r2QLr6/RiYlaxRJCg==} + /@sentry/core@7.107.0: + resolution: {integrity: sha512-C7ogye6+KPyBi8NVL0P8Rxx3Ur7Td8ufnjxosVy678lqY+dcYPk/HONROrzUFYW5fMKWL4/KYnwP+x9uHnkDmw==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.105.0 - '@sentry/utils': 7.105.0 + '@sentry/types': 7.107.0 + '@sentry/utils': 7.107.0 dev: false - /@sentry/integrations@7.105.0: - resolution: {integrity: sha512-AgzecTkF0o+C4svbroMGA+cW5LRnfFSoJnzF5ltUB67hnX906amlwbOvdkKD3MugYO02nRSjF/eEi26E1HACMA==} + /@sentry/integrations@7.107.0: + resolution: {integrity: sha512-0h2sZcjcdptS2pju1KSF4+sXaRaFTlmAN1ZokFfmfnVTs6cVtIFttUFxTYrwQUEE2knpAV05pz87zg1yfPAfYg==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.105.0 - '@sentry/types': 7.105.0 - '@sentry/utils': 7.105.0 + '@sentry/core': 7.107.0 + '@sentry/types': 7.107.0 + '@sentry/utils': 7.107.0 localforage: 1.10.0 dev: false - /@sentry/nextjs@7.105.0(next@14.1.3)(react@18.2.0): - resolution: {integrity: sha512-v0fkBM3JktQ3EPffsC30kiuyQGim1mLYwCy6CGnascyMN7iCdqtLx51OPenVQmgmDj0dxXGjWGrkAPnuCKGUxQ==} + /@sentry/nextjs@7.107.0(next@14.1.3)(react@18.2.0): + resolution: {integrity: sha512-cGKntMb/svjHx5xWuLEh4sYMPA75c9gXegVeGeibpLUuD9b+LNeL7GaqxQ9dm2CX+Vza7QvHGBO/u+08abpEQA==} engines: {node: '>=8'} peerDependencies: next: ^10.0.8 || ^11.0 || ^12.0 || ^13.0 || ^14.0 @@ -8294,13 +7866,13 @@ packages: optional: true dependencies: '@rollup/plugin-commonjs': 24.0.0(rollup@2.78.0) - '@sentry/core': 7.105.0 - '@sentry/integrations': 7.105.0 - '@sentry/node': 7.105.0 - '@sentry/react': 7.105.0(react@18.2.0) - '@sentry/types': 7.105.0 - '@sentry/utils': 7.105.0 - '@sentry/vercel-edge': 7.105.0 + '@sentry/core': 7.107.0 + '@sentry/integrations': 7.107.0 + '@sentry/node': 7.107.0 + '@sentry/react': 7.107.0(react@18.2.0) + '@sentry/types': 7.107.0 + '@sentry/utils': 7.107.0 + '@sentry/vercel-edge': 7.107.0 '@sentry/webpack-plugin': 1.21.0 chalk: 3.0.0 next: 14.1.3(@babel/core@7.24.0)(react-dom@18.2.0)(react@18.2.0) @@ -8313,60 +7885,60 @@ packages: - supports-color dev: false - /@sentry/node@7.105.0: - resolution: {integrity: sha512-b0QwZ7vT4hcJi6LmNRh3dcaYpLtXnkYXkL0rfhMb8hN8sUx8zuOWFMI7j0cfAloVThUeJVwGyv9dERfzGS2r2w==} + /@sentry/node@7.107.0: + resolution: {integrity: sha512-UZXkG7uThT2YyPW8AOSKRXp1LbVcBHufa4r1XAwBukA2FKO6HHJPjMUgY6DYVQ6k+BmA56CNfVjYrdLbyjBYYA==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.105.0 - '@sentry/core': 7.105.0 - '@sentry/types': 7.105.0 - '@sentry/utils': 7.105.0 + '@sentry-internal/tracing': 7.107.0 + '@sentry/core': 7.107.0 + '@sentry/types': 7.107.0 + '@sentry/utils': 7.107.0 dev: false - /@sentry/react@7.105.0(react@18.2.0): - resolution: {integrity: sha512-t9MXmMC6lNv8Hj+eng6ZQg9UdrmOeds8yh2382d/yOcdLR3yFA/JVga1BiR/P9D/26Y6YVE8DgTcn8gz4xKngg==} + /@sentry/react@7.107.0(react@18.2.0): + resolution: {integrity: sha512-3sXNKcDQjEimxwBPnRkewy3xNLt3KqStMAdDZ/dAF3rviOSVyk80DCQ3P6+HIqeB+IAXqWptg4eSWRA1qNZquA==} engines: {node: '>=8'} peerDependencies: react: 15.x || 16.x || 17.x || 18.x dependencies: - '@sentry/browser': 7.105.0 - '@sentry/core': 7.105.0 - '@sentry/types': 7.105.0 - '@sentry/utils': 7.105.0 + '@sentry/browser': 7.107.0 + '@sentry/core': 7.107.0 + '@sentry/types': 7.107.0 + '@sentry/utils': 7.107.0 hoist-non-react-statics: 3.3.2 react: 18.2.0 dev: false - /@sentry/replay@7.105.0: - resolution: {integrity: sha512-hZD2m6fNL9gorUOaaEpqxeH7zNP4y2Ej0TdieM1HMQ2q9Zrm9yOzk9/7ALfbRLIZFRMFTqo9vvVztLs3E+Hx+g==} + /@sentry/replay@7.107.0: + resolution: {integrity: sha512-BNJDEVaEwr/YnV22qnyVA1almx/3p615m3+KaF8lPo7YleYgJGSJv1auH64j1G8INkrJ0J0wFBujb1EFjMYkxA==} engines: {node: '>=12'} dependencies: - '@sentry-internal/tracing': 7.105.0 - '@sentry/core': 7.105.0 - '@sentry/types': 7.105.0 - '@sentry/utils': 7.105.0 + '@sentry-internal/tracing': 7.107.0 + '@sentry/core': 7.107.0 + '@sentry/types': 7.107.0 + '@sentry/utils': 7.107.0 dev: false - /@sentry/types@7.105.0: - resolution: {integrity: sha512-80o0KMVM+X2Ym9hoQxvJetkJJwkpCg7o6tHHFXI+Rp7fawc2iCMTa0IRQMUiSkFvntQLYIdDoNNuKdzz2PbQGA==} + /@sentry/types@7.107.0: + resolution: {integrity: sha512-H7qcPjPSUWHE/Zf5bR1EE24G0pGVuJgrSx8Tvvl5nKEepswMYlbXHRVSDN0gTk/E5Z7cqf+hUBOpkQgZyps77w==} engines: {node: '>=8'} dev: false - /@sentry/utils@7.105.0: - resolution: {integrity: sha512-YVAV0c2KLM8+VZCicQ/E/P2+J9Vs0hGhrXwV7w6ZEAtvxrg4oF270toL1WRhvcaf8JO4J1v4V+LuU6Txs4uEeQ==} + /@sentry/utils@7.107.0: + resolution: {integrity: sha512-C6PbN5gHh73MRHohnReeQ60N8rrLYa9LciHue3Ru2290eSThg4CzsPnx4SzkGpkSeVlhhptKtKZ+hp/ha3iVuw==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.105.0 + '@sentry/types': 7.107.0 dev: false - /@sentry/vercel-edge@7.105.0: - resolution: {integrity: sha512-BYblGPEIJisV+z1L/xkn9zG+SkrZDF//K4s7Ls/Wt+eWAcMhMy9y6QnKMwcBX3D8j7ylHTgG/70Z2Zpc4mk38A==} + /@sentry/vercel-edge@7.107.0: + resolution: {integrity: sha512-8p4v0QrMus3lVOwfIfevf/F+GuJnkC/0CIyp69FF7RMHb0zvkCmuXBjuski1AMD5aCL+E3e4MEU73UKA5XNqSA==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.105.0 - '@sentry/core': 7.105.0 - '@sentry/types': 7.105.0 - '@sentry/utils': 7.105.0 + '@sentry-internal/tracing': 7.107.0 + '@sentry/core': 7.107.0 + '@sentry/types': 7.107.0 + '@sentry/utils': 7.107.0 dev: false /@sentry/webpack-plugin@1.21.0: @@ -8403,22 +7975,22 @@ packages: engines: {node: '>=18'} dev: true - /@size-limit/file@11.0.2(size-limit@11.0.2): - resolution: {integrity: sha512-874lrMtWYRL+xb/6xzejjwD+krfHTOo+2uFGpZfJScvuNv91Ni2O7k0o09zC70VzCYBGkXquV92ln/H+/ognGg==} + /@size-limit/file@11.1.1(size-limit@11.1.1): + resolution: {integrity: sha512-c4XXp2CLvfx2RfzAqIAlxV6OWAQSVquLMNKKD6x9urJD7knjnTesPkbMcf3SkQbjCY4PlLL6kYhaO9drCWGM6g==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: - size-limit: 11.0.2 + size-limit: 11.1.1 dependencies: - size-limit: 11.0.2 + size-limit: 11.1.1 dev: true /@soluble/dsn-parser@1.9.2: resolution: {integrity: sha512-FgkvHHHSCzjQ1/ouW6Vtw2hy0k5/KWeu116swH5VYX267I4rx+8MCy9/6eZ60IWGIQVNgh0sektKAu0n9gtzzA==} - /@storybook/addon-actions@7.6.17: - resolution: {integrity: sha512-TBphs4v6LRfyTpFo/WINF0TkMaE3rrNog7wW5mbz6n0j8o53kDN4o9ZEcygSL5zQX43CAaghQTeDCss7ueG7ZQ==} + /@storybook/addon-actions@8.0.1: + resolution: {integrity: sha512-qFd1NOI9C16/Jo+7XQQXRsoTzcvKPlT6M5lU47lGLuyLwbZSp5EKxmy8+uKTnyLF/2BTAvOLZ/wYmw+Gj4VzOA==} dependencies: - '@storybook/core-events': 7.6.17 + '@storybook/core-events': 8.0.1 '@storybook/global': 5.0.0 '@types/uuid': 9.0.8 dequal: 2.0.3 @@ -8426,121 +7998,110 @@ packages: uuid: 9.0.1 dev: true - /@storybook/addon-backgrounds@7.6.17: - resolution: {integrity: sha512-7dize7x8+37PH77kmt69b0xSaeDqOcZ4fpzW6+hk53hIaCVU26eGs4+j+743Xva31eOgZWNLupUhOpUDc6SqZw==} + /@storybook/addon-backgrounds@8.0.1: + resolution: {integrity: sha512-A06rUg7yEmyEoRTS8B46CkiUh49lKQ9ipGK323O7S9qkwbXSLvqBQTaKmGstZq6p0begPF1DWaGUxCXfU3qr2g==} dependencies: '@storybook/global': 5.0.0 memoizerific: 1.11.3 ts-dedent: 2.2.0 dev: true - /@storybook/addon-controls@7.6.17(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-zR0aLaUF7FtV/nMRyfniFbCls/e0DAAoXACuOAUAwNAv0lbIS8AyZZiHSmKucCvziUQ6WceeCC7+du3C+9y0rQ==} + /@storybook/addon-controls@8.0.1(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-MadJq5fmFUI1eNkDyJSSqtF/IHD+hv/gS0eFNd9+CIioHaysJG2g7t27lG703BV+Qwzz9ekilKBJ/z0bIuqm8g==} dependencies: - '@storybook/blocks': 7.6.17(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) + '@storybook/blocks': 8.0.1(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) lodash: 4.17.21 ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - - '@types/react-dom' - encoding - react - react-dom - supports-color dev: true - /@storybook/addon-docs@7.6.17(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-FKa4Mdy7nhgvEVZJHpMkHriDzpVHbohn87zv9NCL+Ctjs1iAmzGwxEm0culszyDS1HN2ToVoY0h8CSi2RSSZqA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + /@storybook/addon-docs@8.0.1: + resolution: {integrity: sha512-G03ELd2OEycuYoziwbomIgHGUXNIVU2MoCITU7Q1e2zfFJ4amMab7btHmUm4eTnUChXvzbYIucti3Sp9sQNsKw==} dependencies: - '@jest/transform': 29.7.0 - '@mdx-js/react': 2.3.0(react@18.2.0) - '@storybook/blocks': 7.6.17(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@storybook/client-logger': 7.6.17 - '@storybook/components': 7.6.17(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@storybook/csf-plugin': 7.6.17 - '@storybook/csf-tools': 7.6.17 + '@babel/core': 7.24.0 + '@mdx-js/react': 3.0.1(@types/react@18.2.64)(react@18.2.0) + '@storybook/blocks': 8.0.1(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 8.0.1 + '@storybook/components': 8.0.1(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) + '@storybook/csf-plugin': 8.0.1 + '@storybook/csf-tools': 8.0.1 '@storybook/global': 5.0.0 - '@storybook/mdx2-csf': 1.1.0 - '@storybook/node-logger': 7.6.17 - '@storybook/postinstall': 7.6.17 - '@storybook/preview-api': 7.6.17 - '@storybook/react-dom-shim': 7.6.17(react-dom@18.2.0)(react@18.2.0) - '@storybook/theming': 7.6.17(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.6.17 + '@storybook/node-logger': 8.0.1 + '@storybook/preview-api': 8.0.1 + '@storybook/react-dom-shim': 8.0.1(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 8.0.1(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 8.0.1 + '@types/react': 18.2.64 fs-extra: 11.2.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - remark-external-links: 8.0.0 - remark-slug: 6.1.0 + rehype-external-links: 3.0.0 + rehype-slug: 6.0.0 ts-dedent: 2.2.0 transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - encoding - supports-color dev: true - /@storybook/addon-essentials@7.6.17(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-qlSpamxuYfT2taF953nC9QijGF2pSbg1ewMNpdwLTj16PTZvR/d8NCDMTJujI1bDwM2m18u8Yc43ibh5LEmxCw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@storybook/addon-actions': 7.6.17 - '@storybook/addon-backgrounds': 7.6.17 - '@storybook/addon-controls': 7.6.17(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-docs': 7.6.17(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-highlight': 7.6.17 - '@storybook/addon-measure': 7.6.17 - '@storybook/addon-outline': 7.6.17 - '@storybook/addon-toolbars': 7.6.17 - '@storybook/addon-viewport': 7.6.17 - '@storybook/core-common': 7.6.17 - '@storybook/manager-api': 7.6.17(react-dom@18.2.0)(react@18.2.0) - '@storybook/node-logger': 7.6.17 - '@storybook/preview-api': 7.6.17 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + /@storybook/addon-essentials@8.0.1(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ExN5v9p/08ArWVB1eARWri8UdzaXzZgrPCjV+Ip/Bljh/NYuNOd1PhfQ84IyBOB+RhtlPX9hh7fAdQiDa0MN0g==} + dependencies: + '@storybook/addon-actions': 8.0.1 + '@storybook/addon-backgrounds': 8.0.1 + '@storybook/addon-controls': 8.0.1(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-docs': 8.0.1 + '@storybook/addon-highlight': 8.0.1 + '@storybook/addon-measure': 8.0.1 + '@storybook/addon-outline': 8.0.1 + '@storybook/addon-toolbars': 8.0.1 + '@storybook/addon-viewport': 8.0.1 + '@storybook/core-common': 8.0.1 + '@storybook/manager-api': 8.0.1(react-dom@18.2.0)(react@18.2.0) + '@storybook/node-logger': 8.0.1 + '@storybook/preview-api': 8.0.1 ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - - '@types/react-dom' - encoding + - react + - react-dom - supports-color dev: true - /@storybook/addon-highlight@7.6.17: - resolution: {integrity: sha512-R1yBPUUqGn+60aJakn8q+5Zt34E/gU3n3VmgPdryP0LJUdZ5q1/RZShoVDV+yYQ40htMH6oaCv3OyyPzFAGJ6A==} + /@storybook/addon-highlight@8.0.1: + resolution: {integrity: sha512-7+Q4dpQRbBylFKexSSvyksFqYXTIKMQzIcmL/XirUPKzDenCyuGfhDFWtredsb+kIR4P/Gg9MepMWkfBsoupuA==} dependencies: '@storybook/global': 5.0.0 dev: true - /@storybook/addon-links@7.6.17(react@18.2.0): - resolution: {integrity: sha512-iFUwKObRn0EKI0zMETsil2p9a/81rCuSMEWECsi+khkCAs1FUnD2cT6Ag5ydcNcBXsdtdfDJdtXQrkw+TSoStQ==} + /@storybook/addon-links@8.0.1(react@18.2.0): + resolution: {integrity: sha512-cYAPSr/mO++ZZWcNigfTEDPYshozT0hYpHJ7S5DIhUTZCpv92IDudN0HjYmEQnz4+OdsGaQ6GnITI2Fr8IOfQA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: react: optional: true dependencies: - '@storybook/csf': 0.1.2 + '@storybook/csf': 0.1.3 '@storybook/global': 5.0.0 react: 18.2.0 ts-dedent: 2.2.0 dev: true - /@storybook/addon-measure@7.6.17: - resolution: {integrity: sha512-O5vnHZNkduvZ95jf1UssbOl6ivIxzl5tv+4EpScPYId7w700bxWsJH+QX7ip6KlrCf2o3iUhmPe8bm05ghG2KA==} + /@storybook/addon-measure@8.0.1: + resolution: {integrity: sha512-dHZY8K5FWoEYuIK9+6dwky/IsqCGlNuGEU2gn2Q2OiIzHOveumxMtGQkWk8hrzRnwQB/eMbijbdwd+d0aBJp1w==} dependencies: '@storybook/global': 5.0.0 tiny-invariant: 1.3.3 dev: true - /@storybook/addon-outline@7.6.17: - resolution: {integrity: sha512-9o9JXDsYjNaDgz/cY5+jv694+aik/1aiRGGvsCv68e1p/ob0glkGKav4lnJe2VJqD+gCmaARoD8GOJlhoQl8JQ==} + /@storybook/addon-outline@8.0.1: + resolution: {integrity: sha512-1zPBQ+J4IUjULXlBbf3lLt5nblMUwQiTV6HAjngeczl3pCaZ3Q86lVAURE2K/gmLElsRALX4XoLw8M7hY4iYxQ==} dependencies: '@storybook/global': 5.0.0 ts-dedent: 2.2.0 @@ -8559,20 +8120,20 @@ packages: - webpack dev: true - /@storybook/addon-storysource@7.6.17: - resolution: {integrity: sha512-8SZiIuIkRU9NQM3Y2mmE0m+bqtXQefzW8Z9DkPKwTJSJxVBvMZVMHjRiQcPn8ll6zhqQIaQiBj0ahlR8ZqrnqA==} + /@storybook/addon-storysource@8.0.1: + resolution: {integrity: sha512-kv543xzyK7RnuYcGtZwTgoQZKjELLJ3d/uMwkEPgLFKW20tHWPL0jkBF95yCAFuKxI/vXCSU4k+iy6BP/MMaww==} dependencies: - '@storybook/source-loader': 7.6.17 + '@storybook/source-loader': 8.0.1 estraverse: 5.3.0 tiny-invariant: 1.3.3 dev: true - /@storybook/addon-toolbars@7.6.17: - resolution: {integrity: sha512-UMrchbUHiyWrh6WuGnpy34Jqzkx/63B+MSgb3CW7YsQaXz64kE0Rol0TNSznnB+mYXplcqH+ndI4r4kFsmgwDg==} + /@storybook/addon-toolbars@8.0.1: + resolution: {integrity: sha512-Fa5H+iiQsYtcaF/2RhzTOo9YWMzOhjkl2muPOe3f/a7Z4eR4R4pGmJv/JZ1qfpRk67PoyFcUUkFnNWjBF0yLjQ==} dev: true - /@storybook/addon-viewport@7.6.17: - resolution: {integrity: sha512-sA0QCcf4QAMixWvn8uvRYPfkKCSl6JajJaAspoPqXSxHEpK7uwOlpg3kqFU5XJJPXD0X957M+ONgNvBzYqSpEw==} + /@storybook/addon-viewport@8.0.1: + resolution: {integrity: sha512-8p4oDI1lSicLRhbRSZUCuUAJoJrZ+FG/ccgtEV6y6a4GRMkBbUpoqTMyHQKfDqszFmr7G4lG2HVXYCura8a3zg==} dependencies: memoizerific: 1.11.3 dev: true @@ -8625,28 +8186,34 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/blocks@7.6.17(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-PsNVoe0bX1mMn4Kk3nbKZ0ItDZZ0YJnYAFJ6toAbsyBAbgzg1sce88sQinzvbn58/RT9MPKeWMPB45ZS7ggiNg==} + /@storybook/blocks@8.0.1(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-S1aPjmhS3bTvyAeUNHULWzmuGFJ59DiaV5eGv3Dg5u8BKGlYXGe39wItE4p/KR/OqkwtY5++rFHrWQiJeEP90A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true dependencies: - '@storybook/channels': 7.6.17 - '@storybook/client-logger': 7.6.17 - '@storybook/components': 7.6.17(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.6.17 - '@storybook/csf': 0.1.2 - '@storybook/docs-tools': 7.6.17 + '@storybook/channels': 8.0.1 + '@storybook/client-logger': 8.0.1 + '@storybook/components': 8.0.1(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 8.0.1 + '@storybook/csf': 0.1.3 + '@storybook/docs-tools': 8.0.1 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.6.17(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.6.17 - '@storybook/theming': 7.6.17(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.6.17 - '@types/lodash': 4.14.202 + '@storybook/icons': 1.2.9(react-dom@18.2.0)(react@18.2.0) + '@storybook/manager-api': 8.0.1(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 8.0.1 + '@storybook/theming': 8.0.1(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 8.0.1 + '@types/lodash': 4.17.0 color-convert: 2.0.1 dequal: 2.0.3 lodash: 4.17.21 - markdown-to-jsx: 7.4.1(react@18.2.0) + markdown-to-jsx: 7.3.2(react@18.2.0) memoizerific: 1.11.3 polished: 4.3.1 react: 18.2.0 @@ -8658,38 +8225,34 @@ packages: util-deprecate: 1.0.2 transitivePeerDependencies: - '@types/react' - - '@types/react-dom' - encoding - supports-color dev: true - /@storybook/builder-webpack5@7.6.17(esbuild@0.18.20)(typescript@5.4.2): - resolution: {integrity: sha512-GMaBd8/RzivuAmWrYSt9Rga3j8WLcu5LCMYiPVs+XKXsKAC8lTkV0WRWh8Nk6wTmfzsRQ2acwFjSG5oE4ClZKA==} + /@storybook/builder-webpack5@8.0.1(esbuild@0.20.2)(typescript@5.4.2): + resolution: {integrity: sha512-1UOdF5Ic5Ss86VwcZ5E0h5TJT6hcQTQFF+mjSla3Yy9Q9mvWtyr4xHYnTH7RXNB0cQXbFvaPvQLnBA0aOq/8HQ==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@babel/core': 7.24.0 - '@storybook/channels': 7.6.17 - '@storybook/client-logger': 7.6.17 - '@storybook/core-common': 7.6.17 - '@storybook/core-events': 7.6.17 - '@storybook/core-webpack': 7.6.17 - '@storybook/node-logger': 7.6.17 - '@storybook/preview': 7.6.17 - '@storybook/preview-api': 7.6.17 - '@swc/core': 1.4.5 - '@types/node': 18.19.22 + '@storybook/channels': 8.0.1 + '@storybook/client-logger': 8.0.1 + '@storybook/core-common': 8.0.1 + '@storybook/core-events': 8.0.1 + '@storybook/core-webpack': 8.0.1 + '@storybook/node-logger': 8.0.1 + '@storybook/preview': 8.0.1 + '@storybook/preview-api': 8.0.1 + '@types/node': 18.19.25 '@types/semver': 7.5.8 - babel-loader: 9.1.3(@babel/core@7.24.0)(webpack@5.90.2) browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.2.3 constants-browserify: 1.0.0 css-loader: 6.10.0(webpack@5.90.2) - es-module-lexer: 1.4.1 + es-module-lexer: 1.4.2 express: 4.18.3 fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.4.2)(webpack@5.90.2) fs-extra: 11.2.0 @@ -8699,20 +8262,19 @@ packages: process: 0.11.10 semver: 7.6.0 style-loader: 3.3.4(webpack@5.90.2) - swc-loader: 0.2.6(@swc/core@1.4.5)(webpack@5.90.2) - terser-webpack-plugin: 5.3.10(@swc/core@1.4.5)(esbuild@0.18.20)(webpack@5.90.2) + terser-webpack-plugin: 5.3.10(esbuild@0.20.2)(webpack@5.90.2) ts-dedent: 2.2.0 typescript: 5.4.2 url: 0.11.3 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.90.2(@swc/core@1.4.5)(esbuild@0.18.20) + webpack: 5.90.2(esbuild@0.20.2) webpack-dev-middleware: 6.1.1(webpack@5.90.2) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.5.0 transitivePeerDependencies: - '@rspack/core' - - '@swc/helpers' + - '@swc/core' - encoding - esbuild - supports-color @@ -8750,13 +8312,12 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/channels@7.6.17: - resolution: {integrity: sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==} + /@storybook/channels@8.0.1: + resolution: {integrity: sha512-zKhOOI/NU5w0rMGrGNlWkBLhNq7l33pRej9AJ+4rQcuJ3cc0ONkSktktYK8ThQ49I1ZOn7eS+h0BEmXX1Mr3Qg==} dependencies: - '@storybook/client-logger': 7.6.17 - '@storybook/core-events': 7.6.17 + '@storybook/client-logger': 8.0.1 + '@storybook/core-events': 8.0.1 '@storybook/global': 5.0.0 - qs: 6.12.0 telejson: 7.2.0 tiny-invariant: 1.3.3 dev: true @@ -8774,7 +8335,7 @@ packages: '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/store': 6.5.16(react-dom@18.2.0)(react@18.2.0) - '@types/qs': 6.9.12 + '@types/qs': 6.9.13 '@types/webpack-env': 1.18.4 core-js: 3.36.0 fast-deep-equal: 3.1.3 @@ -8798,8 +8359,8 @@ packages: global: 4.4.0 dev: true - /@storybook/client-logger@7.6.17: - resolution: {integrity: sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==} + /@storybook/client-logger@8.0.1: + resolution: {integrity: sha512-8NgJlVixYQB+c0zduoCAcOtEm4M9y776QKtmXvCaCtxyXl2uCbZFAMy6iai6ctoiVge0xiRaEzIkWKT1pHLDig==} dependencies: '@storybook/global': 5.0.0 dev: true @@ -8822,27 +8383,25 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/components@7.6.17(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-lbh7GynMidA+CZcJnstVku6Nhs+YkqjYaZ+mKPugvlVhGVWv0DaaeQFVuZ8cJtUGJ/5FFU4Y+n+gylYUHkGBMA==} + /@storybook/components@8.0.1(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xrOL0CLirSnzZTtuXD+bgk1+MF36DuTG4ADD89A00dl22Uquo+MHFI9kzqxGtyb7PPpcJQjcgw/1WoSMSepPvQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@radix-ui/react-select': 1.2.2(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-toolbar': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) - '@storybook/client-logger': 7.6.17 - '@storybook/csf': 0.1.2 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.64)(react@18.2.0) + '@storybook/client-logger': 8.0.1 + '@storybook/csf': 0.1.3 '@storybook/global': 5.0.0 - '@storybook/theming': 7.6.17(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.6.17 + '@storybook/icons': 1.2.9(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 8.0.1(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 8.0.1 memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - use-resize-observer: 9.1.0(react-dom@18.2.0)(react@18.2.0) util-deprecate: 1.0.2 transitivePeerDependencies: - '@types/react' - - '@types/react-dom' dev: true /@storybook/core-client@6.5.16(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.2)(webpack@5.90.2): @@ -8879,14 +8438,7 @@ packages: typescript: 5.4.2 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.90.2(@swc/core@1.4.5)(esbuild@0.18.20) - dev: true - - /@storybook/core-client@7.6.17: - resolution: {integrity: sha512-LuDbADK+DPNAOOCXOlvY09hdGVueXlDetsdOJ/DgYnSa9QSWv9Uv+F8QcEgR3QckZJbPlztKJIVLgP2n/Xkijw==} - dependencies: - '@storybook/client-logger': 7.6.17 - '@storybook/preview-api': 7.6.17 + webpack: 5.90.2(esbuild@0.20.2) dev: true /@storybook/core-common@6.5.16(eslint@8.57.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.2): @@ -8923,7 +8475,7 @@ packages: '@babel/register': 7.23.7(@babel/core@7.24.0) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 - '@types/node': 16.18.87 + '@types/node': 16.18.90 '@types/pretty-hrtime': 1.0.3 babel-loader: 8.3.0(@babel/core@7.24.0)(webpack@4.47.0) babel-plugin-macros: 3.1.0 @@ -8960,19 +8512,20 @@ packages: - webpack-command dev: true - /@storybook/core-common@7.6.17: - resolution: {integrity: sha512-me2TP3Q9/qzqCLoDHUSsUF+VS1MHxfHbTVF6vAz0D/COTxzsxLpu9TxTbzJoBCxse6XRb6wWI1RgF1mIcjic7g==} + /@storybook/core-common@8.0.1: + resolution: {integrity: sha512-+t9qyJ/b/yRDCsp6zW68NsViieqCUuH6S8BpbSPWnkuGTYp98BMMGQoY4cqufUcFPuDYMzwAN7wQ5/iM5b7DYQ==} dependencies: - '@storybook/core-events': 7.6.17 - '@storybook/node-logger': 7.6.17 - '@storybook/types': 7.6.17 - '@types/find-cache-dir': 3.2.1 - '@types/node': 18.19.22 - '@types/node-fetch': 2.6.11 - '@types/pretty-hrtime': 1.0.3 + '@storybook/core-events': 8.0.1 + '@storybook/csf-tools': 8.0.1 + '@storybook/node-logger': 8.0.1 + '@storybook/types': 8.0.1 + '@yarnpkg/fslib': 2.10.3 + '@yarnpkg/libzip': 2.3.0 chalk: 4.1.2 - esbuild: 0.18.20 - esbuild-register: 3.5.0(esbuild@0.18.20) + cross-spawn: 7.0.3 + esbuild: 0.20.2 + esbuild-register: 3.5.0(esbuild@0.20.2) + execa: 5.1.1 file-system-cache: 2.3.0 find-cache-dir: 3.3.2 find-up: 5.0.0 @@ -8985,7 +8538,11 @@ packages: pkg-dir: 5.0.0 pretty-hrtime: 1.0.3 resolve-from: 5.0.0 + semver: 7.6.0 + tempy: 1.0.1 + tiny-invariant: 1.3.3 ts-dedent: 2.2.0 + util: 0.12.5 transitivePeerDependencies: - encoding - supports-color @@ -8997,45 +8554,45 @@ packages: core-js: 3.36.0 dev: true - /@storybook/core-events@7.6.17: - resolution: {integrity: sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==} + /@storybook/core-events@8.0.1: + resolution: {integrity: sha512-AI8W9YNNXtkC9W1wL+LV2M/hd4SJWVOGNFhwf+bGSFfGb9NLl23CIBWg8XgYVpTtil3etw5ODDgykEmUBcKsKw==} dependencies: ts-dedent: 2.2.0 dev: true - /@storybook/core-webpack@7.6.17: - resolution: {integrity: sha512-PyGrFhRM8sTONGwwLWLqBQ1HO+LBnVZ+5TOQO7ejQfdV2FWyNOzjBXm2e5jL/C6XlqiEhmL5pyHEyDBaQJQ3KA==} + /@storybook/core-webpack@8.0.1: + resolution: {integrity: sha512-QiZYA6mDgfInk10s2pXwSCGIgaUWeix/eo9Iizby3uGlNIu3XOfqfxvCwAE5EjlpLOaUdUbrB9UYr57k0x1PAg==} dependencies: - '@storybook/core-common': 7.6.17 - '@storybook/node-logger': 7.6.17 - '@storybook/types': 7.6.17 - '@types/node': 18.19.22 + '@storybook/core-common': 8.0.1 + '@storybook/node-logger': 8.0.1 + '@storybook/types': 8.0.1 + '@types/node': 18.19.25 ts-dedent: 2.2.0 transitivePeerDependencies: - encoding - supports-color dev: true - /@storybook/csf-plugin@7.6.17: - resolution: {integrity: sha512-xTHv9BUh3bkDVCvcbmdfVF0/e96BdrEgqPJ3G3RmKbSzWLOkQ2U9yiPfHzT0KJWPhVwj12fjfZp0zunu+pcS6Q==} + /@storybook/csf-plugin@8.0.1: + resolution: {integrity: sha512-n3CEGP64gNUjyTKwByS5fpi7TnmUECsLpWH7KE/mpJVRm4omu/xlS1mEgikOxWFgxlXzotM1mAvjeWidvnMq/g==} dependencies: - '@storybook/csf-tools': 7.6.17 - unplugin: 1.8.3 + '@storybook/csf-tools': 8.0.1 + unplugin: 1.10.0 transitivePeerDependencies: - supports-color dev: true - /@storybook/csf-tools@7.6.17: - resolution: {integrity: sha512-dAQtam0EBPeTJYcQPLxXgz4L9JFqD+HWbLFG9CmNIhMMjticrB0mpk1EFIS6vPXk/VsVWpBgMLD7dZlD6YMKcQ==} + /@storybook/csf-tools@8.0.1: + resolution: {integrity: sha512-jG7dP0DsYpV+sdp/EV0/mcuZ6bzaTRsX3N/vZySKTRCvef72IGyxAeZrAg4OoOla0B2t/wxc8RZCG8NGaxHu4Q==} dependencies: '@babel/generator': 7.23.6 '@babel/parser': 7.24.0 '@babel/traverse': 7.24.0 '@babel/types': 7.24.0 - '@storybook/csf': 0.1.2 - '@storybook/types': 7.6.17 + '@storybook/csf': 0.1.3 + '@storybook/types': 8.0.1 fs-extra: 11.2.0 - recast: 0.23.5 + recast: 0.23.6 ts-dedent: 2.2.0 transitivePeerDependencies: - supports-color @@ -9053,18 +8610,18 @@ packages: lodash: 4.17.21 dev: true - /@storybook/csf@0.1.2: - resolution: {integrity: sha512-ePrvE/pS1vsKR9Xr+o+YwdqNgHUyXvg+1Xjx0h9LrVx7Zq4zNe06pd63F5EvzTbCbJsHj7GHr9tkiaqm7U8WRA==} + /@storybook/csf@0.1.3: + resolution: {integrity: sha512-IPZvXXo4b3G+gpmgBSBqVM81jbp2ePOKsvhgJdhyZJtkYQCII7rg9KKLQhvBQM5sLaF1eU6r0iuwmyynC9d9SA==} dependencies: type-fest: 2.19.0 dev: true - /@storybook/docs-tools@7.6.17: - resolution: {integrity: sha512-bYrLoj06adqklyLkEwD32C0Ww6t+9ZVvrJHiVT42bIhTRpFiFPAetl1a9KPHtFLnfduh4n2IxIr1jv32ThPDTA==} + /@storybook/docs-tools@8.0.1: + resolution: {integrity: sha512-xgCe0wB3wHS+uD5xxl1vH5W6/BhvNkEkUtcfpEgA7XUkBqymLq+A6aMuKBNDi/rQI2KLnq8INirFrKaSZXKcmQ==} dependencies: - '@storybook/core-common': 7.6.17 - '@storybook/preview-api': 7.6.17 - '@storybook/types': 7.6.17 + '@storybook/core-common': 8.0.1 + '@storybook/preview-api': 8.0.1 + '@storybook/types': 8.0.1 '@types/doctrine': 0.0.3 assert: 2.1.0 doctrine: 3.0.0 @@ -9078,17 +8635,28 @@ packages: resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} dev: true - /@storybook/manager-api@7.6.17(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-IJIV1Yc6yw1dhCY4tReHCfBnUKDqEBnMyHp3mbXpsaHxnxJZrXO45WjRAZIKlQKhl/Ge1CrnznmHRCmYgqmrWg==} + /@storybook/icons@1.2.9(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-cOmylsz25SYXaJL/gvTk/dl3pyk7yBFRfeXTsHvTA3dfhoU/LWSq0NKL9nM7WBasJyn6XPSGnLS4RtKXLw5EUg==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@storybook/manager-api@8.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-LEUU8ueHAl8Vg8/NJjuMkqU+CQKhlACSphxMk4P6LWcmRl26/4lzcecH31NflxyjDt+HmCNji3mG81MhrBur9g==} dependencies: - '@storybook/channels': 7.6.17 - '@storybook/client-logger': 7.6.17 - '@storybook/core-events': 7.6.17 - '@storybook/csf': 0.1.2 + '@storybook/channels': 8.0.1 + '@storybook/client-logger': 8.0.1 + '@storybook/core-events': 8.0.1 + '@storybook/csf': 0.1.3 '@storybook/global': 5.0.0 - '@storybook/router': 7.6.17 - '@storybook/theming': 7.6.17(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.6.17 + '@storybook/router': 8.0.1 + '@storybook/theming': 8.0.1(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 8.0.1 dequal: 2.0.3 lodash: 4.17.21 memoizerific: 1.11.3 @@ -9100,7 +8668,7 @@ packages: - react-dom dev: true - /@storybook/manager-webpack5@6.5.16(@swc/core@1.4.5)(esbuild@0.18.20)(eslint@8.57.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.2): + /@storybook/manager-webpack5@6.5.16(esbuild@0.20.2)(eslint@8.57.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.2): resolution: {integrity: sha512-OtxXv8JCe0r/0rE5HxaFicsNsXA+fqZxzokxquFFgrYf/1Jg4d7QX6/pG5wINF+5qInJfVkRG6xhPzv1s5bk9Q==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -9119,7 +8687,7 @@ packages: '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0)(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0)(react@18.2.0) - '@types/node': 16.18.87 + '@types/node': 16.18.90 babel-loader: 8.3.0(@babel/core@7.24.0)(webpack@5.90.2) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 @@ -9138,11 +8706,11 @@ packages: resolve-from: 5.0.0 style-loader: 2.0.0(webpack@5.90.2) telejson: 6.0.8 - terser-webpack-plugin: 5.3.10(@swc/core@1.4.5)(esbuild@0.18.20)(webpack@5.90.2) + terser-webpack-plugin: 5.3.10(esbuild@0.20.2)(webpack@5.90.2) ts-dedent: 2.2.0 typescript: 5.4.2 util-deprecate: 1.0.2 - webpack: 5.90.2(@swc/core@1.4.5)(esbuild@0.18.20) + webpack: 5.90.2(esbuild@0.20.2) webpack-dev-middleware: 4.3.0(webpack@5.90.2) webpack-virtual-modules: 0.4.6 transitivePeerDependencies: @@ -9158,10 +8726,6 @@ packages: - webpack-command dev: true - /@storybook/mdx2-csf@1.1.0: - resolution: {integrity: sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==} - dev: true - /@storybook/node-logger@6.5.16: resolution: {integrity: sha512-YjhBKrclQtjhqFNSO+BZK+RXOx6EQypAELJKoLFaawg331e8VUfvUuRCNB3fcEWp8G9oH13PQQte0OTjLyyOYg==} dependencies: @@ -9172,29 +8736,25 @@ packages: pretty-hrtime: 1.0.3 dev: true - /@storybook/node-logger@7.6.17: - resolution: {integrity: sha512-w59MQuXhhUNrUVmVkXhMwIg2nvFWjdDczLTwYLorhfsE36CWeUOY5QCZWQy0Qf/h+jz8Uo7Evy64qn18v9C4wA==} - dev: true - - /@storybook/postinstall@7.6.17: - resolution: {integrity: sha512-WaWqB8o9vUc9aaVls+povQSVirf1Xd1LZcVhUKfAocAF3mzYUsnJsVqvnbjRj/F96UFVihOyDt9Zjl/9OvrCvQ==} + /@storybook/node-logger@8.0.1: + resolution: {integrity: sha512-uYWKSz9NhLOe2O60sJ4UPT1nzvbH0oR/YjK+OP3B4BySa6e195xY/5Uhou4lEaPSNU/0XXaLHCYeXjqeBjZopA==} dev: true - /@storybook/preview-api@7.6.17: - resolution: {integrity: sha512-wLfDdI9RWo1f2zzFe54yRhg+2YWyxLZvqdZnSQ45mTs4/7xXV5Wfbv3QNTtcdw8tT3U5KRTrN1mTfTCiRJc0Kw==} + /@storybook/preview-api@8.0.1: + resolution: {integrity: sha512-grIox2BWEzaxXfBTIc/ODO/DerGk8PGdH6T/GIDgRxbunWndfVRT57j9sUfXuYn7nb4fPFSFD7N3gYhznpslHg==} dependencies: - '@storybook/channels': 7.6.17 - '@storybook/client-logger': 7.6.17 - '@storybook/core-events': 7.6.17 - '@storybook/csf': 0.1.2 + '@storybook/channels': 8.0.1 + '@storybook/client-logger': 8.0.1 + '@storybook/core-events': 8.0.1 + '@storybook/csf': 0.1.3 '@storybook/global': 5.0.0 - '@storybook/types': 7.6.17 - '@types/qs': 6.9.12 + '@storybook/types': 8.0.1 + '@types/qs': 6.9.13 dequal: 2.0.3 lodash: 4.17.21 memoizerific: 1.11.3 qs: 6.12.0 - synchronous-promise: 2.0.17 + tiny-invariant: 1.3.3 ts-dedent: 2.2.0 util-deprecate: 1.0.2 dev: true @@ -9225,12 +8785,12 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/preview@7.6.17: - resolution: {integrity: sha512-LvkMYK/y6alGjwRVNDIKL1lFlbyZ0H0c8iAbcQkiMoaFiujMQyVswMDKlWcj42Upfr/B1igydiruomc+eUt0mw==} + /@storybook/preview@8.0.1: + resolution: {integrity: sha512-HSYwtMFJPJuNPfrBizCjDH/P8ZcyzBpgQg+/D6xcI4odSY7j2ub7QWCvbrSv1/llp0lMHDDRsFyT847qRPgwuQ==} dev: true - /@storybook/react-dom-shim@7.6.17(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-32Sa/G+WnvaPiQ1Wvjjw5UM9rr2c4GDohwCcWVv3/LJuiFPqNS6zglAtmnsrlIBnUwRBMLMh/ekCTdqMiUmfDw==} + /@storybook/react-dom-shim@8.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-WQJiImmR4ToJTLYICwm50c3c8+vv3PFzvkoW+sMxQbYoJBJM8lfvbvsQu80aedG6C1VGEMe68mXSXSQqTvL+bA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -9239,27 +8799,26 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/react@7.6.17(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.2): - resolution: {integrity: sha512-lVqzQSU03rRJWYW+gK2gq6mSo3/qtnVICY8B8oP7gc36jVu4ksDIu45bTfukM618ODkUZy0vZe6T4engK3azjA==} - engines: {node: '>=16.0.0'} + /@storybook/react@8.0.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.2): + resolution: {integrity: sha512-8d3nklcf2ePC/23kPVdKyQGjCfgnOeETU3b/DxA3bBE6T9EkiknjH4JJebBkmYh21oMgDYn5RpCrP73niyc0MQ==} + engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: '*' + typescript: '>= 4.2.x' peerDependenciesMeta: typescript: optional: true dependencies: - '@storybook/client-logger': 7.6.17 - '@storybook/core-client': 7.6.17 - '@storybook/docs-tools': 7.6.17 + '@storybook/client-logger': 8.0.1 + '@storybook/docs-tools': 8.0.1 '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.6.17 - '@storybook/react-dom-shim': 7.6.17(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.6.17 + '@storybook/preview-api': 8.0.1 + '@storybook/react-dom-shim': 8.0.1(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 8.0.1 '@types/escodegen': 0.0.6 '@types/estree': 0.0.51 - '@types/node': 18.19.22 + '@types/node': 18.19.25 acorn: 7.4.1 acorn-jsx: 5.3.2(acorn@7.4.1) acorn-walk: 7.2.0 @@ -9270,6 +8829,7 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-element-to-jsx-string: 15.0.0(react-dom@18.2.0)(react@18.2.0) + semver: 7.6.0 ts-dedent: 2.2.0 type-fest: 2.19.0 typescript: 5.4.2 @@ -9294,10 +8854,10 @@ packages: regenerator-runtime: 0.13.11 dev: true - /@storybook/router@7.6.17: - resolution: {integrity: sha512-GnyC0j6Wi5hT4qRhSyT8NPtJfGmf82uZw97LQRWeyYu5gWEshUdM7aj40XlNiScd5cZDp0owO1idduVF2k2l2A==} + /@storybook/router@8.0.1: + resolution: {integrity: sha512-lTh0veiuQIygavalQu+n/fqZoyR1RoM6kLMPg9xLfH30aFL8I+e4G9Iq9782EguSMK1ya+QYjNe7Zo/CZCfezw==} dependencies: - '@storybook/client-logger': 7.6.17 + '@storybook/client-logger': 8.0.1 memoizerific: 1.11.3 qs: 6.12.0 dev: true @@ -9311,14 +8871,14 @@ packages: find-up: 4.1.0 dev: true - /@storybook/source-loader@7.6.17: - resolution: {integrity: sha512-90v1es7dHmHgkGbflPlaRBYcn2+mqdC8OG4QtyYqOUq6xsLsyg+5CX2rupfHbuSLw9r0A3o1ViOII2J/kWtFow==} + /@storybook/source-loader@8.0.1: + resolution: {integrity: sha512-YBqVBCwiaw8g42/cCSsL3MlWLZWbSwWipj4/JxYG1/vmbxEpKbUwh0MPw8fITLbLw9OoQkKud8yG/IqSt/L8uw==} dependencies: - '@storybook/csf': 0.1.2 - '@storybook/types': 7.6.17 + '@storybook/csf': 0.1.3 + '@storybook/types': 8.0.1 estraverse: 5.3.0 lodash: 4.17.21 - prettier: 2.8.8 + prettier: 3.2.5 dev: true /@storybook/store@6.5.16(react-dom@18.2.0)(react@18.2.0): @@ -9360,25 +8920,29 @@ packages: regenerator-runtime: 0.13.11 dev: true - /@storybook/theming@7.6.17(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-ZbaBt3KAbmBtfjNqgMY7wPMBshhSJlhodyMNQypv+95xLD/R+Az6aBYbpVAOygLaUQaQk4ar7H/Ww6lFIoiFbA==} + /@storybook/theming@8.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-TUmSHRh3YrpJ25DYjD+9PpJaq9Qf9P1S2xpwfNARM9r2KpkMF1/RgqnnQgZpP9od0Tzvkji7XPzxPU//EmQKEA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true dependencies: '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) - '@storybook/client-logger': 7.6.17 + '@storybook/client-logger': 8.0.1 '@storybook/global': 5.0.0 memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/types@7.6.17: - resolution: {integrity: sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==} + /@storybook/types@8.0.1: + resolution: {integrity: sha512-JfNWLg+/dcLgLmIyTVSkM42cYgwhdIfMoLyhA1XR62Ssb9/PyuicLJYKSKS9blTkPtVEYJqcz51fmE9K67ym4w==} dependencies: - '@storybook/channels': 7.6.17 - '@types/babel__core': 7.20.5 + '@storybook/channels': 8.0.1 '@types/express': 4.17.21 file-system-cache: 2.3.0 dev: true @@ -9584,88 +9148,88 @@ packages: - typescript dev: true - /@swc/core-darwin-arm64@1.4.5: - resolution: {integrity: sha512-toMSkbByHNfGXESyY1aiq5L3KutgijrNWB/THgdHIA1aIbwtrgMdFQfxpSE+INuuvWYi/Fxarv86EnU7ewbI0Q==} + /@swc/core-darwin-arm64@1.4.8: + resolution: {integrity: sha512-hhQCffRTgzpTIbngSnC30vV6IJVTI9FFBF954WEsshsecVoCGFiMwazBbrkLG+RwXENTrMhgeREEFh6R3KRgKQ==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@swc/core-darwin-x64@1.4.5: - resolution: {integrity: sha512-LN8cbnmb4Gav8UcbBc+L/DEthmzCWZz22rQr6fIEHMN+f0d71fuKnV0ca0hoKbpZn33dlzUmXQE53HRjlRUQbw==} + /@swc/core-darwin-x64@1.4.8: + resolution: {integrity: sha512-P3ZBw8Jr8rKhY/J8d+6WqWriqngGTgHwtFeJ8MIakQJTbdYbFgXSZxcvDiERg3psbGeFXaUaPI0GO6BXv9k/OQ==} engines: {node: '>=10'} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@swc/core-linux-arm-gnueabihf@1.4.5: - resolution: {integrity: sha512-suRFkhBWmOQxlM4frpos1uqjmHfaEI8FuJ0LL5+yRE7IunNDeQJBKujGZt6taeuxo1KqC0N0Ajr8IluN2wrKpA==} + /@swc/core-linux-arm-gnueabihf@1.4.8: + resolution: {integrity: sha512-PP9JIJt19bUWhAGcQW6qMwTjZOcMyzkvZa0/LWSlDm0ORYVLmDXUoeQbGD3e0Zju9UiZxyulnpjEN0ZihJgPTA==} engines: {node: '>=10'} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-arm64-gnu@1.4.5: - resolution: {integrity: sha512-mLKxasQArDGmR6k9c0tkPVUdoo8VfUecocMG1Mx9NYvpidJNaZ3xq9nYM77v7uq1fQqrs/59DM1fJTNRWvv/UQ==} + /@swc/core-linux-arm64-gnu@1.4.8: + resolution: {integrity: sha512-HvEWnwKHkoVUr5iftWirTApFJ13hGzhAY2CMw4lz9lur2m+zhPviRRED0FCI6T95Knpv7+8eUOr98Z7ctrG6DQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-arm64-musl@1.4.5: - resolution: {integrity: sha512-pgKuyRP7S29U/HMDTx+x8dFcklWxwB9cHFNCNWSE6bS4vHR93jc4quwPX9OEQX5CVHxm+c8+xof043I4OGkAXw==} + /@swc/core-linux-arm64-musl@1.4.8: + resolution: {integrity: sha512-kY8+qa7k/dEeBq9p0Hrta18QnJPpsiJvDQSLNaTIFpdM3aEM9zbkshWz8gaX5VVGUEALowCBUWqmzO4VaqM+2w==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-gnu@1.4.5: - resolution: {integrity: sha512-srR+YN86Oerzoghd0DPCzTbTp08feeJPSr9kkNdmtQWENOa4l/9cJV3+XY6vviw0sEjezPmYnc3SwRxJRaxvEw==} + /@swc/core-linux-x64-gnu@1.4.8: + resolution: {integrity: sha512-0WWyIw432wpO/zeGblwq4f2YWam4pn8Z/Ig4KzHMgthR/KmiLU3f0Z7eo45eVmq5vcU7Os1zi/Zb65OOt09q/w==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-musl@1.4.5: - resolution: {integrity: sha512-aSf41LZtDeG5VXI4RCnzcu0UInPyNm3ip8Kw+sCK+sSqW9o7DgBkyqqbip3RZq84fNUHBQQQQdKXetltsyRRqw==} + /@swc/core-linux-x64-musl@1.4.8: + resolution: {integrity: sha512-p4yxvVS05rBNCrBaSTa20KK88vOwtg8ifTW7ec/yoab0bD5EwzzB8KbDmLLxE6uziFa0sdjF0dfRDwSZPex37Q==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-win32-arm64-msvc@1.4.5: - resolution: {integrity: sha512-vU3k8JwRUlTkJMfJQY9E4VvLrsIFOpfhnvbuXB84Amo1cJsz+bYQcC6RSvY7qpaDzDKFdUGbJco4uZTRoRf7Mg==} + /@swc/core-win32-arm64-msvc@1.4.8: + resolution: {integrity: sha512-jKuXihxAaqUnbFfvPxtmxjdJfs87F1GdBf33il+VUmSyWCP4BE6vW+/ReDAe8sRNsKyrZ3UH1vI5q1n64csBUA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@swc/core-win32-ia32-msvc@1.4.5: - resolution: {integrity: sha512-856YRh3frRK2XbrSjDOFBgoAqWJLNRkaEtfGzXfeEoyJlOz0BFsSJHxKlHAFkxRfHe2li9DJRUQFTEhXn4OUWw==} + /@swc/core-win32-ia32-msvc@1.4.8: + resolution: {integrity: sha512-O0wT4AGHrX8aBeH6c2ADMHgagAJc5Kf6W48U5moyYDAkkVnKvtSc4kGhjWhe1Yl0sI0cpYh2In2FxvYsb44eWw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@swc/core-win32-x64-msvc@1.4.5: - resolution: {integrity: sha512-j1+kV7jmWY1+NbXAvxAEW165781yLXVZKLcoXIZKmw18EatqMF6w8acg1gDG8C+Iw5aWLkRZVS4pijSh7+DtCQ==} + /@swc/core-win32-x64-msvc@1.4.8: + resolution: {integrity: sha512-C2AYc3A2o+ECciqsJWRgIpp83Vk5EaRzHe7ed/xOWzVd0MsWR+fweEsyOjlmzHfpUxJSi46Ak3/BIZJlhZbXbg==} engines: {node: '>=10'} cpu: [x64] os: [win32] requiresBuild: true optional: true - /@swc/core@1.4.5: - resolution: {integrity: sha512-4/JGkG4b1Z/QwCGgx+Ub46MlzrsZvBk5JSkxm9PcZ4bSX81c+4Y94Xm3iLp5Ka8NxzS5rD4mJSpcYuN3Tw0ceg==} + /@swc/core@1.4.8: + resolution: {integrity: sha512-uY2RSJcFPgNOEg12RQZL197LZX+MunGiKxsbxmh22VfVxrOYGRvh4mPANFlrD1yb38CgmW1wI6YgIi8LkIwmWg==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -9675,18 +9239,18 @@ packages: optional: true dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.5 + '@swc/types': 0.1.6 optionalDependencies: - '@swc/core-darwin-arm64': 1.4.5 - '@swc/core-darwin-x64': 1.4.5 - '@swc/core-linux-arm-gnueabihf': 1.4.5 - '@swc/core-linux-arm64-gnu': 1.4.5 - '@swc/core-linux-arm64-musl': 1.4.5 - '@swc/core-linux-x64-gnu': 1.4.5 - '@swc/core-linux-x64-musl': 1.4.5 - '@swc/core-win32-arm64-msvc': 1.4.5 - '@swc/core-win32-ia32-msvc': 1.4.5 - '@swc/core-win32-x64-msvc': 1.4.5 + '@swc/core-darwin-arm64': 1.4.8 + '@swc/core-darwin-x64': 1.4.8 + '@swc/core-linux-arm-gnueabihf': 1.4.8 + '@swc/core-linux-arm64-gnu': 1.4.8 + '@swc/core-linux-arm64-musl': 1.4.8 + '@swc/core-linux-x64-gnu': 1.4.8 + '@swc/core-linux-x64-musl': 1.4.8 + '@swc/core-win32-arm64-msvc': 1.4.8 + '@swc/core-win32-ia32-msvc': 1.4.8 + '@swc/core-win32-x64-msvc': 1.4.8 /@swc/counter@0.1.3: resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} @@ -9697,8 +9261,10 @@ packages: tslib: 2.6.2 dev: false - /@swc/types@0.1.5: - resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} + /@swc/types@0.1.6: + resolution: {integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==} + dependencies: + '@swc/counter': 0.1.3 /@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.1): resolution: {integrity: sha512-8QPrypskfBa7QIMuKHg2TA7BqES6vhBrDLOv8Unb6FcFyd3TjKbc6lcmb9UPQHxfl24sXoJ41ux/H7qQQvfaSQ==} @@ -9781,7 +9347,7 @@ packages: pretty-format: 27.5.1 dev: true - /@testing-library/jest-dom@6.4.2(vitest@1.3.1): + /@testing-library/jest-dom@6.4.2(vitest@1.4.0): resolution: {integrity: sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} peerDependencies: @@ -9810,7 +9376,7 @@ packages: dom-accessibility-api: 0.6.3 lodash: 4.17.21 redent: 3.0.0 - vitest: 1.3.1(@types/node@20.9.0)(happy-dom@13.6.2) + vitest: 1.4.0(@types/node@20.9.0)(happy-dom@14.0.0) dev: true /@testing-library/react@14.2.1(react-dom@18.2.0)(react@18.2.0): @@ -9879,35 +9445,6 @@ packages: resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} dev: true - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - dependencies: - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 - '@types/babel__generator': 7.6.8 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 - dev: true - - /@types/babel__generator@7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} - dependencies: - '@babel/types': 7.24.0 - dev: true - - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - dependencies: - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 - dev: true - - /@types/babel__traverse@7.20.5: - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@types/bcrypt@5.0.2: resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==} dependencies: @@ -10031,6 +9568,10 @@ packages: dev: false optional: true + /@types/emscripten@1.39.10: + resolution: {integrity: sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw==} + dev: true + /@types/escodegen@0.0.6: resolution: {integrity: sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==} dev: true @@ -10069,7 +9610,7 @@ packages: resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} dependencies: '@types/node': 20.9.0 - '@types/qs': 6.9.12 + '@types/qs': 6.9.13 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 dev: true @@ -10085,14 +9626,10 @@ packages: dependencies: '@types/body-parser': 1.19.5 '@types/express-serve-static-core': 4.17.43 - '@types/qs': 6.9.12 + '@types/qs': 6.9.13 '@types/serve-static': 1.15.5 dev: true - /@types/find-cache-dir@3.2.1: - resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==} - dev: true - /@types/fs-extra@11.0.4: resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} dependencies: @@ -10100,12 +9637,6 @@ packages: '@types/node': 20.9.0 dev: true - /@types/graceful-fs@4.1.9: - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - dependencies: - '@types/node': 20.9.0 - dev: true - /@types/hammerjs@2.0.45: resolution: {integrity: sha512-qkcUlZmX6c4J8q45taBKTL3p+LbITgyx7qhlPYOdOHZB7B31K0mXbP5YA7i7SgDeEGuI9MnumiKPEMrxg8j3KQ==} dev: true @@ -10152,18 +9683,6 @@ packages: resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} dev: true - /@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - dev: true - - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - dependencies: - '@types/istanbul-lib-report': 3.0.3 - dev: true - /@types/js-cookie@2.2.7: resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} dev: false @@ -10196,8 +9715,8 @@ packages: resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} dev: true - /@types/lodash@4.14.202: - resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + /@types/lodash@4.17.0: + resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} dev: true /@types/markdown-it@13.0.7: @@ -10266,12 +9785,12 @@ packages: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} dev: true - /@types/node@16.18.87: - resolution: {integrity: sha512-+IzfhNirR/MDbXz6Om5eHV54D9mQlEMGag6AgEzlju0xH3M8baCXYwqQ6RKgGMpn9wSTx6Ltya/0y4Z8eSfdLw==} + /@types/node@16.18.90: + resolution: {integrity: sha512-ofx8kJGTumXmOfYHrJckfdunEiEoq6Aa8x3JKVtGS25z/DTV/fUqIolnHPssDs8P3fq2ZWayNwkAWEk/RmdmwQ==} dev: true - /@types/node@18.19.22: - resolution: {integrity: sha512-p3pDIfuMg/aXBmhkyanPshdfJuX5c5+bQjYLIikPLXAUycEogij/c50n/C+8XOA5L93cU4ZRXtn+dNQGi0IZqQ==} + /@types/node@18.19.25: + resolution: {integrity: sha512-NrNXHJCexZtcbR9K1hsv1fSbwAwnhv7ql7l331aKvW0sej5H0NY1o64BHe0AA2ZoQuTm7NE6fyNW079MOWXe4Q==} dependencies: undici-types: 5.26.5 dev: true @@ -10301,6 +9820,12 @@ packages: resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==} dev: true + /@types/oauth@0.9.4: + resolution: {integrity: sha512-qk9orhti499fq5XxKCCEbd0OzdPZuancneyse3KtR+vgMiHRbh+mn8M4G6t64ob/Fg+GZGpa565MF/2dKWY32A==} + dependencies: + '@types/node': 20.9.0 + dev: true + /@types/papaparse@5.3.14: resolution: {integrity: sha512-LxJ4iEFcpqc6METwp9f6BV6VVc43m6MfH0VqFosHvrUgfXiFe6ww7R3itkOQ+TCK6Y+Iv/+RnnvtRZnkc5Kc9g==} dependencies: @@ -10311,6 +9836,22 @@ packages: resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} dev: true + /@types/passport-github2@1.2.9: + resolution: {integrity: sha512-/nMfiPK2E6GKttwBzwj0Wjaot8eHrM57hnWxu52o6becr5/kXlH/4yE2v2rh234WGvSgEEzIII02Nc5oC5xEHA==} + dependencies: + '@types/express': 4.17.21 + '@types/passport': 1.0.16 + '@types/passport-oauth2': 1.4.15 + dev: true + + /@types/passport-google-oauth20@2.0.14: + resolution: {integrity: sha512-ZaZpRUAeMl3vy298ulKO1wGLn9SQtj/CyIfZL/Px5xU9pybMiQU3mhXDCBiWSbg0EK9uXT4ZoWC3ktuWY+5fwQ==} + dependencies: + '@types/express': 4.17.21 + '@types/passport': 1.0.16 + '@types/passport-oauth2': 1.4.15 + dev: true + /@types/passport-jwt@4.0.1: resolution: {integrity: sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==} dependencies: @@ -10326,6 +9867,14 @@ packages: '@types/passport-strategy': 0.2.38 dev: true + /@types/passport-oauth2@1.4.15: + resolution: {integrity: sha512-9cUTP/HStNSZmhxXGuRrBJfEWzIEJRub2eyJu3CvkA+8HAMc9W3aKdFhVq+Qz1hi42qn+GvSAnz3zwacDSYWpw==} + dependencies: + '@types/express': 4.17.21 + '@types/oauth': 0.9.4 + '@types/passport': 1.0.16 + dev: true + /@types/passport-strategy@0.2.38: resolution: {integrity: sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==} dependencies: @@ -10361,8 +9910,8 @@ packages: dev: false optional: true - /@types/qs@6.9.12: - resolution: {integrity: sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==} + /@types/qs@6.9.13: + resolution: {integrity: sha512-iLR+1vTTJ3p0QaOUq6ACbY1mzKTODFDT/XedZI8BksOotFmL4ForwDfRQ/DZeuTHR7/2i4lI1D203gdfxuqTlA==} dev: true /@types/range-parser@1.2.7: @@ -10484,18 +10033,8 @@ packages: '@types/node': 20.9.0 dev: true - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - dev: true - - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} - dependencies: - '@types/yargs-parser': 21.0.3 - dev: true - - /@typescript-eslint/eslint-plugin@7.0.2(@typescript-eslint/parser@7.0.2)(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-/XtVZJtbaphtdrWjr+CJclaCVGPtOdBpFEnvtNf/jRV0IiEemRrL0qABex/nEt8isYcnFacm3nPHYQwL+Wb7qg==} + /@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -10506,18 +10045,18 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.0.2(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/scope-manager': 7.0.2 - '@typescript-eslint/type-utils': 7.0.2(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/utils': 7.0.2(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/visitor-keys': 7.0.2 + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/scope-manager': 7.2.0 + '@typescript-eslint/type-utils': 7.2.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/visitor-keys': 7.2.0 debug: 4.3.4 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.4.2) + ts-api-utils: 1.3.0(typescript@5.4.2) typescript: 5.4.2 transitivePeerDependencies: - supports-color @@ -10544,8 +10083,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@7.0.2(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-GdwfDglCxSmU+QTS9vhz2Sop46ebNCXpPPvsByK7hu0rFGRHL+AusKQJ7SoN+LbLh6APFpQwHKmDSwN35Z700Q==} + /@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^8.56.0 @@ -10554,10 +10093,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.0.2 - '@typescript-eslint/types': 7.0.2 - '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.4.2) - '@typescript-eslint/visitor-keys': 7.0.2 + '@typescript-eslint/scope-manager': 7.2.0 + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.2) + '@typescript-eslint/visitor-keys': 7.2.0 debug: 4.3.4 eslint: 8.57.0 typescript: 5.4.2 @@ -10580,15 +10119,15 @@ packages: '@typescript-eslint/visitor-keys': 6.21.0 dev: true - /@typescript-eslint/scope-manager@7.0.2: - resolution: {integrity: sha512-l6sa2jF3h+qgN2qUMjVR3uCNGjWw4ahGfzIYsCtFrQJCjhbrDPdiihYT8FnnqFwsWX+20hK592yX9I2rxKTP4g==} + /@typescript-eslint/scope-manager@7.2.0: + resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 7.0.2 - '@typescript-eslint/visitor-keys': 7.0.2 + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/visitor-keys': 7.2.0 - /@typescript-eslint/type-utils@7.0.2(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-IKKDcFsKAYlk8Rs4wiFfEwJTQlHcdn8CLwLaxwd6zb8HNiMcQIFX9sWax2k4Cjj7l7mGS5N1zl7RCHOVwHq2VQ==} + /@typescript-eslint/type-utils@7.2.0(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^8.56.0 @@ -10597,11 +10136,11 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.4.2) - '@typescript-eslint/utils': 7.0.2(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.2) + '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.4.2) debug: 4.3.4 eslint: 8.57.0 - ts-api-utils: 1.2.1(typescript@5.4.2) + ts-api-utils: 1.3.0(typescript@5.4.2) typescript: 5.4.2 transitivePeerDependencies: - supports-color @@ -10617,8 +10156,8 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/types@7.0.2: - resolution: {integrity: sha512-ZzcCQHj4JaXFjdOql6adYV4B/oFOFjPOC9XYwCaZFRvqN8Llfvv4gSxrkQkd2u4Ci62i2c6W6gkDwQJDaRc4nA==} + /@typescript-eslint/types@7.2.0: + resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} engines: {node: ^16.0.0 || >=18.0.0} /@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.2): @@ -10658,14 +10197,14 @@ packages: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.4.2) + ts-api-utils: 1.3.0(typescript@5.4.2) typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@7.0.2(typescript@5.4.2): - resolution: {integrity: sha512-3AMc8khTcELFWcKcPc0xiLviEvvfzATpdPj/DXuOGIdQIIFybf4DMT1vKRbuAEOFMwhWt7NFLXRkbjsvKZQyvw==} + /@typescript-eslint/typescript-estree@7.2.0(typescript@5.4.2): + resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -10673,14 +10212,14 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 7.0.2 - '@typescript-eslint/visitor-keys': 7.0.2 + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/visitor-keys': 7.2.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.4.2) + ts-api-utils: 1.3.0(typescript@5.4.2) typescript: 5.4.2 transitivePeerDependencies: - supports-color @@ -10705,8 +10244,8 @@ packages: - typescript dev: false - /@typescript-eslint/utils@7.0.2(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-PZPIONBIB/X684bhT1XlrkjNZJIEevwkKDsdwfiu1WeqBxYEEdIgVDgm8/bbKHVu+6YOpeRqcfImTdImx/4Bsw==} + /@typescript-eslint/utils@7.2.0(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^8.56.0 @@ -10714,9 +10253,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.0.2 - '@typescript-eslint/types': 7.0.2 - '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.4.2) + '@typescript-eslint/scope-manager': 7.2.0 + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.2) eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: @@ -10740,59 +10279,83 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@7.0.2: - resolution: {integrity: sha512-8Y+YiBmqPighbm5xA2k4wKTxRzx9EkBu7Rlw+WHqMvRJ3RPz/BMBO9b2ru0LUNmXg120PHUXD5+SWFy2R8DqlQ==} + /@typescript-eslint/visitor-keys@7.2.0: + resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 7.0.2 + '@typescript-eslint/types': 7.2.0 eslint-visitor-keys: 3.4.3 /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - /@vitejs/plugin-react-swc@3.6.0(vite@5.1.5): + /@vitejs/plugin-react-swc@3.6.0(vite@5.1.6): resolution: {integrity: sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==} peerDependencies: vite: ^4 || ^5 dependencies: - '@swc/core': 1.4.5 - vite: 5.1.5(@types/node@20.9.0) + '@swc/core': 1.4.8 + vite: 5.1.6(@types/node@20.9.0) + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@vitest/coverage-v8@1.4.0(vitest@1.4.0): + resolution: {integrity: sha512-4hDGyH1SvKpgZnIByr9LhGgCEuF9DKM34IBLCC/fVfy24Z3+PZ+Ii9hsVBsHvY1umM1aGPEjceRkzxCfcQ10wg==} + peerDependencies: + vitest: 1.4.0 + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.4 + istanbul-reports: 3.1.7 + magic-string: 0.30.8 + magicast: 0.3.3 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.0.0 + test-exclude: 6.0.0 + v8-to-istanbul: 9.2.0 + vitest: 1.4.0(@types/node@20.9.0)(happy-dom@14.0.0) transitivePeerDependencies: - - '@swc/helpers' + - supports-color dev: true - /@vitest/expect@1.3.1: - resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} + /@vitest/expect@1.4.0: + resolution: {integrity: sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==} dependencies: - '@vitest/spy': 1.3.1 - '@vitest/utils': 1.3.1 + '@vitest/spy': 1.4.0 + '@vitest/utils': 1.4.0 chai: 4.4.1 dev: true - /@vitest/runner@1.3.1: - resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==} + /@vitest/runner@1.4.0: + resolution: {integrity: sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==} dependencies: - '@vitest/utils': 1.3.1 + '@vitest/utils': 1.4.0 p-limit: 5.0.0 pathe: 1.1.2 dev: true - /@vitest/snapshot@1.3.1: - resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==} + /@vitest/snapshot@1.4.0: + resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==} dependencies: magic-string: 0.30.8 pathe: 1.1.2 pretty-format: 29.7.0 dev: true - /@vitest/spy@1.3.1: - resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} + /@vitest/spy@1.4.0: + resolution: {integrity: sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==} dependencies: tinyspy: 2.2.1 dev: true - /@vitest/utils@1.3.1: - resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} + /@vitest/utils@1.4.0: + resolution: {integrity: sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==} dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 @@ -10800,8 +10363,8 @@ packages: pretty-format: 29.7.0 dev: true - /@webassemblyjs/ast@1.11.6: - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + /@webassemblyjs/ast@1.12.1: + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 @@ -10831,8 +10394,8 @@ packages: resolution: {integrity: sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==} dev: true - /@webassemblyjs/helper-buffer@1.11.6: - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + /@webassemblyjs/helper-buffer@1.12.1: + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} dev: true /@webassemblyjs/helper-buffer@1.9.0: @@ -10871,13 +10434,13 @@ packages: resolution: {integrity: sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==} dev: true - /@webassemblyjs/helper-wasm-section@1.11.6: - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + /@webassemblyjs/helper-wasm-section@1.12.1: + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 dev: true /@webassemblyjs/helper-wasm-section@1.9.0: @@ -10921,17 +10484,17 @@ packages: resolution: {integrity: sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==} dev: true - /@webassemblyjs/wasm-edit@1.11.6: - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + /@webassemblyjs/wasm-edit@1.12.1: + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-opt': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - '@webassemblyjs/wast-printer': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 dev: true /@webassemblyjs/wasm-edit@1.9.0: @@ -10947,10 +10510,10 @@ packages: '@webassemblyjs/wast-printer': 1.9.0 dev: true - /@webassemblyjs/wasm-gen@1.11.6: - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + /@webassemblyjs/wasm-gen@1.12.1: + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} dependencies: - '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 @@ -10967,13 +10530,13 @@ packages: '@webassemblyjs/utf8': 1.9.0 dev: true - /@webassemblyjs/wasm-opt@1.11.6: - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + /@webassemblyjs/wasm-opt@1.12.1: + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 dev: true /@webassemblyjs/wasm-opt@1.9.0: @@ -10985,10 +10548,10 @@ packages: '@webassemblyjs/wasm-parser': 1.9.0 dev: true - /@webassemblyjs/wasm-parser@1.11.6: - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + /@webassemblyjs/wasm-parser@1.12.1: + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} dependencies: - '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-api-error': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 @@ -11018,10 +10581,10 @@ packages: '@xtuc/long': 4.2.2 dev: true - /@webassemblyjs/wast-printer@1.11.6: - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + /@webassemblyjs/wast-printer@1.12.1: + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} dependencies: - '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 dev: true @@ -11045,6 +10608,22 @@ packages: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} dev: true + /@yarnpkg/fslib@2.10.3: + resolution: {integrity: sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==} + engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} + dependencies: + '@yarnpkg/libzip': 2.3.0 + tslib: 1.14.1 + dev: true + + /@yarnpkg/libzip@2.3.0: + resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==} + engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} + dependencies: + '@types/emscripten': 1.39.10 + tslib: 1.14.1 + dev: true + /@zkochan/rimraf@2.1.3: resolution: {integrity: sha512-mCfR3gylCzPC+iqdxEA6z5SxJeOgzgbwmyxanKriIne5qZLswDe/M43aD3p5MNzwzXRhbZg/OX+MpES6Zk1a6A==} engines: {node: '>=12.10'} @@ -11169,12 +10748,9 @@ packages: /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - requiresBuild: true dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - dev: false - optional: true /airbnb-js-shims@2.2.1: resolution: {integrity: sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ==} @@ -11186,15 +10762,15 @@ packages: es6-shim: 0.35.8 function.prototype.name: 1.1.6 globalthis: 1.0.3 - object.entries: 1.1.7 - object.fromentries: 2.0.7 + object.entries: 1.1.8 + object.fromentries: 2.0.8 object.getownpropertydescriptors: 2.1.7 - object.values: 1.1.7 + object.values: 1.2.0 promise.allsettled: 1.0.7 promise.prototype.finally: 3.1.8 string.prototype.matchall: 4.0.10 string.prototype.padend: 3.1.5 - string.prototype.padstart: 3.1.5 + string.prototype.padstart: 3.1.6 symbol.prototype.description: 1.0.6 dev: true @@ -11432,6 +11008,7 @@ packages: engines: {node: '>=10'} dependencies: tslib: 2.6.2 + dev: false /aria-query@5.1.3: resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} @@ -11496,16 +11073,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /array.prototype.filter@1.0.3: - resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.5 - es-array-method-boxes-properly: 1.0.0 - is-string: 1.0.7 - /array.prototype.findlastindex@1.2.4: resolution: {integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==} engines: {node: '>= 0.4'} @@ -11534,14 +11101,15 @@ packages: es-abstract: 1.22.5 es-shim-unscopables: 1.0.2 - /array.prototype.map@1.0.6: - resolution: {integrity: sha512-nK1psgF2cXqP3wSyCSq0Hc7zwNq3sfljQqaG27r/7a7ooNUnn5nGq6yYWyks9jMO5EoFQ0ax80hSg6oXSRNXaw==} + /array.prototype.map@1.0.7: + resolution: {integrity: sha512-XpcFfLoBEAhezrrNw1V+yLXkE7M6uR7xJEsxbG6c/V9v043qurwVJB9r9UTnoSioFDoz1i1VOydpWGmJpfVZbg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 es-array-method-boxes-properly: 1.0.0 + es-object-atoms: 1.0.0 is-string: 1.0.7 dev: true @@ -11650,11 +11218,6 @@ packages: /async@3.2.5: resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - /asynciterator.prototype@1.0.0: - resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} - dependencies: - has-symbols: 1.0.3 - /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -11678,7 +11241,7 @@ packages: engines: {node: '>=8.0.0'} dev: false - /autoprefixer@10.4.18(postcss@8.4.35): + /autoprefixer@10.4.18(postcss@8.4.36): resolution: {integrity: sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -11686,11 +11249,11 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001596 + caniuse-lite: 1.0.30001599 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true @@ -11707,15 +11270,15 @@ packages: /axios@0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.5 + follow-redirects: 1.15.6 transitivePeerDependencies: - debug dev: true - /axios@1.6.7: - resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + /axios@1.6.8: + resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} dependencies: - follow-redirects: 1.15.5 + follow-redirects: 1.15.6 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -11753,33 +11316,7 @@ packages: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.90.2(@swc/core@1.4.5)(esbuild@0.18.20) - dev: true - - /babel-loader@9.1.3(@babel/core@7.24.0)(webpack@5.90.2): - resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} - engines: {node: '>= 14.15.0'} - peerDependencies: - '@babel/core': ^7.12.0 - webpack: '>=5' - dependencies: - '@babel/core': 7.24.0 - find-cache-dir: 4.0.0 - schema-utils: 4.2.0 - webpack: 5.90.2(@swc/core@1.4.5)(esbuild@0.18.20) - dev: true - - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - dependencies: - '@babel/helper-plugin-utils': 7.24.0 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color + webpack: 5.90.2(esbuild@0.20.2) dev: true /babel-plugin-macros@3.1.0: @@ -11791,14 +11328,14 @@ packages: resolve: 1.22.8 dev: true - /babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.24.0): - resolution: {integrity: sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==} + /babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.0): + resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/compat-data': 7.23.5 '@babel/core': 7.24.0 - '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.24.0) + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.0) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -11811,7 +11348,7 @@ packages: dependencies: '@babel/core': 7.24.0 '@babel/helper-define-polyfill-provider': 0.1.5(@babel/core@7.24.0) - core-js-compat: 3.36.0 + core-js-compat: 3.36.1 transitivePeerDependencies: - supports-color dev: true @@ -11823,7 +11360,7 @@ packages: dependencies: '@babel/core': 7.24.0 '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.24.0) - core-js-compat: 3.36.0 + core-js-compat: 3.36.1 transitivePeerDependencies: - supports-color dev: true @@ -11869,6 +11406,11 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + /base64url@3.0.1: + resolution: {integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==} + engines: {node: '>=6.0.0'} + dev: false + /base@0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} engines: {node: '>=0.10.0'} @@ -11918,8 +11460,8 @@ packages: dev: true optional: true - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} /bindings@1.5.0: @@ -11959,25 +11501,6 @@ packages: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} dev: true - /body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.1 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - /body-parser@1.20.2: resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -12136,17 +11659,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001596 - electron-to-chromium: 1.4.695 + caniuse-lite: 1.0.30001599 + electron-to-chromium: 1.4.710 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 - dev: true - /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: false @@ -12282,7 +11799,7 @@ packages: es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 - set-function-length: 1.2.1 + set-function-length: 1.2.2 /call-me-maybe@1.0.2: resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} @@ -12337,13 +11854,13 @@ packages: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001596 + caniuse-lite: 1.0.30001599 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: true - /caniuse-lite@1.0.30001596: - resolution: {integrity: sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ==} + /caniuse-lite@1.0.30001599: + resolution: {integrity: sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==} /case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} @@ -12561,7 +12078,7 @@ packages: resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} dependencies: '@types/validator': 13.11.9 - libphonenumber-js: 1.10.57 + libphonenumber-js: 1.10.58 validator: 13.11.0 /class-variance-authority@0.7.0: @@ -12591,9 +12108,6 @@ packages: /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} - requiresBuild: true - dev: false - optional: true /cli-boxes@2.2.1: resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} @@ -12705,17 +12219,19 @@ packages: engines: {node: '>=0.10.0'} dev: false - /cmdk@0.2.1(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-U6//9lQ6JvT47+6OF6Gi8BvkxYQ8SCRRSKIJkthIMsFsLZRG0cKvTtuTaefyIKMQb8rvvXy0wGdpTNq/jPtm+g==} + /cmdk@1.0.0(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@radix-ui/react-dialog': 1.0.0(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@types/react' + - '@types/react-dom' dev: false /code-block-writer@12.0.0: @@ -12858,10 +12374,6 @@ packages: engines: {node: '>= 12.0.0'} dev: false - /common-path-prefix@3.0.0: - resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - dev: true - /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -13039,11 +12551,11 @@ packages: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.90.2(@swc/core@1.4.5) + webpack: 5.90.2(@swc/core@1.4.8) dev: true - /core-js-compat@3.36.0: - resolution: {integrity: sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==} + /core-js-compat@3.36.1: + resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==} dependencies: browserslist: 4.23.0 dev: true @@ -13062,7 +12574,7 @@ packages: object-assign: 4.1.1 vary: 1.1.2 - /cosmiconfig-typescript-loader@5.0.0(@types/node@20.9.0)(cosmiconfig@8.3.6)(typescript@5.4.2): + /cosmiconfig-typescript-loader@5.0.0(@types/node@20.9.0)(cosmiconfig@9.0.0)(typescript@5.4.2): resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} engines: {node: '>=v16'} peerDependencies: @@ -13071,7 +12583,7 @@ packages: typescript: '>=4' dependencies: '@types/node': 20.9.0 - cosmiconfig: 8.3.6(typescript@5.4.2) + cosmiconfig: 9.0.0(typescript@5.4.2) jiti: 1.21.0 typescript: 5.4.2 dev: true @@ -13130,6 +12642,22 @@ packages: typescript: 5.4.2 dev: true + /cosmiconfig@9.0.0(typescript@5.4.2): + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + typescript: 5.4.2 + dev: true + /create-ecdh@4.0.4: resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} dependencies: @@ -13211,34 +12739,39 @@ packages: randomfill: 1.0.4 dev: true - /css-blank-pseudo@6.0.1(postcss@8.4.35): + /crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + dev: true + + /css-blank-pseudo@6.0.1(postcss@8.4.36): resolution: {integrity: sha512-goSnEITByxTzU4Oh5oJZrEWudxTqk7L6IXj1UW69pO6Hv0UdX+Vsrt02FFu5DweRh2bLu6WpX/+zsQCu5O1gKw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 dev: true - /css-declaration-sorter@6.4.1(postcss@8.4.35): + /css-declaration-sorter@6.4.1(postcss@8.4.36): resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} engines: {node: ^10 || ^12 || >=14} peerDependencies: postcss: ^8.0.9 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true - /css-has-pseudo@6.0.2(postcss@8.4.35): + /css-has-pseudo@6.0.2(postcss@8.4.36): resolution: {integrity: sha512-Z2Qm5yyOvJRTy6THdUlnGIX6PW/1wOc4FHWlfkcBkfkpZ3oz6lPdG+h+J7t1HZHT4uSSVR8XatXiMpqMUADXow==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15) - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.16) + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 postcss-value-parser: 4.2.0 dev: true @@ -13267,7 +12800,7 @@ packages: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.1 - webpack: 5.90.2(@swc/core@1.4.5)(esbuild@0.18.20) + webpack: 5.90.2(esbuild@0.20.2) dev: true /css-loader@5.2.7(webpack@5.90.2): @@ -13276,17 +12809,17 @@ packages: peerDependencies: webpack: ^4.27.0 || ^5.0.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.35) + icss-utils: 5.1.0(postcss@8.4.36) loader-utils: 2.0.4 - postcss: 8.4.35 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.35) - postcss-modules-local-by-default: 4.0.4(postcss@8.4.35) - postcss-modules-scope: 3.1.1(postcss@8.4.35) - postcss-modules-values: 4.0.0(postcss@8.4.35) + postcss: 8.4.36 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.36) + postcss-modules-local-by-default: 4.0.4(postcss@8.4.36) + postcss-modules-scope: 3.1.1(postcss@8.4.36) + postcss-modules-values: 4.0.0(postcss@8.4.36) postcss-value-parser: 4.2.0 schema-utils: 3.3.0 semver: 7.6.0 - webpack: 5.90.2(@swc/core@1.4.5)(esbuild@0.18.20) + webpack: 5.90.2(esbuild@0.20.2) dev: true /css-loader@6.10.0(webpack@5.90.2): @@ -13301,24 +12834,24 @@ packages: webpack: optional: true dependencies: - icss-utils: 5.1.0(postcss@8.4.35) - postcss: 8.4.35 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.35) - postcss-modules-local-by-default: 4.0.4(postcss@8.4.35) - postcss-modules-scope: 3.1.1(postcss@8.4.35) - postcss-modules-values: 4.0.0(postcss@8.4.35) + icss-utils: 5.1.0(postcss@8.4.36) + postcss: 8.4.36 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.36) + postcss-modules-local-by-default: 4.0.4(postcss@8.4.36) + postcss-modules-scope: 3.1.1(postcss@8.4.36) + postcss-modules-values: 4.0.0(postcss@8.4.36) postcss-value-parser: 4.2.0 semver: 7.6.0 - webpack: 5.90.2(@swc/core@1.4.5)(esbuild@0.18.20) + webpack: 5.90.2(esbuild@0.20.2) dev: true - /css-prefers-color-scheme@9.0.1(postcss@8.4.35): + /css-prefers-color-scheme@9.0.1(postcss@8.4.36): resolution: {integrity: sha512-iFit06ochwCKPRiWagbTa1OAWCvWWVdEnIFd8BaRrgO8YrrNh4RAWUQTFcYX5tdFZgFl1DJ3iiULchZyEbnF4g==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true /css-select@4.3.0: @@ -13352,7 +12885,7 @@ packages: engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} dependencies: mdn-data: 2.0.28 - source-map-js: 1.0.2 + source-map-js: 1.1.0 dev: true /css-tree@2.3.1: @@ -13360,7 +12893,7 @@ packages: engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} dependencies: mdn-data: 2.0.30 - source-map-js: 1.0.2 + source-map-js: 1.1.0 dev: true /css-what@6.1.0: @@ -13371,8 +12904,8 @@ packages: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} dev: true - /cssdb@7.11.1: - resolution: {integrity: sha512-F0nEoX/Rv8ENTHsjMPGHd9opdjGfXkgRBafSUGnQKPzGZFB7Lm0BbT10x21TMOCrKLbVsJ0NoCDMk6AfKqw8/A==} + /cssdb@7.11.2: + resolution: {integrity: sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==} dev: true /cssesc@3.0.0: @@ -13380,62 +12913,62 @@ packages: engines: {node: '>=4'} hasBin: true - /cssnano-preset-default@5.2.14(postcss@8.4.35): + /cssnano-preset-default@5.2.14(postcss@8.4.36): resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - css-declaration-sorter: 6.4.1(postcss@8.4.35) - cssnano-utils: 3.1.0(postcss@8.4.35) - postcss: 8.4.35 - postcss-calc: 8.2.4(postcss@8.4.35) - postcss-colormin: 5.3.1(postcss@8.4.35) - postcss-convert-values: 5.1.3(postcss@8.4.35) - postcss-discard-comments: 5.1.2(postcss@8.4.35) - postcss-discard-duplicates: 5.1.0(postcss@8.4.35) - postcss-discard-empty: 5.1.1(postcss@8.4.35) - postcss-discard-overridden: 5.1.0(postcss@8.4.35) - postcss-merge-longhand: 5.1.7(postcss@8.4.35) - postcss-merge-rules: 5.1.4(postcss@8.4.35) - postcss-minify-font-values: 5.1.0(postcss@8.4.35) - postcss-minify-gradients: 5.1.1(postcss@8.4.35) - postcss-minify-params: 5.1.4(postcss@8.4.35) - postcss-minify-selectors: 5.2.1(postcss@8.4.35) - postcss-normalize-charset: 5.1.0(postcss@8.4.35) - postcss-normalize-display-values: 5.1.0(postcss@8.4.35) - postcss-normalize-positions: 5.1.1(postcss@8.4.35) - postcss-normalize-repeat-style: 5.1.1(postcss@8.4.35) - postcss-normalize-string: 5.1.0(postcss@8.4.35) - postcss-normalize-timing-functions: 5.1.0(postcss@8.4.35) - postcss-normalize-unicode: 5.1.1(postcss@8.4.35) - postcss-normalize-url: 5.1.0(postcss@8.4.35) - postcss-normalize-whitespace: 5.1.1(postcss@8.4.35) - postcss-ordered-values: 5.1.3(postcss@8.4.35) - postcss-reduce-initial: 5.1.2(postcss@8.4.35) - postcss-reduce-transforms: 5.1.0(postcss@8.4.35) - postcss-svgo: 5.1.0(postcss@8.4.35) - postcss-unique-selectors: 5.1.1(postcss@8.4.35) - dev: true - - /cssnano-utils@3.1.0(postcss@8.4.35): + css-declaration-sorter: 6.4.1(postcss@8.4.36) + cssnano-utils: 3.1.0(postcss@8.4.36) + postcss: 8.4.36 + postcss-calc: 8.2.4(postcss@8.4.36) + postcss-colormin: 5.3.1(postcss@8.4.36) + postcss-convert-values: 5.1.3(postcss@8.4.36) + postcss-discard-comments: 5.1.2(postcss@8.4.36) + postcss-discard-duplicates: 5.1.0(postcss@8.4.36) + postcss-discard-empty: 5.1.1(postcss@8.4.36) + postcss-discard-overridden: 5.1.0(postcss@8.4.36) + postcss-merge-longhand: 5.1.7(postcss@8.4.36) + postcss-merge-rules: 5.1.4(postcss@8.4.36) + postcss-minify-font-values: 5.1.0(postcss@8.4.36) + postcss-minify-gradients: 5.1.1(postcss@8.4.36) + postcss-minify-params: 5.1.4(postcss@8.4.36) + postcss-minify-selectors: 5.2.1(postcss@8.4.36) + postcss-normalize-charset: 5.1.0(postcss@8.4.36) + postcss-normalize-display-values: 5.1.0(postcss@8.4.36) + postcss-normalize-positions: 5.1.1(postcss@8.4.36) + postcss-normalize-repeat-style: 5.1.1(postcss@8.4.36) + postcss-normalize-string: 5.1.0(postcss@8.4.36) + postcss-normalize-timing-functions: 5.1.0(postcss@8.4.36) + postcss-normalize-unicode: 5.1.1(postcss@8.4.36) + postcss-normalize-url: 5.1.0(postcss@8.4.36) + postcss-normalize-whitespace: 5.1.1(postcss@8.4.36) + postcss-ordered-values: 5.1.3(postcss@8.4.36) + postcss-reduce-initial: 5.1.2(postcss@8.4.36) + postcss-reduce-transforms: 5.1.0(postcss@8.4.36) + postcss-svgo: 5.1.0(postcss@8.4.36) + postcss-unique-selectors: 5.1.1(postcss@8.4.36) + dev: true + + /cssnano-utils@3.1.0(postcss@8.4.36): resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true - /cssnano@5.1.15(postcss@8.4.35): + /cssnano@5.1.15(postcss@8.4.36): resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-preset-default: 5.2.14(postcss@8.4.35) + cssnano-preset-default: 5.2.14(postcss@8.4.36) lilconfig: 2.1.0 - postcss: 8.4.35 + postcss: 8.4.36 yaml: 1.10.2 dev: true @@ -13610,6 +13143,30 @@ packages: engines: {node: '>= 12'} dev: true + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + /dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} dev: true @@ -13725,8 +13282,8 @@ packages: regexp.prototype.flags: 1.5.2 side-channel: 1.0.6 which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.14 + which-collection: 1.0.2 + which-typed-array: 1.1.15 dev: true /deep-extend@0.6.0: @@ -13790,6 +13347,20 @@ packages: isobject: 3.0.1 dev: true + /del@6.1.1: + resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} + engines: {node: '>=10'} + dependencies: + globby: 11.1.0 + graceful-fs: 4.2.11 + is-glob: 4.0.3 + is-path-cwd: 2.2.0 + is-path-inside: 3.0.3 + p-map: 4.0.0 + rimraf: 3.0.2 + slash: 3.0.0 + dev: true + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -13840,6 +13411,7 @@ packages: /detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + dev: false /detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} @@ -14104,8 +13676,8 @@ packages: dependencies: jake: 10.8.7 - /electron-to-chromium@1.4.695: - resolution: {integrity: sha512-eMijZmeqPtm774pCZIOrfUHMs/7ls++W1sLhxwqgu8KQ8E2WmMtzwyqOMt0XXUJ3HTIPfuwlfwF+I5cwnfItBA==} + /electron-to-chromium@1.4.710: + resolution: {integrity: sha512-w+9yAVHoHhysCa+gln7AzbO9CdjFcL/wN/5dd+XW/Msl2d/4+WisEaCF1nty0xbAKaxdaJfgLB2296U7zZB7BA==} /elliptic@6.5.5: resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} @@ -14173,8 +13745,8 @@ packages: tapable: 1.1.3 dev: true - /enhanced-resolve@5.15.1: - resolution: {integrity: sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==} + /enhanced-resolve@5.16.0: + resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 @@ -14198,9 +13770,6 @@ packages: /env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - requiresBuild: true - dev: false - optional: true /err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} @@ -14247,7 +13816,7 @@ packages: has-property-descriptors: 1.0.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 internal-slot: 1.0.7 is-array-buffer: 3.0.4 is-callable: 1.2.7 @@ -14261,20 +13830,72 @@ packages: object-keys: 1.1.1 object.assign: 4.1.5 regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.0 + safe-array-concat: 1.1.2 safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 string.prototype.trimstart: 1.0.7 typed-array-buffer: 1.0.2 typed-array-byte-length: 1.0.1 typed-array-byte-offset: 1.0.2 typed-array-length: 1.0.5 unbox-primitive: 1.0.2 - which-typed-array: 1.1.14 + which-typed-array: 1.1.15 + + /es-abstract@1.23.2: + resolution: {integrity: sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.5 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 /es-array-method-boxes-properly@1.0.0: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + dev: true /es-check@7.1.1: resolution: {integrity: sha512-rgwR2wdJp437Exq28Emwc4x5+Qn6ORDliN9daWo0wTCg5jOQxJsIZieqxVi4AfDEIN4OwMwYhld9b13mnRocUQ==} @@ -14305,21 +13926,20 @@ packages: get-intrinsic: 1.2.4 has-symbols: 1.0.3 is-arguments: 1.1.1 - is-map: 2.0.2 - is-set: 2.0.2 + is-map: 2.0.3 + is-set: 2.0.3 is-string: 1.0.7 isarray: 2.0.5 stop-iteration-iterator: 1.0.0 dev: true - /es-iterator-helpers@1.0.17: - resolution: {integrity: sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==} + /es-iterator-helpers@1.0.18: + resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} engines: {node: '>= 0.4'} dependencies: - asynciterator.prototype: 1.0.0 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 es-errors: 1.3.0 es-set-tostringtag: 2.0.3 function-bind: 1.1.2 @@ -14330,24 +13950,30 @@ packages: has-symbols: 1.0.3 internal-slot: 1.0.7 iterator.prototype: 1.1.2 - safe-array-concat: 1.1.0 + safe-array-concat: 1.1.2 - /es-module-lexer@1.4.1: - resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + /es-module-lexer@1.4.2: + resolution: {integrity: sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw==} dev: true + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + /es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 - hasown: 2.0.1 + hasown: 2.0.2 /es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: - hasown: 2.0.1 + hasown: 2.0.2 /es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} @@ -14370,47 +13996,17 @@ packages: resolution: {integrity: sha512-Twf7I2v4/1tLoIXMT8HlqaBSS5H2wQTs2wx3MNYCI8K1R1/clXyCazrcVCPm/FuO9cyV8+leEaZOWD5C253NDg==} dev: true - /esbuild-register@3.5.0(esbuild@0.18.20): + /esbuild-register@3.5.0(esbuild@0.20.2): resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} peerDependencies: esbuild: '>=0.12 <1' dependencies: debug: 4.3.4 - esbuild: 0.18.20 + esbuild: 0.20.2 transitivePeerDependencies: - supports-color dev: true - /esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.18.20 - '@esbuild/android-arm64': 0.18.20 - '@esbuild/android-x64': 0.18.20 - '@esbuild/darwin-arm64': 0.18.20 - '@esbuild/darwin-x64': 0.18.20 - '@esbuild/freebsd-arm64': 0.18.20 - '@esbuild/freebsd-x64': 0.18.20 - '@esbuild/linux-arm': 0.18.20 - '@esbuild/linux-arm64': 0.18.20 - '@esbuild/linux-ia32': 0.18.20 - '@esbuild/linux-loong64': 0.18.20 - '@esbuild/linux-mips64el': 0.18.20 - '@esbuild/linux-ppc64': 0.18.20 - '@esbuild/linux-riscv64': 0.18.20 - '@esbuild/linux-s390x': 0.18.20 - '@esbuild/linux-x64': 0.18.20 - '@esbuild/netbsd-x64': 0.18.20 - '@esbuild/openbsd-x64': 0.18.20 - '@esbuild/sunos-x64': 0.18.20 - '@esbuild/win32-arm64': 0.18.20 - '@esbuild/win32-ia32': 0.18.20 - '@esbuild/win32-x64': 0.18.20 - dev: true - /esbuild@0.19.12: resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} engines: {node: '>=12'} @@ -14442,6 +14038,37 @@ packages: '@esbuild/win32-x64': 0.19.12 dev: true + /esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + dev: true + /escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -14534,7 +14161,7 @@ packages: eslint-plugin-import: '*' dependencies: debug: 4.3.4 - enhanced-resolve: 5.15.1 + enhanced-resolve: 5.16.0 eslint: 8.57.0 eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) @@ -14549,7 +14176,7 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.0.2)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -14557,10 +14184,10 @@ packages: eslint-plugin-import: '*' dependencies: debug: 4.3.4 - enhanced-resolve: 5.15.1 + enhanced-resolve: 5.16.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.0.2)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.0.2)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.3 is-core-module: 2.13.1 @@ -14626,7 +14253,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.0.2)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: @@ -14647,11 +14274,11 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 7.0.2(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.2) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.0.2)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -14674,14 +14301,14 @@ packages: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.0.2)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - hasown: 2.0.1 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.2 - object.values: 1.1.7 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 transitivePeerDependencies: @@ -14690,7 +14317,7 @@ packages: - supports-color dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.0.2)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: @@ -14700,7 +14327,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 7.0.2(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.2) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.4 array.prototype.flat: 1.3.2 @@ -14709,14 +14336,14 @@ packages: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.0.2)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - hasown: 2.0.1 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.2 - object.values: 1.1.7 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 transitivePeerDependencies: @@ -14733,7 +14360,7 @@ packages: eslint: 8.57.0 dev: false - /eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.0.2)(eslint@8.57.0)(typescript@5.4.2): + /eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.2.0)(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -14746,7 +14373,7 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 7.0.2(@typescript-eslint/parser@7.0.2)(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/eslint-plugin': 7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.4.2) '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) eslint: 8.57.0 transitivePeerDependencies: @@ -14769,14 +14396,14 @@ packages: axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - es-iterator-helpers: 1.0.17 + es-iterator-helpers: 1.0.18 eslint: 8.57.0 - hasown: 2.0.1 + hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 + object.entries: 1.1.8 + object.fromentries: 2.0.8 /eslint-plugin-markdown@3.0.1(eslint@8.57.0): resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} @@ -14820,7 +14447,7 @@ packages: optional: true dependencies: eslint: 8.57.0 - eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@7.0.2)(eslint@8.57.0)(typescript@5.4.2) + eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@7.2.0)(eslint@8.57.0)(typescript@5.4.2) globals: 13.24.0 dev: false @@ -14863,15 +14490,15 @@ packages: array.prototype.flatmap: 1.3.2 array.prototype.tosorted: 1.1.3 doctrine: 2.1.0 - es-iterator-helpers: 1.0.17 + es-iterator-helpers: 1.0.18 eslint: 8.57.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 + object.entries: 1.1.8 + object.fromentries: 2.0.8 object.hasown: 1.1.3 - object.values: 1.1.7 + object.values: 1.2.0 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 @@ -14925,7 +14552,7 @@ packages: tailwindcss: ^3.4.0 dependencies: fast-glob: 3.3.2 - postcss: 8.4.35 + postcss: 8.4.36 tailwindcss: 3.4.1(ts-node@10.9.2) dev: true @@ -15155,6 +14782,21 @@ packages: strip-eof: 1.0.0 dev: false + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.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.7 + strip-final-newline: 2.0.0 + dev: true + /execa@7.2.0: resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} @@ -15236,44 +14878,6 @@ packages: - supports-color dev: false - /express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} - engines: {node: '>= 0.10.0'} - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.1 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - /express@4.18.3: resolution: {integrity: sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==} engines: {node: '>= 0.10.0'} @@ -15363,8 +14967,8 @@ packages: - supports-color dev: true - /fast-copy@3.0.1: - resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} + /fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} dev: false /fast-deep-equal@3.1.3: @@ -15407,8 +15011,8 @@ packages: resolution: {integrity: sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==} dev: false - /fast-redact@3.3.0: - resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} + /fast-redact@3.4.0: + resolution: {integrity: sha512-2gwPvyna0zwBdxKnng1suu/dTL5s8XEy2ZqH8mwDUwJdDkV8w5kp+JV26mupdK68HmPMbm6yjW9m7/Ys/BHEHg==} engines: {node: '>=6'} dev: false @@ -15419,8 +15023,8 @@ packages: resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} dev: false - /fast-xml-parser@4.3.5: - resolution: {integrity: sha512-sWvP1Pl8H03B8oFJpFR3HE31HUfwtX7Rlf9BNsvdpujD4n7WMhfmu8h9wOV2u+c1k0ZilTADhPqypzx2J690ZQ==} + /fast-xml-parser@4.3.6: + resolution: {integrity: sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==} hasBin: true dependencies: strnum: 1.0.5 @@ -15441,12 +15045,6 @@ packages: format: 0.2.2 dev: false - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - dependencies: - bser: 2.1.1 - dev: true - /fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} @@ -15586,14 +15184,6 @@ packages: pkg-dir: 4.2.0 dev: true - /find-cache-dir@4.0.0: - resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} - engines: {node: '>=14.16'} - dependencies: - common-path-prefix: 3.0.0 - pkg-dir: 7.0.0 - dev: true - /find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} @@ -15616,14 +15206,6 @@ packages: locate-path: 6.0.0 path-exists: 4.0.0 - /find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - dev: true - /find-up@7.0.0: resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} engines: {node: '>=18'} @@ -15674,8 +15256,8 @@ packages: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} dev: true - /follow-redirects@1.15.5: - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + /follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -15756,7 +15338,7 @@ packages: semver: 7.6.0 tapable: 2.2.1 typescript: 5.4.2 - webpack: 5.90.2(@swc/core@1.4.5)(esbuild@0.18.20) + webpack: 5.90.2(esbuild@0.20.2) dev: true /fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.90.1): @@ -15779,7 +15361,7 @@ packages: semver: 7.6.0 tapable: 2.2.1 typescript: 5.3.3 - webpack: 5.90.1(@swc/core@1.4.5) + webpack: 5.90.1(@swc/core@1.4.8) dev: true /form-data@4.0.0: @@ -15967,8 +15549,8 @@ packages: engines: {node: '>=10'} dev: false - /fx@31.0.0: - resolution: {integrity: sha512-OoeYSPKqNKmfnH4s+rGYI0c8OZmqqOOXsUtqy0YyHqQQoQSDiDs3m3M9uXKx5OQR+jDx7/FhYqpO3kl/As/xgg==} + /fx@33.0.0: + resolution: {integrity: sha512-uW/UAi9G04+o7dD/RyIH7mP9Cyf12TdiaWQ19QbvnxkKQ2yiffXiZMz65zqbWMstLd2vwla++G9lMabG3nXxYQ==} hasBin: true dev: true @@ -16038,11 +15620,12 @@ packages: function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 /get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + dev: false /get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} @@ -16051,6 +15634,7 @@ packages: /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} + dev: false /get-port@3.2.0: resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} @@ -16113,8 +15697,8 @@ packages: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} dev: false - /github-slugger@1.5.0: - resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + /github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} dev: true /gl-matrix@3.4.3: @@ -16320,8 +15904,8 @@ packages: optionalDependencies: uglify-js: 3.17.4 - /happy-dom@13.6.2: - resolution: {integrity: sha512-Ku+wDqcF/KwFA0dI+xIMZd9Jn020RXjuSil/Vz7gu2yhDC3FsDYZ55qqV9k+SGC4opwb4acisXqVSRxUJMlPbQ==} + /happy-dom@14.0.0: + resolution: {integrity: sha512-XdxaqufN4QZs0WFuo7L4vGkKpj08gmpEpSMFxDtvYo4OipZLssz7VlavE03FuLabHBTJAWxcR6MlKyOQZM9e0w==} engines: {node: '>=16.0.0'} dependencies: entities: 4.5.0 @@ -16438,12 +16022,24 @@ packages: minimalistic-assert: 1.0.1 dev: true - /hasown@2.0.1: - resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 + /hast-util-heading-rank@3.0.0: + resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + dependencies: + '@types/hast': 3.0.4 + dev: true + + /hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + dependencies: + '@types/hast': 3.0.4 + dev: true + /hast-util-parse-selector@2.2.5: resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} dev: false @@ -16459,7 +16055,7 @@ packages: estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.1 + mdast-util-mdx-jsx: 3.1.2 mdast-util-mdxjs-esm: 2.0.1 property-information: 6.4.1 space-separated-tokens: 2.0.2 @@ -16470,6 +16066,12 @@ packages: - supports-color dev: false + /hast-util-to-string@3.0.0: + resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + dependencies: + '@types/hast': 3.0.4 + dev: true + /hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} dependencies: @@ -16544,7 +16146,7 @@ packages: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.29.1 + terser: 5.29.2 dev: true /html-minifier@4.0.0: @@ -16604,7 +16206,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.90.2(@swc/core@1.4.5)(esbuild@0.18.20) + webpack: 5.90.2(esbuild@0.20.2) dev: true /htmlparser2@5.0.1: @@ -16708,6 +16310,11 @@ packages: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} dev: true + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + /human-signals@4.3.1: resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} engines: {node: '>=14.18.0'} @@ -16740,8 +16347,8 @@ packages: resolution: {integrity: sha512-tvfXskmG/9o+TJ5Fxu54sSO5OkY6d+uMn+K6JiUGLJrwxAVfer+8V3nU8jq3ts9Pe5lXJv4b1N7foIjJ8Iy2Gg==} dev: false - /i18next@23.10.0: - resolution: {integrity: sha512-/TgHOqsa7/9abUKJjdPeydoyDc0oTi/7u9F8lMSj6ufg4cbC1Oj3f/Jja7zj7WRIhEQKB7Q4eN6y68I9RDxxGQ==} + /i18next@23.10.1: + resolution: {integrity: sha512-NDiIzFbcs3O9PXpfhkjyf7WdqFn5Vq6mhzhtkXzj51aOcNuPNcTwuYNuXCpHsanZGHlHKL35G7huoFeVic1hng==} dependencies: '@babel/runtime': 7.24.0 dev: false @@ -16770,13 +16377,13 @@ packages: postcss: 7.0.39 dev: true - /icss-utils@5.1.0(postcss@8.4.35): + /icss-utils@5.1.0(postcss@8.4.36): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true /ieee754@1.2.1: @@ -16794,8 +16401,8 @@ packages: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} dev: false - /immer@10.0.3: - resolution: {integrity: sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A==} + /immer@10.0.4: + resolution: {integrity: sha512-cuBuGK40P/sk5IzWa9QPUaAdvPHjkk1c+xYsd9oZw+YQQEV+10G0P5uMpGctZZKnyQ+ibRO08bD25nWLmYi2pw==} dev: false /import-cwd@3.0.0: @@ -16906,7 +16513,7 @@ packages: resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} engines: {node: '>=14.18.0'} dependencies: - '@ljharb/through': 2.3.12 + '@ljharb/through': 2.3.13 ansi-escapes: 4.3.2 chalk: 5.3.0 cli-cursor: 3.1.0 @@ -16932,7 +16539,7 @@ packages: engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 - hasown: 2.0.1 + hasown: 2.0.2 side-channel: 1.0.6 /internmap@2.0.3: @@ -16953,6 +16560,7 @@ packages: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} dependencies: loose-envify: 1.4.0 + dev: false /ioredis@5.3.2: resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} @@ -16990,9 +16598,9 @@ packages: engines: {node: '>= 10'} dev: false - /is-absolute-url@3.0.3: - resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} - engines: {node: '>=8'} + /is-absolute-url@4.0.1: + resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true /is-absolute@1.0.0: @@ -17007,7 +16615,7 @@ packages: resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} engines: {node: '>= 0.10'} dependencies: - hasown: 2.0.1 + hasown: 2.0.2 dev: true /is-alphabetical@1.0.4: @@ -17077,7 +16685,7 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: - binary-extensions: 2.2.0 + binary-extensions: 2.3.0 /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} @@ -17097,15 +16705,21 @@ packages: /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - hasown: 2.0.1 + hasown: 2.0.2 /is-data-descriptor@1.0.1: resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} engines: {node: '>= 0.4'} dependencies: - hasown: 2.0.1 + hasown: 2.0.2 dev: true + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + dependencies: + is-typed-array: 1.1.13 + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -17243,8 +16857,9 @@ packages: resolution: {integrity: sha512-pgF+L5bxC+10hLBgf6R2P4ZZUBOQIIacbdo8YvuCP8/JvsWxG7aZ9p10DYuLtifFci4l3VITphhMlMV4Y+urPw==} dev: false - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} /is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} @@ -17289,6 +16904,11 @@ packages: engines: {node: '>=8'} dev: true + /is-path-cwd@2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + dev: true + /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} @@ -17347,8 +16967,9 @@ packages: is-unc-path: 1.0.0 dev: true - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} /is-shared-array-buffer@1.0.3: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} @@ -17401,7 +17022,7 @@ packages: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.14 + which-typed-array: 1.1.15 /is-unc-path@1.0.0: resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} @@ -17420,16 +17041,18 @@ packages: engines: {node: '>=12'} dev: true - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.7 - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + /is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 @@ -17481,19 +17104,34 @@ packages: engines: {node: '>=8'} dev: true - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} dependencies: - '@babel/core': 7.24.0 - '@babel/parser': 7.24.0 - '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps@5.0.4: + resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==} + engines: {node: '>=10'} + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color dev: true + /istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + /iterare@1.2.1: resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} engines: {node: '>=6'} @@ -17515,7 +17153,7 @@ packages: define-properties: 1.2.1 get-intrinsic: 1.2.4 has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.5 + reflect.getprototypeof: 1.0.6 set-function-name: 2.0.2 /jackspeak@2.3.6: @@ -17536,42 +17174,6 @@ packages: filelist: 1.0.4 minimatch: 3.1.2 - /jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.9 - '@types/node': 20.9.0 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - jest-worker: 29.7.0 - micromatch: 4.0.5 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.9.0 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - dev: true - /jest-worker@26.6.2: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} @@ -17590,16 +17192,6 @@ packages: supports-color: 8.1.1 dev: true - /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@types/node': 20.9.0 - jest-util: 29.7.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - /jiti@1.21.0: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true @@ -17805,7 +17397,7 @@ packages: array-includes: 3.1.7 array.prototype.flat: 1.3.2 object.assign: 4.1.5 - object.values: 1.1.7 + object.values: 1.2.0 /juice@10.0.0: resolution: {integrity: sha512-9f68xmhGrnIi6DBkiiP3rUrQN33SEuaKu1+njX6VgMP+jwZAsnT33WIzlrWICL9matkhYu3OyrqSUP55YTIdGg==} @@ -17991,8 +17583,8 @@ packages: libqp: 2.1.0 dev: false - /libphonenumber-js@1.10.57: - resolution: {integrity: sha512-OjsEd9y4LgcX+Ig09SbxWqcGESxliDDFNVepFhB9KEsQZTrnk3UdEU+cO0sW1APvLprHstQpS23OQpZ3bwxy6Q==} + /libphonenumber-js@1.10.58: + resolution: {integrity: sha512-53A0IpJFL9LdHbpeatwizf8KSwPICrqn9H0g3Y7WQ+Jgeu9cQ4Ew3WrRtrLBu/CX2lXd5+rgT01/tGlkbkzOjw==} /libqp@2.0.1: resolution: {integrity: sha512-Ka0eC5LkF3IPNQHJmYBWljJsw0UvM6j+QdKRbWyCdTmYwvIDE6a7bCm0UkTAL/K+3KXK5qXT/ClcInU01OpdLg==} @@ -18369,8 +17961,8 @@ packages: dependencies: yallist: 4.0.0 - /lucide-react@0.349.0(react@18.2.0): - resolution: {integrity: sha512-Sa+5bRi0RYcyOUU2ifTtNXNiHs87JvdE78DbSfcqWk7JmGsomnFnvzmAhyPjfaCZf3HJMAqHCJOMXGRbB89Q1g==} + /lucide-react@0.358.0(react@18.2.0): + resolution: {integrity: sha512-rBSptRjZTMBm24zsFhR6pK/NgbT18JegZGKcH4+1H3+UigMSRpeoWLtR/fAwMYwYnlJOZB+y8WpeHne9D6X6Kg==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 dependencies: @@ -18409,6 +18001,14 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /magicast@0.3.3: + resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} + dependencies: + '@babel/parser': 7.24.0 + '@babel/types': 7.24.0 + source-map-js: 1.1.0 + dev: true + /mailparser@3.6.9: resolution: {integrity: sha512-1fIDZlgN1NnuzmTSEUxkaViquXYkw5NbQehVc+kz55QRy98QgLdTtRSKv289Jy4NrCiDchRx6zAijB4HrPsvkA==} dependencies: @@ -18446,6 +18046,13 @@ packages: dependencies: semver: 6.3.1 + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.6.0 + dev: true + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -18476,12 +18083,6 @@ packages: dev: false optional: true - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - dependencies: - tmpl: 1.0.5 - dev: true - /map-age-cleaner@0.1.3: resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} engines: {node: '>=6'} @@ -18523,8 +18124,8 @@ packages: resolution: {integrity: sha512-0Q2ua8+oDN7/3r5UXMnbVq8C+LRfT2pzVKA+h4nXTLEMBFQDwp7qJZOe7DkBa79C7V2cSBXJyScxJ7vYs9kE2w==} dev: false - /markdown-it@14.0.0: - resolution: {integrity: sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==} + /markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true dependencies: argparse: 2.0.1 @@ -18539,8 +18140,8 @@ packages: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} dev: false - /markdown-to-jsx@7.4.1(react@18.2.0): - resolution: {integrity: sha512-GbrbkTnHp9u6+HqbPRFJbObi369AgJNXi/sGqq5HRsoZW063xR1XDCaConqq+whfEIAlzB1YPnOgsPc7B7bc/A==} + /markdown-to-jsx@7.3.2(react@18.2.0): + resolution: {integrity: sha512-B+28F5ucp83aQm+OxNrPkS8z0tMKaeHiy0lHJs3LqCyDQFtWuenaIrkaVTgAm1pf1AU85LXltva86hlaT17i8Q==} engines: {node: '>= 10'} peerDependencies: react: '>= 0.14.0' @@ -18566,12 +18167,6 @@ packages: safe-buffer: 5.2.1 dev: true - /mdast-util-definitions@4.0.0: - resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} - dependencies: - unist-util-visit: 2.0.3 - dev: true - /mdast-util-find-and-replace@3.0.1: resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} dependencies: @@ -18692,8 +18287,8 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-mdx-jsx@3.1.1: - resolution: {integrity: sha512-Di63TQEHbiApe6CFp/qQXCORHMHnmW2JFdr5PYH57LuEIPjijRHicAmL5wQu+B0/Q4p0qJaEOE1EkhiwxiNmAQ==} + /mdast-util-mdx-jsx@3.1.2: + resolution: {integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==} dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 @@ -18716,7 +18311,7 @@ packages: dependencies: mdast-util-from-markdown: 2.0.0 mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.1 + mdast-util-mdx-jsx: 3.1.2 mdast-util-mdxjs-esm: 2.0.1 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: @@ -18767,10 +18362,6 @@ packages: unist-util-visit: 5.0.0 zwitch: 2.0.4 - /mdast-util-to-string@1.1.0: - resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} - dev: true - /mdast-util-to-string@2.0.0: resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} dev: true @@ -18902,7 +18493,7 @@ packages: '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 asyncro: 3.0.0 - autoprefixer: 10.4.18(postcss@8.4.35) + autoprefixer: 10.4.18(postcss@8.4.36) babel-plugin-macros: 3.1.0 babel-plugin-transform-async-to-promises: 0.8.18 babel-plugin-transform-replace-expressions: 0.2.0(@babel/core@7.24.0) @@ -18914,16 +18505,16 @@ packages: gzip-size: 6.0.0 kleur: 4.1.5 lodash.merge: 4.6.2 - postcss: 8.4.35 + postcss: 8.4.36 pretty-bytes: 5.6.0 rollup: 2.79.1 rollup-plugin-bundle-size: 1.0.3 - rollup-plugin-postcss: 4.0.2(postcss@8.4.35) + rollup-plugin-postcss: 4.0.2(postcss@8.4.36) rollup-plugin-terser: 7.0.2(rollup@2.79.1) rollup-plugin-typescript2: 0.32.1(rollup@2.79.1)(typescript@4.9.5) rollup-plugin-visualizer: 5.12.0(rollup@2.79.1) sade: 1.8.1 - terser: 5.29.1 + terser: 5.29.2 tiny-glob: 0.2.9 tslib: 2.6.2 typescript: 4.9.5 @@ -19409,7 +19000,7 @@ packages: block-stream2: 2.1.0 browser-or-node: 2.1.1 buffer-crc32: 0.2.13 - fast-xml-parser: 4.3.5 + fast-xml-parser: 4.3.6 ipaddr.js: 2.1.0 json-stream: 1.0.0 lodash: 4.17.21 @@ -19949,7 +19540,7 @@ packages: acorn: 8.11.3 pathe: 1.1.2 pkg-types: 1.0.3 - ufo: 1.4.0 + ufo: 1.5.2 dev: true /module-details-from-path@1.0.3: @@ -20104,7 +19695,7 @@ packages: /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - /nest-knexjs@0.0.21(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(knex@3.1.0)(reflect-metadata@0.2.1)(rxjs@7.8.1): + /nest-knexjs@0.0.21(@nestjs/common@10.3.4)(@nestjs/core@10.3.4)(knex@3.1.0)(reflect-metadata@0.2.1)(rxjs@7.8.1): resolution: {integrity: sha512-nlEG/Ao8gu8IVP1nudpTFXgqxRyYlezxtKAwojwpMMFkthGuNRk3nq46MwpjwQPJoupcjm4TX0jkSpfHQGx7cg==} peerDependencies: '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -20113,15 +19704,15 @@ packages: reflect-metadata: ^0.1.13 || ^0.2.0 rxjs: ^6.6.3 || ^7.2.0 dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/platform-express@10.3.3)(@nestjs/websockets@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.4(@nestjs/common@10.3.4)(@nestjs/platform-express@10.3.4)(@nestjs/websockets@10.3.4)(reflect-metadata@0.2.1)(rxjs@7.8.1) knex: 3.1.0 reflect-metadata: 0.2.1 rxjs: 7.8.1 dev: false - /nestjs-cls@4.2.0(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1): - resolution: {integrity: sha512-sdvdhBmM9eb9d1URtcK7642S3ufD9ZWaKRt4Ouf1gIGmd73YniiKCxxOFwChRqDU+sr7hwxT560JaA27R/7RJQ==} + /nestjs-cls@4.2.1(@nestjs/common@10.3.4)(@nestjs/core@10.3.4)(reflect-metadata@0.2.1)(rxjs@7.8.1): + resolution: {integrity: sha512-q5vkFK/DE1KpoHj6neiEmFshvjdqOJSCmuCGnbcvQ8qw03MGrGeGUCEdYDGzmPixnW5IEkFW4XJmjhpGAg4Ufw==} engines: {node: '>=16'} peerDependencies: '@nestjs/common': '> 7.0.0 < 11' @@ -20129,13 +19720,13 @@ packages: reflect-metadata: '*' rxjs: '>= 7' dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/platform-express@10.3.3)(@nestjs/websockets@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.4(@nestjs/common@10.3.4)(@nestjs/platform-express@10.3.4)(@nestjs/websockets@10.3.4)(reflect-metadata@0.2.1)(rxjs@7.8.1) reflect-metadata: 0.2.1 rxjs: 7.8.1 dev: false - /nestjs-pino@4.0.0(@nestjs/common@10.3.3)(pino-http@9.0.0): + /nestjs-pino@4.0.0(@nestjs/common@10.3.4)(pino-http@9.0.0): resolution: {integrity: sha512-XhCg/R+l3w0BFP6MHyR6lU/BHVEV0tV9z24G0vuA9FD3sv+TQNvnO9uVsF1l/oVspgGfQ9Qulmb2UbsfYlI0+g==} engines: {node: '>= 14'} requiresBuild: true @@ -20143,11 +19734,11 @@ packages: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 pino-http: ^6.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 dependencies: - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/common': 10.3.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) pino-http: 9.0.0 dev: false - /nestjs-redoc@2.2.2(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/swagger@7.3.0)(reflect-metadata@0.2.1): + /nestjs-redoc@2.2.2(@nestjs/common@10.3.4)(@nestjs/core@10.3.4)(@nestjs/swagger@7.3.0)(reflect-metadata@0.2.1): resolution: {integrity: sha512-BubUvDhBXQ2/PEkI14ASxEut+MLKaW4S2tFX78LFB2WjZsdmBM7EEgWBp+8nGO64bZsAApA+kUPZgQ17x4yaQA==} peerDependencies: '@nestjs/common': ^8.0.0 @@ -20156,15 +19747,15 @@ packages: reflect-metadata: ^0.1.12 dependencies: '@hapi/joi': 17.1.1 - '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/platform-express@10.3.3)(@nestjs/websockets@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) - '@nestjs/swagger': 7.3.0(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1) + '@nestjs/common': 10.3.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.4(@nestjs/common@10.3.4)(@nestjs/platform-express@10.3.4)(@nestjs/websockets@10.3.4)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/swagger': 7.3.0(@nestjs/common@10.3.4)(@nestjs/core@10.3.4)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1) express-basic-auth: 1.2.1 express-handlebars: 5.3.5 reflect-metadata: 0.2.1 dev: false - /next-i18next@15.2.0(i18next@23.10.0)(next@14.1.3)(react-i18next@14.0.8)(react@18.2.0): + /next-i18next@15.2.0(i18next@23.10.1)(next@14.1.3)(react-i18next@14.1.0)(react@18.2.0): resolution: {integrity: sha512-Rl5yZ4oGffsB0AjRykZ5PzNQ2M6am54MaMayldGmH/UKZisrIxk2SKEPJvaHhKlWe1qgdNi2FkodwK8sEjfEmg==} engines: {node: '>=14'} peerDependencies: @@ -20177,11 +19768,11 @@ packages: '@types/hoist-non-react-statics': 3.3.5 core-js: 3.36.0 hoist-non-react-statics: 3.3.2 - i18next: 23.10.0 + i18next: 23.10.1 i18next-fs-backend: 2.3.1 next: 14.1.3(@babel/core@7.24.0)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 - react-i18next: 14.0.8(i18next@23.10.0)(react-dom@18.2.0)(react@18.2.0) + react-i18next: 14.1.0(i18next@23.10.1)(react-dom@18.2.0)(react@18.2.0) dev: false /next-secure-headers@2.2.0: @@ -20201,14 +19792,12 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /next-themes@0.2.1(next@14.1.3)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} + /next-themes@0.3.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==} peerDependencies: - next: '*' - react: '*' - react-dom: '*' + react: ^16.8 || ^17 || ^18 + react-dom: ^16.8 || ^17 || ^18 dependencies: - next: 14.1.3(@babel/core@7.24.0)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -20216,7 +19805,7 @@ packages: /next-transpile-modules@10.0.1: resolution: {integrity: sha512-4VX/LCMofxIYAVV58UmD+kr8jQflpLWvas/BQ4Co0qWLWzVh06FoZkECkrX5eEZT6oJFqie6+kfbTA3EZCVtdQ==} dependencies: - enhanced-resolve: 5.15.1 + enhanced-resolve: 5.16.0 dev: false /next@14.1.3(@babel/core@7.24.0)(react-dom@18.2.0)(react@18.2.0): @@ -20237,7 +19826,7 @@ packages: '@next/env': 14.1.3 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001596 + caniuse-lite: 1.0.30001599 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.2.0 @@ -20277,7 +19866,7 @@ packages: '@opentelemetry/api': 1.8.0 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001596 + caniuse-lite: 1.0.30001599 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.2.0 @@ -20395,10 +19984,6 @@ packages: dev: false optional: true - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true - /node-libs-browser@2.2.1: resolution: {integrity: sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==} dependencies: @@ -20435,6 +20020,11 @@ packages: engines: {node: '>=6.0.0'} dev: false + /nodemailer@6.9.12: + resolution: {integrity: sha512-pnLo7g37Br3jXbF0bl5DekBJihm2q+3bB3l2o/B060sWmb5l+VqeScAQCBqaQ+5ezRZFzW5SciZNGdRDEbq89w==} + engines: {node: '>=6.0.0'} + dev: false + /nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} @@ -20507,6 +20097,13 @@ packages: path-key: 2.0.1 dev: false + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + /npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -20548,6 +20145,10 @@ packages: engines: {node: '>=0.10.0'} dev: true + /oauth@0.10.0: + resolution: {integrity: sha512-1orQ9MT1vHFGQxhuy7E/0gECD3fd2fCC+PIX+/jgmU/gI3EpRocXtmtvxCO5x3WZ443FLTLFWNDjl5MPJf9u+Q==} + dev: false + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -20596,21 +20197,22 @@ packages: has-symbols: 1.0.3 object-keys: 1.1.1 - /object.entries@1.1.7: - resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + /object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 - /object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 + es-object-atoms: 1.0.0 /object.getownpropertydescriptors@2.1.7: resolution: {integrity: sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==} @@ -20620,17 +20222,16 @@ packages: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 - safe-array-concat: 1.1.0 + safe-array-concat: 1.1.2 dev: true - /object.groupby@1.0.2: - resolution: {integrity: sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==} + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} dependencies: - array.prototype.filter: 1.0.3 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 - es-errors: 1.3.0 + es-abstract: 1.23.2 /object.hasown@1.1.3: resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} @@ -20645,13 +20246,13 @@ packages: isobject: 3.0.1 dev: true - /object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + /object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 /on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} @@ -20718,8 +20319,8 @@ packages: json-pointer: 0.6.2 dev: false - /openapi-typescript@6.7.4: - resolution: {integrity: sha512-EZyeW9Wy7UDCKv0iYmKrq2pVZtquXiD/YHiUClAKqiMi42nodx/EQH11K6fLqjt1IZlJmVokrAsExsBMM2RROQ==} + /openapi-typescript@6.7.5: + resolution: {integrity: sha512-ZD6dgSZi0u1QCP55g8/2yS5hNJfIpgqsSGHLxxdOjvY7eIrXzj271FJEQw33VwsZ6RCtO/NOuhxa7GBWmEudyA==} hasBin: true dependencies: ansi-colors: 4.1.3 @@ -20884,11 +20485,8 @@ packages: /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} - requiresBuild: true dependencies: aggregate-error: 3.1.0 - dev: false - optional: true /p-queue@6.6.2: resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} @@ -21042,6 +20640,20 @@ packages: engines: {node: '>=0.10.0'} dev: true + /passport-github2@0.1.12: + resolution: {integrity: sha512-3nPUCc7ttF/3HSP/k9sAXjz3SkGv5Nki84I05kSQPo01Jqq1NzJACgMblCK0fGcv9pKCG/KXU3AJRDGLqHLoIw==} + engines: {node: '>= 0.8.0'} + dependencies: + passport-oauth2: 1.8.0 + dev: false + + /passport-google-oauth20@2.0.0: + resolution: {integrity: sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==} + engines: {node: '>= 0.4.0'} + dependencies: + passport-oauth2: 1.8.0 + dev: false + /passport-jwt@4.0.1: resolution: {integrity: sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==} dependencies: @@ -21056,6 +20668,17 @@ packages: passport-strategy: 1.0.0 dev: false + /passport-oauth2@1.8.0: + resolution: {integrity: sha512-cjsQbOrXIDE4P8nNb3FQRCCmJJ/utnFKEz2NX209f7KOHPoX18gF7gBzBbLLsj2/je4KrgiwLLGjf0lm9rtTBA==} + engines: {node: '>= 0.4.0'} + dependencies: + base64url: 3.0.1 + oauth: 0.10.0 + passport-strategy: 1.0.0 + uid2: 0.0.4 + utils-merge: 1.0.1 + dev: false + /passport-strategy@1.0.0: resolution: {integrity: sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==} engines: {node: '>= 0.4.0'} @@ -21241,7 +20864,7 @@ packages: dependencies: colorette: 2.0.20 dateformat: 4.6.3 - fast-copy: 3.0.1 + fast-copy: 3.0.2 fast-safe-stringify: 2.1.1 help-me: 5.0.0 joycon: 3.1.1 @@ -21264,7 +20887,7 @@ packages: hasBin: true dependencies: atomic-sleep: 1.0.0 - fast-redact: 3.3.0 + fast-redact: 3.4.0 on-exit-leak-free: 2.1.2 pino-abstract-transport: 1.1.0 pino-std-serializers: 6.2.2 @@ -21301,13 +20924,6 @@ packages: find-up: 5.0.0 dev: true - /pkg-dir@7.0.0: - resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} - engines: {node: '>=14.16'} - dependencies: - find-up: 6.3.0 - dev: true - /pkg-types@1.0.3: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} dependencies: @@ -21358,73 +20974,73 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} - /postcss-attribute-case-insensitive@6.0.3(postcss@8.4.35): + /postcss-attribute-case-insensitive@6.0.3(postcss@8.4.36): resolution: {integrity: sha512-KHkmCILThWBRtg+Jn1owTnHPnFit4OkqS+eKiGEOPIGke54DCeYGJ6r0Fx/HjfE9M9kznApCLcU0DvnPchazMQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 dev: true - /postcss-calc@8.2.4(postcss@8.4.35): + /postcss-calc@8.2.4(postcss@8.4.36): resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: postcss: ^8.2.2 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 postcss-value-parser: 4.2.0 dev: true - /postcss-clamp@4.1.0(postcss@8.4.35): + /postcss-clamp@4.1.0(postcss@8.4.36): resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} engines: {node: '>=7.6.0'} peerDependencies: postcss: ^8.4.6 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-color-functional-notation@6.0.5(postcss@8.4.35): - resolution: {integrity: sha512-aTFsIy89ftjyclwUHRwvz1IxucLzVrzmmcXmtbPWT9GdyYeaJEKeAwbaZzOZn7AQlXg4xfwgkYhKsofC4aLIwg==} + /postcss-color-functional-notation@6.0.7(postcss@8.4.36): + resolution: {integrity: sha512-VwzaVfu1kEYDK2yM8ixeKA/QbgQ8k0uxpRevLH9Wam+R3C1sg68vnRB7m2AMhYfjqb5khp4p0EQk5aO90ASAkw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-color-parser': 1.6.2(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/postcss-progressive-custom-properties': 3.1.1(postcss@8.4.36) + '@csstools/utilities': 1.0.0(postcss@8.4.36) + postcss: 8.4.36 dev: true - /postcss-color-hex-alpha@9.0.4(postcss@8.4.35): + /postcss-color-hex-alpha@9.0.4(postcss@8.4.36): resolution: {integrity: sha512-XQZm4q4fNFqVCYMGPiBjcqDhuG7Ey2xrl99AnDJMyr5eDASsAGalndVgHZF8i97VFNy1GQeZc4q2ydagGmhelQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/utilities': 1.0.0(postcss@8.4.36) + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-color-rebeccapurple@9.0.3(postcss@8.4.35): + /postcss-color-rebeccapurple@9.0.3(postcss@8.4.36): resolution: {integrity: sha512-ruBqzEFDYHrcVq3FnW3XHgwRqVMrtEPLBtD7K2YmsLKVc2jbkxzzNEctJKsPCpDZ+LeMHLKRDoSShVefGc+CkQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/utilities': 1.0.0(postcss@8.4.36) + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-colormin@5.3.1(postcss@8.4.35): + /postcss-colormin@5.3.1(postcss@8.4.36): resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -21433,210 +21049,210 @@ packages: browserslist: 4.23.0 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-convert-values@5.1.3(postcss@8.4.35): + /postcss-convert-values@5.1.3(postcss@8.4.36): resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.23.0 - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-custom-media@10.0.3(postcss@8.4.35): - resolution: {integrity: sha512-wfJ9nKpLn/Qy7LASKu0Rj9Iq2uMzlRt27P4FAE1889IKRMdYUgy8SqvdXfAOs7LJLQX9Fjm0mZ+TSFphD/mKwA==} + /postcss-custom-media@10.0.4(postcss@8.4.36): + resolution: {integrity: sha512-Ubs7O3wj2prghaKRa68VHBvuy3KnTQ0zbGwqDYY1mntxJD0QL2AeiAy+AMfl3HBedTCVr2IcFNktwty9YpSskA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/cascade-layer-name-parser': 1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/media-query-list-parser': 2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - postcss: 8.4.35 + '@csstools/cascade-layer-name-parser': 1.0.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/media-query-list-parser': 2.1.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + postcss: 8.4.36 dev: true - /postcss-custom-properties@13.3.5(postcss@8.4.35): - resolution: {integrity: sha512-xHg8DTCMfN2nrqs2CQTF+0m5jgnzKL5zrW5Y05KF6xBRO0uDPxiplBm/xcr1o49SLbyJXkMuaRJKhRzkrquKnQ==} + /postcss-custom-properties@13.3.6(postcss@8.4.36): + resolution: {integrity: sha512-vVVIwQbJiIz+PBLMIWA6XMi53Zg66/f474KolA7x0Das6EwkATc/9ZvM6zZx2gs7ZhcgVHjmWBbHkK9FlCgLeA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/cascade-layer-name-parser': 1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/cascade-layer-name-parser': 1.0.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/utilities': 1.0.0(postcss@8.4.36) + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-custom-selectors@7.1.7(postcss@8.4.35): - resolution: {integrity: sha512-N19MpExaR+hYTXU59VO02xE42zLoAUYSVcupwkKlWWLteOb+sWCWHw5FhV7u7gVLTzaGULy7nZP3DNTHgOZAPA==} + /postcss-custom-selectors@7.1.8(postcss@8.4.36): + resolution: {integrity: sha512-fqDkGSEsO7+oQaqdRdR8nwwqH+N2uk6LE/2g4myVJJYz/Ly418lHKEleKTdV/GzjBjFcG4n0dbfuH/Pd2BE8YA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/cascade-layer-name-parser': 1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + '@csstools/cascade-layer-name-parser': 1.0.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 dev: true - /postcss-dir-pseudo-class@8.0.1(postcss@8.4.35): + /postcss-dir-pseudo-class@8.0.1(postcss@8.4.36): resolution: {integrity: sha512-uULohfWBBVoFiZXgsQA24JV6FdKIidQ+ZqxOouhWwdE+qJlALbkS5ScB43ZTjPK+xUZZhlaO/NjfCt5h4IKUfw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 dev: true - /postcss-discard-comments@5.1.2(postcss@8.4.35): + /postcss-discard-comments@5.1.2(postcss@8.4.36): resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true - /postcss-discard-duplicates@5.1.0(postcss@8.4.35): + /postcss-discard-duplicates@5.1.0(postcss@8.4.36): resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true - /postcss-discard-empty@5.1.1(postcss@8.4.35): + /postcss-discard-empty@5.1.1(postcss@8.4.36): resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true - /postcss-discard-overridden@5.1.0(postcss@8.4.35): + /postcss-discard-overridden@5.1.0(postcss@8.4.36): resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true - /postcss-double-position-gradients@5.0.4(postcss@8.4.35): - resolution: {integrity: sha512-xOH2QhazCPeYR+ziYaDcGlpo7Bpw8PVoggOFfU/xPkmBRUQH8MR2eWoPY1CZM93CB0WKs2mxq3ORo83QGIooLw==} + /postcss-double-position-gradients@5.0.5(postcss@8.4.36): + resolution: {integrity: sha512-26Tx4BfoxMNO9C89Nk56bfGv4jAwdDVgrQOyHZOP/6/D+xuOBf306KzTjHC2oBzaIIVtX+famOWHv4raxMjJMQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/postcss-progressive-custom-properties': 3.1.1(postcss@8.4.36) + '@csstools/utilities': 1.0.0(postcss@8.4.36) + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-flexbugs-fixes@5.0.2(postcss@8.4.35): + /postcss-flexbugs-fixes@5.0.2(postcss@8.4.36): resolution: {integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==} peerDependencies: postcss: ^8.1.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true - /postcss-focus-visible@9.0.1(postcss@8.4.35): + /postcss-focus-visible@9.0.1(postcss@8.4.36): resolution: {integrity: sha512-N2VQ5uPz3Z9ZcqI5tmeholn4d+1H14fKXszpjogZIrFbhaq0zNAtq8sAnw6VLiqGbL8YBzsnu7K9bBkTqaRimQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 dev: true - /postcss-focus-within@8.0.1(postcss@8.4.35): + /postcss-focus-within@8.0.1(postcss@8.4.36): resolution: {integrity: sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 dev: true - /postcss-font-variant@5.0.0(postcss@8.4.35): + /postcss-font-variant@5.0.0(postcss@8.4.36): resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true - /postcss-gap-properties@5.0.1(postcss@8.4.35): + /postcss-gap-properties@5.0.1(postcss@8.4.36): resolution: {integrity: sha512-k2z9Cnngc24c0KF4MtMuDdToROYqGMMUQGcE6V0odwjHyOHtaDBlLeRBV70y9/vF7KIbShrTRZ70JjsI1BZyWw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true - /postcss-image-set-function@6.0.3(postcss@8.4.35): + /postcss-image-set-function@6.0.3(postcss@8.4.36): resolution: {integrity: sha512-i2bXrBYzfbRzFnm+pVuxVePSTCRiNmlfssGI4H0tJQvDue+yywXwUxe68VyzXs7cGtMaH6MCLY6IbCShrSroCw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/utilities': 1.0.0(postcss@8.4.36) + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-import@15.1.0(postcss@8.4.35): + /postcss-import@15.1.0(postcss@8.4.36): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - /postcss-js@4.0.1(postcss@8.4.35): + /postcss-js@4.0.1(postcss@8.4.36): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.35 + postcss: 8.4.36 - /postcss-lab-function@6.0.10(postcss@8.4.35): - resolution: {integrity: sha512-Csvw/CwwuwTojK2O3Ad0SvYKrfnAKy+uvT+1Fjk6igR+n8gHuJHIwdj1A2s46EZZojg3RkibdMBuv1vMvR6Sng==} + /postcss-lab-function@6.0.12(postcss@8.4.36): + resolution: {integrity: sha512-flHW2jdRCRe8ClhMgrylR1BCiyyqLLvp1qKfO5wuAclUihldfRsoDIFQWFVW7rJbruil9/LCoHNUvY9JwTlLPw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) - '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) - '@csstools/css-tokenizer': 2.2.3 - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/utilities': 1.0.0(postcss@8.4.35) - postcss: 8.4.35 + '@csstools/css-color-parser': 1.6.2(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) + '@csstools/css-tokenizer': 2.2.4 + '@csstools/postcss-progressive-custom-properties': 3.1.1(postcss@8.4.36) + '@csstools/utilities': 1.0.0(postcss@8.4.36) + postcss: 8.4.36 dev: true - /postcss-load-config@3.1.4(postcss@8.4.35): + /postcss-load-config@3.1.4(postcss@8.4.36): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -21649,11 +21265,11 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - postcss: 8.4.35 + postcss: 8.4.36 yaml: 1.10.2 dev: true - /postcss-load-config@4.0.2(postcss@8.4.35)(ts-node@10.9.2): + /postcss-load-config@4.0.2(postcss@8.4.36)(ts-node@10.9.2): resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} peerDependencies: @@ -21666,8 +21282,8 @@ packages: optional: true dependencies: lilconfig: 3.1.1 - postcss: 8.4.35 - ts-node: 10.9.2(@swc/core@1.4.5)(@types/node@20.9.0)(typescript@5.4.2) + postcss: 8.4.36 + ts-node: 10.9.2(@swc/core@1.4.8)(@types/node@20.9.0)(typescript@5.4.2) yaml: 2.4.1 /postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.90.2): @@ -21683,31 +21299,31 @@ packages: postcss: 7.0.39 schema-utils: 3.3.0 semver: 7.6.0 - webpack: 5.90.2(@swc/core@1.4.5)(esbuild@0.18.20) + webpack: 5.90.2(esbuild@0.20.2) dev: true - /postcss-logical@7.0.1(postcss@8.4.35): + /postcss-logical@7.0.1(postcss@8.4.36): resolution: {integrity: sha512-8GwUQZE0ri0K0HJHkDv87XOLC8DE0msc+HoWLeKdtjDZEwpZ5xuK3QdV6FhmHSQW40LPkg43QzvATRAI3LsRkg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-merge-longhand@5.1.7(postcss@8.4.35): + /postcss-merge-longhand@5.1.7(postcss@8.4.36): resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 - stylehacks: 5.1.1(postcss@8.4.35) + stylehacks: 5.1.1(postcss@8.4.36) dev: true - /postcss-merge-rules@5.1.4(postcss@8.4.35): + /postcss-merge-rules@5.1.4(postcss@8.4.36): resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -21715,53 +21331,53 @@ packages: dependencies: browserslist: 4.23.0 caniuse-api: 3.0.0 - cssnano-utils: 3.1.0(postcss@8.4.35) - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + cssnano-utils: 3.1.0(postcss@8.4.36) + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 dev: true - /postcss-minify-font-values@5.1.0(postcss@8.4.35): + /postcss-minify-font-values@5.1.0(postcss@8.4.36): resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-gradients@5.1.1(postcss@8.4.35): + /postcss-minify-gradients@5.1.1(postcss@8.4.36): resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: colord: 2.9.3 - cssnano-utils: 3.1.0(postcss@8.4.35) - postcss: 8.4.35 + cssnano-utils: 3.1.0(postcss@8.4.36) + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-params@5.1.4(postcss@8.4.35): + /postcss-minify-params@5.1.4(postcss@8.4.36): resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.23.0 - cssnano-utils: 3.1.0(postcss@8.4.35) - postcss: 8.4.35 + cssnano-utils: 3.1.0(postcss@8.4.36) + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-selectors@5.2.1(postcss@8.4.35): + /postcss-minify-selectors@5.2.1(postcss@8.4.36): resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 dev: true /postcss-modules-extract-imports@2.0.0: @@ -21771,13 +21387,13 @@ packages: postcss: 7.0.39 dev: true - /postcss-modules-extract-imports@3.0.0(postcss@8.4.35): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.36): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true /postcss-modules-local-by-default@3.0.3: @@ -21786,19 +21402,19 @@ packages: dependencies: icss-utils: 4.1.1 postcss: 7.0.39 - postcss-selector-parser: 6.0.15 + postcss-selector-parser: 6.0.16 postcss-value-parser: 4.2.0 dev: true - /postcss-modules-local-by-default@4.0.4(postcss@8.4.35): + /postcss-modules-local-by-default@4.0.4(postcss@8.4.36): resolution: {integrity: sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.35) - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + icss-utils: 5.1.0(postcss@8.4.36) + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 postcss-value-parser: 4.2.0 dev: true @@ -21807,17 +21423,17 @@ packages: engines: {node: '>= 6'} dependencies: postcss: 7.0.39 - postcss-selector-parser: 6.0.15 + postcss-selector-parser: 6.0.16 dev: true - /postcss-modules-scope@3.1.1(postcss@8.4.35): + /postcss-modules-scope@3.1.1(postcss@8.4.36): resolution: {integrity: sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 dev: true /postcss-modules-values@3.0.0: @@ -21827,17 +21443,17 @@ packages: postcss: 7.0.39 dev: true - /postcss-modules-values@4.0.0(postcss@8.4.35): + /postcss-modules-values@4.0.0(postcss@8.4.36): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.35) - postcss: 8.4.35 + icss-utils: 5.1.0(postcss@8.4.36) + postcss: 8.4.36 dev: true - /postcss-modules@4.3.1(postcss@8.4.35): + /postcss-modules@4.3.1(postcss@8.4.36): resolution: {integrity: sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==} peerDependencies: postcss: ^8.0.0 @@ -21845,254 +21461,254 @@ packages: generic-names: 4.0.0 icss-replace-symbols: 1.1.0 lodash.camelcase: 4.3.0 - postcss: 8.4.35 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.35) - postcss-modules-local-by-default: 4.0.4(postcss@8.4.35) - postcss-modules-scope: 3.1.1(postcss@8.4.35) - postcss-modules-values: 4.0.0(postcss@8.4.35) + postcss: 8.4.36 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.36) + postcss-modules-local-by-default: 4.0.4(postcss@8.4.36) + postcss-modules-scope: 3.1.1(postcss@8.4.36) + postcss-modules-values: 4.0.0(postcss@8.4.36) string-hash: 1.1.3 dev: true - /postcss-nested@6.0.1(postcss@8.4.35): + /postcss-nested@6.0.1(postcss@8.4.36): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 - /postcss-nesting@12.1.0(postcss@8.4.35): + /postcss-nesting@12.1.0(postcss@8.4.36): resolution: {integrity: sha512-QOYnosaZ+mlP6plQrAxFw09UUp2Sgtxj1BVHN+rSVbtV0Yx48zRt9/9F/ZOoxOKBBEsaJk2MYhhVRjeRRw5yuw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-resolve-nested': 1.1.0(postcss-selector-parser@6.0.15) - '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15) - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + '@csstools/selector-resolve-nested': 1.1.0(postcss-selector-parser@6.0.16) + '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.16) + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 dev: true - /postcss-normalize-charset@5.1.0(postcss@8.4.35): + /postcss-normalize-charset@5.1.0(postcss@8.4.36): resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true - /postcss-normalize-display-values@5.1.0(postcss@8.4.35): + /postcss-normalize-display-values@5.1.0(postcss@8.4.36): resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-positions@5.1.1(postcss@8.4.35): + /postcss-normalize-positions@5.1.1(postcss@8.4.36): resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-repeat-style@5.1.1(postcss@8.4.35): + /postcss-normalize-repeat-style@5.1.1(postcss@8.4.36): resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-string@5.1.0(postcss@8.4.35): + /postcss-normalize-string@5.1.0(postcss@8.4.36): resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-timing-functions@5.1.0(postcss@8.4.35): + /postcss-normalize-timing-functions@5.1.0(postcss@8.4.36): resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-unicode@5.1.1(postcss@8.4.35): + /postcss-normalize-unicode@5.1.1(postcss@8.4.36): resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.23.0 - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-url@5.1.0(postcss@8.4.35): + /postcss-normalize-url@5.1.0(postcss@8.4.36): resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: normalize-url: 6.1.0 - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-whitespace@5.1.1(postcss@8.4.35): + /postcss-normalize-whitespace@5.1.1(postcss@8.4.36): resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-opacity-percentage@2.0.0(postcss@8.4.35): + /postcss-opacity-percentage@2.0.0(postcss@8.4.36): resolution: {integrity: sha512-lyDrCOtntq5Y1JZpBFzIWm2wG9kbEdujpNt4NLannF+J9c8CgFIzPa80YQfdza+Y+yFfzbYj/rfoOsYsooUWTQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true - /postcss-ordered-values@5.1.3(postcss@8.4.35): + /postcss-ordered-values@5.1.3(postcss@8.4.36): resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 3.1.0(postcss@8.4.35) - postcss: 8.4.35 + cssnano-utils: 3.1.0(postcss@8.4.36) + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-overflow-shorthand@5.0.1(postcss@8.4.35): + /postcss-overflow-shorthand@5.0.1(postcss@8.4.36): resolution: {integrity: sha512-XzjBYKLd1t6vHsaokMV9URBt2EwC9a7nDhpQpjoPk2HRTSQfokPfyAS/Q7AOrzUu6q+vp/GnrDBGuj/FCaRqrQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-page-break@3.0.4(postcss@8.4.35): + /postcss-page-break@3.0.4(postcss@8.4.36): resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} peerDependencies: postcss: ^8 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true - /postcss-place@9.0.1(postcss@8.4.35): + /postcss-place@9.0.1(postcss@8.4.36): resolution: {integrity: sha512-JfL+paQOgRQRMoYFc2f73pGuG/Aw3tt4vYMR6UA3cWVMxivviPTnMFnFTczUJOA4K2Zga6xgQVE+PcLs64WC8Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-preset-env@9.5.0(postcss@8.4.35): - resolution: {integrity: sha512-ZTrTWCSqKVYSABB1GerMBb6F8Uto5YWIq1nqi+TKOHPzrXMcyJNuJTc0v2lp5WjG4Sfvwdo7HF/7/3j7HskRog==} + /postcss-preset-env@9.5.2(postcss@8.4.36): + resolution: {integrity: sha512-/KIAHELdg5BxsKA/Vc6Nok/66EM7lps8NulKcQWX2S52HdzxAqh+6HcuAFj7trRSW587vlOA4zCjlRFgR+W6Ag==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-cascade-layers': 4.0.3(postcss@8.4.35) - '@csstools/postcss-color-function': 3.0.10(postcss@8.4.35) - '@csstools/postcss-color-mix-function': 2.0.10(postcss@8.4.35) - '@csstools/postcss-exponential-functions': 1.0.4(postcss@8.4.35) - '@csstools/postcss-font-format-keywords': 3.0.2(postcss@8.4.35) - '@csstools/postcss-gamut-mapping': 1.0.3(postcss@8.4.35) - '@csstools/postcss-gradients-interpolation-method': 4.0.11(postcss@8.4.35) - '@csstools/postcss-hwb-function': 3.0.9(postcss@8.4.35) - '@csstools/postcss-ic-unit': 3.0.4(postcss@8.4.35) - '@csstools/postcss-initial': 1.0.1(postcss@8.4.35) - '@csstools/postcss-is-pseudo-class': 4.0.5(postcss@8.4.35) - '@csstools/postcss-light-dark-function': 1.0.0(postcss@8.4.35) - '@csstools/postcss-logical-float-and-clear': 2.0.1(postcss@8.4.35) - '@csstools/postcss-logical-overflow': 1.0.1(postcss@8.4.35) - '@csstools/postcss-logical-overscroll-behavior': 1.0.1(postcss@8.4.35) - '@csstools/postcss-logical-resize': 2.0.1(postcss@8.4.35) - '@csstools/postcss-logical-viewport-units': 2.0.6(postcss@8.4.35) - '@csstools/postcss-media-minmax': 1.1.3(postcss@8.4.35) - '@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.6(postcss@8.4.35) - '@csstools/postcss-nested-calc': 3.0.2(postcss@8.4.35) - '@csstools/postcss-normalize-display-values': 3.0.2(postcss@8.4.35) - '@csstools/postcss-oklab-function': 3.0.10(postcss@8.4.35) - '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) - '@csstools/postcss-relative-color-syntax': 2.0.10(postcss@8.4.35) - '@csstools/postcss-scope-pseudo-class': 3.0.1(postcss@8.4.35) - '@csstools/postcss-stepped-value-functions': 3.0.5(postcss@8.4.35) - '@csstools/postcss-text-decoration-shorthand': 3.0.4(postcss@8.4.35) - '@csstools/postcss-trigonometric-functions': 3.0.5(postcss@8.4.35) - '@csstools/postcss-unset-value': 3.0.1(postcss@8.4.35) - autoprefixer: 10.4.18(postcss@8.4.35) + '@csstools/postcss-cascade-layers': 4.0.3(postcss@8.4.36) + '@csstools/postcss-color-function': 3.0.12(postcss@8.4.36) + '@csstools/postcss-color-mix-function': 2.0.12(postcss@8.4.36) + '@csstools/postcss-exponential-functions': 1.0.5(postcss@8.4.36) + '@csstools/postcss-font-format-keywords': 3.0.2(postcss@8.4.36) + '@csstools/postcss-gamut-mapping': 1.0.5(postcss@8.4.36) + '@csstools/postcss-gradients-interpolation-method': 4.0.13(postcss@8.4.36) + '@csstools/postcss-hwb-function': 3.0.11(postcss@8.4.36) + '@csstools/postcss-ic-unit': 3.0.5(postcss@8.4.36) + '@csstools/postcss-initial': 1.0.1(postcss@8.4.36) + '@csstools/postcss-is-pseudo-class': 4.0.5(postcss@8.4.36) + '@csstools/postcss-light-dark-function': 1.0.1(postcss@8.4.36) + '@csstools/postcss-logical-float-and-clear': 2.0.1(postcss@8.4.36) + '@csstools/postcss-logical-overflow': 1.0.1(postcss@8.4.36) + '@csstools/postcss-logical-overscroll-behavior': 1.0.1(postcss@8.4.36) + '@csstools/postcss-logical-resize': 2.0.1(postcss@8.4.36) + '@csstools/postcss-logical-viewport-units': 2.0.7(postcss@8.4.36) + '@csstools/postcss-media-minmax': 1.1.4(postcss@8.4.36) + '@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.7(postcss@8.4.36) + '@csstools/postcss-nested-calc': 3.0.2(postcss@8.4.36) + '@csstools/postcss-normalize-display-values': 3.0.2(postcss@8.4.36) + '@csstools/postcss-oklab-function': 3.0.12(postcss@8.4.36) + '@csstools/postcss-progressive-custom-properties': 3.1.1(postcss@8.4.36) + '@csstools/postcss-relative-color-syntax': 2.0.12(postcss@8.4.36) + '@csstools/postcss-scope-pseudo-class': 3.0.1(postcss@8.4.36) + '@csstools/postcss-stepped-value-functions': 3.0.6(postcss@8.4.36) + '@csstools/postcss-text-decoration-shorthand': 3.0.4(postcss@8.4.36) + '@csstools/postcss-trigonometric-functions': 3.0.6(postcss@8.4.36) + '@csstools/postcss-unset-value': 3.0.1(postcss@8.4.36) + autoprefixer: 10.4.18(postcss@8.4.36) browserslist: 4.23.0 - css-blank-pseudo: 6.0.1(postcss@8.4.35) - css-has-pseudo: 6.0.2(postcss@8.4.35) - css-prefers-color-scheme: 9.0.1(postcss@8.4.35) - cssdb: 7.11.1 - postcss: 8.4.35 - postcss-attribute-case-insensitive: 6.0.3(postcss@8.4.35) - postcss-clamp: 4.1.0(postcss@8.4.35) - postcss-color-functional-notation: 6.0.5(postcss@8.4.35) - postcss-color-hex-alpha: 9.0.4(postcss@8.4.35) - postcss-color-rebeccapurple: 9.0.3(postcss@8.4.35) - postcss-custom-media: 10.0.3(postcss@8.4.35) - postcss-custom-properties: 13.3.5(postcss@8.4.35) - postcss-custom-selectors: 7.1.7(postcss@8.4.35) - postcss-dir-pseudo-class: 8.0.1(postcss@8.4.35) - postcss-double-position-gradients: 5.0.4(postcss@8.4.35) - postcss-focus-visible: 9.0.1(postcss@8.4.35) - postcss-focus-within: 8.0.1(postcss@8.4.35) - postcss-font-variant: 5.0.0(postcss@8.4.35) - postcss-gap-properties: 5.0.1(postcss@8.4.35) - postcss-image-set-function: 6.0.3(postcss@8.4.35) - postcss-lab-function: 6.0.10(postcss@8.4.35) - postcss-logical: 7.0.1(postcss@8.4.35) - postcss-nesting: 12.1.0(postcss@8.4.35) - postcss-opacity-percentage: 2.0.0(postcss@8.4.35) - postcss-overflow-shorthand: 5.0.1(postcss@8.4.35) - postcss-page-break: 3.0.4(postcss@8.4.35) - postcss-place: 9.0.1(postcss@8.4.35) - postcss-pseudo-class-any-link: 9.0.1(postcss@8.4.35) - postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.35) - postcss-selector-not: 7.0.2(postcss@8.4.35) - dev: true - - /postcss-pseudo-class-any-link@9.0.1(postcss@8.4.35): + css-blank-pseudo: 6.0.1(postcss@8.4.36) + css-has-pseudo: 6.0.2(postcss@8.4.36) + css-prefers-color-scheme: 9.0.1(postcss@8.4.36) + cssdb: 7.11.2 + postcss: 8.4.36 + postcss-attribute-case-insensitive: 6.0.3(postcss@8.4.36) + postcss-clamp: 4.1.0(postcss@8.4.36) + postcss-color-functional-notation: 6.0.7(postcss@8.4.36) + postcss-color-hex-alpha: 9.0.4(postcss@8.4.36) + postcss-color-rebeccapurple: 9.0.3(postcss@8.4.36) + postcss-custom-media: 10.0.4(postcss@8.4.36) + postcss-custom-properties: 13.3.6(postcss@8.4.36) + postcss-custom-selectors: 7.1.8(postcss@8.4.36) + postcss-dir-pseudo-class: 8.0.1(postcss@8.4.36) + postcss-double-position-gradients: 5.0.5(postcss@8.4.36) + postcss-focus-visible: 9.0.1(postcss@8.4.36) + postcss-focus-within: 8.0.1(postcss@8.4.36) + postcss-font-variant: 5.0.0(postcss@8.4.36) + postcss-gap-properties: 5.0.1(postcss@8.4.36) + postcss-image-set-function: 6.0.3(postcss@8.4.36) + postcss-lab-function: 6.0.12(postcss@8.4.36) + postcss-logical: 7.0.1(postcss@8.4.36) + postcss-nesting: 12.1.0(postcss@8.4.36) + postcss-opacity-percentage: 2.0.0(postcss@8.4.36) + postcss-overflow-shorthand: 5.0.1(postcss@8.4.36) + postcss-page-break: 3.0.4(postcss@8.4.36) + postcss-place: 9.0.1(postcss@8.4.36) + postcss-pseudo-class-any-link: 9.0.1(postcss@8.4.36) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.36) + postcss-selector-not: 7.0.2(postcss@8.4.36) + dev: true + + /postcss-pseudo-class-any-link@9.0.1(postcss@8.4.36): resolution: {integrity: sha512-cKYGGZ9yzUZi+dZd7XT2M8iSDfo+T2Ctbpiizf89uBTBfIpZpjvTavzIJXpCReMVXSKROqzpxClNu6fz4DHM0Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 dev: true - /postcss-reduce-initial@5.1.2(postcss@8.4.35): + /postcss-reduce-initial@5.1.2(postcss@8.4.36): resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -22100,63 +21716,63 @@ packages: dependencies: browserslist: 4.23.0 caniuse-api: 3.0.0 - postcss: 8.4.35 + postcss: 8.4.36 dev: true - /postcss-reduce-transforms@5.1.0(postcss@8.4.35): + /postcss-reduce-transforms@5.1.0(postcss@8.4.36): resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 dev: true - /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.35): + /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.36): resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} peerDependencies: postcss: ^8.0.3 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 dev: true - /postcss-selector-not@7.0.2(postcss@8.4.35): + /postcss-selector-not@7.0.2(postcss@8.4.36): resolution: {integrity: sha512-/SSxf/90Obye49VZIfc0ls4H0P6i6V1iHv0pzZH8SdgvZOPFkF37ef1r5cyWcMflJSFJ5bfuoluTnFnBBFiuSA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 dev: true - /postcss-selector-parser@6.0.15: - resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} + /postcss-selector-parser@6.0.16: + resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} engines: {node: '>=4'} dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - /postcss-svgo@5.1.0(postcss@8.4.35): + /postcss-svgo@5.1.0(postcss@8.4.36): resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.35 + postcss: 8.4.36 postcss-value-parser: 4.2.0 svgo: 2.8.0 dev: true - /postcss-unique-selectors@5.1.1(postcss@8.4.35): + /postcss-unique-selectors@5.1.1(postcss@8.4.36): resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 dev: true /postcss-value-parser@4.2.0: @@ -22176,16 +21792,16 @@ packages: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.0.2 + source-map-js: 1.1.0 dev: false - /postcss@8.4.35: - resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + /postcss@8.4.36: + resolution: {integrity: sha512-/n7eumA6ZjFHAsbX30yhHup/IMkOmlmvtEi7P+6RMYf+bGJSUHc3geH4a0NSZxAz/RJfiS9tooCTs9LAVYUZKw==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.0.2 + source-map-js: 1.1.0 /prebuild-install@7.1.2: resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} @@ -22289,7 +21905,7 @@ packages: fixpack: 4.0.0 get-port: 5.1.1 mailparser: 3.6.9 - nodemailer: 6.9.11 + nodemailer: 6.9.12 open: 7.4.2 p-event: 4.2.0 p-wait-for: 3.2.0 @@ -22297,13 +21913,13 @@ packages: uuid: 9.0.1 dev: false - /prisma@5.10.2: - resolution: {integrity: sha512-hqb/JMz9/kymRE25pMWCxkdyhbnIWrq+h7S6WysJpdnCvhstbJSNP/S6mScEcqiB8Qv2F+0R3yG+osRaWqZacQ==} + /prisma@5.11.0: + resolution: {integrity: sha512-KCLiug2cs0Je7kGkQBN9jDWoZ90ogE/kvZTUTgz2h94FEo8pczCkPH7fPNXkD1sGU7Yh65risGGD1HQ5DF3r3g==} engines: {node: '>=16.13'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 5.10.2 + '@prisma/engines': 5.11.0 dev: false /prismjs@1.27.0: @@ -22370,7 +21986,7 @@ packages: resolution: {integrity: sha512-hezvKvQQmsFkOdrZfYxUxkyxl8mgFQeT259Ajj9PXdbg9VzBCWrItOev72JyWxkCD5VSSqAeHmlN3tWx4DlmsA==} engines: {node: '>= 0.4'} dependencies: - array.prototype.map: 1.0.6 + array.prototype.map: 1.0.7 call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 @@ -22692,15 +22308,6 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - /raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - /raw-body@2.5.2: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} @@ -22863,8 +22470,8 @@ packages: react: 18.2.0 dev: false - /react-hook-form@7.51.0(react@18.2.0): - resolution: {integrity: sha512-BggOy5j58RdhdMzzRUHGOYhSz1oeylFAv6jUSG86OvCIvlAvS7KvnRY7yoAf2pfEiPN7BesnR0xx73nEk3qIiw==} + /react-hook-form@7.51.1(react@18.2.0): + resolution: {integrity: sha512-ifnBjl+kW0ksINHd+8C/Gp6a4eZOdWyvRv0UBaByShwU8JbVx5hTcTWEcd5VdybvmPTATkVVXk9npXArHmo56w==} engines: {node: '>=12.22.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 @@ -22882,8 +22489,8 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /react-i18next@14.0.8(i18next@23.10.0)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-1HKM41/Q8c/nQ2rYNNZlFmrjF2aubZT8sMBmY9aH/xa1/gsrTZ+hPwuLv4V7Cr8fYIh0GQ7vv5C1jCx104uNig==} + /react-i18next@14.1.0(i18next@23.10.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3KwX6LHpbvGQ+sBEntjV4sYW3Zovjjl3fpoHbUwSgFHf0uRBcbeCBLR5al6ikncI5+W0EFb71QXZmfop+J6NrQ==} peerDependencies: i18next: '>= 23.2.3' react: '>= 16.8.0' @@ -22897,7 +22504,7 @@ packages: dependencies: '@babel/runtime': 7.24.0 html-parse-stringify: 3.0.1 - i18next: 23.10.0 + i18next: 23.10.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -22927,8 +22534,8 @@ packages: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true - /react-joyride@2.7.4(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-7MPuqM/z3g9iqCJZnmKNM2RArNgqYBpM8iknny4KjrHp/2wXlPtFL0LpqGiBhtiC0dCC2xe3pNpD9GdLZ2NxMA==} + /react-joyride@2.8.0(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-h/z3QS6dk+KKw1RuVnDJKFRuoHy/L4eyqZSGZ4S9vIn+/c4lec3svhGQBUhcjvBjl/fFPkN9Uag+l6PPKkj66A==} peerDependencies: react: 15 - 18 react-dom: 15 - 18 @@ -22946,7 +22553,7 @@ packages: scroll: 3.0.1 scrollparent: 2.1.0 tree-changes: 0.11.2 - type-fest: 4.11.1 + type-fest: 4.12.0 transitivePeerDependencies: - '@types/react' dev: false @@ -22973,23 +22580,8 @@ packages: - supports-color dev: false - /react-remove-scroll-bar@2.3.5(@types/react@18.2.64)(react@18.2.0): - resolution: {integrity: sha512-3cqjOqg6s0XbOjWvmasmqHch+RLxIEk2r/70rzGXuz3iIGQsQheEQyqYCBb5EECoD01Vo2SIbDqW4paLeLTASw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.64 - react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.64)(react@18.2.0) - tslib: 2.6.2 - - /react-remove-scroll@2.5.4(@types/react@18.2.64)(react@18.2.0): - resolution: {integrity: sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==} + /react-remove-scroll-bar@2.3.6(@types/react@18.2.64)(react@18.2.0): + resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} engines: {node: '>=10'} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -23000,11 +22592,8 @@ packages: dependencies: '@types/react': 18.2.64 react: 18.2.0 - react-remove-scroll-bar: 2.3.5(@types/react@18.2.64)(react@18.2.0) react-style-singleton: 2.2.1(@types/react@18.2.64)(react@18.2.0) tslib: 2.6.2 - use-callback-ref: 1.3.1(@types/react@18.2.64)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.64)(react@18.2.0) dev: false /react-remove-scroll@2.5.5(@types/react@18.2.64)(react@18.2.0): @@ -23019,14 +22608,15 @@ packages: dependencies: '@types/react': 18.2.64 react: 18.2.0 - react-remove-scroll-bar: 2.3.5(@types/react@18.2.64)(react@18.2.0) + react-remove-scroll-bar: 2.3.6(@types/react@18.2.64)(react@18.2.0) react-style-singleton: 2.2.1(@types/react@18.2.64)(react@18.2.0) tslib: 2.6.2 use-callback-ref: 1.3.1(@types/react@18.2.64)(react@18.2.0) use-sidecar: 1.1.2(@types/react@18.2.64)(react@18.2.0) + dev: false - /react-resizable-panels@2.0.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-m0cfwlVQ+460iQbOSVfs3MljVniHI/LGpHGQBa7aNCYUYwaERHcf5W/lCTsoRhbGQfMW9An0M8gxUHILA53Jeg==} + /react-resizable-panels@2.0.13(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-DZxLv5Pc6rfuqkgQ+2JW3eLPiX3BgAAR38Cd0lXuCVHXEZLrD+3W4Nag5TqCoNgEM/4IUU9L/pLM2toOUOd6UQ==} peerDependencies: react: ^16.14.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 @@ -23096,6 +22686,7 @@ packages: invariant: 2.2.4 react: 18.2.0 tslib: 2.6.2 + dev: false /react-syntax-highlighter@15.5.0(react@18.2.0): resolution: {integrity: sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==} @@ -23282,8 +22873,8 @@ packages: engines: {node: '>= 12.13.0'} dev: false - /recast@0.23.5: - resolution: {integrity: sha512-M67zIddJiwXdfPQRYKJ0qZO1SLdH1I0hYeb0wzxA+pNOvAZiQHulWzuk+fYsEWRQ8VfZrgjyucqsCOtCyM01/A==} + /recast@0.23.6: + resolution: {integrity: sha512-9FHoNjX1yjuesMwuthAmPKabxYQdOgihFYmT5ebXfYGBcnqXZf3WOVz+5foEZ8Y83P4ZY6yQD5GMmtV+pgCCAQ==} engines: {node: '>= 4'} dependencies: ast-types: 0.16.1 @@ -23299,8 +22890,8 @@ packages: decimal.js-light: 2.5.1 dev: false - /recharts@2.12.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-9bpxjXSF5g81YsKkTSlaX7mM4b6oYI1mIYck6YkUcWuL3tomADccI51/6thY4LmvhYuRTwpfrOvE80Zc3oBRfQ==} + /recharts@2.12.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vE/F7wTlokf5mtCqVDJlVKelCjliLSJ+DJxj79XlMREm7gpV7ljwbrwE3CfeaoDlOaLX+6iwHaVRn9587YkwIg==} engines: {node: '>=14'} peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 @@ -23315,7 +22906,7 @@ packages: react-smooth: 4.0.0(react-dom@18.2.0)(react@18.2.0) recharts-scale: 0.4.5 tiny-invariant: 1.3.3 - victory-vendor: 36.9.1 + victory-vendor: 36.9.2 dev: false /rechoir@0.6.2: @@ -23377,13 +22968,13 @@ packages: /reflect-metadata@0.2.1: resolution: {integrity: sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==} - /reflect.getprototypeof@1.0.5: - resolution: {integrity: sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==} + /reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 es-errors: 1.3.0 get-intrinsic: 1.2.4 globalthis: 1.0.3 @@ -23469,20 +23060,31 @@ packages: resolution: {integrity: sha512-bEAtp/qrtKucxXSJkD4ebopFZYP0q1+3Vb2WECWv/T8yQEgKxDxJ7ztO285tAMaYZVR6mM1GgI6CCn8FROtL1w==} dev: false - /relateurl@0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} + /rehype-external-links@3.0.0: + resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.2.0 + hast-util-is-element: 3.0.0 + is-absolute-url: 4.0.1 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + dev: true - /remark-external-links@8.0.0: - resolution: {integrity: sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==} + /rehype-slug@6.0.0: + resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} dependencies: - extend: 3.0.2 - is-absolute-url: 3.0.3 - mdast-util-definitions: 4.0.0 - space-separated-tokens: 1.1.5 - unist-util-visit: 2.0.3 + '@types/hast': 3.0.4 + github-slugger: 2.0.0 + hast-util-heading-rank: 3.0.0 + hast-util-to-string: 3.0.0 + unist-util-visit: 5.0.0 dev: true + /relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + /remark-gfm@4.0.0: resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} dependencies: @@ -23525,14 +23127,6 @@ packages: vfile: 6.0.1 dev: false - /remark-slug@6.1.0: - resolution: {integrity: sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==} - dependencies: - github-slugger: 1.5.0 - mdast-util-to-string: 1.1.0 - unist-util-visit: 2.0.3 - dev: true - /remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} dependencies: @@ -23582,8 +23176,8 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - /require-in-the-middle@7.2.0: - resolution: {integrity: sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==} + /require-in-the-middle@7.2.1: + resolution: {integrity: sha512-u5XngygsJ+XV2dBV/Pl4SrcNpUXQfmYmXtuFeHDXfzk4i4NnGnret6xKWkkJHjMHS/16yMV9pEAlAunqmjllkA==} engines: {node: '>=8.6.0'} dependencies: debug: 4.3.4 @@ -23717,7 +23311,7 @@ packages: maxmin: 2.1.0 dev: true - /rollup-plugin-postcss@4.0.2(postcss@8.4.35): + /rollup-plugin-postcss@4.0.2(postcss@8.4.36): resolution: {integrity: sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==} engines: {node: '>=10'} peerDependencies: @@ -23725,13 +23319,13 @@ packages: dependencies: chalk: 4.1.2 concat-with-sourcemaps: 1.1.0 - cssnano: 5.1.15(postcss@8.4.35) + cssnano: 5.1.15(postcss@8.4.36) import-cwd: 3.0.0 p-queue: 6.6.2 pify: 5.0.0 - postcss: 8.4.35 - postcss-load-config: 3.1.4(postcss@8.4.35) - postcss-modules: 4.3.1(postcss@8.4.35) + postcss: 8.4.36 + postcss-load-config: 3.1.4(postcss@8.4.36) + postcss-modules: 4.3.1(postcss@8.4.36) promise.series: 0.2.0 resolve: 1.22.8 rollup-pluginutils: 2.8.2 @@ -23751,7 +23345,7 @@ packages: jest-worker: 26.6.2 rollup: 2.79.1 serialize-javascript: 4.0.0 - terser: 5.29.1 + terser: 5.29.2 dev: true /rollup-plugin-typescript2@0.32.1(rollup@2.79.1)(typescript@4.9.5): @@ -23798,6 +23392,7 @@ packages: hasBin: true optionalDependencies: fsevents: 2.3.3 + dev: false /rollup@2.79.1: resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} @@ -23807,26 +23402,26 @@ packages: fsevents: 2.3.3 dev: true - /rollup@4.12.1: - resolution: {integrity: sha512-ggqQKvx/PsB0FaWXhIvVkSWh7a/PCLQAsMjBc+nA2M8Rv2/HG0X6zvixAB7KyZBRtifBUhy5k8voQX/mRnABPg==} + /rollup@4.13.0: + resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.12.1 - '@rollup/rollup-android-arm64': 4.12.1 - '@rollup/rollup-darwin-arm64': 4.12.1 - '@rollup/rollup-darwin-x64': 4.12.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.12.1 - '@rollup/rollup-linux-arm64-gnu': 4.12.1 - '@rollup/rollup-linux-arm64-musl': 4.12.1 - '@rollup/rollup-linux-riscv64-gnu': 4.12.1 - '@rollup/rollup-linux-x64-gnu': 4.12.1 - '@rollup/rollup-linux-x64-musl': 4.12.1 - '@rollup/rollup-win32-arm64-msvc': 4.12.1 - '@rollup/rollup-win32-ia32-msvc': 4.12.1 - '@rollup/rollup-win32-x64-msvc': 4.12.1 + '@rollup/rollup-android-arm-eabi': 4.13.0 + '@rollup/rollup-android-arm64': 4.13.0 + '@rollup/rollup-darwin-arm64': 4.13.0 + '@rollup/rollup-darwin-x64': 4.13.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.13.0 + '@rollup/rollup-linux-arm64-gnu': 4.13.0 + '@rollup/rollup-linux-arm64-musl': 4.13.0 + '@rollup/rollup-linux-riscv64-gnu': 4.13.0 + '@rollup/rollup-linux-x64-gnu': 4.13.0 + '@rollup/rollup-linux-x64-musl': 4.13.0 + '@rollup/rollup-win32-arm64-msvc': 4.13.0 + '@rollup/rollup-win32-ia32-msvc': 4.13.0 + '@rollup/rollup-win32-x64-msvc': 4.13.0 fsevents: 2.3.3 dev: true @@ -23876,8 +23471,8 @@ packages: mri: 1.2.0 dev: true - /safe-array-concat@1.1.0: - resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} dependencies: call-bind: 1.0.7 @@ -24073,8 +23668,8 @@ packages: /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - /set-function-length@1.2.1: - resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 @@ -24142,7 +23737,7 @@ packages: node-fetch: 3.3.2 ora: 6.3.1 prompts: 2.4.2 - recast: 0.23.5 + recast: 0.23.6 ts-morph: 18.0.0 tsconfig-paths: 4.2.0 zod: 3.22.4 @@ -24299,7 +23894,7 @@ packages: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} dependencies: - '@polka/url': 1.0.0-next.24 + '@polka/url': 1.0.0-next.25 mrmime: 2.0.0 totalist: 3.0.1 dev: true @@ -24308,14 +23903,15 @@ packages: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true - /size-limit@11.0.2: - resolution: {integrity: sha512-iFZ8iTR/3zPqxSwEIdGnTVYVU0F2nhodLQG/G6zpi/NxECYAK9ntq2lNr+prXH7h3gyBjx2Umt2D/oS2Qzz+eg==} + /size-limit@11.1.1: + resolution: {integrity: sha512-0d06gwp+hBuhNQyAyewalfMLhGCnjt15MyDxqouzxN4+85vjAUdRKSNuR1kcyxaS9Ml98q120U0PgRPocPJWiw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: bytes-iec: 3.1.1 chokidar: 3.6.0 globby: 14.0.1 + jiti: 1.21.0 lilconfig: 3.1.1 nanospinner: 1.1.0 picocolors: 1.0.0 @@ -24457,8 +24053,8 @@ packages: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} dev: true - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + /source-map-js@1.1.0: + resolution: {integrity: sha512-9vC2SfsJzlej6MAaMPLu8HiBSHGdRAJ9hVFYN1ibZoNkeanmDmLUcIrj6G9DGL7XMJ54AKg/G75akXl1/izTOw==} engines: {node: '>=0.10.0'} /source-map-resolve@0.5.3: @@ -24510,10 +24106,10 @@ packages: /space-separated-tokens@1.1.5: resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + dev: false /space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: false /spawndamnit@2.0.0: resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} @@ -24803,29 +24399,31 @@ packages: es-abstract: 1.22.5 dev: true - /string.prototype.padstart@3.1.5: - resolution: {integrity: sha512-R57IsE3JIfModQWrVXYZ8ZHWMBNDpIoniDwhYCR1nx+iHwDkjjk26a8xM9BYgf7SAXJO7sdNPng5J+0ccr5LFQ==} + /string.prototype.padstart@3.1.6: + resolution: {integrity: sha512-1y15lz7otgfRTAVK5qbp3eHIga+w8j7+jIH+7HpUrOfnLVl6n0hbspi4EXf4tR+PNOpBjPstltemkx0SvViOCg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 + es-object-atoms: 1.0.0 dev: true - /string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 + es-object-atoms: 1.0.0 - /string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 /string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} @@ -24887,6 +24485,11 @@ packages: engines: {node: '>=0.10.0'} dev: false + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -24930,7 +24533,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 2.7.1 - webpack: 5.90.2(@swc/core@1.4.5)(esbuild@0.18.20) + webpack: 5.90.2(esbuild@0.20.2) dev: true /style-loader@2.0.0(webpack@5.90.2): @@ -24941,7 +24544,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.90.2(@swc/core@1.4.5)(esbuild@0.18.20) + webpack: 5.90.2(esbuild@0.20.2) dev: true /style-loader@3.3.4(webpack@5.90.2): @@ -24950,7 +24553,7 @@ packages: peerDependencies: webpack: ^5.0.0 dependencies: - webpack: 5.90.2(@swc/core@1.4.5)(esbuild@0.18.20) + webpack: 5.90.2(esbuild@0.20.2) dev: true /style-mod@4.1.2: @@ -24981,15 +24584,15 @@ packages: react: 18.2.0 dev: false - /stylehacks@5.1.1(postcss@8.4.35): + /stylehacks@5.1.1(postcss@8.4.36): resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.23.0 - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.36 + postcss-selector-parser: 6.0.16 dev: true /stylis@4.3.1: @@ -25078,17 +24681,6 @@ packages: resolution: {integrity: sha512-jQG0cRgJNMZ7aCoiFofnoojeSaa/+KgWaDlfgs8QN+BXoGMpxeMVY5OEnjq4OlNvF3yjftO8c9GRAgcHlO+u7A==} dev: false - /swc-loader@0.2.6(@swc/core@1.4.5)(webpack@5.90.2): - resolution: {integrity: sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==} - peerDependencies: - '@swc/core': ^1.2.147 - webpack: '>=2' - dependencies: - '@swc/core': 1.4.5 - '@swc/counter': 0.1.3 - webpack: 5.90.2(@swc/core@1.4.5)(esbuild@0.18.20) - dev: true - /symbol-observable@4.0.0: resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} engines: {node: '>=0.10'} @@ -25145,8 +24737,8 @@ packages: tslib: 2.6.2 dev: true - /tailwind-merge@2.2.1: - resolution: {integrity: sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==} + /tailwind-merge@2.2.2: + resolution: {integrity: sha512-tWANXsnmJzgw6mQ07nE3aCDkCK4QdT3ThPMCzawoYA2Pws7vSTCvz3Vrjg61jVUGfFZPJzxEP+NimbcW+EdaDw==} dependencies: '@babel/runtime': 7.24.0 dev: false @@ -25187,12 +24779,12 @@ packages: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.35 - postcss-import: 15.1.0(postcss@8.4.35) - postcss-js: 4.0.1(postcss@8.4.35) - postcss-load-config: 4.0.2(postcss@8.4.35)(ts-node@10.9.2) - postcss-nested: 6.0.1(postcss@8.4.35) - postcss-selector-parser: 6.0.15 + postcss: 8.4.36 + postcss-import: 15.1.0(postcss@8.4.36) + postcss-js: 4.0.1(postcss@8.4.36) + postcss-load-config: 4.0.2(postcss@8.4.36)(ts-node@10.9.2) + postcss-nested: 6.0.1(postcss@8.4.36) + postcss-selector-parser: 6.0.16 resolve: 1.22.8 sucrase: 3.35.0 transitivePeerDependencies: @@ -25262,6 +24854,22 @@ packages: memoizerific: 1.11.3 dev: true + /temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + dev: true + + /tempy@1.0.1: + resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} + engines: {node: '>=10'} + dependencies: + del: 6.1.1 + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + dev: true + /term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -25285,7 +24893,7 @@ packages: worker-farm: 1.7.0 dev: true - /terser-webpack-plugin@5.3.10(@swc/core@1.4.5)(esbuild@0.18.20)(webpack@5.90.2): + /terser-webpack-plugin@5.3.10(@swc/core@1.4.8)(webpack@5.90.1): resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -25302,16 +24910,15 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.25 - '@swc/core': 1.4.5 - esbuild: 0.18.20 + '@swc/core': 1.4.8 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 - terser: 5.29.1 - webpack: 5.90.2(@swc/core@1.4.5)(esbuild@0.18.20) + terser: 5.29.2 + webpack: 5.90.1(@swc/core@1.4.8) dev: true - /terser-webpack-plugin@5.3.10(@swc/core@1.4.5)(webpack@5.90.1): + /terser-webpack-plugin@5.3.10(@swc/core@1.4.8)(webpack@5.90.2): resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -25328,15 +24935,15 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.25 - '@swc/core': 1.4.5 + '@swc/core': 1.4.8 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 - terser: 5.29.1 - webpack: 5.90.1(@swc/core@1.4.5) + terser: 5.29.2 + webpack: 5.90.2(@swc/core@1.4.8) dev: true - /terser-webpack-plugin@5.3.10(@swc/core@1.4.5)(webpack@5.90.2): + /terser-webpack-plugin@5.3.10(esbuild@0.20.2)(webpack@5.90.2): resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -25353,12 +24960,12 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.25 - '@swc/core': 1.4.5 + esbuild: 0.20.2 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 - terser: 5.29.1 - webpack: 5.90.2(@swc/core@1.4.5) + terser: 5.29.2 + webpack: 5.90.2(esbuild@0.20.2) dev: true /terser@4.8.1: @@ -25372,12 +24979,12 @@ packages: source-map-support: 0.5.21 dev: true - /terser@5.29.1: - resolution: {integrity: sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==} + /terser@5.29.2: + resolution: {integrity: sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==} engines: {node: '>=10'} hasBin: true dependencies: - '@jridgewell/source-map': 0.3.5 + '@jridgewell/source-map': 0.3.6 acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 @@ -25500,10 +25107,6 @@ packages: os-tmpdir: 1.0.2 dev: true - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true - /to-arraybuffer@1.0.1: resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==} dev: true @@ -25612,8 +25215,8 @@ packages: /trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - /ts-api-utils@1.2.1(typescript@5.4.2): - resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} + /ts-api-utils@1.3.0(typescript@5.4.2): + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -25658,12 +25261,12 @@ packages: webpack: ^5.0.0 dependencies: chalk: 4.1.2 - enhanced-resolve: 5.15.1 + enhanced-resolve: 5.16.0 micromatch: 4.0.5 semver: 7.6.0 source-map: 0.7.4 typescript: 5.4.2 - webpack: 5.90.2(@swc/core@1.4.5) + webpack: 5.90.2(@swc/core@1.4.8) dev: true /ts-mixer@6.0.4: @@ -25677,7 +25280,7 @@ packages: code-block-writer: 12.0.0 dev: true - /ts-node@10.9.2(@swc/core@1.4.5)(@types/node@20.9.0)(typescript@5.4.2): + /ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.9.0)(typescript@5.4.2): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -25692,7 +25295,7 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.4.5 + '@swc/core': 1.4.8 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 @@ -25712,8 +25315,8 @@ packages: resolution: {integrity: sha512-aafbuAQOTEeWmA7wtcL94w6I89EgLD7F+IlWkr596wYxeb0oveWDO5dQpv85YP0CGbxXT/qXBIeV6IYLcoZ2uA==} dev: false - /tsconfck@3.0.2(typescript@5.4.2): - resolution: {integrity: sha512-6lWtFjwuhS3XI4HsX4Zg0izOI3FU/AI9EGVlPEUMDIhvLPMD4wkiof0WCoDgW7qY+Dy198g4d9miAqUHWHFH6Q==} + /tsconfck@3.0.3(typescript@5.4.2): + resolution: {integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==} engines: {node: ^18 || >=20} hasBin: true peerDependencies: @@ -25730,7 +25333,7 @@ packages: engines: {node: '>=10.13.0'} dependencies: chalk: 4.1.2 - enhanced-resolve: 5.15.1 + enhanced-resolve: 5.16.0 tsconfig-paths: 4.2.0 dev: true @@ -25753,7 +25356,6 @@ packages: /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: false /tslib@2.3.0: resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} @@ -25831,6 +25433,11 @@ packages: engines: {node: '>=10'} dev: true + /type-fest@0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + dev: true + /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -25865,8 +25472,8 @@ packages: engines: {node: '>=14.16'} dev: true - /type-fest@4.11.1: - resolution: {integrity: sha512-MFMf6VkEVZAETidGGSYW2B1MjXbGX+sWIywn2QPEaJ3j08V+MwVRHMXtf2noB8ENJaD0LIun9wh5Z6OPNf1QzQ==} + /type-fest@4.12.0: + resolution: {integrity: sha512-5Y2/pp2wtJk8o08G0CMkuFPCO354FGwk/vbidxrdhRGZfd0tFnb4Qb8anp9XxXriwBgVPjdWbKpGl4J9lJY2jQ==} engines: {node: '>=16'} dev: false @@ -25941,8 +25548,8 @@ packages: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} dev: false - /ufo@1.4.0: - resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} + /ufo@1.5.2: + resolution: {integrity: sha512-eiutMaL0J2MKdhcOM1tUy13pIrYnyR87fEd8STJQFrrAwImwvlXkxlZEjaKah8r2viPohld08lt73QfLG1NxMg==} dev: true /uglify-js@3.17.4: @@ -25957,6 +25564,10 @@ packages: random-bytes: 1.0.0 dev: false + /uid2@0.0.4: + resolution: {integrity: sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==} + dev: false + /uid@2.0.2: resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} engines: {node: '>=8'} @@ -26077,16 +25688,19 @@ packages: dependencies: imurmurhash: 0.1.4 + /unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + dependencies: + crypto-random-string: 2.0.0 + dev: true + /unist-util-inspect@8.0.0: resolution: {integrity: sha512-/3Wn/wU6/H6UEo4FoYUeo8KUePN8ERiZpQYFWYoihOsr1DoDuv80PeB0hobVZyYSvALa2e556bG1A1/AbwU4yg==} dependencies: '@types/unist': 3.0.2 dev: true - /unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} - dev: true - /unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} dependencies: @@ -26121,27 +25735,12 @@ packages: dependencies: '@types/unist': 3.0.2 - /unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 4.1.0 - dev: true - /unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 - /unist-util-visit@2.0.3: - resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 4.1.0 - unist-util-visit-parents: 3.1.1 - dev: true - /unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} dependencies: @@ -26162,21 +25761,21 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - /unplugin-swc@1.4.4(@swc/core@1.4.5): + /unplugin-swc@1.4.4(@swc/core@1.4.8): resolution: {integrity: sha512-S2mgLIQVNR1+UGIk379/wD3tmkTJfm9QJFyZgXutMDNsSJrcPNJUdSXUNGE/+1Zde9i/I0r0BvDqxGgTkg+eJQ==} peerDependencies: '@swc/core': ^1.2.108 dependencies: - '@rollup/pluginutils': 5.1.0(rollup@2.78.0) - '@swc/core': 1.4.5 + '@rollup/pluginutils': 5.1.0(rollup@2.79.1) + '@swc/core': 1.4.8 load-tsconfig: 0.2.5 - unplugin: 1.8.3 + unplugin: 1.10.0 transitivePeerDependencies: - rollup dev: true - /unplugin@1.8.3: - resolution: {integrity: sha512-ZlLteXGDcyJgsbN2g4sZ3Dw6fpX1O5rjgeaA5MmQhhA2YxnTxsh43f8nDQgFOzcir0iv8GYMjtCV8MtyNnrhEg==} + /unplugin@1.10.0: + resolution: {integrity: sha512-CuZtvvO8ua2Wl+9q2jEaqH6m3DoQ38N7pvBYQbbaeNlWGvK2l6GHiKi29aIHDPoSxdUzQ7Unevf1/ugil5X6Pg==} engines: {node: '>=14.0.0'} dependencies: acorn: 8.11.3 @@ -26244,6 +25843,7 @@ packages: '@types/react': 18.2.64 react: 18.2.0 tslib: 2.6.2 + dev: false /use-composed-ref@1.3.0(react@18.2.0): resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} @@ -26289,6 +25889,7 @@ packages: '@juggle/resize-observer': 3.4.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + dev: false /use-sidecar@1.1.2(@types/react@18.2.64)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} @@ -26304,6 +25905,7 @@ packages: detect-node-es: 1.1.0 react: 18.2.0 tslib: 2.6.2 + dev: false /use-sync-external-store@1.2.0(react@18.2.0): resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} @@ -26340,7 +25942,7 @@ packages: is-arguments: 1.1.1 is-generator-function: 1.0.10 is-typed-array: 1.1.13 - which-typed-array: 1.1.14 + which-typed-array: 1.1.15 /utila@0.4.0: resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} @@ -26368,6 +25970,15 @@ packages: /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + /v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + dev: true + /valid-data-url@3.0.1: resolution: {integrity: sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==} engines: {node: '>=10'} @@ -26428,8 +26039,8 @@ packages: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - /victory-vendor@36.9.1: - resolution: {integrity: sha512-+pZIP+U3pEJdDCeFmsXwHzV7vNHQC/eIbHklfe2ZCZqayYRH7lQbHcVgsJ0XOOv27hWs4jH4MONgXxHMObTMSA==} + /victory-vendor@36.9.2: + resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} dependencies: '@types/d3-array': 3.2.1 '@types/d3-ease': 3.0.2 @@ -26447,8 +26058,8 @@ packages: d3-timer: 3.0.1 dev: false - /vite-node@1.3.1(@types/node@20.9.0): - resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} + /vite-node@1.4.0(@types/node@20.9.0): + resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: @@ -26456,7 +26067,7 @@ packages: debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.1.5(@types/node@20.9.0) + vite: 5.1.6(@types/node@20.9.0) transitivePeerDependencies: - '@types/node' - less @@ -26468,7 +26079,7 @@ packages: - terser dev: true - /vite-plugin-svgr@4.2.0(rollup@2.79.1)(typescript@5.4.2)(vite@5.1.5): + /vite-plugin-svgr@4.2.0(rollup@2.79.1)(typescript@5.4.2)(vite@5.1.6): resolution: {integrity: sha512-SC7+FfVtNQk7So0XMjrrtLAbEC8qjFPifyD7+fs/E6aaNdVde6umlVVh0QuwDLdOMu7vp5RiGFsB70nj5yo0XA==} peerDependencies: vite: ^2.6.0 || 3 || 4 || 5 @@ -26476,30 +26087,15 @@ packages: '@rollup/pluginutils': 5.1.0(rollup@2.79.1) '@svgr/core': 8.1.0(typescript@5.4.2) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0) - vite: 5.1.5(@types/node@20.9.0) - transitivePeerDependencies: - - rollup - - supports-color - - typescript - dev: true - - /vite-plugin-svgr@4.2.0(typescript@5.4.2)(vite@5.1.5): - resolution: {integrity: sha512-SC7+FfVtNQk7So0XMjrrtLAbEC8qjFPifyD7+fs/E6aaNdVde6umlVVh0QuwDLdOMu7vp5RiGFsB70nj5yo0XA==} - peerDependencies: - vite: ^2.6.0 || 3 || 4 || 5 - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@2.78.0) - '@svgr/core': 8.1.0(typescript@5.4.2) - '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0) - vite: 5.1.5(@types/node@20.9.0) + vite: 5.1.6(@types/node@20.9.0) transitivePeerDependencies: - rollup - supports-color - typescript dev: true - /vite-tsconfig-paths@4.3.1(typescript@5.4.2)(vite@5.1.5): - resolution: {integrity: sha512-cfgJwcGOsIxXOLU/nELPny2/LUD/lcf1IbfyeKTv2bsupVbTH/xpFtdQlBmIP1GEK2CjjLxYhFfB+QODFAx5aw==} + /vite-tsconfig-paths@4.3.2(typescript@5.4.2)(vite@5.1.6): + resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} peerDependencies: vite: '*' peerDependenciesMeta: @@ -26508,15 +26104,15 @@ packages: dependencies: debug: 4.3.4 globrex: 0.1.2 - tsconfck: 3.0.2(typescript@5.4.2) - vite: 5.1.5(@types/node@20.9.0) + tsconfck: 3.0.3(typescript@5.4.2) + vite: 5.1.6(@types/node@20.9.0) transitivePeerDependencies: - supports-color - typescript dev: true - /vite@5.1.5(@types/node@20.9.0): - resolution: {integrity: sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==} + /vite@5.1.6(@types/node@20.9.0): + resolution: {integrity: sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -26545,13 +26141,13 @@ packages: dependencies: '@types/node': 20.9.0 esbuild: 0.19.12 - postcss: 8.4.35 - rollup: 4.12.1 + postcss: 8.4.36 + rollup: 4.13.0 optionalDependencies: fsevents: 2.3.3 dev: true - /vitest-mock-extended@1.3.1(typescript@5.4.2)(vitest@1.3.1): + /vitest-mock-extended@1.3.1(typescript@5.4.2)(vitest@1.4.0): resolution: {integrity: sha512-OpghYjh4BDuQ/Mzs3lFMQ1QRk9D8/2O9T47MLUA5eLn7K4RWIy+MfIivYOWEyxjTENjsBnzgMihDjyNalN/K0Q==} peerDependencies: typescript: 3.x || 4.x || 5.x @@ -26559,18 +26155,18 @@ packages: dependencies: ts-essentials: 9.4.1(typescript@5.4.2) typescript: 5.4.2 - vitest: 1.3.1(@types/node@20.9.0)(happy-dom@13.6.2) + vitest: 1.4.0(@types/node@20.9.0)(happy-dom@14.0.0) dev: true - /vitest@1.3.1(@types/node@20.9.0)(happy-dom@13.6.2): - resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==} + /vitest@1.4.0(@types/node@20.9.0)(happy-dom@14.0.0): + resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.3.1 - '@vitest/ui': 1.3.1 + '@vitest/browser': 1.4.0 + '@vitest/ui': 1.4.0 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -26588,16 +26184,16 @@ packages: optional: true dependencies: '@types/node': 20.9.0 - '@vitest/expect': 1.3.1 - '@vitest/runner': 1.3.1 - '@vitest/snapshot': 1.3.1 - '@vitest/spy': 1.3.1 - '@vitest/utils': 1.3.1 + '@vitest/expect': 1.4.0 + '@vitest/runner': 1.4.0 + '@vitest/snapshot': 1.4.0 + '@vitest/spy': 1.4.0 + '@vitest/utils': 1.4.0 acorn-walk: 8.3.2 chai: 4.4.1 debug: 4.3.4 execa: 8.0.1 - happy-dom: 13.6.2 + happy-dom: 14.0.0 local-pkg: 0.5.0 magic-string: 0.30.8 pathe: 1.1.2 @@ -26606,8 +26202,8 @@ packages: strip-literal: 2.0.0 tinybench: 2.6.0 tinypool: 0.8.2 - vite: 5.1.5(@types/node@20.9.0) - vite-node: 1.3.1(@types/node@20.9.0) + vite: 5.1.6(@types/node@20.9.0) + vite-node: 1.4.0(@types/node@20.9.0) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -26636,12 +26232,6 @@ packages: resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} dev: true - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - dev: true - /watchpack-chokidar2@2.0.1: resolution: {integrity: sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==} requiresBuild: true @@ -26664,8 +26254,8 @@ packages: - supports-color dev: true - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + /watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} engines: {node: '>=10.13.0'} dependencies: glob-to-regexp: 0.4.1 @@ -26753,7 +26343,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 3.3.0 - webpack: 5.90.2(@swc/core@1.4.5)(esbuild@0.18.20) + webpack: 5.90.2(esbuild@0.20.2) dev: true /webpack-dev-middleware@6.1.1(webpack@5.90.2): @@ -26770,7 +26360,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.90.2(@swc/core@1.4.5)(esbuild@0.18.20) + webpack: 5.90.2(esbuild@0.20.2) dev: true /webpack-hot-middleware@2.26.1: @@ -26849,7 +26439,7 @@ packages: - supports-color dev: true - /webpack@5.90.1(@swc/core@1.4.5): + /webpack@5.90.1(@swc/core@1.4.8): resolution: {integrity: sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==} engines: {node: '>=10.13.0'} hasBin: true @@ -26861,15 +26451,15 @@ packages: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 acorn: 8.11.3 acorn-import-assertions: 1.9.0(acorn@8.11.3) browserslist: 4.23.0 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.1 - es-module-lexer: 1.4.1 + enhanced-resolve: 5.16.0 + es-module-lexer: 1.4.2 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -26880,8 +26470,8 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.4.5)(webpack@5.90.1) - watchpack: 2.4.0 + terser-webpack-plugin: 5.3.10(@swc/core@1.4.8)(webpack@5.90.1) + watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -26889,7 +26479,7 @@ packages: - uglify-js dev: true - /webpack@5.90.2(@swc/core@1.4.5): + /webpack@5.90.2(@swc/core@1.4.8): resolution: {integrity: sha512-ziXu8ABGr0InCMEYFnHrYweinHK2PWrMqnwdHk2oK3rRhv/1B+2FnfwYv5oD+RrknK/Pp/Hmyvu+eAsaMYhzCw==} engines: {node: '>=10.13.0'} hasBin: true @@ -26901,15 +26491,15 @@ packages: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 acorn: 8.11.3 acorn-import-assertions: 1.9.0(acorn@8.11.3) browserslist: 4.23.0 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.1 - es-module-lexer: 1.4.1 + enhanced-resolve: 5.16.0 + es-module-lexer: 1.4.2 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -26920,8 +26510,8 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.4.5)(webpack@5.90.2) - watchpack: 2.4.0 + terser-webpack-plugin: 5.3.10(@swc/core@1.4.8)(webpack@5.90.2) + watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -26929,7 +26519,7 @@ packages: - uglify-js dev: true - /webpack@5.90.2(@swc/core@1.4.5)(esbuild@0.18.20): + /webpack@5.90.2(esbuild@0.20.2): resolution: {integrity: sha512-ziXu8ABGr0InCMEYFnHrYweinHK2PWrMqnwdHk2oK3rRhv/1B+2FnfwYv5oD+RrknK/Pp/Hmyvu+eAsaMYhzCw==} engines: {node: '>=10.13.0'} hasBin: true @@ -26941,15 +26531,15 @@ packages: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 acorn: 8.11.3 acorn-import-assertions: 1.9.0(acorn@8.11.3) browserslist: 4.23.0 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.1 - es-module-lexer: 1.4.1 + enhanced-resolve: 5.16.0 + es-module-lexer: 1.4.2 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -26960,8 +26550,8 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.4.5)(esbuild@0.18.20)(webpack@5.90.2) - watchpack: 2.4.0 + terser-webpack-plugin: 5.3.10(esbuild@0.20.2)(webpack@5.90.2) + watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -27008,16 +26598,17 @@ packages: is-weakref: 1.0.2 isarray: 2.0.5 which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.14 + which-collection: 1.0.2 + which-typed-array: 1.1.15 - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 /which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} @@ -27031,8 +26622,8 @@ packages: path-exists: 4.0.0 dev: true - /which-typed-array@1.1.14: - resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 @@ -27166,14 +26757,6 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true - /ws@7.5.9: resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} engines: {node: '>=8.3.0'} @@ -27326,7 +26909,7 @@ packages: tslib: 2.3.0 dev: false - /zustand@4.5.2(@types/react@18.2.64)(immer@10.0.3)(react@18.2.0): + /zustand@4.5.2(@types/react@18.2.64)(immer@10.0.4)(react@18.2.0): resolution: {integrity: sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==} engines: {node: '>=12.7.0'} peerDependencies: @@ -27342,7 +26925,7 @@ packages: optional: true dependencies: '@types/react': 18.2.64 - immer: 10.0.3 + immer: 10.0.4 react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) dev: false @@ -27357,12 +26940,12 @@ packages: dependencies: '@types/fs-extra': 11.0.4 '@types/minimist': 1.2.5 - '@types/node': 18.19.22 + '@types/node': 18.19.25 '@types/ps-tree': 1.1.6 '@types/which': 3.0.3 chalk: 5.3.0 fs-extra: 11.2.0 - fx: 31.0.0 + fx: 33.0.0 globby: 13.2.2 minimist: 1.2.8 node-fetch: 3.3.1 @@ -27371,3 +26954,11 @@ packages: which: 3.0.1 yaml: 2.4.1 dev: true + + '@cdn.sheetjs.com/xlsx-0.20.1/xlsx-0.20.1.tgz': + resolution: {tarball: https://cdn.sheetjs.com/xlsx-0.20.1/xlsx-0.20.1.tgz} + name: xlsx + version: 0.20.1 + engines: {node: '>=0.8'} + hasBin: true + dev: false diff --git a/scripts/build-image.mjs b/scripts/build-image.mjs index 5cac894c9..28c6afe2a 100755 --- a/scripts/build-image.mjs +++ b/scripts/build-image.mjs @@ -19,6 +19,7 @@ */ const env = $.env; +let isCi = ['true', '1'].includes(env?.CI ?? ''); const getSemver = async () => { // console.log('all environment variables: ', env); @@ -29,6 +30,7 @@ const getSemver = async () => { if (env.GITHUB_ACTIONS) { // github action + isCi = true; const refType = env.GITHUB_REF_TYPE; const runNumber = env.GITHUB_RUN_NUMBER; const sha = env.GITHUB_SHA.substring(0, 7); @@ -47,20 +49,20 @@ const getSemver = async () => { }; const toArray = (input, commaSplit = false, newlineSplit = false) => { - if (input === undefined) { - return []; - } - if (typeof input === 'string') { - if (commaSplit) { - return input.split(',').map((item) => item.trim()); - } else if (newlineSplit) { - return input.split('\n').map((item) => item.trim()); + if (input === undefined) return []; + + const delimiter = commaSplit ? ',' : newlineSplit ? '\n' : null; + + const items = Array.isArray(input) ? input : [input]; + + return items.flatMap((item) => { + if (typeof item === 'string' && delimiter) { + return item.split(delimiter).map((part) => part.trim()); + } else if (typeof item === 'string') { + return item.trim(); } - } - if (Array.isArray(input)) { - return input.map((item) => (typeof item === 'string' ? item.trim() : item)); - } - return [input]; + return item; + }); }; const toBoolean = (input) => Boolean(input); const asyncForEach = async (array, callback) => { @@ -75,6 +77,7 @@ const { 'cache-from': cacheFromArg, 'cache-to': cacheToArg, tag, + 'tag-suffix': tagSuffix, platforms: platformsArg, push: pushArg, } = argv; @@ -107,7 +110,7 @@ if (platforms.length > 0) { command.push('--platform', platforms.join(',')); } await asyncForEach(tags, async (tag) => { - command.push('--tag', tag); + command.push('--tag', `${tag}${tagSuffix ?? ''}`); }); if (push) { @@ -115,6 +118,6 @@ if (push) { } command.push('.'); +command.push('--progress=plain'); -console.log(command.join(' ')); await $`${command}`; diff --git a/scripts/db-migrate.mjs b/scripts/db-migrate.mjs index 41f9cb9b5..ab6942379 100755 --- a/scripts/db-migrate.mjs +++ b/scripts/db-migrate.mjs @@ -1,8 +1,11 @@ #!/usr/bin/env zx -import { $ } from 'zx'; import { parseDsn as parse } from '@soluble/dsn-parser'; -const databaseUrl = process.env.PRISMA_DATABASE_URL; +const env = $.env; +let isCi = ['true', '1'].includes(env?.CI ?? ''); + +const buildVersion = env.BUILD_VERSION; +const databaseUrl = env.PRISMA_DATABASE_URL; const parseDsn = (dsn) => { const parsedDsn = parse(dsn); @@ -26,6 +29,7 @@ const killMe = async () => { await $`exit 0`; }; +console.log(`DB Migrate Version: ${buildVersion}`); await $`prisma -v`; const { driver, host, port } = parseDsn(databaseUrl);