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 64173937e..000000000 Binary files a/apps/electron/static/background.png and /dev/null differ diff --git a/apps/electron/static/icons/icon.icns b/apps/electron/static/icons/icon.icns deleted file mode 100644 index 70db60d7d..000000000 Binary files a/apps/electron/static/icons/icon.icns and /dev/null differ diff --git a/apps/electron/static/icons/icon.ico b/apps/electron/static/icons/icon.ico deleted file mode 100644 index b5540dbef..000000000 Binary files a/apps/electron/static/icons/icon.ico and /dev/null differ diff --git a/apps/electron/static/icons/icon.png b/apps/electron/static/icons/icon.png deleted file mode 100644 index b5540dbef..000000000 Binary files a/apps/electron/static/icons/icon.png and /dev/null differ 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);