diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 31cc5e73..00000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,136 +0,0 @@ -name: Dongarium FE CI/CD - -on: - pull_request: - branches: [ "develop" ] - push: - branches: [ "main" ] - -jobs: - install-dependencies: - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - - name: Set up Node.js - uses: actions/setup-node@v2 - with: - node-version: '22' - - - name: Restore node modules from cache - id: restore-node-modules - uses: actions/cache@v3 - with: - path: node_modules - key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node - - - name: Install dependencies - if: steps.restore-node-modules.outputs.cache-hit != 'true' - run: npm install - - lint: - runs-on: ubuntu-latest - needs: install-dependencies - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - - name: Set up Node.js - uses: actions/setup-node@v2 - with: - node-version: '22' - - - name: Restore node modules from cache - id: restore-node-modules - uses: actions/cache@v3 - with: - path: node_modules - key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - name: Install dependencies (if not cached) - if: steps.restore-node-modules.outputs.cache-hit != 'true' - run: npm install - - - name: Run lint - run: npm run lint - - type-check: - runs-on: ubuntu-latest - needs: install-dependencies - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 - with: - node-version: '22' - - name: Restore node modules from cache - uses: actions/cache@v3 - with: - path: node_modules - key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }} - - name: Install dependencies - run: npm install - - name: TypeScript type check - run: npx tsc --noEmit - - - build: - runs-on: ubuntu-latest - needs: [install-dependencies, lint] - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - - name: Set up Node.js - uses: actions/setup-node@v2 - with: - node-version: '22' - - - name: Restore node modules from cache - id: restore-node-modules - uses: actions/cache@v3 - with: - path: node_modules - key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - name: Install dependencies (if not cached) - if: steps.restore-node-modules.outputs.cache-hit != 'true' - run: npm install - - - name: Run Build - env: - VITE_API_BASE_URL: ${{ secrets.VITE_API_BASE_URL }} - run: npm run build - - - name: Upload dist as artifact - uses: actions/upload-artifact@v4 - with: - name: react-dist - path: ./dist - - deploy: - runs-on: ubuntu-latest - needs: build - if: github.event_name == 'push' && github.ref == 'refs/heads/main' - steps: - - name: Download build artifact - uses: actions/download-artifact@v4 - with: - name: react-dist - path: ./dist - - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v2 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: ap-northeast-2 - - - name: Deploy to S3 and invalidate CloudFront - run: | - aws s3 sync ./dist s3://${{ secrets.S3_BUCKET }} --delete --acl public-read - aws cloudfront create-invalidation --distribution-id ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }} --paths "/*" diff --git a/.github/workflows/fe-ci-cd.yml b/.github/workflows/fe-ci-cd.yml index 86587513..d80dfc73 100644 --- a/.github/workflows/fe-ci-cd.yml +++ b/.github/workflows/fe-ci-cd.yml @@ -4,7 +4,7 @@ on: pull_request: branches: ['develop'] push: - branches: ['main'] + branches: ['develop'] jobs: install-dependencies: @@ -114,7 +114,7 @@ jobs: deploy: runs-on: ubuntu-latest needs: build - if: github.event_name == 'push' && github.ref == 'refs/heads/main' + if: github.event_name == 'push' && github.ref == 'refs/heads/develop' environment: dongarium steps: - name: Download build artifact @@ -132,5 +132,5 @@ jobs: - name: Deploy to S3 and invalidate CloudFront run: | - aws s3 sync ./dist s3://${{ secrets.S3_BUCKET }} --delete --acl public-read + aws s3 sync ./dist s3://${{ secrets.S3_BUCKET }} --delete aws cloudfront create-invalidation --distribution-id ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }} --paths "/*" diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 00000000..36af2198 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx lint-staged diff --git a/package-lock.json b/package-lock.json index da8d185e..63241963 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,8 @@ "react-hook-form": "^7.63.0", "react-icons": "^5.5.0", "react-router-dom": "^7.8.2", - "reset-css": "^5.0.2" + "reset-css": "^5.0.2", + "sonner": "^2.0.7" }, "devDependencies": { "@emotion/babel-plugin": "^11.13.5", @@ -44,6 +45,8 @@ "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-react-refresh": "0.4.5", "globals": "^16.3.0", + "husky": "^9.1.7", + "lint-staged": "^16.2.4", "prettier": "^3.6.2", "typescript": "~5.8.3", "typescript-eslint": "^8.39.1", @@ -54,7 +57,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", @@ -69,7 +71,6 @@ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -79,7 +80,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -109,15 +109,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -126,7 +124,6 @@ "version": "7.28.3", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", - "license": "MIT", "dependencies": { "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", @@ -143,7 +140,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", @@ -160,7 +156,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -169,7 +164,6 @@ "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -178,7 +172,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" @@ -192,7 +185,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", @@ -210,7 +202,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -219,7 +210,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -228,7 +218,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -238,7 +227,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -248,7 +236,6 @@ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.4" @@ -261,7 +248,6 @@ "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", - "license": "MIT", "dependencies": { "@babel/types": "^7.28.4" }, @@ -277,7 +263,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -293,7 +278,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -308,7 +292,6 @@ "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -317,7 +300,6 @@ "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", @@ -331,7 +313,6 @@ "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -349,7 +330,6 @@ "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", - "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" @@ -362,7 +342,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.1.tgz", "integrity": "sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==", - "license": "ISC", "dependencies": { "cookie": "^0.7.2" } @@ -371,7 +350,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", - "license": "ISC", "dependencies": { "statuses": "^2.0.1" } @@ -381,7 +359,6 @@ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "@emnapi/wasi-threads": "1.1.0", @@ -393,7 +370,6 @@ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" @@ -404,7 +380,6 @@ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" @@ -414,7 +389,6 @@ "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", - "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", @@ -433,7 +407,6 @@ "version": "11.14.0", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", - "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0", "@emotion/sheet": "^1.4.0", @@ -445,14 +418,12 @@ "node_modules/@emotion/hash": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", - "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", - "license": "MIT" + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" }, "node_modules/@emotion/is-prop-valid": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", - "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0" } @@ -460,14 +431,12 @@ "node_modules/@emotion/memoize": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", - "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", - "license": "MIT" + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" }, "node_modules/@emotion/react": { "version": "11.14.0", "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -491,7 +460,6 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", - "license": "MIT", "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", @@ -503,14 +471,12 @@ "node_modules/@emotion/sheet": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", - "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", - "license": "MIT" + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" }, "node_modules/@emotion/styled": { "version": "11.14.1", "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -532,14 +498,12 @@ "node_modules/@emotion/unitless": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", - "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", - "license": "MIT" + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", - "license": "MIT", "peerDependencies": { "react": ">=16.8.0" } @@ -547,14 +511,12 @@ "node_modules/@emotion/utils": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", - "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", - "license": "MIT" + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==" }, "node_modules/@emotion/weak-memoize": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", - "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", - "license": "MIT" + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.10", @@ -564,7 +526,6 @@ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "aix" @@ -581,7 +542,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -598,7 +558,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -615,7 +574,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -632,7 +590,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -649,7 +606,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -666,7 +622,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -683,7 +638,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -700,7 +654,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -717,7 +670,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -734,7 +686,6 @@ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -751,7 +702,6 @@ "loong64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -768,7 +718,6 @@ "mips64el" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -785,7 +734,6 @@ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -802,7 +750,6 @@ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -819,7 +766,6 @@ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -836,7 +782,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -853,7 +798,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "netbsd" @@ -870,7 +814,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "netbsd" @@ -887,7 +830,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openbsd" @@ -904,7 +846,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openbsd" @@ -921,7 +862,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openharmony" @@ -938,7 +878,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "sunos" @@ -955,7 +894,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -972,7 +910,6 @@ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -989,7 +926,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -1003,7 +939,6 @@ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -1022,7 +957,6 @@ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, - "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1032,7 +966,6 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -1056,7 +989,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1067,7 +999,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -1083,7 +1014,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -1093,7 +1023,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1106,7 +1035,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -1115,11 +1043,10 @@ } }, "node_modules/@eslint/js": { - "version": "9.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", - "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", + "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1131,7 +1058,6 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", - "license": "MIT", "dependencies": { "@floating-ui/utils": "^0.2.10" } @@ -1140,7 +1066,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", - "license": "MIT", "dependencies": { "@floating-ui/core": "^1.7.3", "@floating-ui/utils": "^0.2.10" @@ -1150,7 +1075,6 @@ "version": "0.27.16", "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.16.tgz", "integrity": "sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g==", - "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.1.6", "@floating-ui/utils": "^0.2.10", @@ -1165,7 +1089,6 @@ "version": "2.1.6", "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", - "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.7.4" }, @@ -1177,8 +1100,7 @@ "node_modules/@floating-ui/utils": { "version": "0.2.10", "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", - "license": "MIT" + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==" }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", @@ -1186,7 +1108,6 @@ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", "dev": true, - "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", @@ -1201,7 +1122,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1212,7 +1132,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1225,7 +1144,6 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -1239,14 +1157,12 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/@inquirer/ansi": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.0.tgz", "integrity": "sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==", - "license": "MIT", "engines": { "node": ">=18" } @@ -1255,7 +1171,6 @@ "version": "5.1.18", "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.18.tgz", "integrity": "sha512-MilmWOzHa3Ks11tzvuAmFoAd/wRuaP3SwlT1IZhyMke31FKLxPiuDWcGXhU+PKveNOpAc4axzAgrgxuIJJRmLw==", - "license": "MIT", "dependencies": { "@inquirer/core": "^10.2.2", "@inquirer/type": "^3.0.8" @@ -1276,7 +1191,6 @@ "version": "10.2.2", "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.2.2.tgz", "integrity": "sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==", - "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.0", "@inquirer/figures": "^1.0.13", @@ -1303,7 +1217,6 @@ "version": "1.0.13", "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", - "license": "MIT", "engines": { "node": ">=18" } @@ -1312,7 +1225,6 @@ "version": "3.0.8", "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", - "license": "MIT", "engines": { "node": ">=18" }, @@ -1329,7 +1241,6 @@ "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" @@ -1340,7 +1251,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -1350,7 +1260,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1358,14 +1267,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1375,7 +1282,6 @@ "version": "0.39.7", "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.39.7.tgz", "integrity": "sha512-sURvQbbKsq5f8INV54YJgJEdk8oxBanqkTiXXd33rKmofFCwZLhLRszPduMZ9TA9b8/1CHc/IJmOlBHJk2Q5AQ==", - "license": "MIT", "dependencies": { "@open-draft/deferred-promise": "^2.2.0", "@open-draft/logger": "^0.3.0", @@ -1393,7 +1299,6 @@ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "@emnapi/core": "^1.4.3", @@ -1406,7 +1311,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1420,7 +1324,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } @@ -1430,7 +1333,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1442,14 +1344,12 @@ "node_modules/@open-draft/deferred-promise": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", - "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", - "license": "MIT" + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==" }, "node_modules/@open-draft/logger": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", - "license": "MIT", "dependencies": { "is-node-process": "^1.2.0", "outvariant": "^1.4.0" @@ -1458,15 +1358,13 @@ "node_modules/@open-draft/until": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", - "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", - "license": "MIT" + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==" }, "node_modules/@pkgr/core": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, @@ -1478,312 +1376,289 @@ "version": "1.0.0-beta.38", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.38.tgz", "integrity": "sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.3.tgz", - "integrity": "sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", + "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.3.tgz", - "integrity": "sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", + "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.3.tgz", - "integrity": "sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", + "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.3.tgz", - "integrity": "sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", + "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.3.tgz", - "integrity": "sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", + "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.3.tgz", - "integrity": "sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", + "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.3.tgz", - "integrity": "sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", + "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.3.tgz", - "integrity": "sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", + "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.3.tgz", - "integrity": "sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", + "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.3.tgz", - "integrity": "sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", + "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.3.tgz", - "integrity": "sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", + "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", "cpu": [ "loong64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.3.tgz", - "integrity": "sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", + "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.3.tgz", - "integrity": "sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", + "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.3.tgz", - "integrity": "sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", + "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.3.tgz", - "integrity": "sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", + "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", "cpu": [ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.3.tgz", - "integrity": "sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", + "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.3.tgz", - "integrity": "sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", + "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.3.tgz", - "integrity": "sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", + "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openharmony" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.3.tgz", - "integrity": "sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", + "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.3.tgz", - "integrity": "sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", + "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.3.tgz", - "integrity": "sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", + "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.3.tgz", - "integrity": "sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", + "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -1793,14 +1668,12 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@tanstack/query-core": { "version": "5.90.2", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.2.tgz", "integrity": "sha512-k/TcR3YalnzibscALLwxeiLUub6jN5EDLwKDiO7q5f4ICEoptJ+n9+7vcEFy5/x/i6Q+Lb/tXrsKCggf5uQJXQ==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -1810,7 +1683,6 @@ "version": "5.90.2", "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.2.tgz", "integrity": "sha512-CLABiR+h5PYfOWr/z+vWFt5VsOA2ekQeRQBFSKlcoW6Ndx/f8rfyVmq4LbgOM4GG2qtxAxjLYLOpCNTYm4uKzw==", - "license": "MIT", "dependencies": { "@tanstack/query-core": "5.90.2" }, @@ -1827,7 +1699,6 @@ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" @@ -1838,7 +1709,6 @@ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -1852,7 +1722,6 @@ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } @@ -1862,7 +1731,6 @@ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -1873,7 +1741,6 @@ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.28.2" } @@ -1881,84 +1748,74 @@ "node_modules/@types/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", - "license": "MIT" + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/node": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.6.0.tgz", - "integrity": "sha512-F1CBxgqwOMc4GKJ7eY22hWhBVQuMYTtqI8L0FcszYcpYX0fzfDGpez22Xau8Mgm7O9fI+zA/TYIdq3tGWfweBA==", + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.0.tgz", + "integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==", "devOptional": true, - "license": "MIT", "dependencies": { - "undici-types": "~7.13.0" + "undici-types": "~7.14.0" } }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "license": "MIT" + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, "node_modules/@types/react": { - "version": "19.1.16", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.16.tgz", - "integrity": "sha512-WBM/nDbEZmDUORKnh5i1bTnAz6vTohUf9b8esSMu+b24+srbaxa04UbJgWx78CVfNXA20sNu0odEIluZDFdCog==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", + "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", "dev": true, - "license": "MIT", "dependencies": { "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "19.1.9", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz", - "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.1.tgz", + "integrity": "sha512-/EEvYBdT3BflCWvTMO7YkYBHVE9Ci6XdqZciZANQgKpaiDRGOLIlRo91jbTNRQjgPFWVaRxcYc0luVNFitz57A==", "dev": true, - "license": "MIT", "peerDependencies": { - "@types/react": "^19.0.0" + "@types/react": "^19.2.0" } }, "node_modules/@types/statuses": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", - "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", - "license": "MIT" + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.45.0.tgz", - "integrity": "sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz", + "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/type-utils": "8.45.0", - "@typescript-eslint/utils": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/type-utils": "8.46.0", + "@typescript-eslint/utils": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -1972,22 +1829,21 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.45.0", + "@typescript-eslint/parser": "^8.46.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.45.0.tgz", - "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz", + "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", "debug": "^4.3.4" }, "engines": { @@ -2003,14 +1859,13 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.45.0.tgz", - "integrity": "sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz", + "integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.45.0", - "@typescript-eslint/types": "^8.45.0", + "@typescript-eslint/tsconfig-utils": "^8.46.0", + "@typescript-eslint/types": "^8.46.0", "debug": "^4.3.4" }, "engines": { @@ -2025,14 +1880,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz", - "integrity": "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz", + "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0" + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2043,11 +1897,10 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz", - "integrity": "sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz", + "integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==", "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2060,15 +1913,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.45.0.tgz", - "integrity": "sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz", + "integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/utils": "8.45.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/utils": "8.46.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -2085,11 +1937,10 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz", - "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz", + "integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==", "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2099,16 +1950,15 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz", - "integrity": "sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz", + "integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.45.0", - "@typescript-eslint/tsconfig-utils": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/project-service": "8.46.0", + "@typescript-eslint/tsconfig-utils": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -2128,16 +1978,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.45.0.tgz", - "integrity": "sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz", + "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0" + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2152,13 +2001,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz", - "integrity": "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz", + "integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/types": "8.46.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -2174,7 +2022,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2186,8 +2033,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { "version": "1.11.1", @@ -2197,7 +2043,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -2211,7 +2056,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -2225,7 +2069,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2239,7 +2082,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2253,7 +2095,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -2267,7 +2108,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2281,7 +2121,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2295,7 +2134,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2309,7 +2147,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2323,7 +2160,6 @@ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2337,7 +2173,6 @@ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2351,7 +2186,6 @@ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2365,7 +2199,6 @@ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2379,7 +2212,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2393,7 +2225,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2407,7 +2238,6 @@ "wasm32" ], "dev": true, - "license": "MIT", "optional": true, "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" @@ -2424,7 +2254,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -2438,7 +2267,6 @@ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -2452,7 +2280,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -2463,7 +2290,6 @@ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.4.tgz", "integrity": "sha512-La0KD0vGkVkSk6K+piWDKRUyg8Rl5iAIKRMH0vMJI0Eg47bq1eOxmoObAaQG37WMW9MSyk7Cs8EIWwJC1PtzKA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.28.4", "@babel/plugin-transform-react-jsx-self": "^7.27.1", @@ -2484,7 +2310,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -2497,7 +2322,6 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -2507,7 +2331,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2519,11 +2342,26 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-escapes": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz", + "integrity": "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", "engines": { "node": ">=8" } @@ -2532,7 +2370,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -2547,15 +2384,13 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" + "dev": true }, "node_modules/aria-query": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">= 0.4" } @@ -2565,7 +2400,6 @@ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" @@ -2582,7 +2416,6 @@ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", @@ -2605,7 +2438,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2626,7 +2458,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", @@ -2648,7 +2479,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -2667,7 +2497,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -2686,7 +2515,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2703,7 +2531,6 @@ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", @@ -2724,23 +2551,13 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/async-function": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/async-generator-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-generator-function/-/async-generator-function-1.0.0.tgz", - "integrity": "sha512-+NAXNqgCrB95ya4Sr66i1CL2hqLVckAk7xwRYWdcm39/ELQ6YNn1aw5r0bdQtqNZgQpEWzc5yc/igXc7aL5SLA==", - "license": "MIT", + "dev": true, "engines": { "node": ">= 0.4" } @@ -2748,15 +2565,13 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, - "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -2772,7 +2587,6 @@ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", "dev": true, - "license": "MPL-2.0", "engines": { "node": ">=4" } @@ -2781,7 +2595,6 @@ "version": "1.12.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", - "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", @@ -2793,7 +2606,6 @@ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">= 0.4" } @@ -2802,7 +2614,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -2817,15 +2628,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/baseline-browser-mapping": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.9.tgz", - "integrity": "sha512-hY/u2lxLrbecMEWSB0IpGzGyDyeoMFQhCvZd2jGFSE5I17Fh01sYUBPCJtkWERw7zrac9+cIghxm/ytJa2X8iA==", + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.13.tgz", + "integrity": "sha512-7s16KR8io8nIBWQyCYhmFhd+ebIzb9VKTzki+wOJXHTxTnV6+mFGH3+Jwn1zoKaY9/H9T/0BcKCZnzXljPnpSQ==", "dev": true, - "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" } @@ -2835,7 +2644,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -2845,7 +2653,6 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -2854,9 +2661,9 @@ } }, "node_modules/browserslist": { - "version": "4.26.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz", - "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", "dev": true, "funding": [ { @@ -2872,11 +2679,10 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.3", - "caniuse-lite": "^1.0.30001741", - "electron-to-chromium": "^1.5.218", + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", "node-releases": "^2.0.21", "update-browserslist-db": "^1.1.3" }, @@ -2892,7 +2698,6 @@ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, - "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", @@ -2910,7 +2715,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -2924,7 +2728,6 @@ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -2940,15 +2743,14 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001746", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001746.tgz", - "integrity": "sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==", + "version": "1.0.30001749", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001749.tgz", + "integrity": "sha512-0rw2fJOmLfnzCRbkm8EyHL8SvI2Apu5UbnQuTsJ0ClgrH8hcwFooJ1s5R0EP8o8aVrFu8++ae29Kt9/gZAZp/Q==", "dev": true, "funding": [ { @@ -2963,15 +2765,13 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2983,38 +2783,114 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/cli-truncate": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.0.tgz", + "integrity": "sha512-7JDGG+4Zp0CsknDCedl0DYdaeOhc46QNpXi3NLQblkZpXXgA6LncLDUUyvrjSvZeF3VRQa+KiMGomazQrC1V8g==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" @@ -3027,7 +2903,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", "engines": { "node": ">=6" } @@ -3036,7 +2911,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -3047,14 +2921,19 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -3062,31 +2941,37 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.1.tgz", + "integrity": "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "license": "MIT" + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3095,7 +2980,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -3111,7 +2995,6 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", "engines": { "node": ">= 6" } @@ -3121,7 +3004,6 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3134,22 +3016,19 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true, - "license": "BSD-2-Clause" + "dev": true }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -3167,7 +3046,6 @@ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -3185,7 +3063,6 @@ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -3202,7 +3079,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/kossnocorp" @@ -3212,7 +3088,6 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -3229,15 +3104,13 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -3255,7 +3128,6 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -3272,7 +3144,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -3282,7 +3153,6 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -3294,7 +3164,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -3305,24 +3174,34 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.227", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.227.tgz", - "integrity": "sha512-ITxuoPfJu3lsNWUi2lBM2PaBPYgH3uqmxut5vmBxgYvyI4AlJ6P3Cai1O76mOrkJCBzq0IxWg/NtqOrpu/0gKA==", - "dev": true, - "license": "ISC" + "version": "1.5.233", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.233.tgz", + "integrity": "sha512-iUdTQSf7EFXsDdQsp8MwJz5SVk4APEFqXU/S47OtQ0YLqacSwPXdZ5vRlMX3neb07Cy2vgioNuRnWUXFwuslkg==", + "dev": true }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -3332,7 +3211,6 @@ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", "dev": true, - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", @@ -3400,7 +3278,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -3409,7 +3286,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -3419,7 +3295,6 @@ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -3446,7 +3321,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -3458,7 +3332,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -3474,7 +3347,6 @@ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, - "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -3487,7 +3359,6 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, - "license": "MIT", "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", @@ -3506,7 +3377,6 @@ "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -3546,7 +3416,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", "engines": { "node": ">=6" } @@ -3555,7 +3424,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -3569,7 +3437,6 @@ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -3625,7 +3492,6 @@ "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", "dev": true, - "license": "MIT", "dependencies": { "eslint-config-airbnb-base": "^15.0.0", "object.assign": "^4.1.2", @@ -3647,7 +3513,6 @@ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", "dev": true, - "license": "MIT", "dependencies": { "confusing-browser-globals": "^1.0.10", "object.assign": "^4.1.2", @@ -3667,7 +3532,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -3677,7 +3541,6 @@ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, - "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -3693,7 +3556,6 @@ "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz", "integrity": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==", "dev": true, - "license": "MIT", "dependencies": { "get-tsconfig": "^4.10.1", "stable-hash-x": "^0.2.0" @@ -3718,7 +3580,6 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -3730,7 +3591,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -3740,7 +3600,6 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.4.tgz", "integrity": "sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw==", "dev": true, - "license": "ISC", "dependencies": { "debug": "^4.4.1", "eslint-import-context": "^0.1.8", @@ -3775,7 +3634,6 @@ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -3793,7 +3651,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -3803,7 +3660,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, - "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -3837,7 +3693,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3848,7 +3703,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -3858,7 +3712,6 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -3871,7 +3724,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3884,7 +3736,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -3894,7 +3745,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", "dev": true, - "license": "MIT", "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", @@ -3924,7 +3774,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3935,7 +3784,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3948,7 +3796,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", "dev": true, - "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.11.7" @@ -3979,7 +3826,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", "dev": true, - "license": "MIT", "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", @@ -4012,7 +3858,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -4025,7 +3870,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz", "integrity": "sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==", "dev": true, - "license": "MIT", "peerDependencies": { "eslint": ">=7" } @@ -4035,7 +3879,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4046,7 +3889,6 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -4059,7 +3901,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4072,7 +3913,6 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, - "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -4090,7 +3930,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -4100,7 +3939,6 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -4117,7 +3955,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4130,7 +3967,6 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -4140,7 +3976,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4151,7 +3986,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -4167,7 +4001,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -4177,7 +4010,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4190,7 +4022,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -4203,7 +4034,6 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -4221,7 +4051,6 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -4234,7 +4063,6 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -4247,7 +4075,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -4257,31 +4084,34 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fast-diff": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true, - "license": "Apache-2.0" + "dev": true }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -4298,7 +4128,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -4310,22 +4139,19 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, - "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -4335,7 +4161,6 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -4348,7 +4173,6 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4359,15 +4183,13 @@ "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "license": "MIT" + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -4384,7 +4206,6 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, - "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -4398,8 +4219,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/follow-redirects": { "version": "1.15.11", @@ -4411,7 +4231,6 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -4426,7 +4245,6 @@ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, - "license": "MIT", "dependencies": { "is-callable": "^1.2.7" }, @@ -4441,7 +4259,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -4457,8 +4274,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -4466,7 +4282,6 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -4479,7 +4294,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4489,7 +4303,6 @@ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -4510,16 +4323,15 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/generator-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.0.tgz", - "integrity": "sha512-xPypGGincdfyl/AiSGa7GjXLkvld9V7GjZlowup9SHIJnQnHLFiLODCd/DqKOp0PBagbHJ68r1KJI9Mut7m4sA==", - "license": "MIT", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, "engines": { "node": ">= 0.4" } @@ -4529,7 +4341,6 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -4538,25 +4349,33 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-intrinsic": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.1.tgz", - "integrity": "sha512-fk1ZVEeOX9hVZ6QzoBNEC55+Ucqg4sTVwrVuigZhuRPESVFpMyXnd3sbXvPOwp7Y9riVyANiqhEuRF0G1aVSeQ==", + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dependencies": { - "async-function": "^1.0.0", - "async-generator-function": "^1.0.0", "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "generator-function": "^2.0.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", @@ -4574,7 +4393,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -4588,7 +4406,6 @@ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -4602,11 +4419,10 @@ } }, "node_modules/get-tsconfig": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", - "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.11.0.tgz", + "integrity": "sha512-sNsqf7XKQ38IawiVGPOoAlqZo1DMrO7TU+ZcZwi7yLl7/7S0JwmoBMKz/IkUPhSoXM0Ng3vT0yB1iCe5XavDeQ==", "dev": true, - "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -4620,7 +4436,6 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4641,7 +4456,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -4654,7 +4468,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4665,7 +4478,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4678,7 +4490,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -4691,7 +4502,6 @@ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, - "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -4707,7 +4517,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4719,14 +4528,12 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/graphql": { "version": "16.11.0", "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz", "integrity": "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==", - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -4736,7 +4543,6 @@ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4749,7 +4555,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -4759,7 +4564,6 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -4772,7 +4576,6 @@ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, - "license": "MIT", "dependencies": { "dunder-proto": "^1.0.0" }, @@ -4787,7 +4590,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4799,7 +4601,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -4814,7 +4615,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -4825,24 +4625,37 @@ "node_modules/headers-polyfill": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", - "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", - "license": "MIT" + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==" }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/ignore": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -4851,7 +4664,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -4868,7 +4680,6 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -4879,7 +4690,6 @@ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, - "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -4889,15 +4699,13 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", @@ -4912,7 +4720,6 @@ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -4928,15 +4735,13 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-async-function": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, - "license": "MIT", "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", @@ -4956,7 +4761,6 @@ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, - "license": "MIT", "dependencies": { "has-bigints": "^1.0.2" }, @@ -4972,7 +4776,6 @@ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -4989,7 +4792,6 @@ "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.7.1" } @@ -4999,7 +4801,6 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5011,7 +4812,6 @@ "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -5027,7 +4827,6 @@ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", @@ -5045,7 +4844,6 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" @@ -5062,7 +4860,6 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5072,7 +4869,6 @@ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -5087,20 +4883,19 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, @@ -5116,7 +4911,6 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -5129,7 +4923,6 @@ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5142,7 +4935,6 @@ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5153,15 +4945,13 @@ "node_modules/is-node-process": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", - "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", - "license": "MIT" + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==" }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -5171,7 +4961,6 @@ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -5188,7 +4977,6 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -5198,7 +4986,6 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", @@ -5217,7 +5004,6 @@ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5230,7 +5016,6 @@ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -5246,7 +5031,6 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -5263,7 +5047,6 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", @@ -5281,7 +5064,6 @@ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, - "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" }, @@ -5297,7 +5079,6 @@ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5310,7 +5091,6 @@ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -5326,7 +5106,6 @@ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" @@ -5342,22 +5121,19 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/iterator.prototype": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", @@ -5373,15 +5149,13 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -5393,7 +5167,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -5405,35 +5178,30 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -5446,7 +5214,6 @@ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, - "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", @@ -5462,7 +5229,6 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -5471,15 +5237,13 @@ "version": "0.3.23", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "dev": true, - "license": "CC0-1.0" + "dev": true }, "node_modules/language-tags": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, - "license": "MIT", "dependencies": { "language-subtag-registry": "^0.3.20" }, @@ -5492,7 +5256,6 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -5504,15 +5267,141 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/lint-staged": { + "version": "16.2.4", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.4.tgz", + "integrity": "sha512-Pkyr/wd90oAyXk98i/2KwfkIhoYQUMtss769FIT9hFM5ogYZwrk+GRE46yKXSg2ZGhcJ1p38Gf5gmI5Ohjg2yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^14.0.1", + "listr2": "^9.0.4", + "micromatch": "^4.0.8", + "nano-spawn": "^2.0.0", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.8.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/listr2": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.4.tgz", + "integrity": "sha512-1wd/kpAdKRLwv7/3OKC8zZ5U8e/fajCfWMxacUvB79S5nLrYGPtUI/8chMQhn3LQjsRVErTb9i1ECAwW0ZIHnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", + "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", + "dev": true, "license": "MIT" }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -5526,22 +5415,124 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", + "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", "dev": true, "license": "MIT" }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, - "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -5554,7 +5545,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -5563,7 +5553,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -5573,7 +5562,6 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } @@ -5583,7 +5571,6 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, - "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -5596,7 +5583,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5605,7 +5591,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -5613,12 +5598,24 @@ "node": ">= 0.6" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -5634,7 +5631,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5642,15 +5638,13 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/msw": { "version": "2.11.3", "resolved": "https://registry.npmjs.org/msw/-/msw-2.11.3.tgz", "integrity": "sha512-878imp8jxIpfzuzxYfX0qqTq1IFQz/1/RBHs/PyirSjzi+xKM/RRfIpIqHSCWjH0GxidrjhgiiXC+DWXNDvT9w==", "hasInstallScript": true, - "license": "MIT", "dependencies": { "@bundled-es-modules/cookie": "^2.0.1", "@bundled-es-modules/statuses": "^1.0.1", @@ -5694,11 +5688,23 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/nano-spawn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-2.0.0.tgz", + "integrity": "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -5710,7 +5716,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -5719,11 +5724,10 @@ } }, "node_modules/napi-postinstall": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.3.tgz", - "integrity": "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", "dev": true, - "license": "MIT", "bin": { "napi-postinstall": "lib/cli.js" }, @@ -5738,22 +5742,19 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/node-releases": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", - "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", - "dev": true, - "license": "MIT" + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", + "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", + "dev": true }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5763,7 +5764,6 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5776,7 +5776,6 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -5786,7 +5785,6 @@ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -5807,7 +5805,6 @@ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", @@ -5823,7 +5820,6 @@ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5842,7 +5838,6 @@ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5857,7 +5852,6 @@ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -5876,17 +5870,31 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "license": "ISC", "dependencies": { "wrappy": "1" } }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, - "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -5902,15 +5910,13 @@ "node_modules/outvariant": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", - "license": "MIT" + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==" }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", @@ -5928,7 +5934,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -5944,7 +5949,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -5959,7 +5963,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -5971,7 +5974,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -5990,7 +5992,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -6000,7 +6001,6 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6010,7 +6010,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -6018,20 +6017,17 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "license": "MIT" + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==" }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", "engines": { "node": ">=8" } @@ -6039,15 +6035,13 @@ "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -6055,12 +6049,24 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -6084,7 +6090,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -6099,7 +6104,6 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -6109,7 +6113,6 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, - "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -6125,7 +6128,6 @@ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, - "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -6138,7 +6140,6 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, - "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -6148,15 +6149,13 @@ "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -6179,14 +6178,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/react": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", - "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", - "license": "MIT", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", + "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", "engines": { "node": ">=0.10.0" } @@ -6195,7 +6192,6 @@ "version": "8.7.0", "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-8.7.0.tgz", "integrity": "sha512-r5OJbiLWc3YiVNy69Kau07/aVgVGsFVMA6+nlqCV7vyQ8q0FUOnJ+wAI4CgVxHejG3i5djAEiebrF8/Eip4rIw==", - "license": "MIT", "dependencies": { "@floating-ui/react": "^0.27.15", "clsx": "^2.1.1", @@ -6207,22 +6203,20 @@ } }, "node_modules/react-dom": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", - "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", - "license": "MIT", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", + "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", "dependencies": { - "scheduler": "^0.26.0" + "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.1.1" + "react": "^19.2.0" } }, "node_modules/react-hook-form": { - "version": "7.63.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.63.0.tgz", - "integrity": "sha512-ZwueDMvUeucovM2VjkCf7zIHcs1aAlDimZu2Hvel5C5907gUzMpm4xCrQXtRzCvsBqFjonB4m3x4LzCFI1ZKWA==", - "license": "MIT", + "version": "7.64.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.64.0.tgz", + "integrity": "sha512-fnN+vvTiMLnRqKNTVhDysdrUay0kUUAymQnFIznmgDvapjveUWOOPqMNzPg+A+0yf9DuE2h6xzBjN1s+Qx8wcg==", "engines": { "node": ">=18.0.0" }, @@ -6238,7 +6232,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==", - "license": "MIT", "peerDependencies": { "react": "*" } @@ -6246,15 +6239,13 @@ "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-refresh": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6263,7 +6254,6 @@ "version": "7.9.3", "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.3.tgz", "integrity": "sha512-4o2iWCFIwhI/eYAIL43+cjORXYn/aRQPgtFRRZb3VzoyQ5Uej0Bmqj7437L97N9NJW4wnicSwLOLS+yCXfAPgg==", - "license": "MIT", "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" @@ -6285,7 +6275,6 @@ "version": "7.9.3", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.3.tgz", "integrity": "sha512-1QSbA0TGGFKTAc/aWjpfW/zoEukYfU4dc1dLkT/vvf54JoGMkW+fNA+3oyo2gWVW1GM7BxjJVHz5GnPJv40rvg==", - "license": "MIT", "dependencies": { "react-router": "7.9.3" }, @@ -6301,7 +6290,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", - "license": "MIT", "engines": { "node": ">=18" } @@ -6311,7 +6299,6 @@ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -6334,7 +6321,6 @@ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -6354,7 +6340,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6362,14 +6347,12 @@ "node_modules/reset-css": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/reset-css/-/reset-css-5.0.2.tgz", - "integrity": "sha512-YtgUGSq5z5W0NPSjsBW7ys7rtWa8P8AiE7S6Fg3d1TQCPpAodgYyLuZYlU0AOsLtprk/fC9ormHN/0pAavVIDw==", - "license": "Unlicense" + "integrity": "sha512-YtgUGSq5z5W0NPSjsBW7ys7rtWa8P8AiE7S6Fg3d1TQCPpAodgYyLuZYlU0AOsLtprk/fC9ormHN/0pAavVIDw==" }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", @@ -6389,7 +6372,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "license": "MIT", "engines": { "node": ">=4" } @@ -6399,35 +6381,55 @@ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/rettime": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.7.0.tgz", - "integrity": "sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw==", - "license": "MIT" + "integrity": "sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw==" }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, - "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -6439,11 +6441,10 @@ } }, "node_modules/rollup": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.3.tgz", - "integrity": "sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", + "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "1.0.8" }, @@ -6455,28 +6456,28 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.52.3", - "@rollup/rollup-android-arm64": "4.52.3", - "@rollup/rollup-darwin-arm64": "4.52.3", - "@rollup/rollup-darwin-x64": "4.52.3", - "@rollup/rollup-freebsd-arm64": "4.52.3", - "@rollup/rollup-freebsd-x64": "4.52.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.3", - "@rollup/rollup-linux-arm-musleabihf": "4.52.3", - "@rollup/rollup-linux-arm64-gnu": "4.52.3", - "@rollup/rollup-linux-arm64-musl": "4.52.3", - "@rollup/rollup-linux-loong64-gnu": "4.52.3", - "@rollup/rollup-linux-ppc64-gnu": "4.52.3", - "@rollup/rollup-linux-riscv64-gnu": "4.52.3", - "@rollup/rollup-linux-riscv64-musl": "4.52.3", - "@rollup/rollup-linux-s390x-gnu": "4.52.3", - "@rollup/rollup-linux-x64-gnu": "4.52.3", - "@rollup/rollup-linux-x64-musl": "4.52.3", - "@rollup/rollup-openharmony-arm64": "4.52.3", - "@rollup/rollup-win32-arm64-msvc": "4.52.3", - "@rollup/rollup-win32-ia32-msvc": "4.52.3", - "@rollup/rollup-win32-x64-gnu": "4.52.3", - "@rollup/rollup-win32-x64-msvc": "4.52.3", + "@rollup/rollup-android-arm-eabi": "4.52.4", + "@rollup/rollup-android-arm64": "4.52.4", + "@rollup/rollup-darwin-arm64": "4.52.4", + "@rollup/rollup-darwin-x64": "4.52.4", + "@rollup/rollup-freebsd-arm64": "4.52.4", + "@rollup/rollup-freebsd-x64": "4.52.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", + "@rollup/rollup-linux-arm-musleabihf": "4.52.4", + "@rollup/rollup-linux-arm64-gnu": "4.52.4", + "@rollup/rollup-linux-arm64-musl": "4.52.4", + "@rollup/rollup-linux-loong64-gnu": "4.52.4", + "@rollup/rollup-linux-ppc64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-musl": "4.52.4", + "@rollup/rollup-linux-s390x-gnu": "4.52.4", + "@rollup/rollup-linux-x64-gnu": "4.52.4", + "@rollup/rollup-linux-x64-musl": "4.52.4", + "@rollup/rollup-openharmony-arm64": "4.52.4", + "@rollup/rollup-win32-arm64-msvc": "4.52.4", + "@rollup/rollup-win32-ia32-msvc": "4.52.4", + "@rollup/rollup-win32-x64-gnu": "4.52.4", + "@rollup/rollup-win32-x64-msvc": "4.52.4", "fsevents": "~2.3.2" } }, @@ -6499,7 +6500,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -6509,7 +6509,6 @@ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -6529,7 +6528,6 @@ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" @@ -6546,7 +6544,6 @@ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -6560,17 +6557,15 @@ } }, "node_modules/scheduler": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "license": "MIT" + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==" }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -6581,15 +6576,13 @@ "node_modules/set-cookie-parser": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "license": "MIT" + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==" }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -6607,7 +6600,6 @@ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -6623,7 +6615,6 @@ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", "dev": true, - "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", @@ -6638,7 +6629,6 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -6651,7 +6641,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -6661,7 +6650,6 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -6681,7 +6669,6 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -6698,7 +6685,6 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -6717,7 +6703,6 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -6736,7 +6721,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", "engines": { "node": ">=14" }, @@ -6744,11 +6728,66 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sonner": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", + "integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -6758,7 +6797,6 @@ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -6768,7 +6806,6 @@ "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.2.0.tgz", "integrity": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12.0.0" } @@ -6777,7 +6814,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -6787,7 +6823,6 @@ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" @@ -6799,14 +6834,22 @@ "node_modules/strict-event-emitter": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", - "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", - "license": "MIT" + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==" + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -6819,15 +6862,13 @@ "node_modules/string-width/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/string.prototype.includes": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -6842,7 +6883,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -6870,7 +6910,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "dev": true, - "license": "MIT", "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" @@ -6881,7 +6920,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -6903,7 +6941,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -6922,7 +6959,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -6939,7 +6975,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -6952,7 +6987,6 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -6962,7 +6996,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -6973,15 +7006,13 @@ "node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", - "license": "MIT" + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -6993,7 +7024,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7006,7 +7036,6 @@ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", "dev": true, - "license": "MIT", "dependencies": { "@pkgr/core": "^0.2.9" }, @@ -7020,22 +7049,19 @@ "node_modules/tabbable": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", - "license": "MIT" + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, - "license": "MIT", "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" @@ -7052,7 +7078,6 @@ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12.0.0" }, @@ -7070,7 +7095,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -7082,7 +7106,6 @@ "version": "7.0.16", "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.16.tgz", "integrity": "sha512-5bdPHSwbKTeHmXrgecID4Ljff8rQjv7g8zKQPkCozRo2HWWni+p310FSn5ImI+9kWw9kK4lzOB5q/a6iv0IJsw==", - "license": "MIT", "dependencies": { "tldts-core": "^7.0.16" }, @@ -7093,15 +7116,13 @@ "node_modules/tldts-core": { "version": "7.0.16", "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.16.tgz", - "integrity": "sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==", - "license": "MIT" + "integrity": "sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==" }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -7113,7 +7134,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", - "license": "BSD-3-Clause", "dependencies": { "tldts": "^7.0.5" }, @@ -7126,7 +7146,6 @@ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=18.12" }, @@ -7139,7 +7158,6 @@ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, - "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -7152,7 +7170,6 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -7165,7 +7182,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD", "optional": true }, "node_modules/type-check": { @@ -7173,7 +7189,6 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -7185,7 +7200,6 @@ "version": "4.41.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" }, @@ -7198,7 +7212,6 @@ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -7213,7 +7226,6 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", @@ -7233,7 +7245,6 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, - "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", @@ -7255,7 +7266,6 @@ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -7276,7 +7286,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "devOptional": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -7286,16 +7295,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.45.0.tgz", - "integrity": "sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.0.tgz", + "integrity": "sha512-6+ZrB6y2bT2DX3K+Qd9vn7OFOJR+xSLDj+Aw/N3zBwUt27uTw2sw2TE2+UcY1RiyBZkaGbTkVg9SSdPNUG6aUw==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.45.0", - "@typescript-eslint/parser": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/utils": "8.45.0" + "@typescript-eslint/eslint-plugin": "8.46.0", + "@typescript-eslint/parser": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/utils": "8.46.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7314,7 +7322,6 @@ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", @@ -7329,11 +7336,10 @@ } }, "node_modules/undici-types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.13.0.tgz", - "integrity": "sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==", - "devOptional": true, - "license": "MIT" + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", + "devOptional": true }, "node_modules/unrs-resolver": { "version": "1.11.1", @@ -7341,7 +7347,6 @@ "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", "dev": true, "hasInstallScript": true, - "license": "MIT", "dependencies": { "napi-postinstall": "^0.3.0" }, @@ -7374,7 +7379,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/kettanaito" } @@ -7398,7 +7402,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" @@ -7415,17 +7418,15 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/vite": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.7.tgz", - "integrity": "sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==", + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", + "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", "dev": true, - "license": "MIT", "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -7500,7 +7501,6 @@ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12.0.0" }, @@ -7518,7 +7518,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -7531,7 +7530,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -7547,7 +7545,6 @@ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, - "license": "MIT", "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", @@ -7567,7 +7564,6 @@ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", @@ -7595,7 +7591,6 @@ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, - "license": "MIT", "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -7614,7 +7609,6 @@ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, - "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", @@ -7636,7 +7630,6 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7645,7 +7638,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -7659,14 +7651,12 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", "engines": { "node": ">=10" } @@ -7675,17 +7665,13 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/yaml": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "dev": true, - "license": "ISC", - "optional": true, - "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -7697,7 +7683,6 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -7715,7 +7700,6 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", "engines": { "node": ">=12" } @@ -7725,7 +7709,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -7737,7 +7720,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", - "license": "MIT", "engines": { "node": ">=18" }, diff --git a/package.json b/package.json index a333de78..b9d8683f 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,17 @@ "build": "tsc -b && vite build", "lint": "eslint . --ext .ts,.tsx", "lint:fix": "eslint . --ext .ts,.tsx --fix", - "preview": "vite preview" + "preview": "vite preview", + "prepare": "husky install" + }, + "lint-staged": { + "*.{js,jsx,ts,tsx}": [ + "eslint --fix", + "prettier --write" + ], + "*.{json,css,scss,md}": [ + "prettier --write" + ] }, "dependencies": { "@emotion/react": "^11.14.0", @@ -25,7 +35,8 @@ "react-hook-form": "^7.63.0", "react-icons": "^5.5.0", "react-router-dom": "^7.8.2", - "reset-css": "^5.0.2" + "reset-css": "^5.0.2", + "sonner": "^2.0.7" }, "devDependencies": { "@emotion/babel-plugin": "^11.13.5", @@ -48,6 +59,8 @@ "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-react-refresh": "0.4.5", "globals": "^16.3.0", + "husky": "^9.1.7", + "lint-staged": "^16.2.4", "prettier": "^3.6.2", "typescript": "~5.8.3", "typescript-eslint": "^8.39.1", diff --git a/public/assets/kakao-icon.png b/public/assets/kakao-icon.png new file mode 100644 index 00000000..5afd83a1 Binary files /dev/null and b/public/assets/kakao-icon.png differ diff --git a/public/assets/logo.png b/public/assets/logo.png new file mode 100644 index 00000000..b3551554 Binary files /dev/null and b/public/assets/logo.png differ diff --git a/src/constants/navigation.ts b/src/constants/navigation.ts index 3ea3b035..4ffaa746 100644 --- a/src/constants/navigation.ts +++ b/src/constants/navigation.ts @@ -5,7 +5,6 @@ export const NAV_CONFIG: Record = { { key: 'logo', label: '동아리움', to: '/', isLogo: true }, { key: 'recruit', label: '모집일정', to: '/recruit' }, { key: 'notice', label: '공지사항', to: '/notice' }, - { key: 'faq', label: 'FAQ', to: '/faq' }, ], manager: [ { key: 'logo', label: '동아리움', to: '/home', isLogo: true }, @@ -14,7 +13,8 @@ export const NAV_CONFIG: Record = { president: [ { key: 'logo', label: '동아리움', to: '/', isLogo: true }, { key: 'applicants', label: '지원자관리', to: '/admin/clubs/dashboard' }, - { key: 'club', label: '동아리페이지관리', to: '/club' }, + { key: 'clubEdit', label: '동아리페이지관리', to: '/admin/clubs/:clubId/edit' }, { key: 'form', label: '지원폼관리', to: '/form' }, + { key: 'login', label: '관리자 로그인', to: '/login' }, ], }; diff --git a/src/constants/routerPath.ts b/src/constants/routerPath.ts index e9f79f9c..60469faf 100644 --- a/src/constants/routerPath.ts +++ b/src/constants/routerPath.ts @@ -12,5 +12,8 @@ export const ROUTE_PATH = { COMMON: { MAIN: '/', CLUBDETAIL: 'clubs/:clubId', + LOGIN: 'login', + CALLBACK: 'login/redirect', + SIGNUP: 'signup', }, }; diff --git a/src/main.tsx b/src/main.tsx index 375dc6d9..4553d4df 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -3,7 +3,9 @@ import { createRoot } from 'react-dom/client'; import 'reset-css/reset.css'; import '@/index.css'; import { RouterProvider } from 'react-router-dom'; +import { Toaster } from 'sonner'; import { router } from '@/pages/Routes.tsx'; +import { theme } from '@/styles/theme'; async function enableMocking() { if (import.meta.env.VITE_ENABLE_MSW === 'true') { @@ -15,7 +17,24 @@ async function enableMocking() { enableMocking().then(() => { createRoot(document.getElementById('root')!).render( + , ); }); + +export const ToastProvider = () => ( + +); diff --git a/src/mocks/handler/club.ts b/src/mocks/handler/club.ts index ed47bb1e..f6048459 100644 --- a/src/mocks/handler/club.ts +++ b/src/mocks/handler/club.ts @@ -4,7 +4,7 @@ import { clubRepository } from '../repositories/club'; const getClubsResolver = ({ request }: { request: Request }) => { const url = new URL(request.url); - const categoryName = url.searchParams.get('categoryName') ?? 'all'; + const categoryName = url.searchParams.get('category') ?? 'all'; const clubs = clubRepository.getClubsByCategory(categoryName); return HttpResponse.json({ clubs }, { status: 200 }); }; @@ -31,11 +31,46 @@ const postApplicationSubmitResolver = async ({ request }: { request: Request }) }); }; +const getClubDetailResolver = ({ params }: { params: PathParams }) => { + const { clubId } = params; + const club = clubRepository.getClubDetailById(Number(clubId)); + + if (!club) { + return new HttpResponse('Not Found', { status: 404 }); + } + + return HttpResponse.json(club, { status: 200 }); +}; + +const postClubDetailResolver = async ({ + params, + request, +}: { + params: PathParams; + request: Request; +}) => { + const { clubId } = params; + const body = await request.json(); + + const existingClub = clubRepository.getClubDetailById(Number(clubId)); + + if (!existingClub) { + return new HttpResponse('Not Found', { status: 404 }); + } + + const updatedClub = { ...existingClub, ...body }; + clubRepository.updateClubDetail(Number(clubId), updatedClub); + + return HttpResponse.json(updatedClub, { status: 200 }); +}; + export const clubHandlers = [ - http.get(import.meta.env.VITE_API_BASE_URL + '/clubs/search/category', getClubsResolver), + http.get(import.meta.env.VITE_API_BASE_URL + '/clubs?category', getClubsResolver), http.get(import.meta.env.VITE_API_BASE_URL + '/clubs/:Id/apply', getClubApplicationResolver), http.post( - 'https://nonprotuberant-florine-irreversibly.ngrok-free.dev/api/clubs/:clubId/apply-submit', + import.meta.env.VITE_API_BASE_URL + '/clubs/:clubId/apply-submit', postApplicationSubmitResolver, ), + http.get(import.meta.env.VITE_API_BASE_URL + '/clubs/:clubId', getClubDetailResolver), + http.post(import.meta.env.VITE_API_BASE_URL + '/clubs/:clubId', postClubDetailResolver), ]; diff --git a/src/mocks/repositories/applicant.ts b/src/mocks/repositories/applicant.ts index 64b24b57..48c6d032 100644 --- a/src/mocks/repositories/applicant.ts +++ b/src/mocks/repositories/applicant.ts @@ -9,7 +9,7 @@ const applicants: ApplicantData[] = [ department: '소프트웨어공학과', phoneNumber: '010-1010-1010', email: 'ddd@naver.com', - status: '미정', + status: 'PENDING', }, { id: 2, @@ -18,7 +18,7 @@ const applicants: ApplicantData[] = [ department: '소프트웨어공학과', phoneNumber: '010-1010-1010', email: 'ddd@naver.com', - status: '합격', + status: 'APPROVED', }, { id: 3, @@ -27,7 +27,7 @@ const applicants: ApplicantData[] = [ department: '소프트웨어공학과', phoneNumber: '010-1010-1010', email: 'ddd@naver.com', - status: '불합격', + status: 'REJECTED', }, { id: 4, @@ -36,7 +36,7 @@ const applicants: ApplicantData[] = [ department: '소프트웨어공학과', phoneNumber: '010-1010-1010', email: 'ddd@naver.com', - status: '미정', + status: 'PENDING', }, ]; diff --git a/src/mocks/repositories/application.ts b/src/mocks/repositories/application.ts index cd442ae3..e7c994b6 100644 --- a/src/mocks/repositories/application.ts +++ b/src/mocks/repositories/application.ts @@ -22,7 +22,7 @@ export const Application: ApplicationForm = { questionType: 'TIME_SLOT', question: '면접가능 날짜는?', required: true, - timeSlotOption: [ + timeSlotOptions: [ { date: '2025-09-24', availableTime: { start: '10:00', end: '12:00' }, diff --git a/src/mocks/repositories/club.ts b/src/mocks/repositories/club.ts index e62e5bec..f668b040 100644 --- a/src/mocks/repositories/club.ts +++ b/src/mocks/repositories/club.ts @@ -1,3 +1,4 @@ +import type { ClubDetail } from '@/pages/user/ClubDetail/types/clubDetail'; import type { Club } from '@/pages/user/Main/types/club'; export const clubs: Club[] = [ @@ -5,79 +6,79 @@ export const clubs: Club[] = [ { id: 1, name: '시향 동아리', - category: 'ARTS', + category: 'LITERATURE', shortIntroduction: '시를 쓰고 낭송하며 문학적 감성을 키우는 모임입니다.', recruitStatus: '모집중', }, { id: 2, name: '소설창작회', - category: 'ARTS', + category: 'LITERATURE', shortIntroduction: '단편 소설을 집필하고 합평회를 진행합니다.', - recruitStatus: '모집마감', + recruitStatus: '모집 마감', }, { id: 3, name: '사진예술회', - category: 'ARTS', + category: 'LITERATURE', shortIntroduction: '풍경과 인물 사진을 촬영하고 전시회를 개최합니다.', recruitStatus: '모집중', }, { id: 4, name: '연극반', - category: 'ARTS', + category: 'LITERATURE', shortIntroduction: '연극을 기획하고 무대에 올리는 활동을 합니다.', recruitStatus: '모집중', }, { id: 5, name: '캘리그라피 모임', - category: 'ARTS', + category: 'LITERATURE', shortIntroduction: '글씨체 예술을 배우고 작품을 제작합니다.', - recruitStatus: '모집마감', + recruitStatus: '모집 마감', }, // 학술 { id: 6, name: 'AI 연구회', - category: 'ACADEMICS', + category: 'STUDY', shortIntroduction: '머신러닝과 인공지능 논문을 함께 읽고 프로젝트를 진행합니다.', recruitStatus: '모집중', }, { id: 7, name: '경제 토론 동아리', - category: 'ACADEMICS', + category: 'STUDY', shortIntroduction: '경제 현안을 주제로 토론과 발표를 진행합니다.', recruitStatus: '모집중', }, { id: 8, name: '수학 문제 연구반', - category: 'ACADEMICS', + category: 'STUDY', shortIntroduction: '수학 올림피아드 스타일 문제를 함께 풉니다.', - recruitStatus: '모집마감', + recruitStatus: '모집 마감', }, { id: 9, name: '철학 소모임', - category: 'ACADEMICS', + category: 'STUDY', shortIntroduction: '철학 고전을 읽고 자유롭게 토론합니다.', recruitStatus: '모집중', }, { id: 10, name: '환경 과학 연구회', - category: 'ACADEMICS', + category: 'STUDY', shortIntroduction: '환경 문제와 해결 방안을 과학적으로 탐구합니다.', - recruitStatus: '모집마감', + recruitStatus: '모집 마감', }, { id: 11, name: '프로그래밍 스터디', - category: 'ACADEMICS', + category: 'STUDY', shortIntroduction: '최신 언어와 프레임워크를 공부하고 프로젝트를 만듭니다.', recruitStatus: '모집중', }, @@ -88,7 +89,7 @@ export const clubs: Club[] = [ name: '기독교 학생회', category: 'RELIGION', shortIntroduction: '성경 공부와 봉사활동을 함께하는 모임입니다.', - recruitStatus: '모집마감', + recruitStatus: '모집 마감', }, { id: 13, @@ -109,7 +110,7 @@ export const clubs: Club[] = [ name: '종교 다문화 교류회', category: 'RELIGION', shortIntroduction: '여러 종교의 문화를 배우고 교류합니다.', - recruitStatus: '모집마감', + recruitStatus: '모집 마감', }, { id: 16, @@ -132,7 +133,7 @@ export const clubs: Club[] = [ name: '배드민턴 동아리', category: 'SPORTS', shortIntroduction: '초보부터 고수까지 함께 치는 배드민턴 모임입니다.', - recruitStatus: '모집마감', + recruitStatus: '모집 마감', }, { id: 19, @@ -146,7 +147,7 @@ export const clubs: Club[] = [ name: '탁구반', category: 'SPORTS', shortIntroduction: '점심시간에 탁구를 치며 즐기는 모임입니다.', - recruitStatus: '모집마감', + recruitStatus: '모집 마감', }, { id: 21, @@ -167,7 +168,7 @@ export const clubs: Club[] = [ name: '요가 클래스', category: 'SPORTS', shortIntroduction: '몸과 마음의 균형을 위해 요가를 함께 합니다.', - recruitStatus: '모집마감', + recruitStatus: '모집 마감', }, // 봉사 @@ -183,7 +184,7 @@ export const clubs: Club[] = [ name: '해외 봉사단', category: 'VOLUNTEER', shortIntroduction: '방학 기간에 해외로 봉사활동을 나가는 모임입니다.', - recruitStatus: '모집마감', + recruitStatus: '모집 마감', }, { id: 26, @@ -204,7 +205,7 @@ export const clubs: Club[] = [ name: '환경 봉사단', category: 'VOLUNTEER', shortIntroduction: '플로깅과 재활용 캠페인을 통해 환경을 지킵니다.', - recruitStatus: '모집마감', + recruitStatus: '모집 마감', }, { id: 29, @@ -225,7 +226,7 @@ export const clubs: Club[] = [ name: '유기동물 보호 동아리', category: 'VOLUNTEER', shortIntroduction: '보호소에서 유기동물을 돌보고 입양을 돕습니다.', - recruitStatus: '모집마감', + recruitStatus: '모집 마감', }, { id: 32, @@ -236,9 +237,113 @@ export const clubs: Club[] = [ }, ]; +export const mockClubDetail: ClubDetail[] = [ + { + clubId: 1, + clubName: '인터엑스', + location: '공7 201호', + category: '사회연구', + shortIntroduction: '사회문제에 관심 있는 사람들을 위한 동아리', + introductionImages: [ + 'https://plus.unsplash.com/premium_photo-1729880132913-4ca7d67f8eeb?q=80&w=1587', + 'https://plus.unsplash.com/premium_photo-1723917604890-418aa2307d2f?q=80&w=1470', + 'https://plus.unsplash.com/premium_photo-1704756437707-e9fee5c04bcf?q=80&w=1470', + 'https://plus.unsplash.com/premium_photo-1704756437647-559e43344877?q=80&w=1470', + ], + introductionOverview: `인터엑스는 사회 문제를 깊이 있게 탐구하고 이를 해결하기 위해 다양한 활동을 기획하는 동아리입니다. +회원들은 토론, 조사, 캠페인 등을 통해 실제 사회 문제를 이해하고, 문제 해결을 위한 창의적 방법을 모색합니다. +학문적 연구와 실질적 활동을 병행하며, 서로의 생각을 존중하고 협력하는 문화를 지향합니다.`, + introductionActivity: `동아리 활동으로는 매주 세미나와 그룹 토론, 지역 사회 봉사활동, 캠페인 기획 및 참여 등이 있습니다. +회원들은 각자의 관심 분야를 살려 프로젝트를 진행하며, 발표와 보고서를 통해 성과를 공유합니다. +또한 외부 전문가 초청 강연을 통해 사회 문제에 대한 이해를 넓히고, 실천 가능한 해결책을 모색합니다.`, + introductionIdeal: `인터엑스에서는 성실하고 책임감 있는 인재를 기다립니다. +문제 해결에 관심이 많고 창의적 아이디어를 공유할 수 있는 사람, +팀원들과 협력하며 꾸준히 학습하고 성장하려는 자세를 가진 사람이라면 누구나 환영합니다.`, + regularMeetingInfo: '매주 화요일 오후 6시', + recruitStatus: '모집중', + presidentName: '김춘식', + presidentPhoneNumber: '010-9619-7677', + recruitStart: '2025-09-03T00:00:00', + recruitEnd: '2025-09-20T23:59:00', + applicationNotice: '현재 지원은 휴학생을 제외한 1~3학년만 받고 있습니다.', + }, + { + clubId: 2, + clubName: '코드마스터', + location: '공5 102호', + category: '프로그래밍', + shortIntroduction: '프로그래밍과 최신 기술을 탐구하는 동아리', + introductionImages: [ + 'https://images.unsplash.com/photo-1622675363311-3e1904dc1885?w=1600&auto=format&fit=crop&q=60&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxzZWFyY2h8MTZ8fGRldmVsb3BlcnN8ZW58MHx8MHx8fDA%3D', + 'https://images.unsplash.com/photo-1637073849667-91120a924221?w=1600&auto=format&fit=crop&q=60&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxzZWFyY2h8M3x8ZGV2ZWxvcGVyc3xlbnwwfHwwfHx8MA%3D%3D', + 'https://plus.unsplash.com/premium_photo-1683134153517-32015af21911?w=1600&auto=format&fit=crop&q=60&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxzZWFyY2h8MXx8ZGV2ZWxvcGVyc3xlbnwwfHwwfHx8MA%3D%3D', + 'https://plus.unsplash.com/premium_photo-1704756437647-559e43344877?q=80&w=1470', + ], + introductionOverview: `코드마스터는 최신 프로그래밍 언어와 프레임워크를 학습하고, +팀 단위 프로젝트를 진행하며 실무 경험을 쌓는 동아리입니다. +회원들은 개발 관련 세미나와 스터디를 통해 기술적 역량을 지속적으로 향상시킵니다.`, + introductionActivity: `동아리 활동으로는 매주 코드 리뷰 세션, 알고리즘 스터디, 팀 프로젝트 진행 등이 있습니다. +회원들은 프로젝트 결과물을 공유하고, 함께 문제를 해결하며 성장합니다. +또한 외부 개발자 초청 강연을 통해 최신 기술 동향을 습득합니다.`, + introductionIdeal: `코드마스터에서는 적극적으로 배우고 실습할 의지가 있는 인재를 환영합니다. +새로운 기술을 탐구하고, 팀원과 협업하며 성장하려는 자세가 있는 사람이라면 누구든 참여 가능합니다.`, + regularMeetingInfo: '매주 수요일 오후 7시', + recruitStatus: '모집중', + presidentName: '이상현', + presidentPhoneNumber: '010-1234-5678', + recruitStart: '2025-09-05T00:00:00', + recruitEnd: '2025-09-25T23:59:00', + applicationNotice: '1~4학년 모두 지원 가능합니다.', + }, + { + clubId: 3, + clubName: '아트픽', + location: '예술관 301호', + category: '예술', + shortIntroduction: '창작 활동과 전시를 즐기는 예술 동아리', + introductionImages: [ + 'https://plus.unsplash.com/premium_photo-1729880132913-4ca7d67f8eeb?q=80&w=1587', + 'https://plus.unsplash.com/premium_photo-1723917604890-418aa2307d2f?q=80&w=1470', + 'https://plus.unsplash.com/premium_photo-1704756437707-e9fee5c04bcf?q=80&w=1470', + 'https://plus.unsplash.com/premium_photo-1704756437647-559e43344877?q=80&w=1470', + ], + introductionOverview: `아트픽은 회원들이 창작 활동을 통해 자신만의 작품을 제작하고, +전시회를 통해 작품을 공유하는 것을 목표로 하는 동아리입니다. +회원들은 서로의 작품을 감상하고 피드백하며 예술적 감각을 향상시킵니다.`, + introductionActivity: `동아리 활동으로는 회화, 조각, 사진, 영상 등 다양한 창작 프로젝트를 진행합니다. +정기적으로 작품 전시회를 열고, 회원들은 서로의 작품을 평가하고 토론합니다. +또한 외부 예술가 초청 워크숍을 통해 새로운 기법과 표현 방식을 배우게 됩니다.`, + introductionIdeal: `아트픽에서는 창의적이고 꾸준히 작품 활동을 이어갈 수 있는 인재를 기다립니다. +자신의 아이디어를 실현하고, 다른 회원과 협력하며 성장할 의지가 있는 사람이라면 누구든 환영합니다.`, + regularMeetingInfo: '매주 금요일 오후 5시', + recruitStatus: '모집중', + presidentName: '박예진', + presidentPhoneNumber: '010-8765-4321', + recruitStart: '2025-09-07T00:00:00', + recruitEnd: '2025-09-30T23:59:00', + applicationNotice: '모든 학년 지원 가능, 특별한 조건 없음.', + }, +]; + export const clubRepository = { getClubsByCategory: (filter: string) => { if (filter === 'ALL') return clubs; return clubs.filter((club) => club.category === filter); }, + + getClubDetailById: (id: number) => { + return mockClubDetail.find((club) => club.clubId === id); + }, + + updateClubDetail: (id: number, updatedData: Partial) => { + const index = mockClubDetail.findIndex((club) => club.clubId === id); + if (index === -1) return; + + mockClubDetail[index] = { + ...mockClubDetail[index], + ...updatedData, + }; + + return mockClubDetail[index]; + }, }; diff --git a/src/pages/Routes.tsx b/src/pages/Routes.tsx index 3a1fe0d3..127bb8e5 100644 --- a/src/pages/Routes.tsx +++ b/src/pages/Routes.tsx @@ -7,6 +7,9 @@ import { DashboardPage } from '@/pages/admin/Dashboard/Page'; import { ClubDetailPage } from '@/pages/user/ClubDetail/Page'; import { MainPage } from '@/pages/user/Main/Page.tsx'; import { ApplicationDetailPage } from './admin/ApplicationDetail/Page'; +import { KakaoCallback } from './admin/Login/KakaoCallback'; +import { LoginPage } from './admin/Login/Page'; +import { AdminSignupPage } from './admin/Signup/Page'; import { ClubApplicationPage } from './user/Apply/Page'; const { USER, ADMIN, COMMON } = ROUTE_PATH; @@ -20,10 +23,22 @@ export const router = createBrowserRouter([ path: COMMON.CLUBDETAIL, element: , }, + { + path: COMMON.LOGIN, + element: , + }, { path: USER.APPLICATION, element: , }, + { + path: COMMON.CALLBACK, + element: , + }, + { + path: COMMON.SIGNUP, + element: , + }, { path: '/admin', children: [ diff --git a/src/pages/admin/ApplicationDetail/api/comments.ts b/src/pages/admin/ApplicationDetail/api/comments.ts index 9d0131bd..651ba284 100644 --- a/src/pages/admin/ApplicationDetail/api/comments.ts +++ b/src/pages/admin/ApplicationDetail/api/comments.ts @@ -1,9 +1,10 @@ import type { Comment } from '@/pages/admin/ApplicationDetail/types/comments'; export const fetchComments = async (applicationId: number): Promise => { - const response = await fetch( - import.meta.env.VITE_API_BASE_URL + `/applications/${applicationId}/comments`, - ); + const url = `${import.meta.env.VITE_API_BASE_URL}/applications/${applicationId}/comments`; + const response = await fetch(url); + + if (!response.ok) throw new Error('Failed to fetch comments'); return await response.json(); }; @@ -12,26 +13,27 @@ export const createComment = async ( content: string, rating: number, ): Promise => { - const response = await fetch( - import.meta.env.VITE_API_BASE_URL + `/applications/${applicationId}/comments`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ content, rating }), + const url = `${import.meta.env.VITE_API_BASE_URL}/applications/${applicationId}/comments`; + + const response = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', }, - ); + body: JSON.stringify({ content, rating }), + }); + + if (!response.ok) throw new Error('Failed to create comment'); return await response.json(); }; export const deleteComment = async (applicationId: number, commentId: number): Promise => { - await fetch( - import.meta.env.VITE_API_BASE_URL + `/applications/${applicationId}/comments/${commentId}`, - { - method: 'DELETE', - }, - ); + const url = `${import.meta.env.VITE_API_BASE_URL}/applications/${applicationId}/comments/${commentId}`; + const response = await fetch(url, { + method: 'DELETE', + }); + + if (!response.ok) throw new Error('Failed to delete comment'); }; export const updateComment = async ( @@ -40,15 +42,15 @@ export const updateComment = async ( content: string, rating: number, ): Promise => { - const response = await fetch( - import.meta.env.VITE_API_BASE_URL + `/applications/${applicationId}/comments/${commentId}`, - { - method: 'PUT', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ content, rating }), + const url = `${import.meta.env.VITE_API_BASE_URL}/applications/${applicationId}/comments/${commentId}`; + const response = await fetch(url, { + method: 'PATCH', + headers: { + 'Content-Type': 'application/json', }, - ); + body: JSON.stringify({ content, rating }), + }); + + if (!response.ok) throw new Error('Failed to update comment'); return await response.json(); }; diff --git a/src/pages/admin/ApplicationDetail/api/detailApplication.ts b/src/pages/admin/ApplicationDetail/api/detailApplication.ts index bf078639..83fcfce5 100644 --- a/src/pages/admin/ApplicationDetail/api/detailApplication.ts +++ b/src/pages/admin/ApplicationDetail/api/detailApplication.ts @@ -4,21 +4,26 @@ export const fetchDetailApplication = async ( clubId: number, applicantId: number, ): Promise => { - const response = await fetch( - import.meta.env.VITE_API_BASE_URL + `/clubs/${clubId}/applicants/${applicantId}/application`, - ); + const url = `${import.meta.env.VITE_API_BASE_URL}/clubs/${clubId}/applicants/${applicantId}/application`; + const response = await fetch(url); + + if (!response.ok) throw new Error('지원서 상세 정보를 가져오지 못했습니다'); return await response.json(); }; export const updateApplicationStatus = async ( applicationId: number, status: DetailApplication['status'], -): Promise => { - await fetch(import.meta.env.VITE_API_BASE_URL + `/applications/${applicationId}`, { +): Promise => { + const url = `${import.meta.env.VITE_API_BASE_URL}/applications/${applicationId}`; + const response = await fetch(url, { method: 'PATCH', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ status }), }); + + if (!response.ok) throw new Error('지원서 상태를 업데이트하지 못했습니다'); + return await response.json(); }; diff --git a/src/pages/admin/ApplicationDetail/components/ApplicantProfileSection/ApplicantStatusButton.tsx b/src/pages/admin/ApplicationDetail/components/ApplicantProfileSection/ApplicantStatusButton.tsx index c4c2da22..b7574ada 100644 --- a/src/pages/admin/ApplicationDetail/components/ApplicantProfileSection/ApplicantStatusButton.tsx +++ b/src/pages/admin/ApplicationDetail/components/ApplicantProfileSection/ApplicantStatusButton.tsx @@ -1,11 +1,11 @@ import styled from '@emotion/styled'; -import type { ApplicantData, ApplicantStatus } from '@/pages/admin/Dashboard/types/dashboard'; +import type { StatusLabel, ApplicationStatus } from '@/pages/admin/Dashboard/types/dashboard'; type Props = { - label: ApplicantData['status']; - value: ApplicantStatus; + label: StatusLabel; + value: ApplicationStatus; selected: boolean; - onClick: (status: ApplicantStatus) => void; + onClick: (status: ApplicationStatus) => void; }; export const ApplicantStatusButton = ({ label, value, selected, onClick }: Props) => { diff --git a/src/pages/admin/ApplicationDetail/components/ApplicantProfileSection/ApplicantStatusToggle.tsx b/src/pages/admin/ApplicationDetail/components/ApplicantProfileSection/ApplicantStatusToggle.tsx index 8e55df78..caef8288 100644 --- a/src/pages/admin/ApplicationDetail/components/ApplicantProfileSection/ApplicantStatusToggle.tsx +++ b/src/pages/admin/ApplicationDetail/components/ApplicantProfileSection/ApplicantStatusToggle.tsx @@ -1,17 +1,17 @@ import styled from '@emotion/styled'; import { useState } from 'react'; import { ApplicantStatusButton } from './ApplicantStatusButton'; -import type { ApplicantStatus } from '@/pages/admin/Dashboard/types/dashboard'; +import type { ApplicationStatus } from '@/pages/admin/Dashboard/types/dashboard'; type Props = { - status?: ApplicantStatus; - updateStatus: (status: ApplicantStatus) => void; + status?: ApplicationStatus; + updateStatus: (status: ApplicationStatus) => void; }; export const ApplicantStatusToggle = ({ status, updateStatus }: Props) => { const [statusOption, setStatusOption] = useState(status); - const handleClick = (newStatus: ApplicantStatus) => { + const handleClick = (newStatus: ApplicationStatus) => { setStatusOption(newStatus); updateStatus(newStatus); }; @@ -20,8 +20,8 @@ export const ApplicantStatusToggle = ({ status, updateStatus }: Props) => { void; + updateStatus: (status: ApplicationStatus) => void; }; export const ApplicantProfileSection = ({ diff --git a/src/pages/admin/ApplicationDetail/components/CommentSection/ApplicantStarRating.tsx b/src/pages/admin/ApplicationDetail/components/CommentSection/ApplicantStarRating.tsx new file mode 100644 index 00000000..7738ed75 --- /dev/null +++ b/src/pages/admin/ApplicationDetail/components/CommentSection/ApplicantStarRating.tsx @@ -0,0 +1,72 @@ +import styled from '@emotion/styled'; +import { useState } from 'react'; + +type ApplicantStarRatingProps = { + rating: number; + onRatingChange: (rating: number) => void; +}; + +const STAR_INDICES = [1, 2, 3, 4, 5]; + +export const ApplicantStarRating = ({ rating, onRatingChange }: ApplicantStarRatingProps) => { + const [previewRating, setPreviewRating] = useState(0); + + const handleStarClick = (index: number, e: React.MouseEvent) => { + const rect = e.currentTarget.getBoundingClientRect(); + const isLeftHalf = e.clientX - rect.left < rect.width / 2; + onRatingChange(isLeftHalf ? index - 0.5 : index); + }; + + const handleStarHover = (index: number, e: React.MouseEvent) => { + const rect = e.currentTarget.getBoundingClientRect(); + const isLeftHalf = e.clientX - rect.left < rect.width / 2; + setPreviewRating(isLeftHalf ? index - 0.5 : index); + }; + + return ( + setPreviewRating(0)}> + {STAR_INDICES.map((index) => { + const currentRating = previewRating || rating; + const fillPercentage = + index <= currentRating ? 100 : index - 0.5 === currentRating ? 50 : 0; + + return ( + handleStarClick(index, e)} + onMouseMove={(e) => handleStarHover(index, e)} + > + + + + ); + })} + + ); +}; + +const StarContainer = styled.div({ + display: 'flex', + gap: '0.125rem', + alignItems: 'center', + cursor: 'pointer', +}); + +const StarWrapper = styled.div({ + position: 'relative', + display: 'inline-block', + fontSize: '1.25rem', +}); + +const StarEmpty = styled.div(({ theme }) => ({ + color: theme.colors.gray200, +})); + +const StarFilled = styled.div<{ fillPercentage: number }>(({ fillPercentage, theme }) => ({ + position: 'absolute', + top: 0, + left: 0, + color: theme.colors.primary, + overflow: 'hidden', + width: `${fillPercentage}%`, +})); diff --git a/src/pages/admin/ApplicationDetail/components/CommentSection/CommentForm.tsx b/src/pages/admin/ApplicationDetail/components/CommentSection/CommentForm.tsx index 5abc6d6f..0f248a9a 100644 --- a/src/pages/admin/ApplicationDetail/components/CommentSection/CommentForm.tsx +++ b/src/pages/admin/ApplicationDetail/components/CommentSection/CommentForm.tsx @@ -4,6 +4,7 @@ import { Form } from 'react-router-dom'; import { Button } from '@/shared/components/Button'; import { OutlineTextareaField } from '@/shared/components/Form/TextAreaField/OutlineTextareaField'; import { Text } from '@/shared/components/Text'; +import { ApplicantStarRating } from './ApplicantStarRating'; import type { CreateCommentRequest } from '@/mocks/handler/applicant'; type Props = { @@ -11,38 +12,68 @@ type Props = { }; export const CommentForm = ({ createComment }: Props) => { + const [rating, setRating] = useState(0); const [content, setContent] = useState(''); + const [isSubmitted, setIsSubmitted] = useState(false); + + const isContentInvalid = !content.trim(); + const isRatingInvalid = rating === 0; + const isSubmitDisabled = isRatingInvalid || isContentInvalid; + const isContentTooLong = content.length > 500; + + const handleChange = (e: React.ChangeEvent) => { + setContent(e.target.value); + }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); + setIsSubmitted(true); - if (!content.trim()) { - alert('댓글을 입력해주세요'); + if (isSubmitDisabled || isContentTooLong) { return; } const newComment = { content: content.trim(), - rating: 5, + rating: rating, }; createComment(newComment); setContent(''); + setRating(0); + setIsSubmitted(false); }; + let errorMessage = ''; + if (isContentTooLong) { + errorMessage = '댓글은 500자 이하로 입력해주세요.'; + } else if (isSubmitted && isSubmitDisabled) { + if (isRatingInvalid && isContentInvalid) { + errorMessage = '별점과 댓글을 모두 입력해주세요.'; + } else if (isRatingInvalid) { + errorMessage = '별점을 선택해주세요.'; + } else { + errorMessage = '댓글을 입력해주세요.'; + } + } + return ( 댓글 +
{ - setContent(e.target.value); - }} + onChange={handleChange} + invalid={(isSubmitted && isSubmitDisabled) || isContentTooLong} + message={errorMessage} /> + + {content.length} / 500 + @@ -66,6 +97,8 @@ const Wrapper = styled.div({ const ButtonWrapper = styled.div({ display: 'flex', - justifyContent: 'flex-end', - marginRight: '-1.65rem', + justifyContent: 'space-between', + alignItems: 'center', + marginRight: '-2rem', + padding: '0 0.3rem', }); diff --git a/src/pages/admin/ApplicationDetail/components/CommentSection/CommentItem.tsx b/src/pages/admin/ApplicationDetail/components/CommentSection/CommentItem.tsx index a25c1392..3556fc46 100644 --- a/src/pages/admin/ApplicationDetail/components/CommentSection/CommentItem.tsx +++ b/src/pages/admin/ApplicationDetail/components/CommentSection/CommentItem.tsx @@ -5,6 +5,7 @@ import { useComments } from '@/pages/admin/ApplicationDetail/hooks/useComments'; import { Button } from '@/shared/components/Button'; import { UnderlineTextareaField } from '@/shared/components/Form/TextAreaField/UnderlineTextareaField'; import { Text } from '@/shared/components/Text'; +import { ApplicantStarRating } from './ApplicantStarRating'; import type { Comment } from '@/pages/admin/ApplicationDetail/types/comments'; type Props = Pick; @@ -15,6 +16,7 @@ export const CommentItem = ({ author, commentId, content, createdAt, rating }: P const [isEditing, setIsEditing] = useState(false); const [editedContent, setEditedContent] = useState(content); + const [editedRating, setEditedRating] = useState(rating); const handleEdit = () => { setIsEditing(true); @@ -26,17 +28,22 @@ export const CommentItem = ({ author, commentId, content, createdAt, rating }: P alert('댓글 내용을 입력해주세요'); return; } + if (editedRating === 0) { + alert('별점을 선택해주세요.'); + return; + } updateComment({ commentId, content: editedContent, - rating, + rating: editedRating, }); setIsEditing(false); }; const handleCancel = () => { setEditedContent(content); + setEditedRating(rating); setIsEditing(false); }; @@ -69,6 +76,7 @@ export const CommentItem = ({ author, commentId, content, createdAt, rating }: P {isEditing ? ( + setEditedContent(e.target.value)} diff --git a/src/pages/admin/ApplicationDetail/hooks/useComments.ts b/src/pages/admin/ApplicationDetail/hooks/useComments.ts index d7e117cc..371db2c8 100644 --- a/src/pages/admin/ApplicationDetail/hooks/useComments.ts +++ b/src/pages/admin/ApplicationDetail/hooks/useComments.ts @@ -8,10 +8,13 @@ import { import type { Comment } from '@/pages/admin/ApplicationDetail/types/comments'; import type { UseApiQueryResult } from '@/types/useApiQueryResult'; +type CreateCommentPayload = Pick; +type UpdateCommentPayload = Pick; + type UseCommentsResult = UseApiQueryResult & { - createComment: (comment: { content: string; rating: number }) => void; + createComment: (comment: CreateCommentPayload) => void; deleteComment: (commentId: number) => void; - updateComment: (comment: { commentId: number; content: string; rating: number }) => void; + updateComment: (comment: UpdateCommentPayload) => void; }; export const useComments = (applicationId: number): UseCommentsResult => { diff --git a/src/pages/admin/ApplicationDetail/types/detailApplication.ts b/src/pages/admin/ApplicationDetail/types/detailApplication.ts index 50ff7c06..eb539c43 100644 --- a/src/pages/admin/ApplicationDetail/types/detailApplication.ts +++ b/src/pages/admin/ApplicationDetail/types/detailApplication.ts @@ -1,8 +1,8 @@ -import type { ApplicantStatus } from '@/pages/admin/Dashboard/types/dashboard'; +import type { ApplicationStatus } from '@/pages/admin/Dashboard/types/dashboard'; export type DetailApplication = { applicationId: number; - status: ApplicantStatus; + status: ApplicationStatus; rating: number; applicantInfo: { applicantId: number; diff --git a/src/pages/admin/ClubDetailEdit/Page.tsx b/src/pages/admin/ClubDetailEdit/Page.tsx index 21f92b41..923cfbab 100644 --- a/src/pages/admin/ClubDetailEdit/Page.tsx +++ b/src/pages/admin/ClubDetailEdit/Page.tsx @@ -1,4 +1,8 @@ import styled from '@emotion/styled'; +import { useEffect } from 'react'; +import { useForm, FormProvider } from 'react-hook-form'; +import { useParams, useNavigate } from 'react-router-dom'; +import { toast } from 'sonner'; import { Button } from '@/shared/components/Button'; import { ClubHeaderSection } from '@/shared/components/ClubDetailLayout/ClubHeaderSection'; import { @@ -6,37 +10,93 @@ import { ContentLeft, ContentRight, } from '@/shared/components/ClubDetailLayout/index.styled'; +import { theme } from '@/styles/theme'; +import { updateClubDetailEdit } from './api/clubDetailEdit'; import { ClubActivityPhotosEditSection } from './components/ClubActivityPhotosEditSection'; import { ClubDescriptionEditSection } from './components/ClubDescriptionEditSection'; import { ClubInfoSidebarEditSection } from './components/ClubInfoSidebarEditSection'; -import { mockClubDetail } from './components/mock'; +import { ClubShortIntroductionEditSection } from './components/ClubShortIntroductionEditSection'; +import { useClubDetailEdit } from './hook/useClubDetailEdit'; +import type { ClubDetailEdit } from './types/clubDetailEdit'; export const ClubDetailEditPage = () => { - const handleSave = () => { - console.log('수정된 값 저장'); - }; + const { clubId } = useParams<{ clubId: string }>(); + const { data: club, isLoading, error } = useClubDetailEdit(clubId ?? ''); + + const methods = useForm({ + mode: 'onTouched', + }); + + const { + handleSubmit, + reset, + formState: { errors, isSubmitting, isSubmitSuccessful }, + } = methods; - const handleCancel = () => { - console.log('취소'); + useEffect(() => { + if (club) reset(club); + }, [club, reset]); + + const navigate = useNavigate(); + + const onSubmit = async (data: ClubDetailEdit) => { + updateClubDetailEdit(clubId ?? '', data) + .then(() => { + toast.success('수정 성공!', { + style: { + backgroundColor: theme.colors.primary, + color: 'white', + }, + duration: 1000, + onAutoClose: () => navigate(`/clubs/${clubId}`), + }); + }) + .catch(() => { + toast.error('수정 실패!', { + duration: 1000, + style: { + backgroundColor: 'white', + color: theme.colors.error, + }, + }); + }); }; + if (isLoading) return
Loading...
; + if (error) return
데이터를 불러오는 중 오류가 발생했습니다.
; + if (!club) return null; + return ( - - - - - - - - - - - - - - + + + + + + + + + {errors.presidentPhoneNumber && ( + {errors.presidentPhoneNumber.message} + )} + + + + + + + {isSubmitSuccessful && 저장 완료!} + + + + + + + + ); }; @@ -46,3 +106,15 @@ const ButtonGroup = styled.div({ gap: '1rem', marginTop: '2rem', }); + +const ErrorMessage = styled.span(({ theme }) => ({ + color: theme.colors.error, + marginTop: '0.5rem', + display: 'block', +})); + +const SuccessMessage = styled.span(({ theme }) => ({ + color: theme.colors.success, + marginTop: '1rem', + display: 'block', +})); diff --git a/src/pages/admin/ClubDetailEdit/api/clubDetailEdit.ts b/src/pages/admin/ClubDetailEdit/api/clubDetailEdit.ts new file mode 100644 index 00000000..d7278921 --- /dev/null +++ b/src/pages/admin/ClubDetailEdit/api/clubDetailEdit.ts @@ -0,0 +1,31 @@ +import type { ClubDetailEdit } from '../types/clubDetailEdit'; + +export const fetchClubDetailEdit = async (clubId: string | number): Promise => { + const url = `${import.meta.env.VITE_API_BASE_URL}/clubs/${clubId}`; + const response = await fetch(url); + + if (!response.ok) { + throw new Error('동아리 상세 수정 데이터를 가져오는데 실패했습니다.'); + } + return response.json() as Promise; +}; + +export const updateClubDetailEdit = async ( + clubId: string | number, + updatedData: Partial, +): Promise => { + const url = `${import.meta.env.VITE_API_BASE_URL}/clubs/${clubId}`; + const response = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(updatedData), + }); + + if (!response.ok) { + throw new Error('동아리 상세 정보를 수정하는데 실패했습니다.'); + } + + return response.json() as Promise; +}; diff --git a/src/pages/admin/ClubDetailEdit/components/ClubActivityPhotosEditSection/index.tsx b/src/pages/admin/ClubDetailEdit/components/ClubActivityPhotosEditSection/index.tsx index 29a018a8..fca426ed 100644 --- a/src/pages/admin/ClubDetailEdit/components/ClubActivityPhotosEditSection/index.tsx +++ b/src/pages/admin/ClubDetailEdit/components/ClubActivityPhotosEditSection/index.tsx @@ -1,17 +1,18 @@ import { FiTrash2, FiPlus } from 'react-icons/fi'; import { SectionTitle } from '@/shared/components/SectionTitle'; import * as S from './index.styled'; -import { mockClubDetail } from '../mock'; -export const ClubActivityPhotosEditSection = () => { +interface ClubActivityPhotosEditSectionProps { + images: string[]; +} + +export const ClubActivityPhotosEditSection = ({ images }: ClubActivityPhotosEditSectionProps) => { const handleDelete = (idx: number) => { console.log(`${idx}번째 사진 삭제`); - // TODO: 사진 삭제 로직 연결 }; const handleAdd = () => { console.log('사진 추가'); - // TODO: 사진 추가 로직 연결 }; return ( @@ -27,7 +28,7 @@ export const ClubActivityPhotosEditSection = () => { - {mockClubDetail.introductionImages.map((src, idx) => ( + {images.map((src, idx) => ( handleDelete(idx)}> diff --git a/src/pages/admin/ClubDetailEdit/components/ClubDescriptionEditSection/index.tsx b/src/pages/admin/ClubDetailEdit/components/ClubDescriptionEditSection/index.tsx index 704f0de7..ae5889c8 100644 --- a/src/pages/admin/ClubDetailEdit/components/ClubDescriptionEditSection/index.tsx +++ b/src/pages/admin/ClubDetailEdit/components/ClubDescriptionEditSection/index.tsx @@ -1,23 +1,54 @@ import styled from '@emotion/styled'; -import { useState } from 'react'; +import { useFormContext } from 'react-hook-form'; +import { OutlineTextareaField } from '@/shared/components/Form/TextAreaField/OutlineTextareaField'; import { SectionTitle } from '@/shared/components/SectionTitle'; -import { mockClubDetail } from '../mock'; export const ClubDescriptionEditSection = () => { - const [introduce, setIntroduce] = useState(mockClubDetail.introductionOverview); - const [activity, setActivity] = useState(mockClubDetail.introductionActivity); - const [ideal, setIdeal] = useState(mockClubDetail.introductionIdeal); + const { + register, + formState: { errors }, + } = useFormContext<{ + introductionOverview: string; + introductionActivity: string; + introductionIdeal: string; + }>(); + + const maxLength = 1200; return ( 동아리 소개 - setIntroduce(e.target.value)} /> + 활동 내용 - setActivity(e.target.value)} /> + 모집하는 사람 - setIdeal(e.target.value)} /> + ); }; @@ -30,25 +61,3 @@ const DescriptionContainer = styled.div(({ theme }) => ({ flexDirection: 'column', gap: '1rem', })); - -const InputArea = styled.textarea(({ theme }) => ({ - fontSize: theme.font.size.sm, - lineHeight: 1.6, - padding: '0.75rem 1rem', - borderRadius: theme.radius.md, - border: `1px solid ${theme.colors.border}`, - backgroundColor: theme.colors.bg, - resize: 'vertical', - minHeight: '100px', - transition: 'border-color 0.2s ease, box-shadow 0.2s ease', - - '&:focus': { - outline: 'none', - borderColor: theme.colors.primary, - boxShadow: `0 0 0 2px ${theme.colors.primary}33`, - }, - - '&::placeholder': { - color: theme.colors.textSecondary, - }, -})); diff --git a/src/pages/admin/ClubDetailEdit/components/ClubInfoSidebarEditSection/index.styled.ts b/src/pages/admin/ClubDetailEdit/components/ClubInfoSidebarEditSection/index.styled.ts index ddc377d4..71e2a164 100644 --- a/src/pages/admin/ClubDetailEdit/components/ClubInfoSidebarEditSection/index.styled.ts +++ b/src/pages/admin/ClubDetailEdit/components/ClubInfoSidebarEditSection/index.styled.ts @@ -1,50 +1,60 @@ import styled from '@emotion/styled'; -import { FiEdit2 } from 'react-icons/fi'; export const SidebarContainer = styled.div(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + gap: '1.5rem', + padding: '1rem', backgroundColor: theme.colors.bg, - padding: '16px', borderRadius: theme.radius.md, +})); + +export const InfoItem = styled.div<{ column?: boolean }>(({ column }) => ({ display: 'flex', - flexDirection: 'column', - gap: '12px', + alignItems: column ? 'flex-start' : 'center', + flexDirection: column ? 'column' : 'row', + paddingTop: column ? '2rem' : '0', + gap: '0.5rem', })); -export const InfoItem = styled.div(({ theme }) => ({ +export const InputWrapper = styled.div({ + display: 'flex', + flexDirection: 'column', + flex: 1, +}); + +export const Label = styled.span<{ required?: boolean }>(({ theme, required }) => ({ + fontWeight: theme.font.weight.bold, + ...(required && { + '&::after': { + content: '" *"', + color: theme.colors.error, + }, + }), + width: '120px', + flexShrink: 0, + textAlign: 'left', fontSize: theme.font.size.sm, color: theme.colors.textPrimary, - display: 'flex', - alignItems: 'center', - justifyContent: 'flex-start', - gap: '8px', - span: { - flex: 1, - textAlign: 'center', - }, })); -export const InlineInput = styled.input(({ theme }) => ({ - border: 'none', - borderBottom: `1px solid ${theme.colors.gray300}`, - fontSize: theme.font.size.sm, - padding: '2px 4px', - flex: 1, +export const DisplayWrapper = styled.div({ + display: 'flex', + flexDirection: 'column', + alignItems: 'center', textAlign: 'center', - '&:focus': { - outline: 'none', - borderBottom: `1px solid ${theme.colors.primary}`, - }, -})); + width: '100%', + gap: '0.3rem', +}); -export const EditIcon = styled(FiEdit2)(({ theme }) => ({ - cursor: 'pointer', - color: theme.colors.gray500, - '&:hover': { - color: theme.colors.primary, - }, +export const DisplayText = styled.span(({ theme }) => ({ + fontSize: theme.font.size.base, + color: theme.colors.textPrimary, + fontWeight: theme.font.weight.medium, })); -export const Notice = styled.div(({ theme }) => ({ - fontSize: theme.font.size.xs, +export const SubText = styled.span(({ theme }) => ({ + fontSize: theme.font.size.sm, color: theme.colors.textSecondary, + marginTop: '0.1rem', })); diff --git a/src/pages/admin/ClubDetailEdit/components/ClubInfoSidebarEditSection/index.tsx b/src/pages/admin/ClubDetailEdit/components/ClubInfoSidebarEditSection/index.tsx index cc14f2af..99bbcee2 100644 --- a/src/pages/admin/ClubDetailEdit/components/ClubInfoSidebarEditSection/index.tsx +++ b/src/pages/admin/ClubDetailEdit/components/ClubInfoSidebarEditSection/index.tsx @@ -1,110 +1,109 @@ -import { useState } from 'react'; -import DatePicker from 'react-datepicker'; -import { mockClubDetail } from '../mock'; -import * as S from './index.styled'; import 'react-datepicker/dist/react-datepicker.css'; +import { useFormContext } from 'react-hook-form'; +import { UnderlineInputField } from '@/shared/components/Form/InputField/UnderlineInputField'; +import { OutlineTextareaField } from '@/shared/components/Form/TextAreaField/OutlineTextareaField'; +import { formatDate } from '@/utils/dateUtils'; +import * as S from './index.styled'; export const ClubInfoSidebarEditSection = () => { const { - presidentName: initialPresidentName, - presidentPhoneNumber: initialPresidentPhoneNumber, - location: initialLocation, - recruitStart: initialRecruitStart, - recruitEnd: initialRecruitEnd, - regularMeetingInfo: initialRegularMeetingInfo, - applicationNotice: initialApplicationNotice, - } = mockClubDetail; - - const [presidentName, setPresidentName] = useState(initialPresidentName); - const [editingField, setEditingField] = useState(null); + register, + formState: { errors }, + getValues, + } = useFormContext<{ + presidentName: string; + presidentPhoneNumber: string; + location: string; + recruitStart: string | null; + recruitEnd: string | null; + regularMeetingInfo: string; + applicationNotice: string; + }>(); - const [recruitStart, setRecruitStart] = useState( - initialRecruitStart ? new Date(initialRecruitStart) : null, - ); - const [recruitEnd, setRecruitEnd] = useState( - initialRecruitEnd ? new Date(initialRecruitEnd) : null, - ); + const formValues = getValues(); - const renderEditableItem = ( - label: string, - value: string, - fieldKey: string, - onChange: (newValue: string) => void, - ) => { - const isEditing = editingField === fieldKey; + return ( + + + 회장 이름 + + {formValues.presidentName || '-'} + + - return ( - {label}: - {isEditing ? ( - onChange(e.target.value)} - onBlur={() => setEditingField(null)} - autoFocus + 연락처 + + + !value || + /^\d{3}-\d{4}-\d{4}$/.test(value) || + '전화번호 형식은 000-0000-0000입니다.', + })} + invalid={!!errors.presidentPhoneNumber} + message={errors.presidentPhoneNumber?.message} /> - ) : ( - {value} - )} - {!isEditing && setEditingField(fieldKey)} />} + - ); - }; - - // const getRecruitStartString = () => - // recruitStart - // ? `${recruitStart.getFullYear()}-${String( - // recruitStart.getMonth() + 1 - // ).padStart(2, "0")}-${String(recruitStart.getDate()).padStart( - // 2, - // "0" - // )}T00:00:00` - // : null; - // const getRecruitEndString = () => - // recruitEnd - // ? `${recruitEnd.getFullYear()}-${String( - // recruitEnd.getMonth() + 1 - // ).padStart(2, "0")}-${String(recruitEnd.getDate()).padStart( - // 2, - // "0" - // )}T23:59:59` - // : null; - - return ( - - {renderEditableItem('회장 이름', presidentName, 'presidentName', setPresidentName)} - {renderEditableItem('연락처', initialPresidentPhoneNumber, 'presidentPhoneNumber', () => {})} - {renderEditableItem('동방 위치', initialLocation, 'location', () => {})} + + 동방 위치 + + + + - 모집 시작일: - setRecruitStart(date)} - dateFormat='yyyy/MM/dd' - customInput={} - /> + 정기 모임 + + + - 모집 마감일: - setRecruitEnd(date)} - minDate={recruitStart ?? undefined} - dateFormat='yyyy/MM/dd' - customInput={} + 모집 기간 + + + {formValues.recruitStart && formValues.recruitEnd + ? `${formatDate(formValues.recruitStart)} ~ ${formatDate(formValues.recruitEnd)}` + : '-'} + + + + + + 지원 시 유의사항 + !value || value.length <= 100 || '100자 이하로 입력해주세요.', + })} + invalid={!!errors.applicationNotice} + message={errors.applicationNotice?.message} /> - {renderEditableItem('정기 모임', initialRegularMeetingInfo, 'regularMeetingInfo', () => {})} - {renderEditableItem( - '지원 시 유의사항', - initialApplicationNotice, - 'applicationNotice', - () => {}, - )} + - 모집 일정은 지원폼 수정 페이지에서 수정할 수 있습니다. + - 회장 변경 시 개발팀에 문의하세요. ); }; diff --git a/src/pages/admin/ClubDetailEdit/components/ClubShortIntroductionEditSection/index.tsx b/src/pages/admin/ClubDetailEdit/components/ClubShortIntroductionEditSection/index.tsx new file mode 100644 index 00000000..e1546767 --- /dev/null +++ b/src/pages/admin/ClubDetailEdit/components/ClubShortIntroductionEditSection/index.tsx @@ -0,0 +1,41 @@ +import styled from '@emotion/styled'; +import { useFormContext } from 'react-hook-form'; +import { OutlineInputField } from '@/shared/components/Form/InputField/OutlineInputField'; +import { SectionTitle } from '@/shared/components/SectionTitle'; +import { Text } from '@/shared/components/Text'; + +export const ClubShortIntroductionEditSection = () => { + const { + register, + formState: { errors }, + } = useFormContext<{ shortIntroduction: string }>(); + + const maxLength = 50; + + return ( + + 동아리 한줄 소개 + + + - 메인에서 보여지는 동아리의 설명입니다. + + + ); +}; + +const ShortIntroContainer = styled.div(({ theme }) => ({ + backgroundColor: theme.colors.bg, + padding: '16px', + paddingBottom: 0, + display: 'flex', + flexDirection: 'column', + gap: '0.5rem', +})); diff --git a/src/pages/admin/ClubDetailEdit/components/mock.ts b/src/pages/admin/ClubDetailEdit/components/mock.ts deleted file mode 100644 index d5755ea5..00000000 --- a/src/pages/admin/ClubDetailEdit/components/mock.ts +++ /dev/null @@ -1,48 +0,0 @@ -export type Club = { - id: number; - clubName: string; - location: string; - category: string; - shortIntroduction: string; - introductionImages: string[]; - introductionOverview: string; - introductionActivity: string; - introductionIdeal: string; - regularMeetingInfo: string; - recruitStatus: string; - presidentName: string; - presidentPhoneNumber: string; - recruitStart: string; - recruitEnd: string; - applicationNotice: string; -}; - -export const mockClubDetail: Club = { - id: 1, - clubName: '인터엑스', - location: '공7 201호', - category: '사회연구', - shortIntroduction: '사회문제에 관심 있는 사람들을 위한 동아리', - introductionImages: [ - 'https://plus.unsplash.com/premium_photo-1729880132913-4ca7d67f8eeb?q=80&w=1587&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D', - 'https://plus.unsplash.com/premium_photo-1723917604890-418aa2307d2f?q=80&w=1470&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D', - 'https://plus.unsplash.com/premium_photo-1704756437707-e9fee5c04bcf?q=80&w=1470&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D', - 'https://plus.unsplash.com/premium_photo-1704756437647-559e43344877?q=80&w=1470&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D', - ], - introductionOverview: `인터엑스는 사회 문제를 깊이 있게 탐구하고 이를 해결하기 위해 다양한 활동을 기획하는 동아리입니다. - 회원들은 토론, 조사, 캠페인 등을 통해 실제 사회 문제를 이해하고, 문제 해결을 위한 창의적 방법을 모색합니다. - 학문적 연구와 실질적 활동을 병행하며, 서로의 생각을 존중하고 협력하는 문화를 지향합니다.`, - introductionActivity: `동아리 활동으로는 매주 세미나와 그룹 토론, 지역 사회 봉사활동, 캠페인 기획 및 참여 등이 있습니다. - 회원들은 각자의 관심 분야를 살려 프로젝트를 진행하며, 발표와 보고서를 통해 성과를 공유합니다. - 또한 외부 전문가 초청 강연을 통해 사회 문제에 대한 이해를 넓히고, 실천 가능한 해결책을 모색합니다.`, - introductionIdeal: `인터엑스에서는 성실하고 책임감 있는 인재를 기다립니다. - 문제 해결에 관심이 많고 창의적 아이디어를 공유할 수 있는 사람, - 팀원들과 협력하며 꾸준히 학습하고 성장하려는 자세를 가진 사람이라면 누구나 환영합니다.`, - regularMeetingInfo: '매주 화요일 오후 6시', - recruitStatus: '모집중', - presidentName: '김춘식', - presidentPhoneNumber: '010-9619-7677', - recruitStart: '2025-09-03T00:00:00', - recruitEnd: '2025-09-20T23:59:00', - applicationNotice: '현재 지원은 휴학생을 제외한 1~3학년만 받고 있습니다.', -}; diff --git a/src/pages/admin/ClubDetailEdit/hook/useClubDetailEdit.ts b/src/pages/admin/ClubDetailEdit/hook/useClubDetailEdit.ts new file mode 100644 index 00000000..be929b05 --- /dev/null +++ b/src/pages/admin/ClubDetailEdit/hook/useClubDetailEdit.ts @@ -0,0 +1,11 @@ +import { useQuery } from '@tanstack/react-query'; +import { fetchClubDetailEdit } from '@/pages/admin/ClubDetailEdit/api/clubDetailEdit'; +import type { ClubDetailEdit } from '../types/clubDetailEdit'; + +export const useClubDetailEdit = (clubId: string | number) => { + return useQuery({ + queryKey: ['clubDetailEdit', clubId], + queryFn: () => fetchClubDetailEdit(clubId), + enabled: !!clubId, + }); +}; diff --git a/src/pages/admin/ClubDetailEdit/types/clubDetailEdit.ts b/src/pages/admin/ClubDetailEdit/types/clubDetailEdit.ts new file mode 100644 index 00000000..c6b82049 --- /dev/null +++ b/src/pages/admin/ClubDetailEdit/types/clubDetailEdit.ts @@ -0,0 +1,3 @@ +import type { ClubDetail } from '@/pages/user/ClubDetail/types/clubDetail'; + +export type ClubDetailEdit = ClubDetail; diff --git a/src/pages/admin/Dashboard/api/applicant.ts b/src/pages/admin/Dashboard/api/applicant.ts index 51138882..24cedaa6 100644 --- a/src/pages/admin/Dashboard/api/applicant.ts +++ b/src/pages/admin/Dashboard/api/applicant.ts @@ -1,20 +1,13 @@ -import type { - ApplicantData, - ApplicationFilterOption, -} from '@/pages/admin/Dashboard/types/dashboard'; +import type { ApplicantData } from '@/pages/admin/Dashboard/types/dashboard'; -export const fetchApplicants = async ( - clubId: number, - status?: ApplicationFilterOption, -): Promise => { - const url = new URL( - import.meta.env.VITE_API_BASE_URL + `/clubs/${clubId}/applicants`, - window.location.origin, - ); - if (status && status !== 'ALL') { - url.searchParams.set('status', status); +export const fetchApplicants = async (clubId: number): Promise => { + const url = `${import.meta.env.VITE_API_BASE_URL}/clubs/${clubId}/dashboard/applicants`; + const response = await fetch(url); + + if (!response.ok) { + const errorText = await response.text(); + throw new Error(`HTTP ${response.status}: ${errorText}`); } - const response = await fetch(url.toString()); return await response.json(); }; diff --git a/src/pages/admin/Dashboard/api/dashboard.ts b/src/pages/admin/Dashboard/api/dashboard.ts new file mode 100644 index 00000000..630ffc34 --- /dev/null +++ b/src/pages/admin/Dashboard/api/dashboard.ts @@ -0,0 +1,12 @@ +import type { DashboardSummary } from '@/pages/admin/Dashboard/types/dashboard'; + +export const fetchDashboardSummary = async (clubId: number): Promise => { + const url = `${import.meta.env.VITE_API_BASE_URL}/clubs/${clubId}/dashboard`; + const response = await fetch(url); + + if (!response.ok) { + throw new Error('대시보드 요약 정보를 불러오는 데 실패했습니다.'); + } + + return response.json(); +}; diff --git a/src/pages/admin/Dashboard/components/ApplicantListSection/ApplicantList.tsx b/src/pages/admin/Dashboard/components/ApplicantListSection/ApplicantList.tsx index 7752aad2..8b99ea46 100644 --- a/src/pages/admin/Dashboard/components/ApplicantListSection/ApplicantList.tsx +++ b/src/pages/admin/Dashboard/components/ApplicantListSection/ApplicantList.tsx @@ -31,23 +31,33 @@ export const ApplicantList = ({ filterOption }: Props) => { ))} - {applicants.map((applicant) => ( - - ))} + {applicants.length > 0 ? ( + applicants.map((applicant) => ( + + )) + ) : ( + + {filterOption === 'ALL' + ? '아직 지원자가 없습니다.' + : `${filterOption === 'PENDING' ? '심사중' : filterOption === 'APPROVED' ? '합격' : '불합격'} 지원자가 없습니다.`} + + )} - - - + {applicants.length > 0 && ( + + + + )}
); }; @@ -82,6 +92,13 @@ const ButtonWrapper = styled.div({ width: '100%', }); +const EmptyMessage = styled.div(({ theme }) => ({ + padding: '4rem', + textAlign: 'center', + color: theme.colors.gray500, + fontSize: '1.4rem', +})); + type ApplicateInfoCategory = '이름' | '학번' | '학과' | '전화번호' | '이메일' | '결과'; const INFO_CATEGORY: ApplicateInfoCategory[] = [ '이름', diff --git a/src/pages/admin/Dashboard/components/ApplicantListSection/ApplicantListItem.tsx b/src/pages/admin/Dashboard/components/ApplicantListSection/ApplicantListItem.tsx index fc11b814..8d9129d3 100644 --- a/src/pages/admin/Dashboard/components/ApplicantListSection/ApplicantListItem.tsx +++ b/src/pages/admin/Dashboard/components/ApplicantListSection/ApplicantListItem.tsx @@ -5,6 +5,12 @@ type Props = ApplicantData & { onClick: (id: number) => void; }; +const STATUS_LABEL: Record = { + PENDING: '미정', + REJECTED: '불합격', + APPROVED: '합격', +}; + export const ApplicantListItem = ({ id, name, @@ -22,7 +28,7 @@ export const ApplicantListItem = ({ {department || '-'} {phoneNumber || '-'} {email || '-'} - {status || '-'} + {STATUS_LABEL[status] || '-'} ); }; @@ -47,15 +53,15 @@ const InfoText = styled.p(({ theme }) => ({ const StatusBadge = styled.p>(({ theme, status }) => { const styles = { - 합격: { + APPROVED: { backgroundColor: theme.colors.primary100, color: theme.colors.primary800, }, - 불합격: { + REJECTED: { backgroundColor: theme.colors.red100, color: theme.colors.red600, }, - 미정: { + PENDING: { backgroundColor: theme.colors.gray100, color: theme.colors.gray600, }, diff --git a/src/pages/admin/Dashboard/components/ApplicantListSection/ApplicationFilter.tsx b/src/pages/admin/Dashboard/components/ApplicantListSection/ApplicationFilter.tsx index d6010df2..c1980b84 100644 --- a/src/pages/admin/Dashboard/components/ApplicantListSection/ApplicationFilter.tsx +++ b/src/pages/admin/Dashboard/components/ApplicantListSection/ApplicationFilter.tsx @@ -1,4 +1,5 @@ import styled from '@emotion/styled'; +import { useApplicants } from '@/pages/admin/Dashboard/hooks/useApplicants'; import { ApplicantFilterButton } from './ApplicationFilterButton'; import type { ApplicationFilterOption } from '@/pages/admin/Dashboard/types/dashboard'; @@ -8,29 +9,31 @@ export type Props = { }; export const ApplicationStatusFilter = ({ option, onOptionChange }: Props) => { + const { counts } = useApplicants(1); + return ( diff --git a/src/pages/admin/Dashboard/components/DashboardSummarySection/SummaryCard.tsx b/src/pages/admin/Dashboard/components/DashboardSummarySection/SummaryCard.tsx index 8011e00c..fa402a4d 100644 --- a/src/pages/admin/Dashboard/components/DashboardSummarySection/SummaryCard.tsx +++ b/src/pages/admin/Dashboard/components/DashboardSummarySection/SummaryCard.tsx @@ -1,15 +1,18 @@ import styled from '@emotion/styled'; import type { DashboardCard } from '@/pages/admin/Dashboard/types/dashboard'; -type Props = Omit; +type Props = Omit & { + isEmpty?: boolean; +}; -export const SummaryCard = ({ label, value, image }: Props) => { +export const SummaryCard = ({ label, value, image, isEmpty = false }: Props) => { return ( - {image} + {image} - {value} + {value} + {isEmpty && 예정된 모집이 없습니다} ); @@ -26,8 +29,9 @@ const Wrapper = styled.div(({ theme }) => ({ borderRadius: theme.radius.lg, })); -const IconWrapper = styled.div(({ theme }) => ({ - color: theme.colors.gray900, +const IconWrapper = styled.div<{ isEmpty?: boolean }>(({ theme, isEmpty }) => ({ + color: isEmpty ? theme.colors.gray400 : theme.colors.gray900, + transition: 'color 0.2s', })); const TextWrapper = styled.div({ @@ -41,8 +45,15 @@ const Label = styled.p(({ theme }) => ({ color: theme.colors.gray900, })); -const Value = styled.p(({ theme }) => ({ - fontSize: '2.2rem', +const Value = styled.p<{ isEmpty?: boolean }>(({ theme, isEmpty }) => ({ + fontSize: '2rem', fontWeight: theme.font.weight.bold, - color: theme.colors.gray900, + color: isEmpty ? theme.colors.gray400 : theme.colors.gray900, + transition: 'color 0.2s', +})); + +const EmptyText = styled.span(({ theme }) => ({ + fontSize: '1.1rem', + color: theme.colors.gray500, + marginTop: '-0.3rem', })); diff --git a/src/pages/admin/Dashboard/components/DashboardSummarySection/index.tsx b/src/pages/admin/Dashboard/components/DashboardSummarySection/index.tsx index ce71a2b9..ec2ce3a9 100644 --- a/src/pages/admin/Dashboard/components/DashboardSummarySection/index.tsx +++ b/src/pages/admin/Dashboard/components/DashboardSummarySection/index.tsx @@ -1,13 +1,49 @@ import styled from '@emotion/styled'; +import { GoPeople, GoCalendar } from 'react-icons/go'; +import { IoDocumentTextOutline } from 'react-icons/io5'; +import { useDashboardSummary } from '@/pages/admin/Dashboard/hooks/useDashboardSummary'; +import { LoadingSpinner } from '@/shared/components/LoadingSpinner'; +import { formatDate } from '@/utils/dateUtils'; import { SummaryCard } from './SummaryCard'; -import type { DashboardCard } from '@/pages/admin/Dashboard/types/dashboard'; export const DashboardSummarySection = () => { + const clubId = 1; + + const { data: summary, isLoading, error } = useDashboardSummary(clubId); + + if (isLoading) return ; + + if (error) { + return Error: {error.message}; + } + + if (!summary) { + return null; + } + + const recruitmentPeriod = + summary.startDay && summary.endDay + ? `${formatDate(summary.startDay)} ~ ${formatDate(summary.endDay)}` + : '-'; + return ( - {DASHBOARD_CARDS.map((card) => ( - - ))} + } + /> + } + /> + } + isEmpty={!summary.startDay || !summary.endDay} + /> ); }; @@ -32,64 +68,3 @@ const Wrapper = styled.section(({ theme }) => ({ backgroundColor: theme.colors.gray300, }, })); - -// 더미 데이터 -const DASHBOARD_CARDS: DashboardCard[] = [ - { - id: 1, - label: '총 지원자', - value: 127, - image: ( - - - - ), - }, - { - id: 2, - label: '대기중인 지원서', - value: 23, - image: ( - - - - ), - }, - { - id: 3, - label: '이번 모집 일정', - value: '8/16 ~ 8/26', - image: ( - - - - ), - }, -]; diff --git a/src/pages/admin/Dashboard/hooks/useApplicants.ts b/src/pages/admin/Dashboard/hooks/useApplicants.ts index d9797afa..9fe755b3 100644 --- a/src/pages/admin/Dashboard/hooks/useApplicants.ts +++ b/src/pages/admin/Dashboard/hooks/useApplicants.ts @@ -1,24 +1,56 @@ import { useQuery } from '@tanstack/react-query'; +import { useMemo } from 'react'; import { fetchApplicants } from '@/pages/admin/Dashboard/api/applicant'; import type { ApplicantData, ApplicationFilterOption, + ApplicantCounts, } from '@/pages/admin/Dashboard/types/dashboard'; import type { UseApiQueryResult } from '@/types/useApiQueryResult'; +export interface ExtendedUseApiQueryResult extends UseApiQueryResult { + counts: ApplicantCounts; +} + export const useApplicants = ( clubId: number, status?: ApplicationFilterOption, -): UseApiQueryResult => { +): ExtendedUseApiQueryResult => { const { data, isLoading, error } = useQuery({ - queryKey: ['applicants', clubId, status], - queryFn: () => fetchApplicants(clubId, status), - staleTime: 1000 * 60 * 2, + queryKey: ['applicants', clubId], + queryFn: () => fetchApplicants(clubId), + staleTime: 1000 * 60 * 5, + refetchInterval: 30000, }); + const filteredData = useMemo(() => { + if (!data) return []; + if (!status || status === 'ALL') return data; + + return data.filter((applicant) => applicant.status === status); + }, [data, status]); + + const counts = useMemo(() => { + if (!data) return { ALL: 0, PENDING: 0, APPROVED: 0, REJECTED: 0 }; + + return data.reduce( + (acc, applicant) => { + acc[applicant.status] += 1; + return acc; + }, + { + ALL: data.length, + PENDING: 0, + APPROVED: 0, + REJECTED: 0, + }, + ); + }, [data]); + return { - data: data || [], + data: filteredData, isLoading, error, + counts, }; }; diff --git a/src/pages/admin/Dashboard/hooks/useDashboardSummary.ts b/src/pages/admin/Dashboard/hooks/useDashboardSummary.ts new file mode 100644 index 00000000..ac0dcf97 --- /dev/null +++ b/src/pages/admin/Dashboard/hooks/useDashboardSummary.ts @@ -0,0 +1,15 @@ +import { useQuery } from '@tanstack/react-query'; +import { fetchDashboardSummary } from '@/pages/admin/Dashboard/api/dashboard'; +import type { DashboardSummary } from '@/pages/admin/Dashboard/types/dashboard'; +import type { UseApiQueryResult } from '@/types/useApiQueryResult'; + +export const useDashboardSummary = (clubId: number): UseApiQueryResult => { + const { data, isLoading, error } = useQuery({ + queryKey: ['dashboardSummary', clubId], + queryFn: () => fetchDashboardSummary(clubId), + staleTime: 1000 * 60 * 5, + refetchInterval: 30000, + }); + + return { data: data || null, isLoading, error }; +}; diff --git a/src/pages/admin/Dashboard/types/dashboard.ts b/src/pages/admin/Dashboard/types/dashboard.ts index 93343863..4694d0b9 100644 --- a/src/pages/admin/Dashboard/types/dashboard.ts +++ b/src/pages/admin/Dashboard/types/dashboard.ts @@ -7,9 +7,9 @@ export type DashboardCard = { image: ReactNode; }; -export type ApplicationFilterOption = 'ALL' | 'ACCEPTED' | 'REJECTED' | 'PENDING'; - -export type ApplicantStatus = 'ACCEPTED' | 'REJECTED' | 'PENDING'; +export type StatusLabel = '합격' | '불합격' | '미정'; +export type ApplicationStatus = 'APPROVED' | 'REJECTED' | 'PENDING'; +export type ApplicationFilterOption = 'ALL' | ApplicationStatus; export type ApplicantData = { id: number; @@ -18,5 +18,19 @@ export type ApplicantData = { department: string; phoneNumber: string; email: string; - status: '합격' | '불합격' | '미정'; + status: ApplicationStatus; +}; + +export type DashboardSummary = { + totalApplicantCount: number; + pendingApplicationCount: number; + startDay: string; + endDay: string; +}; + +export type ApplicantCounts = { + ALL: number; + PENDING: number; + APPROVED: number; + REJECTED: number; }; diff --git a/src/pages/admin/Login/KakaoCallback.tsx b/src/pages/admin/Login/KakaoCallback.tsx new file mode 100644 index 00000000..57afabac --- /dev/null +++ b/src/pages/admin/Login/KakaoCallback.tsx @@ -0,0 +1,56 @@ +import { useEffect } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { LoadingSpinner } from '@/shared/components/LoadingSpinner'; +import { postAuthCode } from './api/postAuthCode'; +import { setAccessToken, setTemporaryToken } from '../Signup/utils/token'; +import type { ErrorResponse } from '../Signup/type/error'; +import type { AxiosError } from 'axios'; + +interface LoginSuccessResponse { + status: 'LOGIN_SUCCESS'; + accessToken: string; + refreshToken: string; +} + +interface RegistrationRequiredResponse { + status: 'REGISTRATION_REQUIRED'; + temporaryToken: string; +} + +type LoginResponse = LoginSuccessResponse | RegistrationRequiredResponse; + +export const KakaoCallback = () => { + const navigate = useNavigate(); + + useEffect(() => { + const code = new URL(window.location.href).searchParams.get('code'); + + if (!code) { + navigate('/login'); + return; + } + + const fetchToken = async () => { + try { + const response: LoginResponse = await postAuthCode(code); + + switch (response.status) { + case 'LOGIN_SUCCESS': + setAccessToken(response.accessToken); + navigate('/'); + break; + case 'REGISTRATION_REQUIRED': + setTemporaryToken(response.temporaryToken); + navigate('/signup'); + break; + } + } catch (e) { + const error = e as AxiosError; + return new Error(error.response?.data.message); + } + }; + fetchToken(); + }, [navigate]); + + return ; +}; diff --git a/src/pages/admin/Login/Page.tsx b/src/pages/admin/Login/Page.tsx new file mode 100644 index 00000000..f931d03f --- /dev/null +++ b/src/pages/admin/Login/Page.tsx @@ -0,0 +1,21 @@ +import styled from '@emotion/styled'; +import { LoginButton } from './component/LoginButton'; +import { Logo } from './component/Logo'; + +export const LoginPage = () => { + return ( + + + + + ); +}; + +const Container = styled.div({ + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + height: '100vh', + gap: '30px', +}); diff --git a/src/pages/admin/Login/api/initInstance.ts b/src/pages/admin/Login/api/initInstance.ts new file mode 100644 index 00000000..f379341a --- /dev/null +++ b/src/pages/admin/Login/api/initInstance.ts @@ -0,0 +1,20 @@ +import axios from 'axios'; +import type { AxiosInstance, CreateAxiosDefaults } from 'axios'; + +const initInstance = (config: CreateAxiosDefaults): AxiosInstance => { + const instance = axios.create({ + timeout: 10000, + headers: { + 'Content-Type': 'application/json', + ...config.headers, + }, + // TODO 0. interceptor 적용지점(동아리 운영자) + ...config, + }); + + return instance; +}; + +export const apiInstance = initInstance({ + baseURL: import.meta.env.VITE_API_BASE_URL, +}); diff --git a/src/pages/admin/Login/api/postAuthCode.ts b/src/pages/admin/Login/api/postAuthCode.ts new file mode 100644 index 00000000..934a0169 --- /dev/null +++ b/src/pages/admin/Login/api/postAuthCode.ts @@ -0,0 +1,22 @@ +import { apiInstance } from './initInstance'; +import type { AxiosResponse } from 'axios'; + +interface LoginSuccessResponse { + status: 'LOGIN_SUCCESS'; + accessToken: string; + refreshToken: string; +} + +interface RegistrationRequiredResponse { + status: 'REGISTRATION_REQUIRED'; + temporaryToken: string; +} + +type LoginResponse = LoginSuccessResponse | RegistrationRequiredResponse; + +export const postAuthCode = async (code: string): Promise => { + const response: AxiosResponse = await apiInstance.post('/auth/kakao/login', { + authorizationCode: code, + }); + return response.data; +}; diff --git a/src/pages/admin/Login/component/LoginButton/index.tsx b/src/pages/admin/Login/component/LoginButton/index.tsx new file mode 100644 index 00000000..ca3bca98 --- /dev/null +++ b/src/pages/admin/Login/component/LoginButton/index.tsx @@ -0,0 +1,64 @@ +import styled from '@emotion/styled'; +import { Button } from '@/shared/components/Button'; + +const REST_API_KEY = import.meta.env.VITE_KAKAO_REST_API_KEY; +const REDIRECT_URI = import.meta.env.VITE_KAKAO_REDIRECT_URI; + +export const LoginButton = () => { + const handleKakaoLogin = () => { + const kakaoAuthUrl = `https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code`; + window.location.href = kakaoAuthUrl; + }; + + return ( + + + + + + + ); +}; + +const Container = styled.div({ + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + width: 300, + padding: '0 0 30px 0', + gap: '10px 0', +}); +const KakaoButtonWrapper = styled.div({ + width: '100%', + '& button': { + width: '100%', + backgroundColor: '#FEE500', + color: 'black', + '&:hover': { + backgroundColor: '#FFD600', + }, + }, +}); + +const ButtonContent = styled.div({ + alignItems: 'center', + justifyContent: 'center', + gap: '8px', + width: '100%', + position: 'relative', +}); + +const Icon = styled.img({ + position: 'absolute', + left: '16px', + width: 20, + height: 20, +}); diff --git a/src/pages/admin/Login/component/LoginInput/index.tsx b/src/pages/admin/Login/component/LoginInput/index.tsx new file mode 100644 index 00000000..05d97400 --- /dev/null +++ b/src/pages/admin/Login/component/LoginInput/index.tsx @@ -0,0 +1,62 @@ +import styled from '@emotion/styled'; +import { OutlineInputField } from '@/shared/components/Form/InputField/OutlineInputField'; + +export const LoginInput = () => { + return ( + + + + 아이디 + + + + + 비밀번호 + + + ); +}; + +const Container = styled.div({ + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + width: 300, + padding: '0 0 30px 0', + gap: '40px 0', +}); + +const InputWrapper = styled.div({ + position: 'relative', + width: '100%', + boxSizing: 'border-box', + '& input': { + padding: '10px 0px 10px 5px ', + }, + '& input:focus + label': { + top: -8, + left: 8, + fontSize: 12, + background: 'white', + padding: '0 4px', + color: '#000', + }, + '& input:not(:placeholder-shown) + label': { + top: -8, + left: 8, + fontSize: 12, + background: 'white', + padding: '0 4px', + color: '#000', + }, +}); + +const PlaceHolderText = styled.label({ + position: 'absolute', + top: 14, + left: 10, + color: '#888', + pointerEvents: 'none', + transition: '0.2s ease all', +}); diff --git a/src/pages/admin/Login/component/Logo/index.tsx b/src/pages/admin/Login/component/Logo/index.tsx new file mode 100644 index 00000000..97128a87 --- /dev/null +++ b/src/pages/admin/Login/component/Logo/index.tsx @@ -0,0 +1,28 @@ +import styled from '@emotion/styled'; + +export const Logo = () => { + return ( + + + + ); +}; + +export const LogoWrapper = styled.div({ + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + marginBottom: '40px', + cursor: 'pointer', +}); + +type ImageWrapperProps = { + width?: number; + height?: number; +}; + +export const LogoImage = styled.img` + width: ${({ width }) => (width ? `${width}px` : 'auto')}; + height: ${({ height }) => (height ? `${height}px` : 'auto')}; + object-fit: contain; +`; diff --git a/src/pages/admin/Signup/Page.tsx b/src/pages/admin/Signup/Page.tsx new file mode 100644 index 00000000..b5f3a014 --- /dev/null +++ b/src/pages/admin/Signup/Page.tsx @@ -0,0 +1,29 @@ +import styled from '@emotion/styled'; +import { HeaderTitle } from './components/HeaderTitle'; +import { SignupForm } from './components/SignupForm'; + +export const AdminSignupPage = () => { + return ( + + + + + ); +}; + +export const Layout = styled.main(({ theme }) => ({ + minHeight: '100vh', + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + gap: '1.5rem', + maxWidth: '1200px', + width: '100%', + margin: '0 auto 4rem auto', + padding: '0 1.5rem', + boxSizing: 'border-box', + + [`@media (max-width: ${theme.breakpoints.mobile})`]: { + padding: '1rem', + }, +})); diff --git a/src/pages/admin/Signup/api/signup.ts b/src/pages/admin/Signup/api/signup.ts new file mode 100644 index 00000000..0f1bf589 --- /dev/null +++ b/src/pages/admin/Signup/api/signup.ts @@ -0,0 +1,43 @@ +import axios, { AxiosError, type AxiosResponse } from 'axios'; +import { apiInstance } from '../../Login/api/initInstance'; +import type { ErrorResponse } from '../type/error'; +import type { SignupFormInputs } from '../type/signup'; + +export interface RegisterSuccessResponse { + status: 'REGISTER_SUCCESS'; + accessToken: string; + refreshToken: string; +} + +export const postSignupForm = async ( + formData: SignupFormInputs, + tempToken: string, +): Promise => { + try { + const response: AxiosResponse = await apiInstance.post( + '/auth/register', + formData, + { + headers: { Authorization: `Bearer ${tempToken}` }, + }, + ); + return response.data; + } catch (e: unknown) { + if (axios.isAxiosError(e)) { + const error = e as AxiosError; + const status = error.response?.status; + const detailMsg = error.response?.data.detail; + switch (status) { + case 400: + throw new Error(`입력 오류: ${detailMsg}`); + case 401: + throw new Error(`권한 오류: ${detailMsg}`); + case 409: + throw new Error(`중복 오류: ${detailMsg}`); + default: + throw new Error(`알 수 없는 오류: ${e.message}`); + } + } + throw e; + } +}; diff --git a/src/pages/admin/Signup/components/HeaderTitle/index.tsx b/src/pages/admin/Signup/components/HeaderTitle/index.tsx new file mode 100644 index 00000000..0b6d8f3c --- /dev/null +++ b/src/pages/admin/Signup/components/HeaderTitle/index.tsx @@ -0,0 +1,22 @@ +import styled from '@emotion/styled'; + +export const HeaderTitle = () => { + return ( + + 관리자 등록 + + ); +}; +const TextWrapper = styled.div({ + display: 'flex', + flexDirection: 'column', + gap: '1rem', + padding: '2rem 0 1rem 0', +}); + +const Title = styled.h1(({ theme }) => ({ + fontSize: '2rem', + fontWeight: theme.font.weight.medium, + lineHeight: 1.3, + color: theme.colors.gray900, +})); diff --git a/src/pages/admin/Signup/components/SignupForm/index.styled.ts b/src/pages/admin/Signup/components/SignupForm/index.styled.ts new file mode 100644 index 00000000..e8947bb7 --- /dev/null +++ b/src/pages/admin/Signup/components/SignupForm/index.styled.ts @@ -0,0 +1,52 @@ +import styled from '@emotion/styled'; + +export const UserInfoWrapper = styled.div(({ theme }) => ({ + boxSizing: 'border-box', + width: '48rem', + display: 'flex', + flexDirection: 'column', + gap: '30px', + borderBottom: `1px solid ${theme.colors.gray200}`, + paddingBottom: '3rem', + + '@media (max-width: 48rem)': { + width: '100%', + }, +})); + +export const FormField = styled.div({ + display: 'flex', + flexDirection: 'column', + gap: '10px', +}); + +export const FormRow = styled.div({ + display: 'flex', + flexDirection: 'row', + gap: '2.5rem', + width: '100%', + '& > *': { + flex: '1 1 0', + minWidth: 0, + }, +}); + +export const Label = styled.label(({ theme }) => ({ + display: 'flex', + alignItems: 'center', + gap: '4px', + fontWeight: theme.font.weight.medium, +})); + +export const FormContainer = styled.main({ + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + gap: '3rem', +}); + +export const ErrorMessage = styled.span(({ theme }) => ({ + color: theme.colors.warning, + fontSize: theme.font.size.xs, + padding: 0, +})); diff --git a/src/pages/admin/Signup/components/SignupForm/index.tsx b/src/pages/admin/Signup/components/SignupForm/index.tsx new file mode 100644 index 00000000..d4d04459 --- /dev/null +++ b/src/pages/admin/Signup/components/SignupForm/index.tsx @@ -0,0 +1,139 @@ +import { useForm, FormProvider } from 'react-hook-form'; +import { useNavigate } from 'react-router-dom'; +import { toast } from 'sonner'; +import { postSignupForm, type RegisterSuccessResponse } from '@/pages/admin/Signup/api/signup'; +import * as S from '@/pages/admin/Signup/components/SignupForm/index.styled'; +import { Button } from '@/shared/components/Button'; +import { OutlineInputField } from '@/shared/components/Form/InputField/OutlineInputField'; +import { theme } from '@/styles/theme'; +import { getTemporaryToken, setAccessToken } from '../../utils/token'; +import type { SignupFormInputs } from '@/pages/admin/Signup/type/signup'; + +export const SignupForm = () => { + const navigate = useNavigate(); + const methods = useForm({ + mode: 'onTouched', + defaultValues: { + name: '', + email: '', + studentId: '', + department: '', + phoneNumber: '', + }, + }); + const { errors, isSubmitting } = methods.formState; + + const onSubmit = async (signupFormValue: SignupFormInputs) => { + const temporaryToken = getTemporaryToken(); + + if (!temporaryToken) { + toast.error('회원가입을 위한 토큰이 존재하지 않습니다.'); + return; + } + + try { + const response: RegisterSuccessResponse = await postSignupForm( + signupFormValue, + temporaryToken, + ); + + setAccessToken(response.accessToken); + toast.success('회원가입 완료!', { + style: { backgroundColor: theme.colors.primary, color: 'white' }, + duration: 1000, + onAutoClose: () => navigate('/'), + }); + } catch (e: unknown) { + if (e instanceof Error) { + toast.error(e.message, { + duration: 1000, + style: { + backgroundColor: 'white', + color: theme.colors.error, + }, + }); + } + } + }; + + return ( + +
+ + + + 이름 + + + + + 이메일 + + + + + + 학번 + + + + + 학과 + + + + + + 전화번호 + + + + + +
+
+ ); +}; diff --git a/src/pages/admin/Signup/type/error.ts b/src/pages/admin/Signup/type/error.ts new file mode 100644 index 00000000..5bf09f8f --- /dev/null +++ b/src/pages/admin/Signup/type/error.ts @@ -0,0 +1,5 @@ +export interface ErrorResponse { + status: number; + message: string; + detail: string; +} diff --git a/src/pages/admin/Signup/type/signup.ts b/src/pages/admin/Signup/type/signup.ts new file mode 100644 index 00000000..d547f0e9 --- /dev/null +++ b/src/pages/admin/Signup/type/signup.ts @@ -0,0 +1,7 @@ +export type SignupFormInputs = { + name: string; + email: string; + studentId: string; + department: string; + phoneNumber: string; +}; diff --git a/src/pages/admin/Signup/utils/token.ts b/src/pages/admin/Signup/utils/token.ts new file mode 100644 index 00000000..032a0f94 --- /dev/null +++ b/src/pages/admin/Signup/utils/token.ts @@ -0,0 +1,5 @@ +export const setAccessToken = (token: string) => localStorage.setItem('accessToken', token); +export const getAccessToken = () => localStorage.getItem('accessToken'); +export const getRefreshToken = () => localStorage.getItem('refreshToken'); +export const setTemporaryToken = (token: string) => sessionStorage.setItem('temporaryToken', token); +export const getTemporaryToken = () => sessionStorage.getItem('temporaryToken'); diff --git a/src/pages/user/Apply/api/apply.ts b/src/pages/user/Apply/api/apply.ts index 4ea9ccc6..e40c46a2 100644 --- a/src/pages/user/Apply/api/apply.ts +++ b/src/pages/user/Apply/api/apply.ts @@ -2,10 +2,14 @@ import type { ApplicationForm, ApplicationFormRequest, FormInputs, + PostInterviewSchedule, } from '@/pages/user/Apply/type/apply.ts'; export const fetchApplicationForm = async (Id: number): Promise => { - const response = await fetch(import.meta.env.VITE_API_BASE_URL + `/clubs/${Id}/apply`); + const url = `${import.meta.env.VITE_API_BASE_URL}/clubs/${Id}/apply`; + const response = await fetch(url); + + if (!response.ok) throw new Error('지원서 양식을 가져오지 못했습니다'); return await response.json(); }; @@ -16,22 +20,26 @@ export const postApplicationForm = async ( ): Promise => { const applicationDto = applicationFormDto(formData, questionArray); - const response = await fetch( - import.meta.env.VITE_API_BASE_URL + `/clubs/${clubId}/apply-submit`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(applicationDto), + const url = `${import.meta.env.VITE_API_BASE_URL}/clubs/${clubId}/apply-submit`; + const response = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', }, - ); + body: JSON.stringify(applicationDto), + }); + + if (!response.ok) throw new Error('지원서 양식을 제출하지 못했습니다'); return await response.json(); }; export const applicationFormDto = (formData: FormInputs, questionArray: string[]) => { - const interviewDateAnswer = formData.selectedInterviewSchedule; - formData.answers.push({ interviewDateAnswer }); + const interviewDateAnswer: PostInterviewSchedule[] = formData.selectedInterviewSchedule; + let formDataAnswers = formData.answers; + + if (interviewDateAnswer.length > 0) { + formDataAnswers = [...formData.answers, { interviewDateAnswer }]; + } return { email: formData.email, @@ -40,7 +48,7 @@ export const applicationFormDto = (formData: FormInputs, questionArray: string[] phoneNumber: formData.phoneNumber, department: formData.department, answers: [ - ...formData.answers.map((answer, index) => { + ...formDataAnswers.map((answer, index) => { return { questionNum: index, question: questionArray[index], diff --git a/src/pages/user/Apply/components/ApplicationForm/InterviewScheduleSelector.tsx b/src/pages/user/Apply/components/ApplicationForm/InterviewScheduleSelector.tsx new file mode 100644 index 00000000..efc6d045 --- /dev/null +++ b/src/pages/user/Apply/components/ApplicationForm/InterviewScheduleSelector.tsx @@ -0,0 +1,34 @@ +import { useDragSelection } from '@/pages/user/Apply/hook/useDragSelection'; +import { getTimeSlotsArray } from '@/pages/user/Apply/utils/time'; +import { Text } from '@/shared/components/Text'; +import { TimeSpan, Wrapper, DateText } from './index.styled'; +import type { InterviewSchedule } from '@/pages/user/Apply/type/apply'; + +export const InterviewScheduleSelector = ({ availableTime, date }: InterviewSchedule) => { + const timeSlotsArray: [string, string][] = getTimeSlotsArray(availableTime); + + const { handleMouseDown, handleMouseMove, handleMouseUp, states } = useDragSelection( + date, + timeSlotsArray, + ); + + return ( + + {date} + {timeSlotsArray.map((e, idx) => { + return ( + + {`${e[0]}~${e[1]}`} + + ); + })} + + ); +}; diff --git a/src/pages/user/Apply/components/ApplicationForm/Schedule.tsx b/src/pages/user/Apply/components/ApplicationForm/Schedule.tsx deleted file mode 100644 index 2575ecff..00000000 --- a/src/pages/user/Apply/components/ApplicationForm/Schedule.tsx +++ /dev/null @@ -1,166 +0,0 @@ -import { useRef, useState } from 'react'; -import { useFormContext } from 'react-hook-form'; -import { getSign, type Sign } from '@/pages/user/Apply/utils/math'; -import { generateHours, getTimeIntervalArray, parseTime } from '@/pages/user/Apply/utils/time'; -import { Text } from '@/shared/components/Text'; -import { TimeSpan, Wrapper, DateText } from './index.styled'; -import type { AvailableTime, PostInterviewSchedule } from '@/pages/user/Apply/type/apply'; - -type InterviewSchedule = { - date: string; - availableTime: AvailableTime; -}; - -export const InterviewSchedule = ({ availableTime, date }: InterviewSchedule) => { - const startNum: number = parseTime(availableTime.start); - const endNum: number = parseTime(availableTime.end); - const isDragging = useRef(false); - const isMouseDown = useRef(false); - const mode = useRef(false); - const [prevDiffSign, setPrevDiffSign] = useState(0); - const lastHoveredIndex = useRef(null); - const startIndex = useRef(''); - const selectedIndex = useRef(''); - const timeIntervalArray = getTimeIntervalArray(generateHours(startNum, endNum)); - const [selected, setSelected] = useState(() => - new Array(timeIntervalArray.length).fill(false), - ); - const selectedInterviewTime = useRef>(new Set()); - const mergedInterviewTime: string[] = []; - const { setValue, getValues } = useFormContext(); - - function handleIndexChange(newIndex: number) { - const diff = newIndex - Number(lastHoveredIndex.current); - const currentSign = getSign(diff); - - if (prevDiffSign !== 0 && currentSign !== 0 && currentSign !== prevDiffSign) { - mode.current = !mode.current; - - if (currentSign < 0) { - startIndex.current = String(newIndex + 1); - } else if (currentSign > 0) { - startIndex.current = String(newIndex - 1); - } - } - setPrevDiffSign(currentSign); - } - - const handleMouseDown = (e: React.MouseEvent) => { - e.preventDefault(); - isMouseDown.current = true; - startIndex.current = e.currentTarget.dataset.index; - if (startIndex.current) mode.current = !selected[Number(startIndex.current)]; - - const newValue = [...selected]; - newValue[Number(startIndex.current)] = mode.current; - - setSelected(newValue); - lastHoveredIndex.current = String(startIndex.current); - }; - - const handleMouseMove = (e: React.MouseEvent) => { - if (!isMouseDown.current) return; - isDragging.current = true; - - selectedIndex.current = e.currentTarget.dataset.index; - if (!e.currentTarget.dataset.index || selectedIndex.current === lastHoveredIndex.current) - return; - - handleIndexChange(Number(selectedIndex.current)); - - setSelected((prev) => { - const newSelected = [...prev]; - const start = Math.min(Number(startIndex.current), Number(selectedIndex.current)); - const end = Math.max(Number(startIndex.current), Number(selectedIndex.current)); - - for (let i = start; i <= end; i++) { - newSelected[i] = mode.current; - } - return newSelected; - }); - lastHoveredIndex.current = selectedIndex.current!; - }; - - const handleMouseUp = () => { - [isDragging.current, isMouseDown.current] = [false, false]; - handleIndexChange(Number(selectedIndex.current)); - - selected.forEach((curVal, index) => { - const [start, end] = timeIntervalArray[index]; - if (curVal) { - selectedInterviewTime.current.add(`${start}-${end}`); - } else { - selectedInterviewTime.current.delete(`${start}-${end}`); - } - }); - - const selectedTimeIntervalArray: string[] = [...selectedInterviewTime.current].sort(); - - selectedTimeIntervalArray.forEach((e, idx) => { - if (mergedInterviewTime.length < 1) { - mergedInterviewTime.push(e); - return; - } - - if (mergedInterviewTime.length > 0) { - if (mergedInterviewTime.length > idx) { - return; - } - } - - const prevVal = mergedInterviewTime[mergedInterviewTime.length - 1]; - - const [prevStart, prevEnd] = prevVal.split('-'); - const [currStart, currEnd] = e.split('-'); - - if (prevEnd === currStart) { - mergedInterviewTime.pop(); - mergedInterviewTime.push(prevStart + '-' + currEnd); - } else { - mergedInterviewTime.push(e); - } - }); - - const currentInterviewTime: PostInterviewSchedule = { - date: date, - selectedTimes: mergedInterviewTime ?? [], - }; - - const currentInterviewSchedule = getValues('selectedInterviewSchedule') || []; - - const sameDateIndex: number = currentInterviewSchedule.findIndex( - (schedule: PostInterviewSchedule) => schedule.date === date, - ); - - let updatedSchedule: PostInterviewSchedule[]; - - if (sameDateIndex !== -1) { - updatedSchedule = [...currentInterviewSchedule]; - updatedSchedule[sameDateIndex] = currentInterviewTime; - } else { - updatedSchedule = [...currentInterviewSchedule, currentInterviewTime]; - } - - setValue('selectedInterviewSchedule', updatedSchedule); - }; - - return ( - - {date} - {timeIntervalArray.map((e, idx) => { - return ( - - {e[0] + '~' + e[1]} - - ); - })} - - ); -}; diff --git a/src/pages/user/Apply/components/ApplicationForm/index.styled.ts b/src/pages/user/Apply/components/ApplicationForm/index.styled.ts index 4445562b..dbcf3c2e 100644 --- a/src/pages/user/Apply/components/ApplicationForm/index.styled.ts +++ b/src/pages/user/Apply/components/ApplicationForm/index.styled.ts @@ -96,9 +96,15 @@ export const TimeSpan = styled.span(({ theme, selected }) => ({ display: 'flex', alignItems: 'center', justifyContent: 'center', - border: '1px solid ', + color: selected ? 'white' : theme.colors.gray800, + border: `1px solid ${theme.colors.gray300}`, + borderRadius: '6px', width: '100px', height: '30px', + transition: 'background-color 0.15s, color 0.15s', + '&:hover': { + backgroundColor: selected ? theme.colors.primary300 : theme.colors.gray200, + }, })); export const Wrapper = styled.div({ @@ -111,5 +117,5 @@ export const DateText = styled.span(({ theme }) => ({ width: '100px', padding: '10px 0 20px 0', fontWeight: theme.font.weight.bold, - fontSize: theme.font.size.base, + fontSize: theme.font.size.sm, })); diff --git a/src/pages/user/Apply/components/ApplicationForm/index.tsx b/src/pages/user/Apply/components/ApplicationForm/index.tsx index 282e6963..9cec999b 100644 --- a/src/pages/user/Apply/components/ApplicationForm/index.tsx +++ b/src/pages/user/Apply/components/ApplicationForm/index.tsx @@ -1,19 +1,22 @@ import { useForm, FormProvider } from 'react-hook-form'; -import { useParams } from 'react-router-dom'; +import { useNavigate, useParams } from 'react-router-dom'; +import { toast } from 'sonner'; import { postApplicationForm } from '@/pages/user/Apply/api/apply'; import { QuestionTypes } from '@/pages/user/Apply/constant/questionType'; import { Button } from '@/shared/components/Button'; import { OutlineInputField } from '@/shared/components/Form/InputField/OutlineInputField'; import { OutlineTextareaField } from '@/shared/components/Form/TextAreaField/OutlineTextareaField'; +import { theme } from '@/styles/theme'; import * as S from './index.styled'; -import { InterviewSchedule } from './Schedule'; -import type { FormInputs, Question } from '@/pages/user/Apply/type/apply'; +import { InterviewScheduleSelector } from './InterviewScheduleSelector'; +import type { FormInputs, InterviewSchedule, Question } from '@/pages/user/Apply/type/apply'; type Props = { questions: Question[]; }; export const ApplicationForm = ({ questions }: Props) => { + const navigate = useNavigate(); const methods = useForm({ mode: 'onTouched', defaultValues: { @@ -23,16 +26,37 @@ export const ApplicationForm = ({ questions }: Props) => { phoneNumber: '', email: '', answers: [], + selectedInterviewSchedule: [], }, }); - const { errors, isSubmitting, isSubmitSuccessful } = methods.formState; + const { errors, isSubmitting } = methods.formState; + + const { clubId } = useParams<{ clubId: string }>(); + const clubIdNumber = Number(clubId); - const { id } = useParams<{ id: string }>(); - const clubId = Number(id); const questionArray = questions.map((e) => e.question); const onSubmit = (data: FormInputs) => { - postApplicationForm(clubId, data, questionArray); + postApplicationForm(clubIdNumber, data, questionArray) + .then(() => { + toast.success('제출 성공!', { + style: { + backgroundColor: theme.colors.primary, + color: 'white', + }, + duration: 1000, + onAutoClose: () => navigate(`/clubs/${clubIdNumber}`), + }); + }) + .catch(() => { + toast.error('제출 실패!', { + duration: 1000, + style: { + backgroundColor: 'white', + color: theme.colors.error, + }, + }); + }); }; const questionsWithIndex = questions.map((q, i) => ({ ...q, originalIndex: i })); @@ -160,21 +184,21 @@ export const ApplicationForm = ({ questions }: Props) => { {timeSlotQuestions.map((field) => ( {field.question} - {field.timeSlotOption?.map((option, idx) => ( - - ))} + {field.timeSlotOptions?.map( + (interviewSchedule: InterviewSchedule, idx: number) => ( + + ), + )} ))} )} - {/* 제출 완료 후 toast 알림 적용 부분*/} - {isSubmitSuccessful && 제출 성공!} diff --git a/src/pages/user/Apply/constant/initialDragState.ts b/src/pages/user/Apply/constant/initialDragState.ts new file mode 100644 index 00000000..2f3c2e92 --- /dev/null +++ b/src/pages/user/Apply/constant/initialDragState.ts @@ -0,0 +1,14 @@ +import type { DragState } from '../type/apply'; + +export const generateInitialDragState = (statesLength: number): DragState => { + return { + startIndex: -1, + lastHoveredIndex: -1, + currentSelectedIndex: -1, + isSelectionMode: false, + isSelectedStates: new Array(statesLength).fill(false), + isMouseDown: false, + isDragging: false, + previousIndexDiffSign: null, + }; +}; diff --git a/src/pages/user/Apply/domain/drag.ts b/src/pages/user/Apply/domain/drag.ts new file mode 100644 index 00000000..4d71e3a0 --- /dev/null +++ b/src/pages/user/Apply/domain/drag.ts @@ -0,0 +1,33 @@ +import type { DragState } from '../type/apply'; + +export type UpdatedDragState = { + newStartIndex: number; + newIsSelectionMode: boolean; + newPreviousIndexDiffSign: number | null; +}; + +export const updateDragState = ( + state: DragState, + currentIdx: number, + idxDiffSign: number, +): UpdatedDragState => { + let newStartIndex = state.startIndex; + let newIsSelectionMode = state.isSelectionMode; + let newPreviousIndexDiffSign = state.previousIndexDiffSign; + if (state.previousIndexDiffSign === null || idxDiffSign !== state.previousIndexDiffSign) { + newIsSelectionMode = + state.previousIndexDiffSign === null ? state.isSelectionMode : !state.isSelectionMode; + + if (idxDiffSign < 0) { + newStartIndex = currentIdx + 1; + } else if (idxDiffSign > 0) { + newStartIndex = currentIdx - 1; + } else { + newStartIndex = currentIdx; + } + + newPreviousIndexDiffSign = idxDiffSign; + } + + return { newStartIndex, newIsSelectionMode, newPreviousIndexDiffSign }; +}; diff --git a/src/pages/user/Apply/domain/schedule.ts b/src/pages/user/Apply/domain/schedule.ts new file mode 100644 index 00000000..70e8b857 --- /dev/null +++ b/src/pages/user/Apply/domain/schedule.ts @@ -0,0 +1,26 @@ +import type { PostInterviewSchedule } from '../type/apply'; + +export const updateSchedule = ( + currentInterviewSchedule: PostInterviewSchedule[], + date: string, + selectedTime: string[], +): PostInterviewSchedule[] => { + const sameDateIndex: number = currentInterviewSchedule.findIndex( + (schedule: PostInterviewSchedule) => schedule.date === date, + ); + + const selectedInterviewSchedule: PostInterviewSchedule = { + date: date, + selectedTimes: selectedTime ?? [], + }; + let updatedSchedule: PostInterviewSchedule[]; + + if (sameDateIndex !== -1) { + updatedSchedule = [...currentInterviewSchedule]; + updatedSchedule[sameDateIndex] = selectedInterviewSchedule; + } else { + updatedSchedule = [...currentInterviewSchedule, selectedInterviewSchedule]; + } + + return updatedSchedule; +}; diff --git a/src/pages/user/Apply/hook/useApplicationForm.ts b/src/pages/user/Apply/hook/useApplicationForm.ts index fc8ec5c0..5f00d520 100644 --- a/src/pages/user/Apply/hook/useApplicationForm.ts +++ b/src/pages/user/Apply/hook/useApplicationForm.ts @@ -2,17 +2,17 @@ import { useEffect, useState } from 'react'; import { fetchApplicationForm } from '@/pages/user/Apply/api/apply.ts'; import type { ApplicationForm } from '../type/apply'; -export const useApplicationForm = (Id: number) => { +export const useApplicationForm = (clubId: number) => { const [clubApplicationForm, setClubApplicationForm] = useState(null); useEffect(() => { - if (!Id) return; + if (!clubId) return; const setFormStateAfterFetch = async () => { - const applicationForm = await fetchApplicationForm(Id); + const applicationForm = await fetchApplicationForm(clubId); setClubApplicationForm(applicationForm); }; setFormStateAfterFetch(); - }, [Id]); + }, [clubId]); return clubApplicationForm; }; diff --git a/src/pages/user/Apply/hook/useDragSelection.ts b/src/pages/user/Apply/hook/useDragSelection.ts new file mode 100644 index 00000000..3d43cb38 --- /dev/null +++ b/src/pages/user/Apply/hook/useDragSelection.ts @@ -0,0 +1,118 @@ +import { useReducer } from 'react'; +import { useInterviewScheduleUpdater } from './useFormDataUpdate'; + +import { generateInitialDragState } from '../constant/initialDragState'; +import { updateDragState } from '../domain/drag'; +import { updateSelectedState } from '../utils/drag'; +import { getIndexDiffSign } from '../utils/math'; +import type { DragAction, DragState } from '../type/apply'; + +function getSelectedIndex(e: React.MouseEvent) { + return Number(e.currentTarget.dataset.index); +} + +function dragReducer(state: DragState, action: DragAction) { + switch (action.type) { + case 'mouseDown': { + const newSelectedStates: boolean[] = [...state.isSelectedStates]; + newSelectedStates[action.index] = action.isSelectionMode; + + return { + ...state, + startIndex: action.index, + currentSelectedIndex: action.index, + lastHoveredIndex: action.index, + isSelectionMode: action.isSelectionMode, + isSelectedStates: newSelectedStates, + isMouseDown: true, + previousIndexDiffSign: null, + }; + } + case 'mouseMove': { + const currentIndex = action.index; + const indexDiffSign = action.indexDiffSign; + + const { newStartIndex, newIsSelectionMode, newPreviousIndexDiffSign } = updateDragState( + state, + currentIndex, + indexDiffSign, + ); + + const newSelectedStates = updateSelectedState( + state.isSelectedStates, + newStartIndex, + currentIndex, + newIsSelectionMode, + ); + + return { + ...state, + isDragging: true, + currentSelectedIndex: currentIndex, + lastHoveredIndex: currentIndex, + isSelectedStates: newSelectedStates, + isSelectionMode: newIsSelectionMode, + startIndex: newStartIndex, + previousIndexDiffSign: newPreviousIndexDiffSign, + }; + } + case 'mouseUp': { + return { + ...state, + isMouseDown: false, + isDragging: false, + }; + } + default: + return state; + } +} + +export function useDragSelection(date: string, timeIntervalArray: [string, string][]) { + const { updateInterviewSchedule } = useInterviewScheduleUpdater(date, timeIntervalArray); + + const [states, dispatch] = useReducer( + dragReducer, + generateInitialDragState(timeIntervalArray.length), + ); + + const handleMouseDown = (e: React.MouseEvent) => { + e.preventDefault(); + dispatch({ + type: 'mouseDown', + index: getSelectedIndex(e), + isSelectionMode: !states.isSelectedStates[getSelectedIndex(e)], + }); + }; + + const handleMouseMove = (e: React.MouseEvent) => { + if ( + !e.currentTarget.dataset.index || + getSelectedIndex(e) === states.lastHoveredIndex || + !states.isMouseDown + ) + return; + + dispatch({ + type: 'mouseMove', + index: getSelectedIndex(e), + indexDiffSign: getIndexDiffSign(getSelectedIndex(e), states.lastHoveredIndex), + }); + }; + + const handleMouseUp = () => { + if (!states.isMouseDown) return; + dispatch({ + type: 'mouseUp', + }); + + updateInterviewSchedule(states.isSelectedStates); + }; + + return { + handleMouseDown, + handleMouseMove, + handleMouseUp, + states, + }; +} diff --git a/src/pages/user/Apply/hook/useFormDataUpdate.ts b/src/pages/user/Apply/hook/useFormDataUpdate.ts new file mode 100644 index 00000000..ede9ebf5 --- /dev/null +++ b/src/pages/user/Apply/hook/useFormDataUpdate.ts @@ -0,0 +1,19 @@ +import { useFormContext } from 'react-hook-form'; +import { updateSchedule } from '../domain/schedule'; +import { convertSelectionToTimeInterval, mergeContinuousTimeInterval } from '../utils/time'; +import type { FormInputs, PostInterviewSchedule } from '../type/apply'; + +export function useInterviewScheduleUpdater(date: string, timeSlotsArray: [string, string][]) { + const { setValue, getValues } = useFormContext(); + + const updateInterviewSchedule = (isSelectedStates: boolean[]) => { + const selectedTimes = convertSelectionToTimeInterval(isSelectedStates, timeSlotsArray); + const mergedTimes = mergeContinuousTimeInterval(selectedTimes); + const currentSchedules: PostInterviewSchedule[] = getValues('selectedInterviewSchedule') || []; + + const updatedSchedules = updateSchedule(currentSchedules, date, mergedTimes); + setValue('selectedInterviewSchedule', updatedSchedules); + }; + + return { updateInterviewSchedule }; +} diff --git a/src/pages/user/Apply/type/apply.ts b/src/pages/user/Apply/type/apply.ts index 3bc9c9fb..f37da6fa 100644 --- a/src/pages/user/Apply/type/apply.ts +++ b/src/pages/user/Apply/type/apply.ts @@ -15,7 +15,7 @@ export type Question = questionType: typeof QuestionTypes.TIME_SLOT; question: string; required: boolean; - timeSlotOption: InterviewSchedule[]; + timeSlotOptions: InterviewSchedule[]; } | { questionNum: number; @@ -65,5 +65,21 @@ export type FormInputs = { phoneNumber: string; email: string; answers: object[]; - selectedInterviewSchedule: string[]; + selectedInterviewSchedule: PostInterviewSchedule[]; }; + +export type DragState = { + startIndex: number; + lastHoveredIndex: number; + currentSelectedIndex: number; + isSelectionMode: boolean; + isSelectedStates: boolean[]; + isMouseDown: boolean; + isDragging: boolean; + previousIndexDiffSign: null | number; +}; + +export type DragAction = + | { type: 'mouseDown'; index: number; isSelectionMode: boolean } + | { type: 'mouseMove'; index: number; indexDiffSign: number } + | { type: 'mouseUp' }; diff --git a/src/pages/user/Apply/utils/drag.ts b/src/pages/user/Apply/utils/drag.ts new file mode 100644 index 00000000..ca05ed82 --- /dev/null +++ b/src/pages/user/Apply/utils/drag.ts @@ -0,0 +1,13 @@ +export const updateSelectedState = ( + selectedStates: boolean[], + startIndex: number, + selectedIndex: number, + selectionMode: boolean, +): boolean[] => { + const start = Math.min(startIndex, selectedIndex); + const end = Math.max(startIndex, selectedIndex); + + return selectedStates.map((isSelected, index) => + index >= start && index <= end ? selectionMode : isSelected, + ); +}; diff --git a/src/pages/user/Apply/utils/math.ts b/src/pages/user/Apply/utils/math.ts index 7d8d30ae..30a218ac 100644 --- a/src/pages/user/Apply/utils/math.ts +++ b/src/pages/user/Apply/utils/math.ts @@ -5,3 +5,11 @@ export function getSign(diff: number): Sign { if (diff < 0) return -1; return 0; } + +export function getDiff(A: number, B: number): number { + return A - B; +} + +export function getIndexDiffSign(currentSelectedIndex: number, lastHoveredIndex: number): Sign { + return getSign(getDiff(currentSelectedIndex, lastHoveredIndex)); +} diff --git a/src/pages/user/Apply/utils/time.ts b/src/pages/user/Apply/utils/time.ts index 7f43c34e..c860fd9c 100644 --- a/src/pages/user/Apply/utils/time.ts +++ b/src/pages/user/Apply/utils/time.ts @@ -1,3 +1,5 @@ +import type { AvailableTime } from '../type/apply'; + export function parseTime(time: string): number { return parseInt(time.split(':')[0], 10); } @@ -16,28 +18,89 @@ export const formatHour = (hour: number): string => { return hour.toString().padStart(2, '0') + ':00'; }; -export function getTimeIntervalArray(hourArray: string[]) { +export function generateTimeSlotsArray(timeSlots: string[]) { const thirtyMinuteArray: [string, string][] = []; - for (let i = 0; i < hourArray.length - 1; i++) { - thirtyMinuteArray.push([hourArray[i], hourArray[i + 1]]); + for (let i = 0; i < timeSlots.length - 1; i++) { + thirtyMinuteArray.push([timeSlots[i], timeSlots[i + 1]]); } return thirtyMinuteArray; } -export function generateHours(startHour: number, endHour: number): string[] { - const hours: string[] = []; +export function generateTimeSlots( + startHour: number, + endHour: number, + intervalMinute: number, +): string[] { + const timeSlots: string[] = []; for (let h = startHour; h <= endHour; h++) { const hourStr = formatHour(h); - hours.push(hourStr); + timeSlots.push(hourStr); if (h < endHour) { - const halfHourStr = h.toString().padStart(2, '0') + ':30'; - hours.push(halfHourStr); + for (let m = intervalMinute; m < 60; m += intervalMinute) { + timeSlots.push(h.toString().padStart(2, '0') + ':' + m); + } } } - return hours; + return timeSlots; +} + +export function getTimeSlotsArray(availableTime: AvailableTime): [string, string][] { + const startNum: number = parseTime(availableTime.start); + const endNum: number = parseTime(availableTime.end); + return generateTimeSlotsArray(generateTimeSlots(startNum, endNum, 30)); +} + +export function convertSelectionToTimeInterval( + selected: boolean[], + timeIntervalArray: [string, string][], +): Set { + const selectedInterviewTime = new Set(); + + selected.forEach((curVal, index) => { + const [start, end] = timeIntervalArray[index]; + if (curVal) { + selectedInterviewTime.add(`${start}-${end}`); + } else { + selectedInterviewTime.delete(`${start}-${end}`); + } + }); + + return selectedInterviewTime; +} + +export function mergeContinuousTimeInterval(selectedTime: Set): string[] { + const selectedTimeIntervalArray = [...selectedTime].sort(); + const mergedInterviewTime: string[] = []; + + selectedTimeIntervalArray.forEach((e, idx) => { + if (mergedInterviewTime.length < 1) { + mergedInterviewTime.push(e); + return; + } + + if (mergedInterviewTime.length > 0) { + if (mergedInterviewTime.length > idx) { + return; + } + } + + const prevVal = mergedInterviewTime[mergedInterviewTime.length - 1]; + + const [prevStart, prevEnd] = prevVal.split('-'); + const [currStart, currEnd] = e.split('-'); + + if (prevEnd === currStart) { + mergedInterviewTime.pop(); + mergedInterviewTime.push(prevStart + '-' + currEnd); + } else { + mergedInterviewTime.push(e); + } + }); + + return mergedInterviewTime; } diff --git a/src/pages/user/ClubDetail/Page.tsx b/src/pages/user/ClubDetail/Page.tsx index df40e25a..6cc88335 100644 --- a/src/pages/user/ClubDetail/Page.tsx +++ b/src/pages/user/ClubDetail/Page.tsx @@ -1,26 +1,54 @@ +import { useEffect, useState } from 'react'; +import { useParams } from 'react-router-dom'; import { ClubHeaderSection } from '@/shared/components/ClubDetailLayout/ClubHeaderSection'; import { Layout, ContentLeft, ContentRight, } from '@/shared/components/ClubDetailLayout/index.styled'; +import { fetchClubDetail } from './api/clubDetail'; import { ClubActivityPhotosSection } from './components/ClubActivityPhotosSection'; import { ClubDescriptionSection } from './components/ClubDescriptionSection'; import { ClubInfoSidebarSection } from './components/ClubInfoSidebarSection'; import { ClubReviewsSection } from './components/ClubReviewsSection'; -import { mockClubDetail } from './components/mock'; +import type { ClubDetail } from './types/clubDetail'; export const ClubDetailPage = () => { + const { clubId } = useParams<{ clubId: string }>(); + const clubIdNumber = Number(clubId); + const [club, setClub] = useState(null); + + useEffect(() => { + if (!clubIdNumber) return; + fetchClubDetail(clubIdNumber).then(setClub).catch(console.error); + }, [clubIdNumber]); + + if (!club) return
Loading...
; + return ( - - - + + + - + ); diff --git a/src/pages/user/ClubDetail/api/clubDetail.ts b/src/pages/user/ClubDetail/api/clubDetail.ts new file mode 100644 index 00000000..5a4453ef --- /dev/null +++ b/src/pages/user/ClubDetail/api/clubDetail.ts @@ -0,0 +1,11 @@ +import type { ClubDetail } from '../types/clubDetail'; + +export const fetchClubDetail = async (clubId: number): Promise => { + const url = `${import.meta.env.VITE_API_BASE_URL}/clubs/${clubId}`; + const response = await fetch(url); + + if (!response.ok) { + throw new Error('동아리 상세 정보를 가져오는데 실패했습니다.'); + } + return response.json() as Promise; +}; diff --git a/src/pages/user/ClubDetail/components/ClubActivityPhotosSection/index.tsx b/src/pages/user/ClubDetail/components/ClubActivityPhotosSection/index.tsx index f05e54b9..56ff4b39 100644 --- a/src/pages/user/ClubDetail/components/ClubActivityPhotosSection/index.tsx +++ b/src/pages/user/ClubDetail/components/ClubActivityPhotosSection/index.tsx @@ -1,8 +1,11 @@ import { SectionTitle } from '@/shared/components/SectionTitle'; import * as S from './index.styled'; -import { mockClubDetail } from '../mock'; -export const ClubActivityPhotosSection = () => { +interface ClubActivityPhotosSectionProps { + images: string[]; +} + +export const ClubActivityPhotosSection = ({ images }: ClubActivityPhotosSectionProps) => { return ( <> @@ -10,7 +13,7 @@ export const ClubActivityPhotosSection = () => { - {mockClubDetail.introductionImages.map((src, idx) => ( + {images.map((src, idx) => ( ))} diff --git a/src/pages/user/ClubDetail/components/ClubDescriptionSection/index.tsx b/src/pages/user/ClubDetail/components/ClubDescriptionSection/index.tsx index e61352d0..1877b4af 100644 --- a/src/pages/user/ClubDetail/components/ClubDescriptionSection/index.tsx +++ b/src/pages/user/ClubDetail/components/ClubDescriptionSection/index.tsx @@ -1,18 +1,27 @@ import styled from '@emotion/styled'; import { SectionTitle } from '@/shared/components/SectionTitle'; -import { mockClubDetail } from '../mock'; -export const ClubDescriptionSection = () => { +interface ClubDescriptionSectionProps { + introductionOverview: string; + introductionActivity: string; + introductionIdeal: string; +} + +export const ClubDescriptionSection = ({ + introductionOverview, + introductionActivity, + introductionIdeal, +}: ClubDescriptionSectionProps) => { return ( 동아리 소개 - {mockClubDetail.introductionOverview} + {introductionOverview} 활동 내용 - {mockClubDetail.introductionActivity} + {introductionActivity} 모집하는 사람 - {mockClubDetail.introductionIdeal} + {introductionIdeal} ); }; diff --git a/src/pages/user/ClubDetail/components/ClubInfoSidebarSection/index.tsx b/src/pages/user/ClubDetail/components/ClubInfoSidebarSection/index.tsx index 4694d796..ecbccb6f 100644 --- a/src/pages/user/ClubDetail/components/ClubInfoSidebarSection/index.tsx +++ b/src/pages/user/ClubDetail/components/ClubInfoSidebarSection/index.tsx @@ -1,23 +1,32 @@ import styled from '@emotion/styled'; -import { useParams } from 'react-router-dom'; import { Button } from '@/shared/components/Button'; import { formatDate } from '@/utils/dateUtils'; -import { mockClubDetail } from '../mock'; +import type { ClubDetail } from '@/pages/user/ClubDetail/types/clubDetail'; -export const ClubInfoSidebarSection = () => { - const { - presidentName, - presidentPhoneNumber, - location, - recruitStart, - recruitEnd, - regularMeetingInfo, - recruitStatus, - applicationNotice, - } = mockClubDetail; - - const { clubId } = useParams<{ clubId: string }>(); +type ClubInfoSidebarSectionProps = Pick< + ClubDetail, + | 'clubId' + | 'presidentName' + | 'presidentPhoneNumber' + | 'location' + | 'recruitStart' + | 'recruitEnd' + | 'regularMeetingInfo' + | 'recruitStatus' + | 'applicationNotice' +>; +export const ClubInfoSidebarSection = ({ + clubId, + presidentName, + presidentPhoneNumber, + location, + recruitStart, + recruitEnd, + regularMeetingInfo, + recruitStatus, + applicationNotice, +}: ClubInfoSidebarSectionProps) => { return ( 회장 이름: {presidentName} diff --git a/src/pages/user/ClubDetail/components/ClubReviewsSection/index.styled.ts b/src/pages/user/ClubDetail/components/ClubReviewsSection/index.styled.ts new file mode 100644 index 00000000..d14df1a4 --- /dev/null +++ b/src/pages/user/ClubDetail/components/ClubReviewsSection/index.styled.ts @@ -0,0 +1,73 @@ +import styled from '@emotion/styled'; + +export const Divider = styled.hr(({ theme }) => ({ + border: 'none', + borderTop: `1px solid ${theme.colors.gray200}`, + width: '100%', +})); + +export const ReviewsContainer = styled.div(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + gap: '1.5rem', + backgroundColor: theme.colors.bg, + padding: '2rem 1.5rem', + borderRadius: theme.radius.lg, +})); + +export const ReviewItem = styled.div(({ theme }) => ({ + backgroundColor: theme.colors.bg, + borderRadius: theme.radius.md, + padding: '1rem 1.2rem', + boxShadow: theme.shadow.sm, +})); + +export const ReviewHeader = styled.div({ + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: '0.5rem', +}); + +export const ReviewAuthor = styled.p(({ theme }) => ({ + fontWeight: theme.font.weight.medium, + color: theme.colors.textSecondary, + fontSize: theme.font.size.base, +})); + +export const ReviewDate = styled.p(({ theme }) => ({ + fontSize: theme.font.size.xs, + color: theme.colors.textSecondary, +})); + +export const ReviewContent = styled.p(({ theme }) => ({ + lineHeight: 1.6, + color: theme.colors.textPrimary, + fontSize: theme.font.size.sm, +})); + +export const ReviewForm = styled.div(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + gap: '0.75rem', + paddingTop: '1rem', + borderTop: `1px solid ${theme.colors.border}`, +})); + +export const FormTitle = styled.p(({ theme }) => ({ + fontWeight: theme.font.weight.bold, + fontSize: theme.font.size.lg, + display: 'flex', + alignItems: 'center', + gap: '0.5rem', +})); + +export const FormNote = styled.span(({ theme }) => ({ + fontSize: theme.font.size.xs, + color: theme.colors.textSecondary, +})); + +export const ButtonWrapper = styled.div({ + display: 'flex', + justifyContent: 'flex-end', +}); diff --git a/src/pages/user/ClubDetail/components/ClubReviewsSection/index.tsx b/src/pages/user/ClubDetail/components/ClubReviewsSection/index.tsx index e4e5b1b7..7b55c351 100644 --- a/src/pages/user/ClubDetail/components/ClubReviewsSection/index.tsx +++ b/src/pages/user/ClubDetail/components/ClubReviewsSection/index.tsx @@ -1,15 +1,43 @@ -import styled from '@emotion/styled'; +import { Button } from '@/shared/components/Button'; +import { OutlineInputField } from '@/shared/components/Form/InputField/OutlineInputField'; +import { OutlineTextareaField } from '@/shared/components/Form/TextAreaField/OutlineTextareaField'; +import { SectionTitle } from '@/shared/components/SectionTitle'; +import * as S from './index.styled'; +import { clubReviewMockData } from './mock'; export const ClubReviewsSection = () => { + const reviews = clubReviewMockData.reviews; + return ( - -

동아리 후기 영역

-
+ + + 동아리 후기 + + {reviews.map((review) => ( + + + {review.writer} + {new Date(review.createdAt).toLocaleDateString('ko-KR')} + + {review.content} + + ))} + + + + 후기 작성 *학번은 노출되지 않습니다! + + + + + + + + + + + ); }; - -const ReviewsContainer = styled.div(({ theme }) => ({ - backgroundColor: theme.colors.bg, - padding: '16px', - borderRadius: theme.radius.md, -})); diff --git a/src/pages/user/ClubDetail/components/ClubReviewsSection/mock.ts b/src/pages/user/ClubDetail/components/ClubReviewsSection/mock.ts new file mode 100644 index 00000000..5bc77ae8 --- /dev/null +++ b/src/pages/user/ClubDetail/components/ClubReviewsSection/mock.ts @@ -0,0 +1,25 @@ +//msw연결 전 UI구현을 위한 임시 목입니다! +export const clubReviewMockData = { + reviews: [ + { + id: 1, + writer: '익명1', + content: + '솔직히 처음에는 "종교 동아리"라고 해서 조금 망설였습니다. 분위기가 너무 경건하거나 믿음을 강요하지는 않을까 걱정했거든요. 괜한 걱정이었어요~', + createdAt: '2025-10-01T10:00:00Z', + }, + { + id: 2, + writer: '익명2', + content: + '그냥 시간표가 비어서 한번 가보자는 가벼운 마음으로 첫 모임에 나갔는데, 좋은 분들이 많아서 학기 중에 도움을 많이 받았습니다.', + createdAt: '2025-10-02T14:30:00Z', + }, + { + id: 3, + writer: '익명2', + content: '사이비 종교와 관련없는 신앙심이 경건해지는 동아리!', + createdAt: '2025-10-03T09:20:00Z', + }, + ], +}; diff --git a/src/pages/user/ClubDetail/components/mock.ts b/src/pages/user/ClubDetail/components/mock.ts deleted file mode 100644 index d5755ea5..00000000 --- a/src/pages/user/ClubDetail/components/mock.ts +++ /dev/null @@ -1,48 +0,0 @@ -export type Club = { - id: number; - clubName: string; - location: string; - category: string; - shortIntroduction: string; - introductionImages: string[]; - introductionOverview: string; - introductionActivity: string; - introductionIdeal: string; - regularMeetingInfo: string; - recruitStatus: string; - presidentName: string; - presidentPhoneNumber: string; - recruitStart: string; - recruitEnd: string; - applicationNotice: string; -}; - -export const mockClubDetail: Club = { - id: 1, - clubName: '인터엑스', - location: '공7 201호', - category: '사회연구', - shortIntroduction: '사회문제에 관심 있는 사람들을 위한 동아리', - introductionImages: [ - 'https://plus.unsplash.com/premium_photo-1729880132913-4ca7d67f8eeb?q=80&w=1587&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D', - 'https://plus.unsplash.com/premium_photo-1723917604890-418aa2307d2f?q=80&w=1470&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D', - 'https://plus.unsplash.com/premium_photo-1704756437707-e9fee5c04bcf?q=80&w=1470&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D', - 'https://plus.unsplash.com/premium_photo-1704756437647-559e43344877?q=80&w=1470&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D', - ], - introductionOverview: `인터엑스는 사회 문제를 깊이 있게 탐구하고 이를 해결하기 위해 다양한 활동을 기획하는 동아리입니다. - 회원들은 토론, 조사, 캠페인 등을 통해 실제 사회 문제를 이해하고, 문제 해결을 위한 창의적 방법을 모색합니다. - 학문적 연구와 실질적 활동을 병행하며, 서로의 생각을 존중하고 협력하는 문화를 지향합니다.`, - introductionActivity: `동아리 활동으로는 매주 세미나와 그룹 토론, 지역 사회 봉사활동, 캠페인 기획 및 참여 등이 있습니다. - 회원들은 각자의 관심 분야를 살려 프로젝트를 진행하며, 발표와 보고서를 통해 성과를 공유합니다. - 또한 외부 전문가 초청 강연을 통해 사회 문제에 대한 이해를 넓히고, 실천 가능한 해결책을 모색합니다.`, - introductionIdeal: `인터엑스에서는 성실하고 책임감 있는 인재를 기다립니다. - 문제 해결에 관심이 많고 창의적 아이디어를 공유할 수 있는 사람, - 팀원들과 협력하며 꾸준히 학습하고 성장하려는 자세를 가진 사람이라면 누구나 환영합니다.`, - regularMeetingInfo: '매주 화요일 오후 6시', - recruitStatus: '모집중', - presidentName: '김춘식', - presidentPhoneNumber: '010-9619-7677', - recruitStart: '2025-09-03T00:00:00', - recruitEnd: '2025-09-20T23:59:00', - applicationNotice: '현재 지원은 휴학생을 제외한 1~3학년만 받고 있습니다.', -}; diff --git a/src/pages/user/ClubDetail/types/clubDetail.ts b/src/pages/user/ClubDetail/types/clubDetail.ts new file mode 100644 index 00000000..1162f7a7 --- /dev/null +++ b/src/pages/user/ClubDetail/types/clubDetail.ts @@ -0,0 +1,20 @@ +export type RecruitStatus = '모집중' | '모집 준비중' | '모집 종료'; + +export type ClubDetail = { + clubId: number; + clubName: string; + location: string; + category: string; + shortIntroduction: string; + introductionImages: string[]; + introductionOverview: string; + introductionActivity: string; + introductionIdeal: string; + regularMeetingInfo: string; + recruitStatus: RecruitStatus; + presidentName: string; + presidentPhoneNumber: string; + recruitStart: string; + recruitEnd: string; + applicationNotice: string; +}; diff --git a/src/pages/user/Main/api/club.ts b/src/pages/user/Main/api/club.ts index ed68aaec..9f638c50 100644 --- a/src/pages/user/Main/api/club.ts +++ b/src/pages/user/Main/api/club.ts @@ -6,8 +6,8 @@ export type ClubResponse = { }; export async function getClubsByCategory(filter: ClubCategoryEng): Promise { - const response = await fetch( - import.meta.env.VITE_API_BASE_URL + `/clubs/search/category?categoryName=${filter}`, - ); + const url = `${import.meta.env.VITE_API_BASE_URL}/clubs?category=${filter}`; + const response = await fetch(url); + return await response.json(); } diff --git a/src/pages/user/Main/components/ClubListSection/Club.styled.ts b/src/pages/user/Main/components/ClubListSection/Club.styled.ts index 7ccf6481..6fbf4d2a 100644 --- a/src/pages/user/Main/components/ClubListSection/Club.styled.ts +++ b/src/pages/user/Main/components/ClubListSection/Club.styled.ts @@ -17,6 +17,9 @@ export const ClubIntroduction = styled.div(({ theme }) => ({ fontSize: theme?.font?.size?.xs, fontWeight: theme.font.weight.regular, color: theme?.colors?.textSecondary, + overflow: 'hidden', + whiteSpace: 'nowrap', + textOverflow: 'ellipsis', })); type Props = { @@ -32,7 +35,7 @@ export const RecruitStatusBox = styled.div(({ theme, status }) => ({ export const RecruitStatusText = styled.div(({ theme, status }) => ({ textAlign: `center`, - fontSize: theme.font.size.sm, + fontSize: theme.font.size.xs, fontWeight: theme.font.weight.bold, color: status === '모집중' ? theme.colors.primary700 : theme.colors.red700, })); diff --git a/src/pages/user/Main/components/ClubListSection/index.tsx b/src/pages/user/Main/components/ClubListSection/index.tsx index d564a68b..e5b492e4 100644 --- a/src/pages/user/Main/components/ClubListSection/index.tsx +++ b/src/pages/user/Main/components/ClubListSection/index.tsx @@ -4,6 +4,8 @@ import { searchClubs } from '@/pages/user/Main/utils/searchClubs.ts'; import { LoadingSpinner } from '@/shared/components/LoadingSpinner.tsx'; import { Text } from '@/shared/components/Text'; import * as S from './Club.styled.ts'; +import { engToKorCategory } from '../../utils/formatting.ts'; +import type { Club } from '../../types/club.ts'; import type { ClubCategoryEng } from '@/pages/user/Main/constant/clubCategory.ts'; type Props = { @@ -25,7 +27,7 @@ export const ClubListSection = ({ filter, searchText }: Props) => { { return ( - {searchedClubs.map((club) => ( + {searchedClubs.map((club: Club) => ( navigate(`/clubs/${club.id}`)} key={club.id}> - {club.category} + {engToKorCategory[club.category]} {club.name} {club.shortIntroduction} diff --git a/src/pages/user/Main/constant/clubCategory.ts b/src/pages/user/Main/constant/clubCategory.ts index 896380d0..5023981d 100644 --- a/src/pages/user/Main/constant/clubCategory.ts +++ b/src/pages/user/Main/constant/clubCategory.ts @@ -1,5 +1,13 @@ -export type ClubCategory = '전체' | '문예' | '학술' | '종교' | '체육' | '봉사'; +export const CLUB_CATEGORY_MAP = { + 전체: 'ALL', + 문예: 'LITERATURE', + 학술: 'STUDY', + 체육: 'SPORTS', + 종교: 'RELIGION', + 봉사: 'VOLUNTEER', +} as const; -export type ClubCategoryEng = 'ALL' | 'ARTS' | 'ACADEMICS' | 'RELIGION' | 'SPORTS' | 'VOLUNTEER'; +export type ClubCategory = keyof typeof CLUB_CATEGORY_MAP; +export type ClubCategoryEng = (typeof CLUB_CATEGORY_MAP)[ClubCategory]; -export const CLUB_CATEGORY: ClubCategory[] = ['전체', '문예', '학술', '종교', '체육', '봉사']; +export const CLUB_CATEGORY = Object.keys(CLUB_CATEGORY_MAP) as ClubCategory[]; diff --git a/src/pages/user/Main/types/club.ts b/src/pages/user/Main/types/club.ts index dcaf76c5..cd6df442 100644 --- a/src/pages/user/Main/types/club.ts +++ b/src/pages/user/Main/types/club.ts @@ -1,9 +1,11 @@ -export type RecruitStatus = '모집중' | '모집마감'; +import type { ClubCategoryEng } from '../constant/clubCategory'; + +export type RecruitStatus = '모집중' | '모집 마감'; export type Club = { id: number; name: string; - category: string; + category: ClubCategoryEng; shortIntroduction: string; recruitStatus: RecruitStatus; }; diff --git a/src/pages/user/Main/utils/formatting.ts b/src/pages/user/Main/utils/formatting.ts index 7699db07..5bf4f077 100644 --- a/src/pages/user/Main/utils/formatting.ts +++ b/src/pages/user/Main/utils/formatting.ts @@ -2,9 +2,18 @@ import type { ClubCategory, ClubCategoryEng } from '../constant/clubCategory'; export const korToEngCategory: Record = { 전체: 'ALL', - 문예: 'ARTS', - 학술: 'ACADEMICS', + 문예: 'LITERATURE', + 학술: 'STUDY', 체육: 'SPORTS', 종교: 'RELIGION', 봉사: 'VOLUNTEER', }; + +export const engToKorCategory: Record = { + ALL: '전체', + LITERATURE: '문예', + STUDY: '학술', + SPORTS: '체육', + RELIGION: '종교', + VOLUNTEER: '봉사', +}; diff --git a/src/shared/components/Button/index.tsx b/src/shared/components/Button/index.tsx index d34ff5a8..b5802207 100644 --- a/src/shared/components/Button/index.tsx +++ b/src/shared/components/Button/index.tsx @@ -1,6 +1,6 @@ import type { ReactNode } from 'react'; import styled from '@emotion/styled'; -import { Link } from 'react-router-dom'; +import { Link, useNavigate } from 'react-router-dom'; type Variant = 'light' | 'outline'; import type { Theme } from '@emotion/react'; @@ -23,9 +23,28 @@ export const Button = ({ variant, width, }: Props) => { + const navigate = useNavigate(); + if (to) { + const handleClick = (e: React.MouseEvent) => { + if (disabled) { + e.preventDefault(); + return; + } + e.preventDefault(); + navigate(to); + window.scrollTo(0, 0); + onClick?.(); + }; + return ( - + {children} ); diff --git a/src/shared/components/Navigation/NavigationContainer.tsx b/src/shared/components/Navigation/NavigationContainer.tsx index 4ff5e656..8f8e4f3b 100644 --- a/src/shared/components/Navigation/NavigationContainer.tsx +++ b/src/shared/components/Navigation/NavigationContainer.tsx @@ -51,6 +51,9 @@ const NavContainer = styled.nav(({ theme }) => ({ boxShadow: theme.shadow.sm, zIndex: theme.zIndex.header, position: 'relative', + '& a[href="/login"]': { + marginLeft: 'auto', + }, })); const UnderlineIndicator = styled.div<{ visible: boolean }>(({ theme, visible }) => ({ diff --git a/src/shared/components/Navigation/index.tsx b/src/shared/components/Navigation/index.tsx index 2ccf4d44..6fc6ceaf 100644 --- a/src/shared/components/Navigation/index.tsx +++ b/src/shared/components/Navigation/index.tsx @@ -1,5 +1,6 @@ import { useState } from 'react'; import { NAV_CONFIG } from '@/constants/navigation'; +import { replaceRouteParams } from '@/utils/replaceRouteParams'; import { NavigationContainer } from './NavigationContainer'; import { NavigationItem } from './NavigationItem'; import type { Role } from '@/types/navigation'; @@ -12,6 +13,9 @@ export const Navigation = ({ role }: NavbarProps) => { const [currentRoute, setCurrentRoute] = useState('동아리움'); const items = NAV_CONFIG[role]; + // TODO: 추후 context나 로그인 정보에서 가져오기 + const clubId = '1'; // 임시 값 + const handleItemClick = (label: React.ReactNode) => { if (typeof label === 'string') { setCurrentRoute(label); @@ -20,17 +24,23 @@ export const Navigation = ({ role }: NavbarProps) => { return ( - {items.map((item) => ( - - {item.label} - - ))} + {items.map((item) => { + const path = item.to?.includes(':clubId') + ? replaceRouteParams(item.to, { clubId }) + : item.to; + + return ( + + {item.label} + + ); + })} ); }; diff --git a/src/shared/components/SectionTitle/index.tsx b/src/shared/components/SectionTitle/index.tsx index d75b9963..50612299 100644 --- a/src/shared/components/SectionTitle/index.tsx +++ b/src/shared/components/SectionTitle/index.tsx @@ -26,5 +26,5 @@ const StyledTitle = styled.h2(({ theme }) => ({ })); const RequiredMark = styled.span(({ theme }) => ({ - color: theme.colors.red300, + color: theme.colors.error, })); diff --git a/src/utils/replaceRouteParams.ts b/src/utils/replaceRouteParams.ts new file mode 100644 index 00000000..c62f9f71 --- /dev/null +++ b/src/utils/replaceRouteParams.ts @@ -0,0 +1,7 @@ +export const replaceRouteParams = (path: string, params: Record) => { + let replaced = path; + Object.entries(params).forEach(([key, value]) => { + replaced = replaced.replace(`:${key}`, String(value)); + }); + return replaced; +}; diff --git a/vite.config.ts b/vite.config.ts index f5b171dc..91d7fdb0 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,18 +1,30 @@ import react from '@vitejs/plugin-react'; -import { defineConfig } from 'vite'; +import { defineConfig, loadEnv, type ConfigEnv } from 'vite'; // https://vite.dev/config/ -export default defineConfig({ - plugins: [ - react({ - babel: { - plugins: ['@emotion/babel-plugin'], +export default ({ mode }: ConfigEnv) => { + const env = loadEnv(mode, process.cwd(), ''); + return defineConfig({ + plugins: [ + react({ + babel: { + plugins: ['@emotion/babel-plugin'], + }, + }), + ], + resolve: { + alias: { + '@': '/src', }, - }), - ], - resolve: { - alias: { - '@': '/src', }, - }, -}); + server: { + proxy: { + '/api': { + target: env.VITE_PROXY_TARGET, + changeOrigin: true, + secure: false, + }, + }, + }, + }); +};