diff --git a/eslint.config.js b/.eslintrc.cjs similarity index 85% rename from eslint.config.js rename to .eslintrc.cjs index ba66430..b130e4b 100644 --- a/eslint.config.js +++ b/.eslintrc.cjs @@ -1,15 +1,4 @@ -import { FlatCompat } from '@eslint/eslintrc'; -import js from '@eslint/js'; -import process from 'process'; - -const dirname = process.cwd(); - -const compat = new FlatCompat({ - baseDirectory: dirname, - resolvePluginsRelativeTo: dirname, -}); - -const appConfigs = compat.config({ +const config = { env: { node: true, browser: true, @@ -118,17 +107,6 @@ const appConfigs = compat.config({ } } ] -}).map((conf) => ({ - ...conf, - files: ['src/**/*.tsx', 'src/**/*.jsx', 'src/**/*.ts', 'src/**/*.js', 'generated/**/*.ts'], -})); - -const otherConfig = { - files: ['*.js', '*.ts', '*.cjs'], - ...js.configs.recommended, }; -export default [ - ...appConfigs, - otherConfig, -]; +module.exports = config; diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..db70eae --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,135 @@ +name: Lint & Build + +on: + pull_request: + push: + branches: + - 'develop' + +env: + APP_TITLE: ${{ vars.APP_TITLE }} + APP_ENVIRONMENT: ${{ vars.APP_ENVIRONMENT }} + APP_GRAPHQL_CODEGEN_ENDPOINT: ${{ vars.APP_GRAPHQL_CODEGEN_ENDPOINT }} + APP_GRAPHQL_ENDPOINT: ${{ vars.APP_GRAPHQL_ENDPOINT }} + APP_AUTH_URL: ${{ vars.APP_AUTH_URL }} + APP_ADMIN_URL: ${{ vars.APP_ADMIN_URL }} + APP_UMAMI_SRC: ${{ vars.APP_UMAMI_SRC }} + APP_UMAMI_ID: ${{ vars.APP_UMAMI_ID }} + APP_SENTRY_DSN: ${{ vars.APP_SENTRY_DSN }} + GITHUB_WORKFLOW: true + +jobs: + unused: + name: Find unused things + environment: 'test' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: true + + - uses: pnpm/action-setup@v4 + name: Install pnpm + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Run knip + run: pnpm generate:type && pnpm lint:unused + lint-js: + name: Lint JS + environment: 'test' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: true + + - uses: pnpm/action-setup@v4 + name: Install pnpm + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Lint Javascript + run: pnpm generate:type && pnpm lint:js + css-lint: + name: Lint CSS + environment: 'test' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + name: Install pnpm + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Css Lint + run: pnpm lint:css + typecheck: + name: Typecheck + environment: 'test' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: true + + - uses: pnpm/action-setup@v4 + name: Install pnpm + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Lint Javascript + run: pnpm generate:type && pnpm typecheck + build: + name: Build + environment: 'test' + needs: [lint-js, css-lint, typecheck] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: true + + - uses: pnpm/action-setup@v4 + name: Install pnpm + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Build + run: pnpm generate:type && pnpm build diff --git a/.gitignore b/.gitignore index 9aaadbe..d5bce58 100644 --- a/.gitignore +++ b/.gitignore @@ -10,5 +10,5 @@ pnpm-debug.log* # Custom build/ generated/ +coverage/ stats.html - diff --git a/codegen.ts b/codegen.ts index 67500c7..0e09f41 100644 --- a/codegen.ts +++ b/codegen.ts @@ -9,7 +9,7 @@ const config: CodegenConfig = { ignoreNoDocuments: true, // for better experience with the watcher generates: { './generated/types/': { - preset: 'client' + preset: 'client', } }, config: { diff --git a/env.ts b/env.ts index c426bdc..b8667de 100644 --- a/env.ts +++ b/env.ts @@ -10,4 +10,4 @@ export default defineConfig({ APP_UMAMI_SRC: Schema.string.optional(), APP_UMAMI_ID: Schema.string.optional(), APP_SENTRY_DSN: Schema.string.optional(), -}) +}); diff --git a/knip.json b/knip.json index faebd69..975df57 100644 --- a/knip.json +++ b/knip.json @@ -1,5 +1,20 @@ { "$schema": "https://unpkg.com/knip@5/schema.json", - "entry": ["src/index.tsx"], - "project": ["src/**/*.tsx", "src/**/*.ts"] + "ignoreDependencies": [ + "virtual:pwa-info", + "virtual:pwa-register" + ], + "entry": [ + "src/**/*.test.ts", + "src/**/*.test.tsx", + "generated/**/*.ts", + "src/index.tsx!" + ], + "project": [ + "src/**/*.d.ts", + "src/**/*.test.ts", + "src/**/*.test.tsx", + "src/**/*.tsx!", + "src/**/*.ts!" + ] } diff --git a/package.json b/package.json index e44dba9..9bc127a 100644 --- a/package.json +++ b/package.json @@ -8,19 +8,21 @@ "build": "vite build", "preview": "vite preview", "generate-and-watch:type": "graphql-codegen --require dotenv/config --config codegen.ts --watch", - "generate:type": "graphql-codegen --require dotenv/config --config codegen.ts && eslint --fix generated/", + "generate:type": "graphql-codegen --require dotenv/config --config codegen.ts", "typecheck": "tsc", + "lint": "pnpm lint:js && pnpm lint:css", + "lint:fix": "pnpm lint:js --fix && pnpm lint:css --fix", "lint:js": "eslint src", "lint:css": "stylelint \"./src/**/*.css\"", - "lint": "yarn lint:js && yarn lint:css", - "lint:unused": "knip", - "lint:fix": "yarn lint:js --fix && yarn lint:css --fix", + "lint:unused": "knip --tags=-knipignore", "test": "vitest", "test:coverage": "vitest run --coverage", "postinstall": "patch-package" }, "dependencies": { "@codemirror/lang-markdown": "^6.2.5", + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", "@replit/codemirror-vim": "^6.2.1", "@sentry/react": "^8.26.0", "@togglecorp/fujs": "^2.2.0", @@ -38,11 +40,8 @@ "urql": "^4.1.0" }, "devDependencies": { - "@eslint/eslintrc": "^2.0.3", "@graphql-codegen/cli": "^5.0.2", "@graphql-codegen/client-preset": "^4.3.3", - "@graphql-codegen/introspection": "^4.0.3", - "@graphql-codegen/typescript-operations": "^4.2.3", "@graphql-typed-document-node/core": "^3.2.0", "@julr/vite-plugin-validate-env": "^1.0.1", "@types/node": "^20.11.6", @@ -55,24 +54,25 @@ "@vitejs/plugin-react-swc": "^3.5.0", "@vitest/coverage-v8": "^1.2.2", "autoprefixer": "^10.4.14", + "dotenv": "^16.4.5", "eslint": "^8.40.0", "eslint-config-airbnb": "^19.0.4", "eslint-import-resolver-typescript": "^3.5.5", "eslint-plugin-import": "^2.27.5", - "eslint-plugin-import-exports-imports-resolver": "^1.0.1", "eslint-plugin-import-newlines": "^1.3.4", "eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-react": "^7.32.2", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.3.4", "eslint-plugin-simple-import-sort": "^10.0.0", - "knip": "^5.27.3", + "graphql": "^16.9.0", + "happy-dom": "^15.7.3", + "knip": "^5.29.2", "patch-package": "^7.0.0", "postcss": "^8.3.0", "postcss-nested": "^6.0.1", "postcss-normalize": "^10.0.1", "postcss-preset-env": "^8.3.2", - "postinstall-postinstall": "^2.1.0", "rollup-plugin-visualizer": "^5.9.0", "stylelint": "^16.7.0", "stylelint-config-concentric": "^2.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9d4c289..d7a9d1c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,15 @@ dependencies: '@codemirror/lang-markdown': specifier: ^6.2.5 version: 6.2.5 + '@dnd-kit/core': + specifier: ^6.1.0 + version: 6.1.0(react-dom@18.2.0)(react@18.2.0) + '@dnd-kit/sortable': + specifier: ^8.0.0 + version: 8.0.0(@dnd-kit/core@6.1.0)(react@18.2.0) '@replit/codemirror-vim': specifier: ^6.2.1 - version: 6.2.1(@codemirror/commands@6.6.0)(@codemirror/language@6.10.2)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1) + version: 6.2.1(@codemirror/commands@6.6.1)(@codemirror/language@6.10.2)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0) '@sentry/react': specifier: ^8.26.0 version: 8.26.0(react@18.2.0) @@ -19,13 +25,13 @@ dependencies: version: 2.2.0 '@uiw/codemirror-theme-github': specifier: ^4.23.0 - version: 4.23.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1) + version: 4.23.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0) '@uiw/react-codemirror': specifier: ^4.23.0 - version: 4.23.0(@babel/runtime@7.24.8)(@codemirror/autocomplete@6.17.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.29.1)(codemirror@6.0.1)(react-dom@18.2.0)(react@18.2.0) + version: 4.23.0(@babel/runtime@7.25.6)(@codemirror/autocomplete@6.18.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.33.0)(codemirror@6.0.1)(react-dom@18.2.0)(react@18.2.0) '@urql/exchange-graphcache': specifier: ^7.1.2 - version: 7.1.2(@urql/core@5.0.5)(graphql@15.9.0) + version: 7.1.2(@urql/core@5.0.6)(graphql@16.9.0) match-sorter: specifier: ^6.3.4 version: 6.3.4 @@ -52,27 +58,18 @@ dependencies: version: 2.4.0 urql: specifier: ^4.1.0 - version: 4.1.0(@urql/core@5.0.5)(react@18.2.0) + version: 4.1.0(@urql/core@5.0.6)(react@18.2.0) devDependencies: - '@eslint/eslintrc': - specifier: ^2.0.3 - version: 2.0.3 '@graphql-codegen/cli': specifier: ^5.0.2 - version: 5.0.2(@types/node@20.11.6)(graphql@15.9.0)(typescript@5.0.4) + version: 5.0.2(@types/node@20.11.6)(graphql@16.9.0)(typescript@5.0.4) '@graphql-codegen/client-preset': specifier: ^4.3.3 - version: 4.3.3(graphql@15.9.0) - '@graphql-codegen/introspection': - specifier: ^4.0.3 - version: 4.0.3(graphql@15.9.0) - '@graphql-codegen/typescript-operations': - specifier: ^4.2.3 - version: 4.2.3(graphql@15.9.0) + version: 4.3.3(graphql@16.9.0) '@graphql-typed-document-node/core': specifier: ^3.2.0 - version: 3.2.0(graphql@15.9.0) + version: 3.2.0(graphql@16.9.0) '@julr/vite-plugin-validate-env': specifier: ^1.0.1 version: 1.0.1(vite@5.0.10)(zod@3.23.8) @@ -106,6 +103,9 @@ devDependencies: autoprefixer: specifier: ^10.4.14 version: 10.4.14(postcss@8.3.0) + dotenv: + specifier: ^16.4.5 + version: 16.4.5 eslint: specifier: ^8.40.0 version: 8.40.0 @@ -118,9 +118,6 @@ devDependencies: eslint-plugin-import: specifier: ^2.27.5 version: 2.27.5(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.40.0) - eslint-plugin-import-exports-imports-resolver: - specifier: ^1.0.1 - version: 1.0.1 eslint-plugin-import-newlines: specifier: ^1.3.4 version: 1.3.4(eslint@8.40.0) @@ -139,9 +136,15 @@ devDependencies: eslint-plugin-simple-import-sort: specifier: ^10.0.0 version: 10.0.0(eslint@8.40.0) + graphql: + specifier: ^16.9.0 + version: 16.9.0 + happy-dom: + specifier: ^15.7.3 + version: 15.7.3 knip: - specifier: ^5.27.3 - version: 5.27.3(@types/node@20.11.6)(typescript@5.0.4) + specifier: ^5.29.2 + version: 5.29.2(@types/node@20.11.6)(typescript@5.0.4) patch-package: specifier: ^7.0.0 version: 7.0.0 @@ -157,9 +160,6 @@ devDependencies: postcss-preset-env: specifier: ^8.3.2 version: 8.3.2(postcss@8.3.0) - postinstall-postinstall: - specifier: ^2.1.0 - version: 2.1.0 rollup-plugin-visualizer: specifier: ^5.9.0 version: 5.9.0(rollup@2.79.1) @@ -204,14 +204,14 @@ devDependencies: version: 4.2.2(typescript@5.0.4)(vite@5.0.10) vitest: specifier: ^1.2.2 - version: 1.2.2(@types/node@20.11.6) + version: 1.2.2(@types/node@20.11.6)(happy-dom@15.7.3) workbox-window: specifier: ^7.1.0 version: 7.1.0 packages: - /@0no-co/graphql.web@1.0.7(graphql@15.9.0): + /@0no-co/graphql.web@1.0.7(graphql@16.9.0): resolution: {integrity: sha512-E3Qku4mTzdrlwVWGPxklDnME5ANrEGetvYw4i2GCRlppWXXE4QD66j7pwb8HelZwS6LnqEChhrSOGCXpbiu6MQ==} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 @@ -219,7 +219,18 @@ packages: graphql: optional: true dependencies: - graphql: 15.9.0 + graphql: 16.9.0 + dev: false + + /@0no-co/graphql.web@1.0.8(graphql@16.9.0): + resolution: {integrity: sha512-8BG6woLtDMvXB9Ajb/uE+Zr/U7y4qJ3upXi0JQHZmsKUJa7HjF/gFvmL2f3/mSmfZoQGRr9VoY97LCX2uaFMzA==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + graphql: + optional: true + dependencies: + graphql: 16.9.0 dev: false /@ampproject/remapping@2.3.0: @@ -246,24 +257,24 @@ packages: leven: 3.1.0 dev: true - /@ardatan/relay-compiler@12.0.0(graphql@15.9.0): + /@ardatan/relay-compiler@12.0.0(graphql@16.9.0): resolution: {integrity: sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==} hasBin: true peerDependencies: graphql: '*' dependencies: - '@babel/core': 7.24.9 - '@babel/generator': 7.25.0 - '@babel/parser': 7.25.3 - '@babel/runtime': 7.24.8 - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 - babel-preset-fbjs: 3.4.0(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/runtime': 7.25.6 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + babel-preset-fbjs: 3.4.0(@babel/core@7.25.2) chalk: 4.1.2 fb-watchman: 2.0.2 fbjs: 3.0.5 glob: 7.2.3 - graphql: 15.9.0 + graphql: 16.9.0 immutable: 3.7.6 invariant: 2.2.4 nullthrows: 1.1.1 @@ -297,8 +308,8 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/compat-data@7.25.2: - resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} + /@babel/compat-data@7.25.4: + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} engines: {node: '>=6.9.0'} dev: true @@ -308,16 +319,39 @@ packages: dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 + '@babel/generator': 7.25.6 '@babel/helper-compilation-targets': 7.24.8 '@babel/helper-module-transforms': 7.24.9(@babel/core@7.24.9) '@babel/helpers': 7.24.8 - '@babel/parser': 7.25.3 + '@babel/parser': 7.25.6 '@babel/template': 7.25.0 - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 convert-source-map: 2.0.0 - debug: 4.3.5 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/core@7.25.2: + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + convert-source-map: 2.0.0 + debug: 4.3.7 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -335,19 +369,29 @@ packages: jsesc: 2.5.2 dev: true + /@babel/generator@7.25.6: + resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.25.6 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: true + /@babel/helper-annotate-as-pure@7.24.7: resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 dev: true /@babel/helper-builder-binary-assignment-operator-visitor@7.24.7: resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color dev: true @@ -367,52 +411,52 @@ packages: resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.25.2 + '@babel/compat-data': 7.25.4 '@babel/helper-validator-option': 7.24.8 browserslist: 4.23.3 lru-cache: 5.1.1 semver: 6.3.1 dev: true - /@babel/helper-create-class-features-plugin@7.25.0(@babel/core@7.24.9): - resolution: {integrity: sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==} + /@babel/helper-create-class-features-plugin@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-member-expression-to-functions': 7.24.8 '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.24.9) + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-create-regexp-features-plugin@7.25.2(@babel/core@7.24.9): + /@babel/helper-create-regexp-features-plugin@7.25.2(@babel/core@7.25.2): resolution: {integrity: sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 regexpu-core: 5.3.2 semver: 6.3.1 dev: true - /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.9): + /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.2): resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - debug: 4.3.5 + debug: 4.3.7 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -423,15 +467,15 @@ packages: resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 dev: true /@babel/helper-member-expression-to-functions@7.24.8: resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color dev: true @@ -440,8 +484,8 @@ packages: resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color dev: true @@ -462,17 +506,17 @@ packages: - supports-color dev: true - /@babel/helper-module-transforms@7.25.2(@babel/core@7.24.9): + /@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2): resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 '@babel/helper-simple-access': 7.24.7 '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color dev: true @@ -481,7 +525,7 @@ packages: resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 dev: true /@babel/helper-plugin-utils@7.24.8: @@ -489,30 +533,30 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.24.9): + /@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.25.2): resolution: {integrity: sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-wrap-function': 7.25.0 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-replace-supers@7.25.0(@babel/core@7.24.9): + /@babel/helper-replace-supers@7.25.0(@babel/core@7.25.2): resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-member-expression-to-functions': 7.24.8 '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color dev: true @@ -521,8 +565,8 @@ packages: resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color dev: true @@ -531,8 +575,8 @@ packages: resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color dev: true @@ -541,7 +585,7 @@ packages: resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 dev: true /@babel/helper-string-parser@7.24.8: @@ -564,8 +608,8 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.25.0 - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color dev: true @@ -575,7 +619,15 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.25.0 - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 + dev: true + + /@babel/helpers@7.25.6: + resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 dev: true /@babel/highlight@7.24.7: @@ -593,160 +645,168 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 dev: true - /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.24.9): + /@babel/parser@7.25.6: + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.25.6 + dev: true + + /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.25.2): resolution: {integrity: sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.24.9): + /@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.25.2): resolution: {integrity: sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.24.9): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.25.2): resolution: {integrity: sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.24.9): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.24.9) + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.24.9): + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.25.2): resolution: {integrity: sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.9): + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.25.2): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.24.9): + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.25.2): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.25.2 - '@babel/core': 7.24.9 + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.9): + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.9): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.9): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.9): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-flow@7.24.7(@babel/core@7.24.9): + /@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true @@ -760,842 +820,852 @@ packages: '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.24.9): - resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} + /@babel/plugin-syntax-import-assertions@7.25.6(@babel/core@7.25.2): + resolution: {integrity: sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.9): + /@babel/plugin-syntax-import-attributes@7.25.6(@babel/core@7.25.2): + resolution: {integrity: sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.9): + /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.9): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.9): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.9): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.9): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.9): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-async-generator-functions@7.25.0(@babel/core@7.24.9): - resolution: {integrity: sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==} + /@babel/plugin-transform-async-generator-functions@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.9) - '@babel/traverse': 7.25.3 + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.24.9) + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.24.9): + /@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.25.2): resolution: {integrity: sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.24.9): - resolution: {integrity: sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==} + /@babel/plugin-transform-class-properties@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.9) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-classes@7.25.0(@babel/core@7.24.9): - resolution: {integrity: sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==} + /@babel/plugin-transform-classes@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.24.9) - '@babel/traverse': 7.25.3 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/traverse': 7.25.6 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/template': 7.25.0 dev: true - /@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.24.9): + /@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.25.2): resolution: {integrity: sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.24.9): + /@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.25.2): resolution: {integrity: sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-flow-strip-types@7.25.2(@babel/core@7.24.9): + /@babel/plugin-transform-flow-strip-types@7.25.2(@babel/core@7.25.2): resolution: {integrity: sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.24.9) + '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-for-of@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-for-of@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-function-name@7.25.1(@babel/core@7.24.9): + /@babel/plugin-transform-function-name@7.25.1(@babel/core@7.25.2): resolution: {integrity: sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-literals@7.25.2(@babel/core@7.24.9): + /@babel/plugin-transform-literals@7.25.2(@babel/core@7.25.2): resolution: {integrity: sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.24.9): + /@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.25.2): resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-simple-access': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.24.9): + /@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.25.2): resolution: {integrity: sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-new-target@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-new-target@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-object-super@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-object-super@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.24.9) + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.24.9): + /@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.25.2): resolution: {integrity: sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-parameters@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-parameters@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.24.9): - resolution: {integrity: sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==} + /@babel/plugin-transform-private-methods@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.24.9) + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.9) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.24.9): + /@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2): resolution: {integrity: sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-module-imports': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.9) - '@babel/types': 7.25.2 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 regenerator-transform: 0.15.2 dev: true - /@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-spread@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-spread@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.24.9): + /@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.25.2): resolution: {integrity: sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.24.9): - resolution: {integrity: sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==} + /@babel/plugin-transform-unicode-sets-regex@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/preset-env@7.25.3(@babel/core@7.24.9): - resolution: {integrity: sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==} + /@babel/preset-env@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.25.2 - '@babel/core': 7.24.9 + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-validator-option': 7.24.8 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.3(@babel/core@7.24.9) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.9) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.9) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.9) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.9) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.9) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.9) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.9) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.9) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.9) - '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-async-generator-functions': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-classes': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.24.9) - '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.24.9) - '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.24.9) - '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.24.9) - '@babel/plugin-transform-modules-systemjs': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.24.9) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-typeof-symbol': 7.24.8(@babel/core@7.24.9) - '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-unicode-sets-regex': 7.24.7(@babel/core@7.24.9) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.9) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.9) - babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.24.9) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.9) - core-js-compat: 3.38.0 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.3(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-import-assertions': 7.25.6(@babel/core@7.25.2) + '@babel/plugin-syntax-import-attributes': 7.25.6(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-async-generator-functions': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-class-properties': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-classes': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.25.2) + '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-modules-systemjs': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-private-methods': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-typeof-symbol': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-sets-regex': 7.25.4(@babel/core@7.25.2) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.25.2) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.2) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2) + core-js-compat: 3.38.1 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.9): + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 esutils: 2.0.3 dev: true @@ -1617,6 +1687,12 @@ packages: dependencies: regenerator-runtime: 0.14.1 + /@babel/runtime@7.25.6: + resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + /@babel/template@7.25.0: resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} @@ -1626,16 +1702,16 @@ packages: '@babel/types': 7.25.2 dev: true - /@babel/traverse@7.25.3: - resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} + /@babel/traverse@7.25.6: + resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/parser': 7.25.3 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 '@babel/template': 7.25.0 - '@babel/types': 7.25.2 - debug: 4.3.5 + '@babel/types': 7.25.6 + debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -1650,6 +1726,15 @@ packages: to-fast-properties: 2.0.0 dev: true + /@babel/types@7.25.6: + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + dev: true + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true @@ -1672,6 +1757,20 @@ packages: '@lezer/common': 1.2.1 dev: false + /@codemirror/autocomplete@6.18.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0)(@lezer/common@1.2.1): + resolution: {integrity: sha512-5DbOvBbY4qW5l57cjDsmmpDh3/TeK1vXfTHa+BUMrRzdWdcxKZ4U4V7vQaTtOpApNU4kLS4FQ6cINtLg245LXA==} + peerDependencies: + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@lezer/common': ^1.0.0 + dependencies: + '@codemirror/language': 6.10.2 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.33.0 + '@lezer/common': 1.2.1 + dev: false + /@codemirror/commands@6.6.0: resolution: {integrity: sha512-qnY+b7j1UNcTS31Eenuc/5YJB6gQOzkUoNmJQc0rznwqSRpeaWWpjkWy2C/MPTcePpsKJEM26hXrOXl1+nceXg==} dependencies: @@ -1681,6 +1780,15 @@ packages: '@lezer/common': 1.2.1 dev: false + /@codemirror/commands@6.6.1: + resolution: {integrity: sha512-iBfKbyIoXS1FGdsKcZmnrxmbc8VcbMrSgD7AVrsnX+WyAYjmUDWvE93dt5D874qS4CCVu4O1JpbagHdXbbLiOw==} + dependencies: + '@codemirror/language': 6.10.2 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.33.0 + '@lezer/common': 1.2.1 + dev: false + /@codemirror/lang-css@6.2.1(@codemirror/view@6.29.1): resolution: {integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==} dependencies: @@ -1754,7 +1862,7 @@ packages: resolution: {integrity: sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==} dependencies: '@codemirror/state': 6.4.1 - '@codemirror/view': 6.29.1 + '@codemirror/view': 6.33.0 crelt: 1.0.6 dev: false @@ -1767,8 +1875,8 @@ packages: dependencies: '@codemirror/language': 6.10.2 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.29.1 - '@lezer/highlight': 1.2.0 + '@codemirror/view': 6.33.0 + '@lezer/highlight': 1.2.1 dev: false /@codemirror/view@6.29.1: @@ -1779,6 +1887,14 @@ packages: w3c-keyname: 2.2.8 dev: false + /@codemirror/view@6.33.0: + resolution: {integrity: sha512-AroaR3BvnjRW8fiZBalAaK+ZzB5usGgI014YKElYZvQdNH5ZIidHlO+cyf/2rWzyBFRkvG6VhiXeAEbC53P2YQ==} + dependencies: + '@codemirror/state': 6.4.1 + style-mod: 4.1.2 + w3c-keyname: 2.2.8 + dev: false + /@colors/colors@1.5.0: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -1866,9 +1982,9 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.1) + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /@csstools/postcss-color-function@2.2.3(postcss@8.3.0): @@ -1949,9 +2065,9 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.1) + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /@csstools/postcss-logical-float-and-clear@1.0.1(postcss@8.3.0): @@ -2058,7 +2174,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /@csstools/postcss-stepped-value-functions@2.1.1(postcss@8.3.0): @@ -2105,13 +2221,13 @@ packages: postcss: 8.3.0 dev: true - /@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.1.1): + /@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.1.2): resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss-selector-parser: ^6.0.10 dependencies: - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.1.1): @@ -2132,6 +2248,49 @@ packages: postcss: 8.3.0 dev: true + /@dnd-kit/accessibility@3.1.0(react@18.2.0): + resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + tslib: 2.6.3 + dev: false + + /@dnd-kit/core@6.1.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@dnd-kit/accessibility': 3.1.0(react@18.2.0) + '@dnd-kit/utilities': 3.2.2(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.3 + dev: false + + /@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0)(react@18.2.0): + resolution: {integrity: sha512-U3jk5ebVXe1Lr7c2wU7SBZjcWdQP+j7peHJfCspnA81enlu88Mgd7CC8Q+pub9ubP7eKVETzJW+IBAhsqbSu/g==} + peerDependencies: + '@dnd-kit/core': ^6.1.0 + react: '>=16.8.0' + dependencies: + '@dnd-kit/core': 6.1.0(react-dom@18.2.0)(react@18.2.0) + '@dnd-kit/utilities': 3.2.2(react@18.2.0) + react: 18.2.0 + tslib: 2.6.3 + dev: false + + /@dnd-kit/utilities@3.2.2(react@18.2.0): + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + tslib: 2.6.3 + dev: false + /@dual-bundle/import-meta-resolve@4.1.0: resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} dev: true @@ -2380,17 +2539,17 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@graphql-codegen/add@5.0.3(graphql@15.9.0): + /@graphql-codegen/add@5.0.3(graphql@16.9.0): resolution: {integrity: sha512-SxXPmramkth8XtBlAHu4H4jYcYXM/o3p01+psU+0NADQowA8jtYkK6MW5rV6T+CxkEaNZItfSmZRPgIuypcqnA==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + graphql: 16.9.0 tslib: 2.6.3 dev: true - /@graphql-codegen/cli@5.0.2(@types/node@20.11.6)(graphql@15.9.0)(typescript@5.0.4): + /@graphql-codegen/cli@5.0.2(@types/node@20.11.6)(graphql@16.9.0)(typescript@5.0.4): resolution: {integrity: sha512-MBIaFqDiLKuO4ojN6xxG9/xL9wmfD3ZjZ7RsPjwQnSHBCUXnEkdKvX+JVpx87Pq29Ycn8wTJUguXnTZ7Di0Mlw==} hasBin: true peerDependencies: @@ -2403,26 +2562,26 @@ packages: '@babel/generator': 7.25.0 '@babel/template': 7.25.0 '@babel/types': 7.25.2 - '@graphql-codegen/client-preset': 4.3.3(graphql@15.9.0) - '@graphql-codegen/core': 4.0.2(graphql@15.9.0) - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-tools/apollo-engine-loader': 8.0.1(graphql@15.9.0) - '@graphql-tools/code-file-loader': 8.1.3(graphql@15.9.0) - '@graphql-tools/git-loader': 8.0.7(graphql@15.9.0) - '@graphql-tools/github-loader': 8.0.1(@types/node@20.11.6)(graphql@15.9.0) - '@graphql-tools/graphql-file-loader': 8.0.1(graphql@15.9.0) - '@graphql-tools/json-file-loader': 8.0.1(graphql@15.9.0) - '@graphql-tools/load': 8.0.2(graphql@15.9.0) - '@graphql-tools/prisma-loader': 8.0.4(@types/node@20.11.6)(graphql@15.9.0) - '@graphql-tools/url-loader': 8.0.2(@types/node@20.11.6)(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-codegen/client-preset': 4.3.3(graphql@16.9.0) + '@graphql-codegen/core': 4.0.2(graphql@16.9.0) + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + '@graphql-tools/apollo-engine-loader': 8.0.1(graphql@16.9.0) + '@graphql-tools/code-file-loader': 8.1.3(graphql@16.9.0) + '@graphql-tools/git-loader': 8.0.7(graphql@16.9.0) + '@graphql-tools/github-loader': 8.0.1(@types/node@20.11.6)(graphql@16.9.0) + '@graphql-tools/graphql-file-loader': 8.0.1(graphql@16.9.0) + '@graphql-tools/json-file-loader': 8.0.1(graphql@16.9.0) + '@graphql-tools/load': 8.0.2(graphql@16.9.0) + '@graphql-tools/prisma-loader': 8.0.4(@types/node@20.11.6)(graphql@16.9.0) + '@graphql-tools/url-loader': 8.0.2(@types/node@20.11.6)(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) '@whatwg-node/fetch': 0.8.8 chalk: 4.1.2 cosmiconfig: 8.3.6(typescript@5.0.4) debounce: 1.2.1 detect-indent: 6.1.0 - graphql: 15.9.0 - graphql-config: 5.1.0(@types/node@20.11.6)(graphql@15.9.0)(typescript@5.0.4) + graphql: 16.9.0 + graphql-config: 5.1.0(@types/node@20.11.6)(graphql@16.9.0)(typescript@5.0.4) inquirer: 8.2.6 is-glob: 4.0.3 jiti: 1.21.6 @@ -2447,159 +2606,145 @@ packages: - utf-8-validate dev: true - /@graphql-codegen/client-preset@4.3.3(graphql@15.9.0): + /@graphql-codegen/client-preset@4.3.3(graphql@16.9.0): resolution: {integrity: sha512-IrDsSVe8bkKtxgVfKPHzjL9tYlv7KEpA59R4gZLqx/t2WIJncW1i0OMvoz9tgoZsFEs8OKKgXZbnwPZ/Qf1kEw==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@babel/helper-plugin-utils': 7.24.8 '@babel/template': 7.25.0 - '@graphql-codegen/add': 5.0.3(graphql@15.9.0) - '@graphql-codegen/gql-tag-operations': 4.0.9(graphql@15.9.0) - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-codegen/typed-document-node': 5.0.9(graphql@15.9.0) - '@graphql-codegen/typescript': 4.0.9(graphql@15.9.0) - '@graphql-codegen/typescript-operations': 4.2.3(graphql@15.9.0) - '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@15.9.0) - '@graphql-tools/documents': 1.0.1(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - '@graphql-typed-document-node/core': 3.2.0(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-codegen/add': 5.0.3(graphql@16.9.0) + '@graphql-codegen/gql-tag-operations': 4.0.9(graphql@16.9.0) + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + '@graphql-codegen/typed-document-node': 5.0.9(graphql@16.9.0) + '@graphql-codegen/typescript': 4.0.9(graphql@16.9.0) + '@graphql-codegen/typescript-operations': 4.2.3(graphql@16.9.0) + '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@16.9.0) + '@graphql-tools/documents': 1.0.1(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0) + graphql: 16.9.0 tslib: 2.6.3 transitivePeerDependencies: - encoding - supports-color dev: true - /@graphql-codegen/core@4.0.2(graphql@15.9.0): + /@graphql-codegen/core@4.0.2(graphql@16.9.0): resolution: {integrity: sha512-IZbpkhwVqgizcjNiaVzNAzm/xbWT6YnGgeOLwVjm4KbJn3V2jchVtuzHH09G5/WkkLSk2wgbXNdwjM41JxO6Eg==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-tools/schema': 10.0.4(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + '@graphql-tools/schema': 10.0.4(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 tslib: 2.6.3 dev: true - /@graphql-codegen/gql-tag-operations@4.0.9(graphql@15.9.0): + /@graphql-codegen/gql-tag-operations@4.0.9(graphql@16.9.0): resolution: {integrity: sha512-lVgu1HClel896HqZAEjynatlU6eJrYOw+rh05DPgM150xvmb7Gz5TnRHA2vfwlDNIXDaToAIpz5RFfkjjnYM1Q==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) auto-bind: 4.0.0 - graphql: 15.9.0 - tslib: 2.6.3 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /@graphql-codegen/introspection@4.0.3(graphql@15.9.0): - resolution: {integrity: sha512-4cHRG15Zu4MXMF4wTQmywNf4+fkDYv5lTbzraVfliDnB8rJKcaurQpRBi11KVuQUe24YTq/Cfk4uwewfNikWoA==} - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@15.9.0) - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 transitivePeerDependencies: - encoding - supports-color dev: true - /@graphql-codegen/plugin-helpers@5.0.4(graphql@15.9.0): + /@graphql-codegen/plugin-helpers@5.0.4(graphql@16.9.0): resolution: {integrity: sha512-MOIuHFNWUnFnqVmiXtrI+4UziMTYrcquljaI5f/T/Bc7oO7sXcfkAvgkNWEEi9xWreYwvuer3VHCuPI/lAFWbw==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) change-case-all: 1.0.15 common-tags: 1.8.2 - graphql: 15.9.0 + graphql: 16.9.0 import-from: 4.0.0 lodash: 4.17.21 tslib: 2.6.3 dev: true - /@graphql-codegen/schema-ast@4.1.0(graphql@15.9.0): + /@graphql-codegen/schema-ast@4.1.0(graphql@16.9.0): resolution: {integrity: sha512-kZVn0z+th9SvqxfKYgztA6PM7mhnSZaj4fiuBWvMTqA+QqQ9BBed6Pz41KuD/jr0gJtnlr2A4++/0VlpVbCTmQ==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 tslib: 2.6.3 dev: true - /@graphql-codegen/typed-document-node@5.0.9(graphql@15.9.0): + /@graphql-codegen/typed-document-node@5.0.9(graphql@16.9.0): resolution: {integrity: sha512-Wx6fyA4vpfIbfNTMiWUECGnjqzKkJdEbZHxVMIegiCBPzBYPAJV4mZZcildLAfm2FtZcgW4YKtFoTbnbXqPB3w==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@15.9.0) + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@16.9.0) auto-bind: 4.0.0 change-case-all: 1.0.15 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 transitivePeerDependencies: - encoding - supports-color dev: true - /@graphql-codegen/typescript-operations@4.2.3(graphql@15.9.0): + /@graphql-codegen/typescript-operations@4.2.3(graphql@16.9.0): resolution: {integrity: sha512-6z7avSSOr03l5SyKbeDs7MzRyGwnQFSCqQm8Om5wIuoIgXVu2gXRmcJAY/I7SLdAy9xbF4Sho7XNqieFM2CAFQ==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-codegen/typescript': 4.0.9(graphql@15.9.0) - '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@15.9.0) + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + '@graphql-codegen/typescript': 4.0.9(graphql@16.9.0) + '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@16.9.0) auto-bind: 4.0.0 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 transitivePeerDependencies: - encoding - supports-color dev: true - /@graphql-codegen/typescript@4.0.9(graphql@15.9.0): + /@graphql-codegen/typescript@4.0.9(graphql@16.9.0): resolution: {integrity: sha512-0O35DMR4d/ctuHL1Zo6mRUUzp0BoszKfeWsa6sCm/g70+S98+hEfTwZNDkQHylLxapiyjssF9uw/F+sXqejqLw==} peerDependencies: graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-codegen/schema-ast': 4.1.0(graphql@15.9.0) - '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@15.9.0) + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + '@graphql-codegen/schema-ast': 4.1.0(graphql@16.9.0) + '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@16.9.0) auto-bind: 4.0.0 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 transitivePeerDependencies: - encoding - supports-color dev: true - /@graphql-codegen/visitor-plugin-common@5.3.1(graphql@15.9.0): + /@graphql-codegen/visitor-plugin-common@5.3.1(graphql@16.9.0): resolution: {integrity: sha512-MktoBdNZhSmugiDjmFl1z6rEUUaqyxtFJYWnDilE7onkPgyw//O0M+TuPBJPBWdyV6J2ond0Hdqtq+rkghgSIQ==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-tools/optimize': 2.0.0(graphql@15.9.0) - '@graphql-tools/relay-operation-optimizer': 7.0.1(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + '@graphql-tools/optimize': 2.0.0(graphql@16.9.0) + '@graphql-tools/relay-operation-optimizer': 7.0.1(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) auto-bind: 4.0.0 change-case-all: 1.0.15 dependency-graph: 0.11.0 - graphql: 15.9.0 - graphql-tag: 2.12.6(graphql@15.9.0) + graphql: 16.9.0 + graphql-tag: 2.12.6(graphql@16.9.0) parse-filepath: 1.0.2 tslib: 2.6.3 transitivePeerDependencies: @@ -2607,86 +2752,86 @@ packages: - supports-color dev: true - /@graphql-tools/apollo-engine-loader@8.0.1(graphql@15.9.0): + /@graphql-tools/apollo-engine-loader@8.0.1(graphql@16.9.0): resolution: {integrity: sha512-NaPeVjtrfbPXcl+MLQCJLWtqe2/E4bbAqcauEOQ+3sizw1Fc2CNmhHRF8a6W4D0ekvTRRXAMptXYgA2uConbrA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@ardatan/sync-fetch': 0.0.1 - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) '@whatwg-node/fetch': 0.9.19 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 transitivePeerDependencies: - encoding dev: true - /@graphql-tools/batch-execute@9.0.4(graphql@15.9.0): + /@graphql-tools/batch-execute@9.0.4(graphql@16.9.0): resolution: {integrity: sha512-kkebDLXgDrep5Y0gK1RN3DMUlLqNhg60OAz0lTCqrYeja6DshxLtLkj+zV4mVbBA4mQOEoBmw6g1LZs3dA84/w==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) dataloader: 2.2.2 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 value-or-promise: 1.0.12 dev: true - /@graphql-tools/code-file-loader@8.1.3(graphql@15.9.0): + /@graphql-tools/code-file-loader@8.1.3(graphql@16.9.0): resolution: {integrity: sha512-Qoo8VyU0ux7k20DkzL5wFm7Y6iqlG1GQ0xA4T3EQbm4B/qbENsMc38l76QnXYIVmIlKAnD9EAvzxPEQ8iv+ZPA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/graphql-tag-pluck': 8.3.2(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/graphql-tag-pluck': 8.3.2(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) globby: 11.1.0 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 unixify: 1.0.0 transitivePeerDependencies: - supports-color dev: true - /@graphql-tools/delegate@10.0.17(graphql@15.9.0): + /@graphql-tools/delegate@10.0.17(graphql@16.9.0): resolution: {integrity: sha512-YIJleGaSjYnqIcJ5uoBWVBBE3eP5h3CvEM9PiANHtRUBmoNBKdYstkrS3IqBSlgKLsboD5CTYfmXDVQAPfH+mw==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/batch-execute': 9.0.4(graphql@15.9.0) - '@graphql-tools/executor': 1.3.0(graphql@15.9.0) - '@graphql-tools/schema': 10.0.4(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/batch-execute': 9.0.4(graphql@16.9.0) + '@graphql-tools/executor': 1.3.0(graphql@16.9.0) + '@graphql-tools/schema': 10.0.4(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) dataloader: 2.2.2 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 dev: true - /@graphql-tools/documents@1.0.1(graphql@15.9.0): + /@graphql-tools/documents@1.0.1(graphql@16.9.0): resolution: {integrity: sha512-aweoMH15wNJ8g7b2r4C4WRuJxZ0ca8HtNO54rkye/3duxTkW4fGBEutCx03jCIr5+a1l+4vFJNP859QnAVBVCA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - graphql: 15.9.0 + graphql: 16.9.0 lodash.sortby: 4.7.0 tslib: 2.6.3 dev: true - /@graphql-tools/executor-graphql-ws@1.2.0(graphql@15.9.0): + /@graphql-tools/executor-graphql-ws@1.2.0(graphql@16.9.0): resolution: {integrity: sha512-tSYC1QdrabWexLrYV0UI3uRGbde9WCY/bRhq6Jc+VXMZcfq6ea6pP5NEAVTfwbhUQ4xZvJABVVbKXtKb9uTg1w==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) '@types/ws': 8.5.12 - graphql: 15.9.0 - graphql-ws: 5.16.0(graphql@15.9.0) + graphql: 16.9.0 + graphql-ws: 5.16.0(graphql@16.9.0) isomorphic-ws: 5.0.0(ws@8.18.0) tslib: 2.6.3 ws: 8.18.0 @@ -2695,17 +2840,17 @@ packages: - utf-8-validate dev: true - /@graphql-tools/executor-http@1.1.5(@types/node@20.11.6)(graphql@15.9.0): + /@graphql-tools/executor-http@1.1.5(@types/node@20.11.6)(graphql@16.9.0): resolution: {integrity: sha512-ZAsVGUwafPc1GapLA1yoJuRx7ihpVdAv7JDHmlI2eHRQsJnMVQwcxHnjfUb/id9YAEBrP86/s4pgEoRyad3Zng==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) '@repeaterjs/repeater': 3.0.6 '@whatwg-node/fetch': 0.9.19 extract-files: 11.0.0 - graphql: 15.9.0 + graphql: 16.9.0 meros: 1.3.0(@types/node@20.11.6) tslib: 2.6.3 value-or-promise: 1.0.12 @@ -2713,15 +2858,15 @@ packages: - '@types/node' dev: true - /@graphql-tools/executor-legacy-ws@1.1.0(graphql@15.9.0): + /@graphql-tools/executor-legacy-ws@1.1.0(graphql@16.9.0): resolution: {integrity: sha512-k+6ZyiaAd8SmwuzbEOfA/LVkuI1nqidhoMw+CJ7c41QGOjSMzc0VS0UZbJyeitI0n7a+uP/Meln1wjzJ2ReDtQ==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) '@types/ws': 8.5.12 - graphql: 15.9.0 + graphql: 16.9.0 isomorphic-ws: 5.0.0(ws@8.18.0) tslib: 2.6.3 ws: 8.18.0 @@ -2730,29 +2875,29 @@ packages: - utf-8-validate dev: true - /@graphql-tools/executor@1.3.0(graphql@15.9.0): + /@graphql-tools/executor@1.3.0(graphql@16.9.0): resolution: {integrity: sha512-e+rmEf/2EO4hDnbkO8mTS2FI+jGUNmYkSDKw5TgPVlO8VOKS+TXmJBK6E9v4Gc/39yVkZsffYfW/R8obJrA0mg==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - '@graphql-typed-document-node/core': 3.2.0(graphql@15.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0) '@repeaterjs/repeater': 3.0.6 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 value-or-promise: 1.0.12 dev: true - /@graphql-tools/git-loader@8.0.7(graphql@15.9.0): + /@graphql-tools/git-loader@8.0.7(graphql@16.9.0): resolution: {integrity: sha512-+s23lxHR24+zLDk9/Hfl7/8Qcal8Q1yJ8armRp1fvcJyuc0RTZv97ZoZb0tArTfME74z+kJ92Mx4SfZMd7mHSQ==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/graphql-tag-pluck': 8.3.2(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-tools/graphql-tag-pluck': 8.3.2(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 is-glob: 4.0.3 micromatch: 4.0.7 tslib: 2.6.3 @@ -2761,18 +2906,18 @@ packages: - supports-color dev: true - /@graphql-tools/github-loader@8.0.1(@types/node@20.11.6)(graphql@15.9.0): + /@graphql-tools/github-loader@8.0.1(@types/node@20.11.6)(graphql@16.9.0): resolution: {integrity: sha512-W4dFLQJ5GtKGltvh/u1apWRFKBQOsDzFxO9cJkOYZj1VzHCpRF43uLST4VbCfWve+AwBqOuKr7YgkHoxpRMkcg==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@ardatan/sync-fetch': 0.0.1 - '@graphql-tools/executor-http': 1.1.5(@types/node@20.11.6)(graphql@15.9.0) - '@graphql-tools/graphql-tag-pluck': 8.3.2(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/executor-http': 1.1.5(@types/node@20.11.6)(graphql@16.9.0) + '@graphql-tools/graphql-tag-pluck': 8.3.2(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) '@whatwg-node/fetch': 0.9.19 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 value-or-promise: 1.0.12 transitivePeerDependencies: @@ -2781,112 +2926,112 @@ packages: - supports-color dev: true - /@graphql-tools/graphql-file-loader@8.0.1(graphql@15.9.0): + /@graphql-tools/graphql-file-loader@8.0.1(graphql@16.9.0): resolution: {integrity: sha512-7gswMqWBabTSmqbaNyWSmRRpStWlcCkBc73E6NZNlh4YNuiyKOwbvSkOUYFOqFMfEL+cFsXgAvr87Vz4XrYSbA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/import': 7.0.1(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/import': 7.0.1(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) globby: 11.1.0 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 unixify: 1.0.0 dev: true - /@graphql-tools/graphql-tag-pluck@8.3.2(graphql@15.9.0): + /@graphql-tools/graphql-tag-pluck@8.3.2(graphql@16.9.0): resolution: {integrity: sha512-wJKkDjXRg2qJAVhAVE96zJGMli8Ity9mKUB7gTbvJwsAniaquRqLcTXUQ19X9qVT4ACzbbp+tAfk96b2U3tfog==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@babel/core': 7.24.9 - '@babel/parser': 7.25.3 + '@babel/parser': 7.25.6 '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.24.9) - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 tslib: 2.6.3 transitivePeerDependencies: - supports-color dev: true - /@graphql-tools/import@7.0.1(graphql@15.9.0): + /@graphql-tools/import@7.0.1(graphql@16.9.0): resolution: {integrity: sha512-935uAjAS8UAeXThqHfYVr4HEAp6nHJ2sximZKO1RzUTq5WoALMAhhGARl0+ecm6X+cqNUwIChJbjtaa6P/ML0w==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 resolve-from: 5.0.0 tslib: 2.6.3 dev: true - /@graphql-tools/json-file-loader@8.0.1(graphql@15.9.0): + /@graphql-tools/json-file-loader@8.0.1(graphql@16.9.0): resolution: {integrity: sha512-lAy2VqxDAHjVyqeJonCP6TUemrpYdDuKt25a10X6zY2Yn3iFYGnuIDQ64cv3ytyGY6KPyPB+Kp+ZfOkNDG3FQA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) globby: 11.1.0 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 unixify: 1.0.0 dev: true - /@graphql-tools/load@8.0.2(graphql@15.9.0): + /@graphql-tools/load@8.0.2(graphql@16.9.0): resolution: {integrity: sha512-S+E/cmyVmJ3CuCNfDuNF2EyovTwdWfQScXv/2gmvJOti2rGD8jTt9GYVzXaxhblLivQR9sBUCNZu/w7j7aXUCA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/schema': 10.0.4(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-tools/schema': 10.0.4(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 p-limit: 3.1.0 tslib: 2.6.3 dev: true - /@graphql-tools/merge@9.0.4(graphql@15.9.0): + /@graphql-tools/merge@9.0.4(graphql@16.9.0): resolution: {integrity: sha512-MivbDLUQ+4Q8G/Hp/9V72hbn810IJDEZQ57F01sHnlrrijyadibfVhaQfW/pNH+9T/l8ySZpaR/DpL5i+ruZ+g==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 tslib: 2.6.3 dev: true - /@graphql-tools/optimize@2.0.0(graphql@15.9.0): + /@graphql-tools/optimize@2.0.0(graphql@16.9.0): resolution: {integrity: sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 dev: true - /@graphql-tools/prisma-loader@8.0.4(@types/node@20.11.6)(graphql@15.9.0): + /@graphql-tools/prisma-loader@8.0.4(@types/node@20.11.6)(graphql@16.9.0): resolution: {integrity: sha512-hqKPlw8bOu/GRqtYr0+dINAI13HinTVYBDqhwGAPIFmLr5s+qKskzgCiwbsckdrb5LWVFmVZc+UXn80OGiyBzg==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/url-loader': 8.0.2(@types/node@20.11.6)(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/url-loader': 8.0.2(@types/node@20.11.6)(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) '@types/js-yaml': 4.0.9 '@whatwg-node/fetch': 0.9.19 chalk: 4.1.2 debug: 4.3.5 dotenv: 16.4.5 - graphql: 15.9.0 - graphql-request: 6.1.0(graphql@15.9.0) + graphql: 16.9.0 + graphql-request: 6.1.0(graphql@16.9.0) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.5 jose: 5.6.3 @@ -2903,50 +3048,50 @@ packages: - utf-8-validate dev: true - /@graphql-tools/relay-operation-optimizer@7.0.1(graphql@15.9.0): + /@graphql-tools/relay-operation-optimizer@7.0.1(graphql@16.9.0): resolution: {integrity: sha512-y0ZrQ/iyqWZlsS/xrJfSir3TbVYJTYmMOu4TaSz6F4FRDTQ3ie43BlKkhf04rC28pnUOS4BO9pDcAo1D30l5+A==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@ardatan/relay-compiler': 12.0.0(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@ardatan/relay-compiler': 12.0.0(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 tslib: 2.6.3 transitivePeerDependencies: - encoding - supports-color dev: true - /@graphql-tools/schema@10.0.4(graphql@15.9.0): + /@graphql-tools/schema@10.0.4(graphql@16.9.0): resolution: {integrity: sha512-HuIwqbKxPaJujox25Ra4qwz0uQzlpsaBOzO6CVfzB/MemZdd+Gib8AIvfhQArK0YIN40aDran/yi+E5Xf0mQww==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/merge': 9.0.4(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-tools/merge': 9.0.4(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 tslib: 2.6.3 value-or-promise: 1.0.12 dev: true - /@graphql-tools/url-loader@8.0.2(@types/node@20.11.6)(graphql@15.9.0): + /@graphql-tools/url-loader@8.0.2(@types/node@20.11.6)(graphql@16.9.0): resolution: {integrity: sha512-1dKp2K8UuFn7DFo1qX5c1cyazQv2h2ICwA9esHblEqCYrgf69Nk8N7SODmsfWg94OEaI74IqMoM12t7eIGwFzQ==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@ardatan/sync-fetch': 0.0.1 - '@graphql-tools/delegate': 10.0.17(graphql@15.9.0) - '@graphql-tools/executor-graphql-ws': 1.2.0(graphql@15.9.0) - '@graphql-tools/executor-http': 1.1.5(@types/node@20.11.6)(graphql@15.9.0) - '@graphql-tools/executor-legacy-ws': 1.1.0(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - '@graphql-tools/wrap': 10.0.5(graphql@15.9.0) + '@graphql-tools/delegate': 10.0.17(graphql@16.9.0) + '@graphql-tools/executor-graphql-ws': 1.2.0(graphql@16.9.0) + '@graphql-tools/executor-http': 1.1.5(@types/node@20.11.6)(graphql@16.9.0) + '@graphql-tools/executor-legacy-ws': 1.1.0(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + '@graphql-tools/wrap': 10.0.5(graphql@16.9.0) '@types/ws': 8.5.12 '@whatwg-node/fetch': 0.9.19 - graphql: 15.9.0 + graphql: 16.9.0 isomorphic-ws: 5.0.0(ws@8.18.0) tslib: 2.6.3 value-or-promise: 1.0.12 @@ -2958,39 +3103,39 @@ packages: - utf-8-validate dev: true - /@graphql-tools/utils@10.3.3(graphql@15.9.0): + /@graphql-tools/utils@10.3.3(graphql@16.9.0): resolution: {integrity: sha512-p0zCctE+kXsXb5FCJmA3DoucQmB5eSkrtyBAaEcjbnz8OVbriSJx2WNEyzttiHv2qanBe/AK/YiyHD/5Nsj76Q==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@15.9.0) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0) cross-inspect: 1.0.1 dset: 3.1.3 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 dev: true - /@graphql-tools/wrap@10.0.5(graphql@15.9.0): + /@graphql-tools/wrap@10.0.5(graphql@16.9.0): resolution: {integrity: sha512-Cbr5aYjr3HkwdPvetZp1cpDWTGdD1Owgsb3z/ClzhmrboiK86EnQDxDvOJiQkDCPWE9lNBwj8Y4HfxroY0D9DQ==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/delegate': 10.0.17(graphql@15.9.0) - '@graphql-tools/schema': 10.0.4(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-tools/delegate': 10.0.17(graphql@16.9.0) + '@graphql-tools/schema': 10.0.4(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 tslib: 2.6.3 value-or-promise: 1.0.12 dev: true - /@graphql-typed-document-node/core@3.2.0(graphql@15.9.0): + /@graphql-typed-document-node/core@3.2.0(graphql@16.9.0): resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - graphql: 15.9.0 + graphql: 16.9.0 dev: true /@humanwhocodes/config-array@0.11.14: @@ -3103,6 +3248,12 @@ packages: '@lezer/common': 1.2.1 dev: false + /@lezer/highlight@1.2.1: + resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==} + dependencies: + '@lezer/common': 1.2.1 + dev: false + /@lezer/html@1.3.10: resolution: {integrity: sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==} dependencies: @@ -3222,7 +3373,7 @@ packages: resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==} dev: true - /@replit/codemirror-vim@6.2.1(@codemirror/commands@6.6.0)(@codemirror/language@6.10.2)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1): + /@replit/codemirror-vim@6.2.1(@codemirror/commands@6.6.1)(@codemirror/language@6.10.2)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0): resolution: {integrity: sha512-qDAcGSHBYU5RrdO//qCmD8K9t6vbP327iCj/iqrkVnjbrpFhrjOt92weGXGHmTNRh16cUtkUZ7Xq7rZf+8HVow==} peerDependencies: '@codemirror/commands': ^6.0.0 @@ -3231,14 +3382,14 @@ packages: '@codemirror/state': ^6.0.1 '@codemirror/view': ^6.0.3 dependencies: - '@codemirror/commands': 6.6.0 + '@codemirror/commands': 6.6.1 '@codemirror/language': 6.10.2 '@codemirror/search': 6.5.6 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.29.1 + '@codemirror/view': 6.33.0 dev: false - /@rollup/plugin-babel@5.3.1(@babel/core@7.24.9)(rollup@2.79.1): + /@rollup/plugin-babel@5.3.1(@babel/core@7.25.2)(rollup@2.79.1): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -3249,7 +3400,7 @@ packages: '@types/babel__core': optional: true dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 '@rollup/pluginutils': 3.1.0(rollup@2.79.1) rollup: 2.79.1 @@ -3297,7 +3448,7 @@ packages: rollup: 2.79.1 serialize-javascript: 6.0.2 smob: 1.5.0 - terser: 5.31.3 + terser: 5.31.6 dev: true /@rollup/pluginutils@3.1.0(rollup@2.79.1): @@ -3670,7 +3821,7 @@ packages: resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} engines: {node: '>=14'} dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 entities: 4.5.0 dev: true @@ -4020,7 +4171,7 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@uiw/codemirror-extensions-basic-setup@4.23.0(@codemirror/autocomplete@6.17.0)(@codemirror/commands@6.6.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1): + /@uiw/codemirror-extensions-basic-setup@4.23.0(@codemirror/autocomplete@6.18.0)(@codemirror/commands@6.6.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0): resolution: {integrity: sha512-+k5nkRpUWGaHr1JWT8jcKsVewlXw5qBgSopm9LW8fZ6KnSNZBycz8kHxh0+WSvckmXEESGptkIsb7dlkmJT/hQ==} peerDependencies: '@codemirror/autocomplete': '>=6.0.0' @@ -4031,26 +4182,26 @@ packages: '@codemirror/state': '>=6.0.0' '@codemirror/view': '>=6.0.0' dependencies: - '@codemirror/autocomplete': 6.17.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.18.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0)(@lezer/common@1.2.1) '@codemirror/commands': 6.6.0 '@codemirror/language': 6.10.2 '@codemirror/lint': 6.8.1 '@codemirror/search': 6.5.6 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.29.1 + '@codemirror/view': 6.33.0 dev: false - /@uiw/codemirror-theme-github@4.23.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1): + /@uiw/codemirror-theme-github@4.23.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0): resolution: {integrity: sha512-1pJ9V7LQXoojfgYXgI4yn8CfaYBm9HS919xC32/rs81Wl1lhYEOhiYRmNcpnJQDu9ZMgO8ebPMgAVU21z/C76g==} dependencies: - '@uiw/codemirror-themes': 4.23.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1) + '@uiw/codemirror-themes': 4.23.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0) transitivePeerDependencies: - '@codemirror/language' - '@codemirror/state' - '@codemirror/view' dev: false - /@uiw/codemirror-themes@4.23.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1): + /@uiw/codemirror-themes@4.23.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0): resolution: {integrity: sha512-9fiji9xooZyBQozR1i6iTr56YP7j/Dr/VgsNWbqf5Szv+g+4WM1iZuiDGwNXmFMWX8gbkDzp6ASE21VCPSofWw==} peerDependencies: '@codemirror/language': '>=6.0.0' @@ -4059,10 +4210,10 @@ packages: dependencies: '@codemirror/language': 6.10.2 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.29.1 + '@codemirror/view': 6.33.0 dev: false - /@uiw/react-codemirror@4.23.0(@babel/runtime@7.24.8)(@codemirror/autocomplete@6.17.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.29.1)(codemirror@6.0.1)(react-dom@18.2.0)(react@18.2.0): + /@uiw/react-codemirror@4.23.0(@babel/runtime@7.25.6)(@codemirror/autocomplete@6.18.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.33.0)(codemirror@6.0.1)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-MnqTXfgeLA3fsUUQjqjJgemEuNyoGALgsExVm0NQAllAAi1wfj+IoKFeK+h3XXMlTFRCFYOUh4AHDv0YXJLsOg==} peerDependencies: '@babel/runtime': '>=7.11.0' @@ -4073,12 +4224,12 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.6 '@codemirror/commands': 6.6.0 '@codemirror/state': 6.4.1 '@codemirror/theme-one-dark': 6.1.2 - '@codemirror/view': 6.29.1 - '@uiw/codemirror-extensions-basic-setup': 4.23.0(@codemirror/autocomplete@6.17.0)(@codemirror/commands@6.6.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1) + '@codemirror/view': 6.33.0 + '@uiw/codemirror-extensions-basic-setup': 4.23.0(@codemirror/autocomplete@6.18.0)(@codemirror/commands@6.6.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0) codemirror: 6.0.1(@lezer/common@1.2.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4089,22 +4240,22 @@ packages: - '@codemirror/search' dev: false - /@urql/core@5.0.5(graphql@15.9.0): - resolution: {integrity: sha512-KmWRlN8dJz+XU21wmhcHcTV11n1K7zxaMtVwOhkH7b8H5Z5nuFKY5EkUsWqPlZl53YPiKwTtOMpptz5hamVVNQ==} + /@urql/core@5.0.6(graphql@16.9.0): + resolution: {integrity: sha512-38rgSDqVNihFDauw1Pm9V7XLWIKuK8V9CKgrUF7/xEKinze8ENKP1ZeBhkG+dxWzJan7CHK+SLl46kAdvZwIlA==} dependencies: - '@0no-co/graphql.web': 1.0.7(graphql@15.9.0) + '@0no-co/graphql.web': 1.0.8(graphql@16.9.0) wonka: 6.3.4 transitivePeerDependencies: - graphql dev: false - /@urql/exchange-graphcache@7.1.2(@urql/core@5.0.5)(graphql@15.9.0): + /@urql/exchange-graphcache@7.1.2(@urql/core@5.0.6)(graphql@16.9.0): resolution: {integrity: sha512-W2+lYYB/aW1xjPtrMO/Cuxnq3Wl+DuiySqbdw/II91G/NH8Axx2oxRLjWMeC5r/71RivJUrmf2FVzb4Yy1+qwQ==} peerDependencies: '@urql/core': ^5.0.0 dependencies: - '@0no-co/graphql.web': 1.0.7(graphql@15.9.0) - '@urql/core': 5.0.5(graphql@15.9.0) + '@0no-co/graphql.web': 1.0.7(graphql@16.9.0) + '@urql/core': 5.0.6(graphql@16.9.0) wonka: 6.3.4 transitivePeerDependencies: - graphql @@ -4161,7 +4312,7 @@ packages: std-env: 3.7.0 test-exclude: 6.0.0 v8-to-istanbul: 9.3.0 - vitest: 1.2.2(@types/node@20.11.6) + vitest: 1.2.2(@types/node@20.11.6)(happy-dom@15.7.3) transitivePeerDependencies: - supports-color dev: true @@ -4305,7 +4456,7 @@ packages: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} dependencies: - debug: 4.3.5 + debug: 4.3.7 transitivePeerDependencies: - supports-color dev: true @@ -4511,8 +4662,8 @@ packages: engines: {node: '>=8'} dev: true - /async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + /async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} dev: true /asynckit@0.4.0: @@ -4556,8 +4707,8 @@ packages: resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} dev: true - /aws4@1.13.0: - resolution: {integrity: sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==} + /aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} dev: true /axe-core@4.9.1: @@ -4584,38 +4735,38 @@ packages: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} dev: true - /babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.9): + /babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.2): resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.25.2 - '@babel/core': 7.24.9 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.9) + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.24.9): + /babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.25.2): resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.9) - core-js-compat: 3.38.0 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + core-js-compat: 3.38.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.9): + /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.2): resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) transitivePeerDependencies: - supports-color dev: true @@ -4624,38 +4775,38 @@ packages: resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} dev: true - /babel-preset-fbjs@3.4.0(@babel/core@7.24.9): + /babel-preset-fbjs@3.4.0(@babel/core@7.25.2): resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.9) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.24.9) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.9) - '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-transform-classes': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.24.9) - '@babel/plugin-transform-flow-strip-types': 7.25.2(@babel/core@7.24.9) - '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.24.9) - '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.24.9) - '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.24.9) - '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.24.9) - '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-classes': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-flow-strip-types': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.25.2) + '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.25.2) babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 transitivePeerDependencies: - supports-color @@ -4674,8 +4825,8 @@ packages: dev: true optional: true - /bare-fs@2.3.1: - resolution: {integrity: sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==} + /bare-fs@2.3.3: + resolution: {integrity: sha512-7RYKL+vZVCyAsMLi5SPu7QGauGGT8avnP/HO571ndEuV4MYdGXvLhtW67FuLPeEI8EiIY7zbbRR9x7x7HU0kgw==} requiresBuild: true dependencies: bare-events: 2.4.2 @@ -5046,13 +5197,13 @@ packages: /codemirror@6.0.1(@lezer/common@1.2.1): resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==} dependencies: - '@codemirror/autocomplete': 6.17.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1)(@lezer/common@1.2.1) - '@codemirror/commands': 6.6.0 + '@codemirror/autocomplete': 6.18.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0)(@lezer/common@1.2.1) + '@codemirror/commands': 6.6.1 '@codemirror/language': 6.10.2 '@codemirror/lint': 6.8.1 '@codemirror/search': 6.5.6 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.29.1 + '@codemirror/view': 6.33.0 transitivePeerDependencies: - '@lezer/common' dev: false @@ -5164,8 +5315,8 @@ packages: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true - /core-js-compat@3.38.0: - resolution: {integrity: sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==} + /core-js-compat@3.38.1: + resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==} dependencies: browserslist: 4.23.3 dev: true @@ -5251,7 +5402,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /css-functions-list@3.2.2: @@ -5265,9 +5416,9 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.1) + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 dev: true @@ -5394,6 +5545,18 @@ packages: ms: 2.1.2 dev: true + /debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -5878,13 +6041,6 @@ packages: - supports-color dev: true - /eslint-plugin-import-exports-imports-resolver@1.0.1: - resolution: {integrity: sha512-4Gqp25iQSS3k8o0/zKxymWbnDW8KIqkubrOOy67IU9Qmhmkq4AiuMXbjx9O9AhYG7Vl94ZQFBcpfwLaQkINv2w==} - dependencies: - resolve.exports: 1.1.1 - resolve.imports: 1.2.7 - dev: true - /eslint-plugin-import-newlines@1.3.4(eslint@8.40.0): resolution: {integrity: sha512-Lmf/BbK+EQKUfjKPcZpslE/KTGYlgaI8ZJ/sYzdbb3BVTg5+GmLBLHBjsUKNEVRM1SEhDTF/didtOSYKi4tSnQ==} engines: {node: '>=10.0.0'} @@ -6609,7 +6765,7 @@ packages: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true - /graphql-config@5.1.0(@types/node@20.11.6)(graphql@15.9.0)(typescript@5.0.4): + /graphql-config@5.1.0(@types/node@20.11.6)(graphql@16.9.0)(typescript@5.0.4): resolution: {integrity: sha512-g4mNs1OZmZI+LHwRly3BbHO3mRZryyRCbmFKDGsFGde3U0F7TlIwJ0mhX1KTJlQzGQVDZDexZWnvIwodFERPvg==} engines: {node: '>= 16.0.0'} peerDependencies: @@ -6619,14 +6775,14 @@ packages: cosmiconfig-toml-loader: optional: true dependencies: - '@graphql-tools/graphql-file-loader': 8.0.1(graphql@15.9.0) - '@graphql-tools/json-file-loader': 8.0.1(graphql@15.9.0) - '@graphql-tools/load': 8.0.2(graphql@15.9.0) - '@graphql-tools/merge': 9.0.4(graphql@15.9.0) - '@graphql-tools/url-loader': 8.0.2(@types/node@20.11.6)(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/graphql-file-loader': 8.0.1(graphql@16.9.0) + '@graphql-tools/json-file-loader': 8.0.1(graphql@16.9.0) + '@graphql-tools/load': 8.0.2(graphql@16.9.0) + '@graphql-tools/merge': 9.0.4(graphql@16.9.0) + '@graphql-tools/url-loader': 8.0.2(@types/node@20.11.6)(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) cosmiconfig: 8.3.6(typescript@5.0.4) - graphql: 15.9.0 + graphql: 16.9.0 jiti: 1.21.6 minimatch: 4.2.3 string-env-interpolation: 1.0.1 @@ -6639,40 +6795,49 @@ packages: - utf-8-validate dev: true - /graphql-request@6.1.0(graphql@15.9.0): + /graphql-request@6.1.0(graphql@16.9.0): resolution: {integrity: sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==} peerDependencies: graphql: 14 - 16 dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@15.9.0) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0) cross-fetch: 3.1.8 - graphql: 15.9.0 + graphql: 16.9.0 transitivePeerDependencies: - encoding dev: true - /graphql-tag@2.12.6(graphql@15.9.0): + /graphql-tag@2.12.6(graphql@16.9.0): resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} engines: {node: '>=10'} peerDependencies: graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 dev: true - /graphql-ws@5.16.0(graphql@15.9.0): + /graphql-ws@5.16.0(graphql@16.9.0): resolution: {integrity: sha512-Ju2RCU2dQMgSKtArPbEtsK5gNLnsQyTNIo/T7cZNp96niC1x0KdJNZV0TIoilceBPQwfb5itrGl8pkFeOUMl4A==} engines: {node: '>=10'} peerDependencies: graphql: '>=0.11 <=16' dependencies: - graphql: 15.9.0 + graphql: 16.9.0 dev: true - /graphql@15.9.0: - resolution: {integrity: sha512-GCOQdvm7XxV1S4U4CGrsdlEN37245eC8P9zaYCMr6K1BG0IPGy5lUwmJsEOGyl1GD6HXjOtl2keCP9asRBwNvA==} - engines: {node: '>= 10.x'} + /graphql@16.9.0: + resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + /happy-dom@15.7.3: + resolution: {integrity: sha512-w3RUaYNXFJX5LiNVhOJLK4GqCB1bFj1FvELtpon3HrN8gUpS09V0Vvm4/BBRRj7mLUE1+ch8PKv1JxEp/0IHjA==} + engines: {node: '>=18.0.0'} + dependencies: + entities: 4.5.0 + webidl-conversions: 7.0.0 + whatwg-mimetype: 3.0.0 + dev: true /har-schema@2.0.0: resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} @@ -6775,7 +6940,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.1 - debug: 4.3.5 + debug: 4.3.7 transitivePeerDependencies: - supports-color dev: true @@ -6794,7 +6959,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.1 - debug: 4.3.5 + debug: 4.3.7 transitivePeerDependencies: - supports-color dev: true @@ -7229,7 +7394,7 @@ packages: engines: {node: '>=10'} hasBin: true dependencies: - async: 3.2.5 + async: 3.2.6 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 @@ -7417,8 +7582,8 @@ packages: engines: {node: '>=6'} dev: true - /knip@5.27.3(@types/node@20.11.6)(typescript@5.0.4): - resolution: {integrity: sha512-X0zYs0viwENUtp+FZE2Ig6vQZYvKOz8TvuQkWSWMOXiEDoiMAF+NuDczVD9Dhupicfew0YKpYamHhKtNP+f8+g==} + /knip@5.29.2(@types/node@20.11.6)(typescript@5.0.4): + resolution: {integrity: sha512-NfJ3VDyV7gHvI4lVmr9PQCvC4lvrnTdaRMmtHIVBWB2GWWKj86uTw8Yfnp07M+fQeqOnX3AGPG8hjXHPlE1MEw==} engines: {node: '>=18.6.0'} hasBin: true peerDependencies: @@ -7639,7 +7804,7 @@ packages: /magicast@0.3.4: resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} dependencies: - '@babel/parser': 7.25.3 + '@babel/parser': 7.25.6 '@babel/types': 7.25.2 source-map-js: 1.2.0 dev: true @@ -8200,10 +8365,6 @@ packages: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true - /pattern-key-compare@1.0.0: - resolution: {integrity: sha512-7wi8a7OFmdx4Hx31+KY9kcD7gO+MWWupXtlAx7ANqoE8Pypl501FsDAPX2tSYLOuafED82A0Mv3lzeNfn82Jlg==} - dev: true - /performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} dev: true @@ -8250,7 +8411,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /postcss-browser-comments@4.0.0(browserslist@4.23.3)(postcss@8.3.0): @@ -8343,7 +8504,7 @@ packages: '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /postcss-dir-pseudo-class@7.0.2(postcss@8.3.0): @@ -8353,7 +8514,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /postcss-double-position-gradients@4.0.4(postcss@8.3.0): @@ -8374,7 +8535,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /postcss-focus-within@7.0.2(postcss@8.3.0): @@ -8384,7 +8545,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /postcss-font-variant@5.0.0(postcss@8.3.0): @@ -8461,9 +8622,9 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.1) + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /postcss-normalize@10.0.1(browserslist@4.23.3)(postcss@8.3.0): @@ -8588,7 +8749,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /postcss-replace-overflow-wrap@4.0.0(postcss@8.3.0): @@ -8603,6 +8764,10 @@ packages: resolution: {integrity: sha512-R6vHqZWgVnTAPq0C+xjyHfEZqfIYboCBVSy24MjxEDm+tIh1BU4O6o7DP7AA7kHzf136d+Qc5duI4tlpHjixDw==} dev: true + /postcss-resolve-nested-selector@0.1.6: + resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} + dev: true + /postcss-safe-parser@7.0.0(postcss@8.4.40): resolution: {integrity: sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==} engines: {node: '>=18.0'} @@ -8619,7 +8784,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /postcss-selector-parser@6.1.1: @@ -8630,6 +8795,14 @@ packages: util-deprecate: 1.0.2 dev: true + /postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + /postcss-sorting@4.1.0: resolution: {integrity: sha512-r4T2oQd1giURJdHQ/RMb72dKZCuLOdWx2B/XhXN1Y1ZdnwXsKH896Qz6vD4tFy9xSjpKNYhlZoJmWyhH/7JUQw==} engines: {node: '>=6.14.3'} @@ -8668,11 +8841,6 @@ packages: source-map-js: 1.2.0 dev: true - /postinstall-postinstall@2.1.0: - resolution: {integrity: sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==} - requiresBuild: true - dev: true - /prebuild-install@7.1.2: resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} engines: {node: '>=10'} @@ -8899,7 +9067,7 @@ packages: /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.6 dev: true /regexp.prototype.flags@1.5.2: @@ -8934,7 +9102,7 @@ packages: /relay-runtime@12.0.0: resolution: {integrity: sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==} dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.6 fbjs: 3.0.5 invariant: 2.2.4 transitivePeerDependencies: @@ -8986,7 +9154,7 @@ packages: deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 dependencies: aws-sign2: 0.7.0 - aws4: 1.13.0 + aws4: 1.13.2 caseless: 0.12.0 combined-stream: 1.0.8 extend: 3.0.2 @@ -9035,17 +9203,6 @@ packages: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} dev: true - /resolve.exports@1.1.1: - resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} - engines: {node: '>=10'} - dev: true - - /resolve.imports@1.2.7: - resolution: {integrity: sha512-q+UNv8vIE8wiB3BYjN9cAEtx17TnV6PoQSBWLCWaI9DDumevUifHY5ocKL4S5qcETHm++Gia3EdNJO81IW3PaQ==} - dependencies: - pattern-key-compare: 1.0.0 - dev: true - /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -9858,7 +10015,7 @@ packages: pump: 3.0.0 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 2.3.1 + bare-fs: 2.3.3 bare-path: 2.1.3 dev: true @@ -9901,8 +10058,8 @@ packages: engines: {node: '>=18'} dev: true - /terser@5.31.3: - resolution: {integrity: sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==} + /terser@5.31.6: + resolution: {integrity: sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==} engines: {node: '>=10'} hasBin: true dependencies: @@ -10053,7 +10210,6 @@ packages: /tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - dev: true /tsutils@3.21.0(typescript@5.0.4): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -10295,13 +10451,13 @@ packages: resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} dev: true - /urql@4.1.0(@urql/core@5.0.5)(react@18.2.0): + /urql@4.1.0(@urql/core@5.0.6)(react@18.2.0): resolution: {integrity: sha512-NfbfTvxy1sM89EQAJWm89qJZihUWk7BSMfrWgfljFXLOf+e7RK7DtV/Tbg2+82HnCG2x3LcEOJenxiFSYEC+bw==} peerDependencies: '@urql/core': ^5.0.0 react: '>= 16.8.0' dependencies: - '@urql/core': 5.0.5(graphql@15.9.0) + '@urql/core': 5.0.6(graphql@16.9.0) react: 18.2.0 wonka: 6.3.4 dev: false @@ -10350,7 +10506,7 @@ packages: hasBin: true dependencies: cac: 6.7.14 - debug: 4.3.5 + debug: 4.3.7 pathe: 1.1.2 picocolors: 1.0.1 vite: 5.0.10(@types/node@20.11.6) @@ -10532,7 +10688,7 @@ packages: fsevents: 2.3.3 dev: true - /vitest@1.2.2(@types/node@20.11.6): + /vitest@1.2.2(@types/node@20.11.6)(happy-dom@15.7.3): resolution: {integrity: sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -10568,6 +10724,7 @@ packages: chai: 4.4.1 debug: 4.3.5 execa: 8.0.1 + happy-dom: 15.7.3 local-pkg: 0.5.0 magic-string: 0.30.10 pathe: 1.1.2 @@ -10677,6 +10834,11 @@ packages: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} dev: true + /webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + dev: true + /whatwg-encoding@1.0.5: resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} dependencies: @@ -10687,6 +10849,11 @@ packages: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} dev: true + /whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + dev: true + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: @@ -10782,10 +10949,10 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) - '@babel/core': 7.24.9 - '@babel/preset-env': 7.25.3(@babel/core@7.24.9) - '@babel/runtime': 7.24.8 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.24.9)(rollup@2.79.1) + '@babel/core': 7.25.2 + '@babel/preset-env': 7.25.4(@babel/core@7.25.2) + '@babel/runtime': 7.25.6 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.25.2)(rollup@2.79.1) '@rollup/plugin-node-resolve': 15.2.3(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@rollup/plugin-terser': 0.4.4(rollup@2.79.1) @@ -11083,13 +11250,13 @@ packages: peerDependencies: stylelint: ^15.5.0 dependencies: - '@babel/parser': 7.25.3 - '@babel/traverse': 7.25.3 + '@babel/parser': 7.25.6 + '@babel/traverse': 7.25.6 array.prototype.flatmap: 1.3.2 jsdom: 15.2.1 option-t: 20.3.1 - postcss-resolve-nested-selector: 0.1.4 - postcss-selector-parser: 6.1.1 + postcss-resolve-nested-selector: 0.1.6 + postcss-selector-parser: 6.1.2 string-template: 1.0.0 stylelint: 16.7.0(typescript@5.0.4) transitivePeerDependencies: diff --git a/src/App/index.tsx b/src/App/index.tsx index c91c16b..c350438 100644 --- a/src/App/index.tsx +++ b/src/App/index.tsx @@ -10,12 +10,16 @@ import { RouterProvider, } from 'react-router-dom'; import * as Sentry from '@sentry/react'; -import { listToMap } from '@togglecorp/fujs'; +import { + encodeDate, + listToMap, +} from '@togglecorp/fujs'; import { gql, useQuery, } from 'urql'; +import DateContext from '#contexts/date'; import EnumsContext, { EnumsContextProps } from '#contexts/enums'; import LocalStorageContext, { LocalStorageContextProps } from '#contexts/localStorage'; import NavbarContext, { NavbarContextProps } from '#contexts/navbar'; @@ -33,7 +37,7 @@ import { } from '#generated/types/graphql'; import useThrottledValue from '#hooks/useThrottledValue'; import { getWindowSize } from '#utils/common'; -import { setToStorage } from '#utils/localStorage'; +import { defaultConfigValue } from '#utils/constants'; import wrappedRoutes, { unwrappedRoutes } from './routes'; @@ -108,19 +112,62 @@ const sentryCreateBrowserRouter = Sentry.wrapCreateBrowserRouter( const router = sentryCreateBrowserRouter(unwrappedRoutes); function App() { - const [userAuth, setUserAuth] = useState(); - const [size, setSize] = useState(getWindowSize); - const [ready, setReady] = useState(false); - const [storageState, setStorageState] = useState({}); + // Date - useEffect(() => { - Object.keys(storageState).forEach((key) => { - setToStorage(key, storageState[key].value); - }); - }, [storageState]); + const [date, setDate] = useState(() => { + const today = new Date(); + return { + fullDate: encodeDate(today), + year: today.getFullYear(), + month: today.getMonth(), + day: today.getDate(), + }; + }); + + useEffect( + () => { + const timeout = window.setInterval( + () => { + setDate((oldValue) => { + const today = new Date(); + const newDateString = encodeDate(today); + if (oldValue.fullDate === newDateString) { + return oldValue; + } + return { + fullDate: newDateString, + year: today.getFullYear(), + month: today.getMonth(), + day: today.getDate(), + }; + }); + }, + 2000, + ); + return () => { + window.clearInterval(timeout); + }; + }, + [], + ); + + // Local Storage + + const [storageState, setStorageState] = useState({ + 'timur-config': { + defaultValue: defaultConfigValue, + }, + }); + + const storageContextValue = useMemo(() => ({ + storageState, + setStorageState, + }), [storageState]); - const debouncedSize = useThrottledValue(size); + // Device Size + const [size, setSize] = useState(getWindowSize); + const throttledSize = useThrottledValue(size); useEffect(() => { function handleResize() { setSize(getWindowSize()); @@ -133,6 +180,11 @@ function App() { }; }, []); + // Authentication + + const [userAuth, setUserAuth] = useState(); + const [ready, setReady] = useState(false); + const [meResult] = useQuery( { query: ME_QUERY }, ); @@ -145,10 +197,6 @@ function App() { setReady(true); }, [meResult.data, meResult.fetching]); - const [enumsResult] = useQuery( - { query: ENUMS_QUERY }, - ); - const removeUserAuth = useCallback( () => { setUserAuth(undefined); @@ -165,6 +213,12 @@ function App() { [userAuth, removeUserAuth], ); + // Enums + + const [enumsResult] = useQuery( + { query: ENUMS_QUERY }, + ); + const enumsContextValue = useMemo( () => ({ enums: enumsResult.data, @@ -184,10 +238,7 @@ function App() { [enumsResult], ); - const storageContextValue = useMemo(() => ({ - storageState, - setStorageState, - }), [storageState]); + // Page layouts const navbarStartActionRef = useRef(null); const navbarMidActionRef = useRef(null); @@ -199,6 +250,8 @@ function App() { endActionsRef: navbarEndActionRef, }), []); + // Route + const fallbackElement = (
); + // NOTE: We should block page for authentication before we mount routes + // TODO: Handle error with authentication if (!ready) { return fallbackElement; } return ( - - - - - - - - - - - + + + + + + + + + + + + + ); } diff --git a/src/App/routes/PageError/index.tsx b/src/App/routes/PageError/index.tsx index f93df11..60808c1 100644 --- a/src/App/routes/PageError/index.tsx +++ b/src/App/routes/PageError/index.tsx @@ -3,8 +3,15 @@ import { useEffect, useState, } from 'react'; +import { + RiArrowDownSLine, + RiArrowUpSLine, + RiHome4Line, + RiRefreshLine, +} from 'react-icons/ri'; import { useRouteError } from 'react-router-dom'; +import Button from '#components/Button'; import Link from '#components/Link'; import styles from './styles.module.css'; @@ -24,14 +31,7 @@ function PageError() { const [ fullErrorVisible, setFullErrorVisible, - ] = useState(false); - - const handleErrorVisibleToggle = useCallback( - () => { - setFullErrorVisible((oldValue) => !oldValue); - }, - [setFullErrorVisible], - ); + ] = useState(import.meta.env.DEV); const handleReloadButtonClick = useCallback( () => { @@ -49,45 +49,56 @@ function PageError() {

Looks like we ran into some issue!

-
- {errorResponse?.error?.message - ?? errorResponse?.message - ?? 'Something unexpected happended!'} -
- + {!fullErrorVisible && ( +
+ {errorResponse?.error?.message + || errorResponse?.message + || 'Something unexpected happended!'} +
+ )} {fullErrorVisible && ( - <> -
- {errorResponse?.error?.stack - ?? errorResponse?.stack ?? 'Stack trace not available!'} -
-
- See the developer console for more details. -
- +
+ {errorResponse?.error?.stack + || errorResponse?.stack + || errorResponse?.error?.message + || errorResponse?.message + || 'Stack trace not available!'} +
)}
+
+ See the developer console for more details. +
- {/* NOTE: using the anchor element as it will refresh the page */} - - Go back to homepage - - + {fullErrorVisible ? 'Hide details' : 'Show details'} + +
+ {/* NOTE: using the anchor element as it will refresh the page */} + } + variant="quaternary" + > + Go to homepage + + +
diff --git a/src/App/routes/PageError/styles.module.css b/src/App/routes/PageError/styles.module.css index c495c1f..d3c4983 100644 --- a/src/App/routes/PageError/styles.module.css +++ b/src/App/routes/PageError/styles.module.css @@ -8,56 +8,54 @@ .container { display: flex; flex-direction: column; - /* - border-top: var(--go-ui-width-separator-large) solid var(--go-ui-color-primary-red); - border-radius: var(--go-ui-border-radius-xl); - box-shadow: var(--go-ui-box-shadow-2xl); - background-color: var(--go-ui-color-white); - padding: var(--go-ui-spacing-2xl); - width: calc(100% - var(--go-ui-spacing-2xl)); - */ + border-top: var(--width-separator-lg) solid var(--color-primary); + border-radius: var(--border-radius-xl); + box-shadow: var(--box-shadow-lg); + background-color: var(--color-foreground); + padding: var(--spacing-2xl); + width: calc(100% - var(--spacing-2xl)); max-width: 60rem; max-height: 60rem; - /* - gap: var(--go-ui-spacing-2xl); - */ + gap: var(--spacing-lg); .content { display: flex; flex-direction: column; - /* - gap: var(--go-ui-spacing-md); - */ + gap: var(--spacing-md); .heading { margin: 0; - /* - font-weight: var(--go-ui-font-weight-medium); - */ + font-weight: var(--font-weight-semibold); + } + + .message { + font-family: var(--font-family-mono); } .stack { flex-grow: 1; - /* - background-color: var(--go-ui-color-background); - padding: var(--go-ui-spacing-md); - */ + background-color: var(--color-background); + padding: var(--spacing-md); width: 100%; overflow: auto; white-space: pre; - /* - font-family: var(--go-ui-font-family-mono); - */ + font-family: var(--font-family-mono); } } .footer { display: flex; align-items: center; - justify-content: flex-end; - /* - gap: var(--go-ui-spacing-md); - */ + flex-wrap: wrap; + justify-content: space-between; + gap: var(--spacing-md); + + .actions { + display: flex; + align-items: center; + justify-content: flex-end; + gap: var(--spacing-sm); + } } } } diff --git a/src/App/routes/SmartNavigate.tsx b/src/App/routes/SmartNavigate.tsx deleted file mode 100644 index e278fc0..0000000 --- a/src/App/routes/SmartNavigate.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { - Navigate, - type NavigateProps, - useLocation, -} from 'react-router-dom'; -import { - isDefined, - isTruthyString, -} from '@togglecorp/fujs'; - -type RouteKey = string; - -interface Props extends NavigateProps { - hashToRouteMap: Record; - forwardUnmatchedHashTo?: string; -} - -function SmartNavigate(props: Props) { - const { - hashToRouteMap, - forwardUnmatchedHashTo, - ...navigateProps - } = props; - - const location = useLocation(); - const newRoute = isTruthyString(location.hash) - ? (hashToRouteMap[location.hash] ?? forwardUnmatchedHashTo) - : undefined; - - if (isDefined(newRoute)) { - return ( - - ); - } - - return ( - - ); -} - -export default SmartNavigate; diff --git a/src/App/routes/index.tsx b/src/App/routes/index.tsx index c1af8da..419ca67 100644 --- a/src/App/routes/index.tsx +++ b/src/App/routes/index.tsx @@ -84,11 +84,8 @@ const settings = customWrapRoute({ parent: rootLayout, path: 'settings', component: { - render: () => import('#components/TemplateView'), - props: { - title: 'Settings', - description: 'No settings to configure', - }, + render: () => import('#views/Settings'), + props: {}, }, wrapperComponent: Auth, context: { diff --git a/src/App/styles.module.css b/src/App/styles.module.css index 05e5da5..6dbff78 100644 --- a/src/App/styles.module.css +++ b/src/App/styles.module.css @@ -3,9 +3,6 @@ align-items: center; flex-direction: column; justify-content: center; - /* - background-color: var(--go-ui-color-background); - */ width: 100vw; height: 100vh; gap: 1rem; @@ -13,8 +10,5 @@ .app-logo { margin-top: -4rem; height: 6rem; - /* - animation: slide-up var(--go-ui-duration-animation-slow) ease-in-out forwards; - */ } } diff --git a/src/PwaPrompt/index.tsx b/src/PwaPrompt/index.tsx index 0f13e90..fc2769e 100644 --- a/src/PwaPrompt/index.tsx +++ b/src/PwaPrompt/index.tsx @@ -10,7 +10,7 @@ import styles from './styles.module.css'; // eslint-disable-next-line no-console console.info('PWA information:', pwaInfo); -function ReloadPrompt() { +function PwaPrompt() { const { offlineReady: [offlineReady, setOfflineReady], needRefresh: [needRefresh, setNeedRefresh], @@ -38,6 +38,7 @@ function ReloadPrompt() { console.info('SW registration error', error); }, }); + const reload = useCallback( () => { updateServiceWorker(true); @@ -96,4 +97,4 @@ function ReloadPrompt() { ); } -export default ReloadPrompt; +export default PwaPrompt; diff --git a/src/components/AvailabilityIndicator/index.tsx b/src/components/AvailabilityIndicator/index.tsx index 5773698..37af994 100644 --- a/src/components/AvailabilityIndicator/index.tsx +++ b/src/components/AvailabilityIndicator/index.tsx @@ -1,6 +1,7 @@ import { FcHome, FcLandscape, + FcOrganization, } from 'react-icons/fc'; import { _cs } from '@togglecorp/fujs'; @@ -11,7 +12,7 @@ import { import styles from './styles.module.css'; -export interface Props { +interface Props { className?: string; wfhType: JournalWorkFromHomeTypeEnum | null | undefined; leaveType: JournalLeaveTypeEnum | null | undefined; @@ -33,27 +34,43 @@ function AvailabilityIndicator(props: Props) { return <>{fallback}; } - const wfhContent = !!wfhType && ; - const leaveContent = !!leaveType && ; + const wfhContent = ; + const leaveContent = ; + const officeContent = ; - let content = ( - <> - {leaveContent} - {wfhContent} - - ); - if (leaveType === 'SECOND_HALF') { - content = ( - <> - {wfhContent} - {leaveContent} - - ); + let firstContent; + let secondContent; + + if (wfhType === 'FULL') { + firstContent = wfhContent; + secondContent = null; + } else if (leaveType === 'FULL') { + firstContent = leaveContent; + secondContent = null; + } else if (wfhType === 'FIRST_HALF' && leaveType === 'SECOND_HALF') { + firstContent = wfhContent; + secondContent = leaveContent; + } else if (leaveType === 'FIRST_HALF' && wfhType === 'SECOND_HALF') { + firstContent = leaveContent; + secondContent = wfhContent; + } else if (wfhType === 'FIRST_HALF') { + firstContent = wfhContent; + secondContent = officeContent; + } else if (wfhType === 'SECOND_HALF') { + firstContent = officeContent; + secondContent = wfhContent; + } else if (leaveType === 'FIRST_HALF') { + firstContent = leaveContent; + secondContent = officeContent; + } else if (leaveType === 'SECOND_HALF') { + firstContent = officeContent; + secondContent = leaveContent; } return (
- {content} + {firstContent} + {secondContent}
); } diff --git a/src/components/AvailabilityIndicator/styles.module.css b/src/components/AvailabilityIndicator/styles.module.css index c7b6888..fce943d 100644 --- a/src/components/AvailabilityIndicator/styles.module.css +++ b/src/components/AvailabilityIndicator/styles.module.css @@ -1,4 +1,4 @@ .indicator { display: inline-flex; - gap: var(--spacing-xs); + gap: var(--spacing-2xs); } diff --git a/src/components/CalendarInput/index.tsx b/src/components/CalendarInput/index.tsx index d784301..1e9bf87 100644 --- a/src/components/CalendarInput/index.tsx +++ b/src/components/CalendarInput/index.tsx @@ -1,16 +1,17 @@ import { useCallback, + useContext, useState, } from 'react'; -import { isDefined } from '@togglecorp/fujs'; import Button, { Props as ButtonProps } from '#components//Button'; import Dialog from '#components/Dialog'; import MonthlyCalendar from '#components/MonthlyCalendar'; +import DateContext from '#contexts/date'; import styles from './styles.module.css'; -export interface Props extends Omit, 'onClick' | 'onChange'> { +interface Props extends Omit, 'onClick' | 'onChange'> { value: string | undefined, onChange: (value: string | undefined) => void; } @@ -23,6 +24,7 @@ function CalendarInput(props: Props) { } = props; const [confirmationShown, setConfirmationShown] = useState(false); + const { year, month } = useContext(DateContext); const handleModalOpen = useCallback( () => { @@ -46,9 +48,6 @@ function CalendarInput(props: Props) { [onChange], ); - const today = new Date(); - const selectedDate = isDefined(value) ? new Date(value) : today; - return ( <>
diff --git a/src/components/Dialog/styles.module.css b/src/components/Dialog/styles.module.css index 95885c2..5f14958 100644 --- a/src/components/Dialog/styles.module.css +++ b/src/components/Dialog/styles.module.css @@ -11,6 +11,8 @@ .header { display: flex; padding: var(--spacing-md); + padding-bottom: 0; + gap: var(--spacing-md); .heading { flex-grow: 1; diff --git a/src/components/DisplayPicture/index.tsx b/src/components/DisplayPicture/index.tsx index 1379791..5841a3b 100644 --- a/src/components/DisplayPicture/index.tsx +++ b/src/components/DisplayPicture/index.tsx @@ -21,6 +21,7 @@ function DisplayPicture(props: Props) { className, } = props; + // FIXME: Use pastel colors? const color = useMemo(() => stringToColor(displayName), [displayName]); return ( diff --git a/src/components/DropdownMenu/index.tsx b/src/components/DropdownMenu/index.tsx index a81ef6a..c87ebf3 100644 --- a/src/components/DropdownMenu/index.tsx +++ b/src/components/DropdownMenu/index.tsx @@ -6,9 +6,9 @@ import { useState, } from 'react'; import { - IoCaretDown, - IoCaretUp, -} from 'react-icons/io5'; + RiArrowDropDownLine, + RiArrowDropUpLine, +} from 'react-icons/ri'; import { _cs } from '@togglecorp/fujs'; import Button, { Props as ButtonProps } from '#components/Button'; @@ -126,8 +126,8 @@ function DropdownMenu(props: Props) { <> {actions} {!withoutDropdownIcon && (showDropdown - ? - : + ? + : )} ) : undefined} diff --git a/src/components/Indent/index.tsx b/src/components/Indent/index.tsx new file mode 100644 index 0000000..7c2fc42 --- /dev/null +++ b/src/components/Indent/index.tsx @@ -0,0 +1,23 @@ +import styles from './styles.module.css'; + +interface Props { + level: number; +} + +function Indent(props: Props) { + const { level } = props; + + if (level === 0) { + return null; + } + + return ( +
+ {Array.from(new Array(level).keys()).map((key) => ( + + ))} +
+ ); +} + +export default Indent; diff --git a/src/components/Indent/styles.module.css b/src/components/Indent/styles.module.css new file mode 100644 index 0000000..118962e --- /dev/null +++ b/src/components/Indent/styles.module.css @@ -0,0 +1,12 @@ +.indent { + display: flex; + height: 100%; + gap: var(--spacing-sm); + min-height: 1.5rem; + + .item { + border-right: var(--width-separator-sm) solid var(--color-separator-dark); + width: var(--spacing-2xs); + height: 100%; + } +} diff --git a/src/components/Link/index.tsx b/src/components/Link/index.tsx index 746afec..5b0e4d4 100644 --- a/src/components/Link/index.tsx +++ b/src/components/Link/index.tsx @@ -3,9 +3,9 @@ import { useMemo, } from 'react'; import { - IoChevronForward, - IoExit, -} from 'react-icons/io5'; + RiArrowRightWideLine, + RiExternalLinkLine, +} from 'react-icons/ri'; import { generatePath, Link as InternalLink, @@ -30,7 +30,7 @@ import { type WrappedRoutes } from '../../App/routes'; import styles from './styles.module.css'; -export interface UrlParams { +interface UrlParams { [key: string]: string | number | null | undefined; } @@ -56,7 +56,7 @@ export function resolvePath( } // eslint-disable-next-line react-refresh/only-export-components -export function useLink(props: { +function useLink(props: { external: true, href: string | undefined | null, to?: never, @@ -199,10 +199,10 @@ function Link(props: Props) { <> {actions} {withLinkIcon && external && ( - + )} {withLinkIcon && !external && ( - + )} ) : null, diff --git a/src/components/MonthlyCalendar/index.tsx b/src/components/MonthlyCalendar/index.tsx index fe1f131..1bef486 100644 --- a/src/components/MonthlyCalendar/index.tsx +++ b/src/components/MonthlyCalendar/index.tsx @@ -1,19 +1,21 @@ import { useCallback, + useContext, useEffect, useMemo, useState, } from 'react'; import { - IoChevronBackSharp, - IoChevronForwardSharp, -} from 'react-icons/io5'; + RiArrowLeftSLine, + RiArrowRightSLine, +} from 'react-icons/ri'; import { _cs, encodeDate, } from '@togglecorp/fujs'; import Button from '#components/Button'; +import DateContext from '#contexts/date'; import styles from './styles.module.css'; @@ -62,7 +64,7 @@ function MonthlyCalendar(props: Props) { const [year, setYear] = useState(initialYear); const [month, setMonth] = useState(initialMonth); - const today = new Date(); + const { fullDate } = useContext(DateContext); const resetView = useCallback( (newYear: number, newMonth: number) => { @@ -105,6 +107,7 @@ function MonthlyCalendar(props: Props) { [month, year], ); + // FIXME: We should be able be use a for loop here const daysInMonth = useMemo(() => { // NOTE: getDate() starts at 1 // where as getDay() starts at 0 @@ -136,7 +139,7 @@ function MonthlyCalendar(props: Props) { title="See previous month in calendar" spacing="xs" > - +
{year} @@ -169,7 +172,7 @@ function MonthlyCalendar(props: Props) { {daysInMonth.map((day) => { const date = encodeDate(new Date(year, month, day.date)); let variant; - if (encodeDate(today) === date) { + if (fullDate === date) { variant = 'secondary' as const; } else if (selectedDate === date) { variant = 'quaternary' as const; diff --git a/src/components/Navbar/index.tsx b/src/components/Navbar/index.tsx index 8488ac9..6e11ead 100644 --- a/src/components/Navbar/index.tsx +++ b/src/components/Navbar/index.tsx @@ -3,10 +3,10 @@ import { useContext, } from 'react'; import { - IoExitOutline, - IoSettingsOutline, - IoShieldCheckmarkOutline, -} from 'react-icons/io5'; + RiAdminLine, + RiLogoutBoxLine, + RiSettings4Line, +} from 'react-icons/ri'; import { _cs, isDefined, @@ -128,7 +128,7 @@ function Navbar(props: Props) { type="link" external href={import.meta.env.APP_ADMIN_URL} - icons={} + icons={} > Admin Panel @@ -136,7 +136,7 @@ function Navbar(props: Props) { } + icons={} > Settings @@ -145,7 +145,7 @@ function Navbar(props: Props) { name={undefined} onClick={handleLogoutClick} disabled={fetching} - icons={} + icons={} title="Log out" > Log out diff --git a/src/components/NumberInput/index.tsx b/src/components/NumberInput/index.tsx deleted file mode 100644 index 6226023..0000000 --- a/src/components/NumberInput/index.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import { - useCallback, - useEffect, - useId, - useState, -} from 'react'; -import { - isDefined, - isNotDefined, -} from '@togglecorp/fujs'; - -import InputContainer, { Props as InputContainerProps } from '#components/InputContainer'; -import RawInput, { Props as RawInputProps } from '#components/RawInput'; - -type InheritedProps = (Omit & Omit, 'onChange' | 'value' | 'id'>); - -export interface Props extends InheritedProps { - inputElementRef?: React.RefObject; - inputClassName?: string; - value: number | undefined | null; - onChange?: ( - value: number | undefined, - name: T, - e?: React.FormEvent | undefined, - ) => void; -} - -function NumberInput(props: Props) { - const { - className, - actions, - inputSectionClassName, - icons, - hint, - label, - disabled, - readOnly, - inputClassName, - value: valueFromProps, - withAsterisk, - labelClassName, - required, - variant, - onChange, - inputElementRef, - ...otherInputProps - } = props; - - const inputId = useId(); - - const [tempValue, setTempValue] = useState(String(valueFromProps ?? '')); - - useEffect(() => { - setTempValue(String(valueFromProps ?? '')); - }, [valueFromProps]); - - const handleChange: RawInputProps['onChange'] = useCallback((v, n, e) => { - setTempValue(v); - - if (isNotDefined(onChange)) { - return; - } - - if (isDefined(v)) { - const floatValue = +v; - if (!Number.isNaN(floatValue)) { - onChange(floatValue, n, e); - } - } else { - onChange(undefined, n, e); - } - }, [onChange]); - - return ( - - )} - /> - ); -} - -export default NumberInput; diff --git a/src/components/Page/index.tsx b/src/components/Page/index.tsx index 38bef4b..a1e73ff 100644 --- a/src/components/Page/index.tsx +++ b/src/components/Page/index.tsx @@ -5,10 +5,10 @@ import { useRef, } from 'react'; import { - IoChevronBack, - IoList, - IoMenu, -} from 'react-icons/io5'; + RiArrowLeftSLine, + RiListUnordered, + RiMenuLine, +} from 'react-icons/ri'; import { _cs, isDefined, @@ -23,11 +23,6 @@ import SizeContext from '#contexts/size'; import useDebouncedValue from '#hooks/useDebouncedValue'; import useLocalStorage from '#hooks/useLocalStorage'; import useSetFieldValue from '#hooks/useSetFieldValue'; -import { - defaultConfigValue, - KEY_CONFIG_STORAGE, -} from '#utils/constants'; -import { ConfigStorage } from '#utils/types'; import styles from './styles.module.css'; @@ -60,19 +55,16 @@ function Page(props: Props) { onSwipeRight, } = props; - const { width } = useContext(SizeContext); + const { screen } = useContext(SizeContext); - const [storedState, setStoredState] = useLocalStorage( - KEY_CONFIG_STORAGE, - defaultConfigValue, - ); + const [storedConfig, setStoredConfig] = useLocalStorage('timur-config'); const { startSidebarShown, endSidebarShown, - } = storedState; + } = storedConfig; - const setFieldValue = useSetFieldValue(setStoredState); + const setFieldValue = useSetFieldValue(setStoredConfig); const setSidebarShown = useCallback( (newValue: boolean) => setFieldValue(newValue, 'startSidebarShown'), @@ -125,11 +117,11 @@ function Page(props: Props) { !startSidebarShown && styles.startSidebarCollapsed, debouncedStartSidebarCollapsed && styles.debouncedStartSidebarCollapsed, debouncedEndSidebarCollapsed && styles.debouncedEndSidebarCollapsed, - (!endSidebarShown || width <= 900) && styles.endSidebarCollapsed, + (!endSidebarShown || screen === 'mobile') && styles.endSidebarCollapsed, startSidebarShown && !!startAsideContent && styles.startSidebarVisible, endSidebarShown && !!endAsideContent - && width > 900 + && screen === 'desktop' && styles.endSidebarVisible, className, )} @@ -143,7 +135,7 @@ function Page(props: Props) { variant="transparent" title="Toggle left pane" > - + )} @@ -158,7 +150,7 @@ function Page(props: Props) { variant="transparent" title="Close left pane" > - + )} @@ -168,7 +160,7 @@ function Page(props: Props) { {children}
- {endAsideContent && width > 900 && ( + {endAsideContent && screen === 'desktop' && ( )} - {endAsideContent && width > 900 && ( + {endAsideContent && screen === 'desktop' && ( diff --git a/src/components/Popup/index.tsx b/src/components/Popup/index.tsx index be3f6bc..d84cd04 100644 --- a/src/components/Popup/index.tsx +++ b/src/components/Popup/index.tsx @@ -9,7 +9,6 @@ import styles from './styles.module.css'; interface Props { className?: string; - // pointerClassName?: string; elementRef?: React.RefObject; parentRef: React.RefObject; children?: React.ReactNode; @@ -22,7 +21,6 @@ function Popup(props: Props) { elementRef, children, className, - // pointerClassName, preferredWidth, } = props; @@ -38,7 +36,6 @@ function Popup(props: Props) { const { content, - // pointer, width, orientation, } = placements; @@ -61,25 +58,6 @@ function Popup(props: Props) { > {children}
- {/* -
- - - -
- */} ); } diff --git a/src/components/Popup/styles.module.css b/src/components/Popup/styles.module.css index c811857..f5ed1be 100644 --- a/src/components/Popup/styles.module.css +++ b/src/components/Popup/styles.module.css @@ -11,26 +11,3 @@ box-shadow: 0 -8pt 20pt -5pt rgb(0 0 0 / 0.5); } } - -/* -.pointer { - position: fixed; - transform: translateX(-50%); - background-color: transparent; - line-height: 0; - color: var(--color-text-on-dark); - font-size: 0.5rem; - pointer-events: none; - filter: drop-shadow(0 -1pt 1pt rgb(0 0 0 / .1)); - - .icon { - width: 2em; - height: 1em; - fill: currentColor; - } - - &.top-orientation { - transform: translateX(-50%) rotate(180deg); - } -} -*/ diff --git a/src/components/RadioInput/Radio/index.tsx b/src/components/RadioInput/Radio/index.tsx index 68227c4..d268fa5 100644 --- a/src/components/RadioInput/Radio/index.tsx +++ b/src/components/RadioInput/Radio/index.tsx @@ -1,8 +1,8 @@ import React from 'react'; import { - IoRadioButtonOffOutline, - IoRadioButtonOnOutline, -} from 'react-icons/io5'; + RiCheckboxBlankCircleLine, + RiCheckboxCircleFill, +} from 'react-icons/ri'; import { _cs } from '@togglecorp/fujs'; import useBasicLayout from '#hooks/useBasicLayout'; @@ -47,9 +47,9 @@ function Radio(props: Props) { containerClassName, } = useBasicLayout({ icons: value ? ( - + ) : ( - + ), actions, childrenContainerClassName: styles.content, diff --git a/src/components/RadioInput/index.tsx b/src/components/RadioInput/index.tsx index a6230ca..09fb230 100644 --- a/src/components/RadioInput/index.tsx +++ b/src/components/RadioInput/index.tsx @@ -10,7 +10,7 @@ import Radio, { Props as RadioProps } from './Radio'; import styles from './styles.module.css'; -export interface BaseProps> { +interface BaseProps> { className?: string; options: O[] | undefined; name: N; @@ -42,7 +42,7 @@ type ClearableProps = { onChange: (value: V | undefined, name: N) => void; } -export type Props, OMISSION extends string> = ( +type Props, OMISSION extends string> = ( Omit, OMISSION> & ( Omit, OMISSION> @@ -140,8 +140,6 @@ function RadioInput< descriptionSelector, ]); - // const isRequired = withAsterisk ?? required; - return (
- +
{ label } diff --git a/src/components/SelectInputContainer/index.tsx b/src/components/SelectInputContainer/index.tsx index 12b36e4..028b4ff 100644 --- a/src/components/SelectInputContainer/index.tsx +++ b/src/components/SelectInputContainer/index.tsx @@ -4,9 +4,9 @@ import React, { useRef, } from 'react'; import { - IoCheckmarkDoneSharp, - IoCloseSharp, -} from 'react-icons/io5'; + RiCheckDoubleLine, + RiCloseLine, +} from 'react-icons/ri'; import { _cs, isTruthyString, @@ -160,16 +160,6 @@ function SelectInputContainer< ], ); - /* - const handleToggleDropdown: NonNullable['onClick']> = useCallback( - (_, e) => { - e.stopPropagation(); - onDropdownShownChange(!dropdownShown); - }, - [dropdownShown, onDropdownShownChange], - ); - */ - const handleShowDropdown = useCallback( () => { // FIXME: this is not atomic. Call only once @@ -302,7 +292,7 @@ function SelectInputContainer< name={undefined} title="Select all options" > - + )} {!readOnly && !nonClearable && hasValue && ( @@ -314,23 +304,9 @@ function SelectInputContainer< name={undefined} title="Clear all options" > - + )} - {/* !readOnly && ( - - ) */} )} input={( diff --git a/src/contexts/date.tsx b/src/contexts/date.tsx new file mode 100644 index 0000000..935e004 --- /dev/null +++ b/src/contexts/date.tsx @@ -0,0 +1,20 @@ +import { createContext } from 'react'; +import { encodeDate } from '@togglecorp/fujs'; + +interface DateContextType { + fullDate: string, + year: number, + month: number, + day: number, +} + +const today = new Date(); + +const DateContext = createContext({ + fullDate: encodeDate(today), + year: today.getFullYear(), + month: today.getMonth(), + day: today.getDate(), +}); + +export default DateContext; diff --git a/src/contexts/localStorage.tsx b/src/contexts/localStorage.tsx index 8e21426..dea5b17 100644 --- a/src/contexts/localStorage.tsx +++ b/src/contexts/localStorage.tsx @@ -1,19 +1,28 @@ import { createContext } from 'react'; -export type StoredValue = { - timestamp: number; - value: VALUE; +import { PutNull } from '#utils/common'; +import { defaultConfigValue } from '#utils/constants'; +import { ConfigStorage } from '#utils/types'; + +type StoredValue = { + value?: PutNull; + defaultValue: VALUE; +}; +export type StorageState = { + 'timur-config': StoredValue, }; -type StorageState = Record>; export interface LocalStorageContextProps { storageState: StorageState; setStorageState: React.Dispatch>; } -// FIXME: replace this with simpler alternative const LocalStorageContext = createContext({ - storageState: {}, + storageState: { + 'timur-config': { + defaultValue: defaultConfigValue, + }, + }, setStorageState: () => { // eslint-disable-next-line no-console console.error('LocalStorageContext::setStorage() called without a provider'); diff --git a/src/hooks/useFormattedRelativeTime.ts b/src/hooks/useFormattedRelativeTime.ts deleted file mode 100644 index ec55882..0000000 --- a/src/hooks/useFormattedRelativeTime.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { - useCallback, - useEffect, - useRef, - useState, -} from 'react'; -import { - isDefined, - isNotDefined, -} from '@togglecorp/fujs'; - -import { - formatRelativeTimeToString, - RelativeTime, - toRelativeTime, -} from '#utils/temporal'; - -function useFormattedRelativeTime(timestamp: number | undefined) { - const [relativeTime, setRelativeTime] = useState( - () => (isDefined(timestamp) ? toRelativeTime(timestamp) : undefined), - ); - - const updateTimeoutRef = useRef(); - - const update = useCallback(() => { - if (isDefined(timestamp)) { - setRelativeTime(toRelativeTime(timestamp)); - } - }, [timestamp]); - - useEffect(update, [update]); - - useEffect(() => { - window.clearTimeout(updateTimeoutRef.current); - if (isNotDefined(relativeTime)) { - return; - } - - const timeoutDuration = relativeTime.resolution === 'second' - ? (2000 + (500 * relativeTime.value)) - : (1000 * 60); - - updateTimeoutRef.current = window.setTimeout(update, timeoutDuration); - }, [relativeTime, update]); - - return isDefined(relativeTime) - ? formatRelativeTimeToString(relativeTime) - : 'never'; -} - -export default useFormattedRelativeTime; diff --git a/src/hooks/useLocalStorage.ts b/src/hooks/useLocalStorage.ts index b9808fd..77a6570 100644 --- a/src/hooks/useLocalStorage.ts +++ b/src/hooks/useLocalStorage.ts @@ -2,65 +2,87 @@ import { useCallback, useContext, useEffect, - useState, + useMemo, } from 'react'; +import { isDefined } from '@togglecorp/fujs'; -import LocalStorageContext, { StoredValue } from '#contexts/localStorage'; -import { isCallable } from '#utils/common'; -import { getFromStorage } from '#utils/localStorage'; +import LocalStorageContext, { StorageState } from '#contexts/localStorage'; +import { + isCallable, + putNull, + putUndefined, +} from '#utils/common'; +import { + getFromStorage, + setToStorage, +} from '#utils/localStorage'; -import useDebouncedValue from './useDebouncedValue'; +function useLocalStorage(key: K) { + const { + storageState, + setStorageState, + } = useContext(LocalStorageContext); -function useLocalStorage( - key: string, - defaultValue: T, - debounce = 200, -) { - const [value, setValue] = useState>( - () => { - const fromStorage = getFromStorage(key); + type T = StorageState[K]; + + const hasReadValue = isDefined(storageState[key].value); - return { - timestamp: new Date().getTime(), - value: fromStorage ?? defaultValue, - }; + useEffect( + () => { + if (hasReadValue) { + return; + } + const val = getFromStorage(key); + setStorageState((oldValue) => ({ + ...oldValue, + [key]: { + ...oldValue[key], + value: val, + }, + })); }, + [key, hasReadValue, setStorageState], ); - const { storageState, setStorageState } = useContext(LocalStorageContext); - const debouncedValue = useDebouncedValue(value, debounce); + const setValue: React.Dispatch>> = useCallback( + (newValue) => { + setStorageState((oldValue) => { + const oldValueValue = oldValue[key].value; + const oldValueDefaultValue = oldValue[key].defaultValue; - useEffect(() => { - if (!storageState[key]) { - return; - } + const resolvedValue = isCallable(newValue) + ? newValue(oldValueValue ?? oldValueDefaultValue) + : newValue; - if (storageState[key].timestamp > value.timestamp) { - setValue(storageState[key] as StoredValue); - } - }, [storageState, key, value]); + setToStorage(key, putNull(resolvedValue)); - useEffect(() => { - setStorageState((oldStorageValue) => ({ - ...oldStorageValue, - [key]: debouncedValue, - })); - }, [debouncedValue, key, setStorageState]); + return { + ...oldValue, + [key]: { + ...oldValue[key], + value: resolvedValue, + }, + } satisfies StorageState; + }); + }, + [key, setStorageState], + ); - const setValueSafe = useCallback((newValue: T | ((v: T) => T)) => { - setValue((oldValue) => { - const resolvedValue = isCallable(newValue) - ? newValue(oldValue.value) - : newValue; + const { value } = storageState[key]; + const { defaultValue } = storageState[key]; - return { - timestamp: new Date().getTime(), - value: resolvedValue, - } satisfies StoredValue; - }); - }, []); + const finalValue = useMemo( + () => putUndefined({ + ...defaultValue, + ...value, + }), + [defaultValue, value], + ); - return [value.value, setValueSafe] as const; + return [ + finalValue, + setValue, + ] as const; } export default useLocalStorage; diff --git a/src/hooks/useRouting.ts b/src/hooks/useRouting.ts deleted file mode 100644 index 45a992e..0000000 --- a/src/hooks/useRouting.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { - useCallback, - useContext, -} from 'react'; -import { - type NavigateOptions, - useLocation, - useNavigate, -} from 'react-router-dom'; - -import { - resolvePath, - UrlParams, -} from '#components/Link'; -import RouteContext from '#contexts/route'; - -import { type WrappedRoutes } from '../App/routes'; - -function useRouting() { - const location = useLocation(); - const navigateFromLib = useNavigate(); - const routes = useContext(RouteContext); - - const historyEntryExist = location.key !== 'default'; - - const navigate = useCallback( - ( - path: keyof WrappedRoutes, - options?: { - params?: UrlParams, - search?: string, - hash?: string, - }, - otherOptions?: NavigateOptions, - ) => { - const { resolvedPath } = resolvePath( - path, - routes, - options?.params, - ); - navigateFromLib({ - pathname: resolvedPath, - search: options?.search, - hash: options?.hash, - }, otherOptions); - }, - [navigateFromLib, routes], - ); - - const goBack = useCallback( - ( - fallbackPath: keyof WrappedRoutes = 'home', - options: { - params?: UrlParams, - search?: string, - hash?: string, - } = {}, - ) => { - if (historyEntryExist) { - navigateFromLib(-1); - } else if (fallbackPath) { - navigate(fallbackPath, options); - } else { - navigateFromLib('/'); - } - }, - [historyEntryExist, navigateFromLib, navigate], - ); - - return { navigate, goBack }; -} - -export default useRouting; diff --git a/src/hooks/useSizeTracking.ts b/src/hooks/useSizeTracking.ts deleted file mode 100644 index 709a894..0000000 --- a/src/hooks/useSizeTracking.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - useEffect, - useState, -} from 'react'; -import { isDefined } from '@togglecorp/fujs'; - -import useDebouncedValue from '#hooks/useDebouncedValue'; - -function useSizeTracking(ref: React.RefObject, disabled = false) { - const [size, setSize] = useState(() => { - const bcr = ref.current?.getBoundingClientRect(); - - return { - width: bcr?.width ?? 0, - height: bcr?.height ?? 0, - }; - }); - - useEffect(() => { - const resizeObserver = new ResizeObserver((entries) => { - const entry = entries.at(0); - const contentRect = entry?.contentRect; - - if (contentRect) { - setSize({ - width: contentRect.width, - height: contentRect.height, - }); - } - }); - - const el = ref.current; - if (!disabled && isDefined(el)) { - resizeObserver.observe(el); - } - - return () => { - if (!disabled && isDefined(el)) { - resizeObserver.unobserve(el); - } - }; - }, [disabled, ref]); - - return useDebouncedValue(size); -} - -export default useSizeTracking; diff --git a/src/index.css b/src/index.css index 69b3d6a..959ae23 100644 --- a/src/index.css +++ b/src/index.css @@ -4,6 +4,7 @@ :root { --font-family-sans-serif: "Fira Sans", sans-serif; + --font-family-mono: "Oxygen Mono", monospace; --color-primary: #c45332; --color-secondary: #9cb56e; @@ -18,6 +19,7 @@ --color-text-on-dark: #ffffff; --color-separator: rgba(0, 0, 0, 0.1); + --color-separator-dark: rgba(0, 0, 0, 0.2); --base-font-size: 1rem; @@ -32,15 +34,17 @@ --font-size-4xl: calc(var(--base-font-size) * 3.6); @media screen and (max-width: 40rem) { - --font-size-2xs: calc(var(--base-font-size) * 0.625); - --font-size-xs: calc(var(--base-font-size) * 0.75); - --font-size-sm: calc(var(--base-font-size) * 0.875); + --base-font-size: 0.875rem; + + --font-size-2xs: calc(var(--base-font-size) * 0.75); + --font-size-xs: calc(var(--base-font-size) * 0.875); + --font-size-sm: calc(var(--base-font-size) * 0.9375); --font-size-md: calc(var(--base-font-size) * 1); - --font-size-lg: calc(var(--base-font-size) * 1.25); - --font-size-xl: calc(var(--base-font-size) * 1.44); - --font-size-2xl: calc(var(--base-font-size) * 1.8); - --font-size-3xl: calc(var(--base-font-size) * 2.25); - --font-size-4xl: calc(var(--base-font-size) * 3); + --font-size-lg: calc(var(--base-font-size) * 1.125); + --font-size-xl: calc(var(--base-font-size) * 1.25); + --font-size-2xl: calc(var(--base-font-size) * 1.44); + --font-size-3xl: calc(var(--base-font-size) * 1.8); + --font-size-4xl: calc(var(--base-font-size) * 2.25); } --font-weight-light: 300; @@ -72,11 +76,11 @@ @media screen and (max-width: 900px) { --base-spacing: 0.75rem; - --spacing-4xs: calc(var(--base-spacing) * 0.0625); - --spacing-3xs: calc(var(--base-spacing) * 0.125); - --spacing-2xs: calc(var(--base-spacing) * 0.25); - --spacing-xs: calc(var(--base-spacing) * 0.4); - --spacing-sm: calc(var(--base-spacing) * 0.625); + --spacing-4xs: calc(var(--base-spacing) * 0.125); + --spacing-3xs: calc(var(--base-spacing) * 0.25); + --spacing-2xs: calc(var(--base-spacing) * 0.5); + --spacing-xs: calc(var(--base-spacing) * 0.75); + --spacing-sm: calc(var(--base-spacing) * 0.875); --spacing-md: calc(var(--base-spacing) * 1); --spacing-lg: calc(var(--base-spacing) * 1.25); --spacing-xl: calc(var(--base-spacing) * 1.5625); @@ -138,6 +142,7 @@ body { overflow-x: hidden; color: var(--color-text); font-family: var(--font-family-sans-serif); + font-size: var(--font-size-md); font-weight: var(--font-weight-normal); font-style: normal; font-optical-sizing: auto; @@ -159,6 +164,26 @@ h1, h2, h3, h4, h5, h6 { font-weight: var(--font-weight-semibold); } +h1 { + font-size: var(--font-size-2xl); +} + +h2 { + font-size: var(--font-size-xl); +} + +h3 { + font-size: var(--font-size-lg); +} + +h4 { + font-size: var(--font-size-md); +} + +h5 { + font-size: var(--font-size-sm); +} + p { margin: 0; } diff --git a/src/utils/colors.ts b/src/utils/colors.ts deleted file mode 100644 index bfced1e..0000000 --- a/src/utils/colors.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { isNotDefined } from '@togglecorp/fujs'; - -import { isCallable } from '#utils/common'; - -export function hexToRgb(hex: string) { - return { - r: +`0x${hex[1]}${hex[2]}`, - g: +`0x${hex[3]}${hex[4]}`, - b: +`0x${hex[5]}${hex[6]}`, - }; -} - -export function hex255(n: number) { - return n.toString(16).padStart(2, '0'); -} - -export function rgbToHex(rgb: { r: number, g: number, b: number }) { - const { r, g, b } = rgb; - - return `#${hex255(r)}${hex255(g)}${hex255(b)}`; -} - -export function hslToRgb(hsl: { h: number, s: number, l: number }) { - const { h, s, l } = hsl; - - if (h === 0) { - const v = Math.round(l * 255); - return { - r: v, - g: v, - b: v, - }; - } - - const c = (1 - Math.abs(2 * l - 1)) * s; - const x = c * (1 - Math.abs(((h / 60) % 2) - 1)); - const m = l - c / 2; - - const lookUps = [ - [c, x, 0], - [x, c, 0], - [0, c, x], - [0, x, c], - [x, 0, c], - [c, 0, x], - ]; - - const i = Math.ceil(h / 60) - 1; - const [rp, gp, bp] = lookUps[i]; - - return { - r: Math.round((rp + m) * 255), - g: Math.round((gp + m) * 255), - b: Math.round((bp + m) * 255), - }; -} - -function getHue(r: number, g: number, b: number, max: number, diff: number) { - if (r === max) { - const hue = 60 * ((g - b) / diff); - if (hue > 0) { - return hue; - } - - return 360 + hue; - } - - if (g === max) { - return 60 * (2 + (b - r) / diff); - } - - if (b === max) { - return 60 * (4 + (r - g) / diff); - } - - return 0; -} - -function hexToHsl(hex: string) { - const c = hexToRgb(hex); - const r = c.r / 255; - const g = c.g / 255; - const b = c.b / 255; - - const min = Math.min(r, g, b); - const max = Math.max(r, g, b); - const diff = max - min; - const sum = max + min; - const l = sum / 2; - - if (diff === 0) { - return { h: 0, s: 0, l }; - } - - const s = diff / Math.abs(1 - (2 * l - 1)); - const h = getHue(r, g, b, max, diff); - return { h, s, l }; -} - -export function interpolate255(a: number, b: number, factor: number) { - return Math.min(Math.round(a + (b - a) * factor), 255); -} - -export function interpolateHexColor(ha: string, hb: string, factor: number) { - const ca = hexToRgb(ha); - const cb = hexToRgb(hb); - - const r = hex255(interpolate255(ca.r, cb.r, factor)); - const g = hex255(interpolate255(ca.g, cb.g, factor)); - const b = hex255(interpolate255(ca.b, cb.b, factor)); - - return `#${r}${g}${b}`; -} - -type Callable = T | ((t1: T, t2: T) => T); -export function resolveCallable(callable: Callable, arg1: T, arg2: T) { - if (!isCallable(callable)) { - return callable; - } - - return callable(arg1, arg2); -} - -export function modifyHexSL(hex: string, s?: Callable, l?: Callable) { - if (isNotDefined(s) && isNotDefined(l)) { - return hex; - } - - const hsl = hexToHsl(hex); - const rgb = hslToRgb({ - h: hsl.h, - s: Math.min(hsl.s * resolveCallable(s ?? 1, hsl.s, hsl.l), 1), - l: Math.min(hsl.l * resolveCallable(l ?? 1, hsl.l, hsl.s), 1), - }); - - return rgbToHex(rgb); -} diff --git a/src/utils/common.ts b/src/utils/common.ts index 3e0b7cf..654d975 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -24,11 +24,15 @@ export function isCallable(value: T | X): value is X { export interface Size { width: number; height: number; + screen: 'desktop' | 'mobile'; } export function getWindowSize(): Size { return { width: window.innerWidth, height: window.innerHeight, + screen: window.innerWidth >= 900 + ? 'desktop' + : 'mobile', }; } @@ -36,6 +40,7 @@ function squash(items: T[]): T | undefined { if (items.length <= 1) { return items[0]; } + // NOTE: We should use items.slice(1) instead return items.reduce( (acc, val) => ({ ...acc, @@ -107,7 +112,7 @@ export function getDurationNumber(value: string | undefined) { } // decimal if (value.match(/^\d{0,2}\.\d{1,2}$/)) { - return Number(value); + return Math.round(Number(value) * 60); } // hh:mm // hh:m @@ -212,3 +217,158 @@ export function fuzzySearch( rows, ); } + +export function sortByAttributes( + list: LIST_ITEM[], + attributes: ATTRIBUTE[], + sortFn: (a: LIST_ITEM, b: LIST_ITEM, attr: ATTRIBUTE) => number, +): LIST_ITEM[] { + if (attributes.length <= 0) { + return list; + } + + const newList = [...list]; + newList.sort( + (a, b) => { + for (let i = 0; i < attributes.length; i += 1) { + const currentSortResult = sortFn( + a, + b, + attributes[i], + ); + + if (currentSortResult !== 0) { + return currentSortResult; + } + } + return 0; + }, + ); + + return newList; +} + +type GroupedItem = { + groupKey: string; + type: 'heading'; + value: LIST_ITEM; + attribute: ATTRIBUTE; + level: number; +} | { + type: 'list-item'; + value: LIST_ITEM; + level: number; +}; + +// NOTE: the list must be sorted before grouping +export function groupListByAttributes( + list: LIST_ITEM[], + attributes: ATTRIBUTE[], + compareItemAttributes: (a: LIST_ITEM, b: LIST_ITEM, attribute: ATTRIBUTE) => boolean, + getGroupKey: (item: LIST_ITEM, attributes: ATTRIBUTE[]) => string, +): GroupedItem[] { + if (isNotDefined(list) || list.length === 0) { + return []; + } + + const groupedItems = list.flatMap((listItem, listIndex) => { + if (listIndex === 0) { + const groupKey = getGroupKey(listItem, attributes); + const headings = attributes.map((attribute, i) => ({ + type: 'heading' as const, + value: listItem, + attribute, + level: i, + groupKey, + })); + + return [ + ...headings, + { + type: 'list-item' as const, + value: listItem, + level: attributes.length, + }, + ]; + } + + const prevListItem = list[listIndex - 1]; + const attributeMismatchIndex = attributes.findIndex((attribute) => { + const hasSameCurrentAttribute = compareItemAttributes( + listItem, + prevListItem, + attribute, + ); + + return !hasSameCurrentAttribute; + }); + + if (attributeMismatchIndex === -1) { + return [ + { + type: 'list-item' as const, + value: listItem, + level: attributes.length, + }, + ]; + } + + const groupKey = getGroupKey(listItem, attributes); + const headings = attributes.map((attribute, i) => { + if (i < attributeMismatchIndex) { + return undefined; + } + + return { + type: 'heading' as const, + value: listItem, + attribute, + level: i, + groupKey, + }; + }).filter(isDefined); + + return [ + ...headings, + { + type: 'list-item' as const, + value: listItem, + level: attributes.length, + }, + ]; + }); + + return groupedItems; +} + +export type PutNull = { + [key in keyof T]: T[key] extends undefined ? null : T[key]; +} +export function putNull(value: T) { + type PartialWithNull = { + [P in keyof Q]: Q[P] | null; + }; + const copy: PartialWithNull = { ...value }; + Object.keys(copy).forEach((key) => { + const safeKey = key as keyof T; + if (copy[safeKey] === undefined) { + copy[safeKey] = null; + } + }); + + return copy as PutNull; +} +type PutUndefined = { + [key in keyof T]: T[key] extends null ? undefined : T[key]; +} +export function putUndefined(value: T) { + const copy: Partial = { ...value }; + Object.keys(copy).forEach((key) => { + const safeKey = key as keyof T; + if (copy[safeKey] === null) { + copy[safeKey] = undefined; + } + }); + + return copy as PutUndefined; +} diff --git a/src/utils/constants.ts b/src/utils/constants.ts index ef93e69..352e9ff 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -1,16 +1,27 @@ -import { ConfigStorage } from './types'; - -export const KEY_CONFIG_STORAGE = 'timur-config'; +import { + ConfigStorage, + NumericOption, +} from './types'; export const defaultConfigValue: ConfigStorage = { defaultTaskType: undefined, defaultTaskStatus: 'DONE', editingMode: 'normal', + indent: true, compactTextArea: false, checkboxForStatus: false, - showInputIcons: false, startSidebarShown: window.innerWidth >= 900, endSidebarShown: false, + dailyJournalGrouping: { + groupLevel: 2, + joinLevel: 2, + }, + dailyJournalAttributeOrder: [ + { key: 'project', sortDirection: 1 }, + { key: 'contract', sortDirection: 1 }, + { key: 'task', sortDirection: 1 }, + { key: 'status', sortDirection: 1 }, + ], }; export const colorscheme: [string, string][] = [ @@ -33,3 +44,22 @@ export const colorscheme: [string, string][] = [ // horchata 8 ['#7d5327', '#ecdecc'], ]; + +// FIXME: We should instead generate these options +export const numericOptions: NumericOption[] = [ + { key: 1, label: '1' }, + { key: 2, label: '2' }, + { key: 3, label: '3' }, + { key: 4, label: '4' }, + { key: 5, label: '5' }, + { key: 6, label: '6' }, + { key: 7, label: '7' }, + { key: 8, label: '8' }, + { key: 9, label: '9' }, +]; +export function numericOptionKeySelector(option: NumericOption) { + return option.key; +} +export function numericOptionLabelSelector(option: NumericOption) { + return option.label; +} diff --git a/src/utils/localStorage.ts b/src/utils/localStorage.ts index 2b854ca..80cb1be 100644 --- a/src/utils/localStorage.ts +++ b/src/utils/localStorage.ts @@ -1,12 +1,13 @@ +import { isNotDefined } from '@togglecorp/fujs'; + export function getFromStorage(key: string) { const val = localStorage.getItem(key); return val === null || val === undefined ? undefined : JSON.parse(val) as T; } -export function removeFromStorage(key: string) { - localStorage.removeItem(key); -} - -export function setToStorage(key: string, value: T) { +export function setToStorage(key: string, value: unknown) { + if (isNotDefined(value)) { + localStorage.removeItem(key); + } localStorage.setItem(key, JSON.stringify(value)); } diff --git a/src/utils/resolveUrl.ts b/src/utils/resolveUrl.ts deleted file mode 100644 index 8c6880a..0000000 --- a/src/utils/resolveUrl.ts +++ /dev/null @@ -1,9 +0,0 @@ -// eslint-disable-next-line import/prefer-default-export -export function resolveUrl(from: string, to: string) { - const resolvedUrl = new URL(to, new URL(from, 'resolve://')); - if (resolvedUrl.protocol === 'resolve:') { - const { pathname, search, hash } = resolvedUrl; - return pathname + search + hash; - } - return resolvedUrl.toString(); -} diff --git a/src/utils/temporal.ts b/src/utils/temporal.ts index e96d8a6..80e830b 100644 --- a/src/utils/temporal.ts +++ b/src/utils/temporal.ts @@ -1,11 +1,5 @@ import { isNotDefined } from '@togglecorp/fujs'; -export interface RelativeTime { - direction: 'past' | 'present' | 'future', - resolution: 'second' | 'minute' | 'hour' | 'day'; - value: number; -} - export interface RelativeDate { direction: 'past' | 'present' | 'future', resolution: 'day' | 'week' | 'month' | 'year'; @@ -14,22 +8,14 @@ export interface RelativeDate { export type DateLike = string | number | Date; -export function incrementDate(date: Date, days = 1) { +function incrementDate(date: Date, days = 1) { const newDate = new Date(date); newDate.setDate(date.getDate() + days); newDate.setHours(0, 0, 0, 0); return newDate; } -export function incrementMonth(date: Date, months = 1) { - const newDate = new Date(date); - newDate.setDate(1); - newDate.setMonth(date.getMonth() + months); - newDate.setHours(0, 0, 0, 0); - return newDate; -} - -export function getNumberOfDays(start: Date, end: Date) { +function getNumberOfDays(start: Date, end: Date) { const startDate = new Date(start); startDate.setHours(0, 0, 0, 0); @@ -44,7 +30,7 @@ export function getNumberOfDays(start: Date, end: Date) { return numDays; } -export function getNumberOfMonths(start: Date, end: Date) { +function getNumberOfMonths(start: Date, end: Date) { const monthDiff = Math.abs( ((12 * end.getFullYear()) + end.getMonth()) - ((12 * start.getFullYear()) + start.getMonth()), @@ -52,7 +38,7 @@ export function getNumberOfMonths(start: Date, end: Date) { return monthDiff; } -export function getTemporalDiff(min: DateLike, max: DateLike) { +function getTemporalDiff(min: DateLike, max: DateLike) { const minDate = new Date(min); const maxDate = new Date(max); @@ -160,72 +146,3 @@ export function formatRelativeDateToString(relativeDate: RelativeDate | undefine return value === 1 ? `In a ${resolution}` : `In ${value} ${resolution}s`; } - -export function toRelativeTime(timestamp: number): RelativeTime { - const now = Date.now(); - const diff = now - timestamp; - - if (diff === 0) { - return { - direction: 'present', - resolution: 'second', - value: 0, - }; - } - - const direction = diff < 0 ? 'future' : 'past'; - const absDiff = Math.abs(diff); - - const seconds = Math.floor((absDiff / 1000) % 60); - const minutes = Math.floor((absDiff / (1000 * 60)) % 60); - const hours = Math.floor((absDiff / (1000 * 60 * 60)) % 24); - const days = Math.floor(absDiff / (1000 * 60 * 60 * 24)); - - if (days > 0) { - return { - direction, - resolution: 'day', - value: days, - }; - } - - if (hours > 0) { - return { - direction, - resolution: 'hour', - value: hours, - }; - } - - if (minutes > 0) { - return { - direction, - resolution: 'minute', - value: minutes, - }; - } - - return { - direction, - resolution: 'second', - value: Math.max(1, seconds), - }; -} - -export function formatRelativeTimeToString(relativeTime: RelativeTime) { - const { - direction, - resolution, - value, - } = relativeTime; - - if (direction === 'present') { - return 'now'; - } - - if (direction === 'past') { - return value === 1 ? `A ${resolution} ago` : `${value} ${resolution}s ago`; - } - - return value === 1 ? `In a ${resolution}` : `In ${value} ${resolution}s`; -} diff --git a/src/utils/types.ts b/src/utils/types.ts index 1f11e8f..5c31fa9 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -16,29 +16,38 @@ export type SpacingVariant = 'xs' | 'sm' | 'md' | 'lg' | 'xl'; export type EditingMode = 'normal' | 'vim'; export type Task = EnumsQuery['private']['allActiveTasks'][number]; -export type Contract = Task['contract']; -export type Project = Contract['project']; type WorkItemType = TimeEntryTypeEnum; export type WorkItemStatus = TimeEntryStatusEnum; export type WorkItem = Omit & { clientId: string }; -export interface Note { - id: string; - date: string; - content: string | undefined; +export type DailyJournalAttributeKeys = 'project' | 'contract' | 'task' | 'status'; +export interface DailyJournalAttribute { + key: DailyJournalAttributeKeys; + sortDirection: number; +} + +export interface DailyJournalGrouping { + groupLevel: number; + joinLevel: number; } export type ConfigStorage = { defaultTaskType: WorkItemType | undefined, defaultTaskStatus: WorkItemStatus, + editingMode: EditingMode, + checkboxForStatus: boolean, - showInputIcons: boolean, + compactTextArea: boolean, + indent: boolean, + + dailyJournalAttributeOrder: DailyJournalAttribute[]; + dailyJournalGrouping: DailyJournalGrouping; + startSidebarShown: boolean, endSidebarShown: boolean, - compactTextArea: boolean, } export interface GeneralEvent { @@ -47,6 +56,10 @@ export interface GeneralEvent { typeDisplay: string; icon: React.ReactNode; name: string; - date: string; remainingDays: number; } + +export interface NumericOption { + key: number; + label: string; +} diff --git a/src/views/DailyJournal/AddWorkItemDialog/index.tsx b/src/views/DailyJournal/AddWorkItemDialog/index.tsx index 22b4f3f..089de64 100644 --- a/src/views/DailyJournal/AddWorkItemDialog/index.tsx +++ b/src/views/DailyJournal/AddWorkItemDialog/index.tsx @@ -6,7 +6,7 @@ import { useRef, useState, } from 'react'; -import { IoSearch } from 'react-icons/io5'; +import { RiSearchLine } from 'react-icons/ri'; import { listToGroupList } from '@togglecorp/fujs'; import Dialog from '#components/Dialog'; @@ -94,7 +94,7 @@ function AddWorkItemDialog(props: Props) { focusElementRef={titleInputRef} >
- Please select a task to add the workitems + Please select a task to add new entry
+ )} />
) => void; - onWorkItemChange: (clientId: string, ...entries: EntriesAsList) => void; - onWorkItemDelete: (clientId: string) => void; -} - -function ContractGroupedView(props: Props) { - const { - className, - contract, - project, - workItems, - onWorkItemClone, - onWorkItemChange, - onWorkItemDelete, - } = props; - - const [config] = useLocalStorage( - KEY_CONFIG_STORAGE, - defaultConfigValue, - ); - - const totalHours = useMemo( - () => ( - sum(workItems.map((item) => item.duration).filter(isDefined)) - ), - [workItems], - ); - - const rendererParams = useCallback( - (_: string, item: WorkItem): WorkItemRowProps => ({ - workItem: item, - onClone: onWorkItemClone, - onChange: onWorkItemChange, - onDelete: onWorkItemDelete, - contract, - }), - [ - onWorkItemClone, - onWorkItemChange, - onWorkItemDelete, - contract, - ], - ); - - return ( -
-
- -
-

- {project.name} -

-
- {contract.name} -
-
-
- {config.showInputIcons && ( - - )} - {getDurationString(totalHours)} -
-
- -
- ); -} - -export default ContractGroupedView; diff --git a/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/styles.module.css b/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/styles.module.css deleted file mode 100644 index dcfdf80..0000000 --- a/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/styles.module.css +++ /dev/null @@ -1,60 +0,0 @@ -.contract-grouped-view { - display: flex; - flex-direction: column; - border-radius: var(--border-radius-lg); - - .heading { - display: flex; - gap: var(--spacing-sm); - align-items: flex-start; - - .display-picture { - font-size: var(--font-size-xl); - } - - .text-section { - display: flex; - align-items: baseline; - gap: 0 var(--spacing-sm); - flex-grow: 1; - flex-wrap: wrap; - - .contract-name { - color: var(--color-text-light); - font-size: var(--font-size-sm); - } - } - - .duration { - display: flex; - align-items: center; - align-self: flex-end; - flex-shrink: 0; - padding: var(--spacing-xs) 0; - width: calc(8rem + 2 * var(--spacing-xs)); - color: var(--color-text-light); - font-weight: var(--font-weight-bold); - gap: var(--spacing-2xs); - - &.with-icon { - width: calc(9rem + 2 * var(--spacing-xs)); - } - - @media screen and (max-width: 900px) { - width: unset; - - &.with-icon { - width: unset; - } - } - } - } - - .work-item-list { - display: flex; - flex-direction: column; - border-radius: var(--border-radius-lg); - background-color: var(--color-foreground); - padding: var(--spacing-3xs) 0; - } -} diff --git a/src/views/DailyJournal/DayView/ProjectGroupedView/index.tsx b/src/views/DailyJournal/DayView/ProjectGroupedView/index.tsx deleted file mode 100644 index d00ffd2..0000000 --- a/src/views/DailyJournal/DayView/ProjectGroupedView/index.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { useCallback } from 'react'; -import { _cs } from '@togglecorp/fujs'; - -import List from '#components/List'; -import { - Contract, - EntriesAsList, - Project, - WorkItem, -} from '#utils/types'; - -import ContractGroupedView, { Props as ContractGroupedViewProps } from './ContractGroupedView'; - -import styles from './styles.module.css'; - -type ContractGroupedWorkItem = { - contract: Contract; - workItems: WorkItem[]; -}; - -function getId(item: ContractGroupedWorkItem) { - return item.contract.id; -} - -export interface Props { - className?: string; - project: Project; - contracts: ContractGroupedWorkItem[]; - onWorkItemClone: (clientId: string, override?: Partial) => void; - onWorkItemChange: (clientId: string, ...entries: EntriesAsList) => void; - onWorkItemDelete: (clientId: string) => void; -} - -function ProjectGroupedView(props: Props) { - const { - className, - project, - contracts, - onWorkItemClone, - onWorkItemChange, - onWorkItemDelete, - } = props; - - const rendererParams = useCallback( - (_: string, item: ContractGroupedWorkItem): ContractGroupedViewProps => ({ - project, - contract: item.contract, - workItems: item.workItems, - onWorkItemClone, - onWorkItemChange, - onWorkItemDelete, - }), - [ - project, - onWorkItemClone, - onWorkItemChange, - onWorkItemDelete, - ], - ); - - return ( - - ); -} - -export default ProjectGroupedView; diff --git a/src/views/DailyJournal/DayView/ProjectGroupedView/styles.module.css b/src/views/DailyJournal/DayView/ProjectGroupedView/styles.module.css deleted file mode 100644 index 0221640..0000000 --- a/src/views/DailyJournal/DayView/ProjectGroupedView/styles.module.css +++ /dev/null @@ -1,5 +0,0 @@ -.contract-grouped-list { - display: flex; - flex-direction: column; - gap: var(--spacing-md); -} diff --git a/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/WorkItemRow/index.tsx b/src/views/DailyJournal/DayView/WorkItemRow/index.tsx similarity index 81% rename from src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/WorkItemRow/index.tsx rename to src/views/DailyJournal/DayView/WorkItemRow/index.tsx index 1d6bda1..5c0f9c3 100644 --- a/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/WorkItemRow/index.tsx +++ b/src/views/DailyJournal/DayView/WorkItemRow/index.tsx @@ -5,19 +5,12 @@ import { useState, } from 'react'; import { - FcClock, - FcDocument, - FcPackage, - FcPieChart, - FcRuler, -} from 'react-icons/fc'; -import { - IoCopyOutline, - IoEllipsisVertical, - IoPencilOutline, - IoSwapHorizontal, - IoTrashOutline, -} from 'react-icons/io5'; + RiDeleteBin2Line, + RiEditBoxLine, + RiFileCopyLine, + RiMoreLine, + RiSwap2Line, +} from 'react-icons/ri'; import { _cs, isDefined, @@ -32,19 +25,14 @@ import DurationInput from '#components/DurationInput'; import MonthlyCalendar from '#components/MonthlyCalendar'; import SelectInput from '#components/SelectInput'; import TextArea from '#components/TextArea'; +import DateContext from '#contexts/date'; import EnumsContext from '#contexts/enums'; import SizeContext from '#contexts/size'; import { EnumsQuery } from '#generated/types/graphql'; import { useFocusClient } from '#hooks/useFocus'; import useLocalStorage from '#hooks/useLocalStorage'; +import { colorscheme } from '#utils/constants'; import { - colorscheme, - defaultConfigValue, - KEY_CONFIG_STORAGE, -} from '#utils/constants'; -import { - ConfigStorage, - Contract, EntriesAsList, Task, WorkItem, @@ -88,44 +76,44 @@ function defaultColorSelector(_: T, i: number): [string, string] { return colorscheme[i % colorscheme.length]; } -export interface Props { +interface Props { className?: string; workItem: WorkItem; - contract: Contract; + contractId: string | undefined; - onClone: (clientId: string, override?: Partial) => void; - onChange: (clientId: string, ...entries: EntriesAsList) => void; - onDelete: (clientId: string) => void; + onClone?: (clientId: string, override?: Partial) => void; + onChange?: (clientId: string, ...entries: EntriesAsList) => void; + onDelete?: (clientId: string) => void; } function WorkItemRow(props: Props) { const { className, workItem, - contract, + contractId, onClone, onDelete, onChange, } = props; const { enums } = useContext(EnumsContext); - const { width: windowWidth } = useContext(SizeContext); + const { screen } = useContext(SizeContext); + const inputRef = useFocusClient(workItem.clientId); - const [config] = useLocalStorage( - KEY_CONFIG_STORAGE, - defaultConfigValue, - ); + const [config] = useLocalStorage('timur-config'); const setFieldValue = useCallback( (...entries: EntriesAsList) => { - onChange(workItem.clientId, ...entries); + if (onChange) { + onChange(workItem.clientId, ...entries); + } }, [workItem.clientId, onChange], ); const filteredTaskList = useMemo( - () => enums?.private?.allActiveTasks?.filter((task) => task.contract.id === contract.id), - [contract.id, enums], + () => enums?.private?.allActiveTasks?.filter((task) => task.contract.id === contractId), + [contractId, enums], ); const handleStatusCheck = useCallback(() => { @@ -168,7 +156,7 @@ function WorkItemRow(props: Props) { (newValue: string) => { if (dialogState === 'move') { setFieldValue(newValue, 'date'); - } else if (dialogState === 'copy') { + } else if (dialogState === 'copy' && onClone) { onClone(workItem.clientId, { date: newValue }); } setDialogState(undefined); @@ -178,7 +166,9 @@ function WorkItemRow(props: Props) { const handleClone = useCallback( () => { - onClone(workItem.clientId); + if (onClone) { + onClone(workItem.clientId); + } }, [onClone, workItem.clientId], ); @@ -206,7 +196,6 @@ function WorkItemRow(props: Props) { onChange={setFieldValue} value={workItem.status} nonClearable - icons={config.showInputIcons && } /> ); @@ -221,12 +210,6 @@ function WorkItemRow(props: Props) { onChange={setFieldValue} value={workItem.task} nonClearable - icons={( - config.showInputIcons - // NOTE: hide/unhide icon wrt "checkbox for status" flag - && (windowWidth < 900 || !config.checkboxForStatus) - && - )} /> ); @@ -238,12 +221,6 @@ function WorkItemRow(props: Props) { title="Description" value={workItem.description} onChange={setFieldValue} - icons={( - config.showInputIcons - // NOTE: hide/unhide icon wrt "checkbox for status" flag - && (windowWidth >= 900 || !config.checkboxForStatus) - && - )} placeholder="Description" compact={config.compactTextArea} /> @@ -260,7 +237,6 @@ function WorkItemRow(props: Props) { colorSelector={defaultColorSelector} onChange={setFieldValue} value={workItem.type} - icons={config.showInputIcons && } /> ); @@ -271,7 +247,6 @@ function WorkItemRow(props: Props) { title="Hours" value={workItem.duration} onChange={setFieldValue} - icons={config.showInputIcons && } placeholder="hh:mm" /> ); @@ -285,10 +260,10 @@ function WorkItemRow(props: Props) { onClick={handleClone} spacing="xs" > - + } + label={} withoutDropdownIcon variant="transparent" persistent @@ -299,7 +274,7 @@ function WorkItemRow(props: Props) { name={workItem.clientId} title="Edit this entry" onClick={undefined} - icons={} + icons={} disabled > Edit entry @@ -309,7 +284,7 @@ function WorkItemRow(props: Props) { name={workItem.clientId} title="Move this entry to another day" onClick={handleCopyDialogOpen} - icons={} + icons={} > Copy to another day @@ -318,7 +293,7 @@ function WorkItemRow(props: Props) { name={workItem.clientId} title="Move this entry to another day" onClick={handleMoveDialogOpen} - icons={} + icons={} > Move to another day @@ -338,7 +313,7 @@ function WorkItemRow(props: Props) {

)} - icons={} + icons={} > Delete entry @@ -346,10 +321,7 @@ function WorkItemRow(props: Props) {
); - const today = new Date(); - const selectedDate = isDefined(workItem.date) - ? new Date(workItem.date) - : today; + const { year, month } = useContext(DateContext); return ( <> @@ -358,11 +330,10 @@ function WorkItemRow(props: Props) { className={_cs( styles.workItemRow, config.checkboxForStatus && styles.checkboxForStatus, - config.showInputIcons && styles.withIcons, className, )} > - {windowWidth >= 900 ? ( + {screen === 'desktop' ? ( <> {statusInput} {taskInput} @@ -396,8 +367,8 @@ function WorkItemRow(props: Props) { > diff --git a/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/WorkItemRow/styles.module.css b/src/views/DailyJournal/DayView/WorkItemRow/styles.module.css similarity index 78% rename from src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/WorkItemRow/styles.module.css rename to src/views/DailyJournal/DayView/WorkItemRow/styles.module.css index b727bc2..7568ef7 100644 --- a/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/WorkItemRow/styles.module.css +++ b/src/views/DailyJournal/DayView/WorkItemRow/styles.module.css @@ -2,19 +2,11 @@ display: grid; align-items: flex-start; grid-template-columns: 5rem 2fr 5fr 9rem 4rem 4rem; - padding: var(--spacing-2xs) var(--spacing-xs); + padding: var(--spacing-xs) var(--spacing-sm); gap: var(--spacing-xs); - &.with-icons { - grid-template-columns: 5.5rem 2fr 5fr 12rem 5rem 4rem; - } - &.checkbox-for-status { grid-template-columns: 1rem 2fr 5fr 10rem 4rem 4rem; - - &.with-icons { - grid-template-columns: 1rem 2fr 5fr 10rem 5rem 4rem; - } } .actions { @@ -49,16 +41,8 @@ grid-template-columns: auto; gap: var(--spacing-sm); - &.with-icons { - grid-template-columns: auto; - } - &.checkbox-for-status { grid-template-columns: 1rem 1fr; - - &.with-icons { - grid-template-columns: 1rem 1fr; - } } .compact-options { diff --git a/src/views/DailyJournal/DayView/index.tsx b/src/views/DailyJournal/DayView/index.tsx index a5fb25c..2706207 100644 --- a/src/views/DailyJournal/DayView/index.tsx +++ b/src/views/DailyJournal/DayView/index.tsx @@ -1,36 +1,36 @@ import { + ElementType, + Fragment, useCallback, useContext, useMemo, } from 'react'; -import { FcClock } from 'react-icons/fc'; import { _cs, + bound, + compareString, isDefined, isNotDefined, - listToGroupList, - mapToList, sum, } from '@togglecorp/fujs'; -import List from '#components/List'; +import DefaultMessage from '#components/DefaultMessage'; +import Indent from '#components/Indent'; import EnumsContext from '#contexts/enums'; import useFormattedRelativeDate from '#hooks/useFormattedRelativeDate'; import useLocalStorage from '#hooks/useLocalStorage'; -import { getDurationString } from '#utils/common'; import { - defaultConfigValue, - KEY_CONFIG_STORAGE, -} from '#utils/constants'; + getDurationString, + groupListByAttributes, + sortByAttributes, +} from '#utils/common'; import { - ConfigStorage, - Contract, + DailyJournalAttribute, EntriesAsList, - Project, WorkItem, } from '#utils/types'; -import ProjectGroupedView, { Props as ProjectGroupedViewProps } from './ProjectGroupedView'; +import WorkItemRow from './WorkItemRow'; import styles from './styles.module.css'; @@ -44,18 +44,6 @@ const dateFormatter = new Intl.DateTimeFormat( }, ); -interface ProjectGroupedWorkItem { - project: Project, - contracts: { - contract: Contract, - workItems: WorkItem[], - }[], -} - -function getId(item: ProjectGroupedWorkItem) { - return item.project.id; -} - interface Props { className?: string; workItems: WorkItem[] | undefined; @@ -80,57 +68,39 @@ function DayView(props: Props) { } = props; const { taskById } = useContext(EnumsContext); - const [storedConfig] = useLocalStorage( - KEY_CONFIG_STORAGE, - defaultConfigValue, - ); - const groupedWorkItems = useMemo( - (): ProjectGroupedWorkItem[] | undefined => { - if (isNotDefined(workItems) || isNotDefined(taskById)) { - return undefined; - } + const [storedConfig] = useLocalStorage('timur-config'); - return mapToList(listToGroupList( - mapToList(listToGroupList( - workItems, - (workItem) => taskById[workItem.task].contract.id, - undefined, - (list) => ({ - contract: taskById[list[0].task].contract, - workItems: list, - }), - )), - (contractGrouped) => contractGrouped.contract.project.id, - undefined, - (list) => ({ - project: list[0].contract.project, - contracts: list, - }), - )); - }, - [workItems, taskById], - ); + const getWorkItemLabelFromAttr = useCallback(( + item: WorkItem, + attr: DailyJournalAttribute, + ) => { + if (attr.key === 'status') { + return item.status; + } - type GroupedWorkItem = NonNullable<(typeof groupedWorkItems)>[number]; - - const rendererParams = useCallback( - (_: string, item: GroupedWorkItem): ProjectGroupedViewProps => ({ - contracts: item.contracts, - project: item.project, - onWorkItemClone, - onWorkItemChange, - onWorkItemDelete, - }), - [ - onWorkItemClone, - onWorkItemChange, - onWorkItemDelete, - ], - ); + if (isNotDefined(taskById)) { + return undefined; + } - const formattedDate = dateFormatter.format(new Date(selectedDate)); + const taskDetails = taskById[item.task]; + + if (attr.key === 'task') { + return taskDetails.name; + } + + if (attr.key === 'contract') { + return taskDetails.contract.name; + } + + if (attr.key === 'project') { + return taskDetails.contract.project.name; + } + return undefined; + }, [taskById]); + + const formattedDate = dateFormatter.format(new Date(selectedDate)); const formattedRelativeDate = useFormattedRelativeDate(selectedDate); const totalHours = useMemo( @@ -144,6 +114,54 @@ function DayView(props: Props) { [workItems], ); + const { + dailyJournalAttributeOrder, + dailyJournalGrouping: { + groupLevel, + joinLevel, + }, + indent, + } = storedConfig; + + const groupedItems = useMemo(() => { + if (isNotDefined(taskById) || isNotDefined(workItems)) { + return []; + } + + const sortedWorkItems = sortByAttributes( + workItems, + dailyJournalAttributeOrder, + (a, b, attr) => ( + compareString( + getWorkItemLabelFromAttr(a, attr), + getWorkItemLabelFromAttr(b, attr), + attr.sortDirection, + ) + ), + ); + + return groupListByAttributes( + sortedWorkItems, + dailyJournalAttributeOrder.slice(0, groupLevel), + (a, b, attr) => { + const aValue = getWorkItemLabelFromAttr(a, attr); + const bValue = getWorkItemLabelFromAttr(b, attr); + + return aValue === bValue; + }, + (item, attrs) => { + const values = attrs.map((attr) => getWorkItemLabelFromAttr(item, attr)).join(';'); + return values; + }, + ); + }, [ + taskById, + workItems, + getWorkItemLabelFromAttr, + dailyJournalAttributeOrder, + groupLevel, + ]); + return (
@@ -156,43 +174,117 @@ function DayView(props: Props) { {isDefined(totalHours) && (
- {storedConfig.showInputIcons && ( - - )}
{getDurationString(totalHours)}
)}
- - Click on - {' '} - Add entry - {' '} - to create a new entry. - - )} /> + {!errored && !loading && ( +
+ {groupedItems.map((groupedItem) => { + if (groupedItem.type === 'heading') { + // Main Heading + // NOTE: Need to add 1 as groupLevel and level starts from 1 and 0 resp. + if (groupedItem.level + 1 < (groupLevel - joinLevel + 1)) { + const headingText = getWorkItemLabelFromAttr( + groupedItem.value, + groupedItem.attribute, + ); + + const Heading = `h${bound(groupedItem.level + 2, 2, 4)}` as unknown as ElementType; + + return ( + + {indent && } + {headingText} + + ); + } + + // Sub Headings + // NOTE: We only need to show one subheading after the main headings + // NOTE: Need to add 1 as groupLevel and level starts from 1 and 0 resp. + if (groupedItem.level + 1 === groupLevel) { + return ( +

+ {indent && ( + + )} + {dailyJournalAttributeOrder.map((attribute, i) => { + if (i >= groupLevel) { + return null; + } + + const currentLabel = getWorkItemLabelFromAttr( + groupedItem.value, + attribute, + ); + + if (i < (groupLevel - joinLevel)) { + return null; + } + + return ( + + {i > (groupLevel - joinLevel) && ( +
+ )} +
{currentLabel}
+ + ); + })} +

+ ); + } + + return null; + } + + const taskDetails = taskById?.[groupedItem.value.task]; + if (!taskDetails) { + return null; + } + + return ( +
+ {indent && ( + + )} + +
+ ); + })} +
+ )}
); } diff --git a/src/views/DailyJournal/DayView/styles.module.css b/src/views/DailyJournal/DayView/styles.module.css index 13a4709..a8a7767 100644 --- a/src/views/DailyJournal/DayView/styles.module.css +++ b/src/views/DailyJournal/DayView/styles.module.css @@ -31,20 +31,11 @@ font-weight: var(--font-weight-bold); gap: var(--spacing-2xs); - &.with-icon { - width: calc(9rem + 2 * var(--spacing-xs)); - } - @media screen and (max-width: 900px) { flex-grow: 1; justify-content: flex-end; padding: unset; width: unset; - - &.with-icon { - padding: unset; - width: unset; - } } } } @@ -54,4 +45,47 @@ flex-direction: column; gap: var(--spacing-md); } + + .new-group { + display: flex; + flex-direction: column; + gap: var(--spacing-2xs); + + .nested-heading { + display: flex; + align-items: center; + gap: var(--spacing-sm); + color: var(--color-text-light); + font-weight: var(--font-weight-semibold); + + &h2 { + margin-top: var(--spacing-md); + } + } + + .joined-heading { + display: flex; + align-items: center; + gap: var(--spacing-sm); + color: var(--color-text-light); + font-weight: var(--font-weight-semibold); + + .separator { + border-radius: 0.5rem; + background-color: var(--color-separator); + width: 0.5rem; + height: 0.5rem; + } + } + + .work-item-container { + display: flex; + gap: var(--spacing-sm); + + .work-item { + flex-grow: 1; + background-color: var(--color-foreground); + } + } + } } diff --git a/src/views/DailyJournal/StartSidebar/index.tsx b/src/views/DailyJournal/StartSidebar/index.tsx index 23fd6d6..c2507b0 100644 --- a/src/views/DailyJournal/StartSidebar/index.tsx +++ b/src/views/DailyJournal/StartSidebar/index.tsx @@ -1,81 +1,156 @@ import { useCallback, useContext, + useMemo, } from 'react'; +import { RiDraggable } from 'react-icons/ri'; import { + closestCenter, + DndContext, + DragEndEvent, + DraggableAttributes, + PointerSensor, + useSensor, + useSensors, +} from '@dnd-kit/core'; +import { SyntheticListenerMap } from '@dnd-kit/core/dist/hooks/utilities'; +import { + SortableContext, + useSortable, + verticalListSortingStrategy, +} from '@dnd-kit/sortable'; +import { + _cs, isDefined, - isFalsyString, isNotDefined, - listToGroupList, - mapToList, } from '@togglecorp/fujs'; -import Button from '#components/Button'; -import Checkbox from '#components/Checkbox'; -import Link from '#components/Link'; import MonthlyCalendar from '#components/MonthlyCalendar'; -import SelectInput from '#components/SelectInput'; -import EnumsContext from '#contexts/enums'; -import { EnumsQuery } from '#generated/types/graphql'; +import RadioInput from '#components/RadioInput'; +import DateContext from '#contexts/date'; import useLocalStorage from '#hooks/useLocalStorage'; import useSetFieldValue from '#hooks/useSetFieldValue'; import { - colorscheme, defaultConfigValue, - KEY_CONFIG_STORAGE, + numericOptionKeySelector, + numericOptionLabelSelector, + numericOptions, } from '#utils/constants'; import { - ConfigStorage, - EditingMode, - WorkItem, - WorkItemStatus, + DailyJournalAttribute, + DailyJournalAttributeKeys, + DailyJournalGrouping, } from '#utils/types'; import styles from './styles.module.css'; -type EditingOption = { key: EditingMode, label: string }; -function editingOptionKeySelector(item: EditingOption) { - return item.key; -} -function editingOptionLabelSelector(item: EditingOption) { - return item.label; -} -const editingOptions: EditingOption[] = [ - { key: 'normal', label: 'Normies' }, - { key: 'vim', label: 'Vim Masterace' }, -]; - -type WorkItemTypeOption = EnumsQuery['enums']['TimeEntryType'][number]; -function workItemTypeKeySelector(item: WorkItemTypeOption) { - return item.key; -} -function workItemTypeLabelSelector(item: WorkItemTypeOption) { - return item.label; -} +const dailyJournalAttributeDetails: Record = { + project: { label: 'Project' }, + contract: { label: 'Contract' }, + task: { label: 'Task' }, + status: { label: 'Status' }, +}; -type WorkItemStatusOption = EnumsQuery['enums']['TimeEntryStatus'][number]; -function workItemStatusKeySelector(item: WorkItemStatusOption) { - return item.key; +interface ItemProps { + className?: string; + attribute: DailyJournalAttribute; + setNodeRef?: (node: HTMLElement | null) => void; + draggableAttributes?: DraggableAttributes; + draggableListeners?: SyntheticListenerMap | undefined; + transformStyle?: string | undefined; + transitionStyle?: string | undefined; } -function workItemStatusLabelSelector(item: WorkItemStatusOption) { - return item.label; + +function Item(props: ItemProps) { + const { + className, + setNodeRef, + attribute, + draggableAttributes, + draggableListeners, + transformStyle, + transitionStyle, + } = props; + + return ( +
+
+ +
+
+ {dailyJournalAttributeDetails[attribute.key].label} +
+
+ ); } -function workItemStatusColorSelector(item: WorkItemStatusOption): [string, string] { - if (item.key === 'DOING') { - return colorscheme[1]; - } - if (item.key === 'DONE') { - return colorscheme[5]; - } - return colorscheme[7]; + +interface SortableItemProps { + className?: string; + attribute: DailyJournalAttribute; } -function defaultColorSelector(_: T, i: number): [string, string] { - return colorscheme[i % colorscheme.length]; +function SortableItem(props: SortableItemProps) { + const { + attribute, + className, + } = props; + + const { + attributes, + listeners, + setNodeRef, + transform, + transition, + isDragging, + over, + } = useSortable({ id: attribute.key }); + + const transformStyle = useMemo(() => { + if (isNotDefined(transform)) { + return undefined; + } + + const transformations = [ + // isDefined(transform.x) && `translateX(${transform.x}px)`, + isDefined(transform.y) && `translateY(${transform.y}px)`, + isDefined(transform.scaleX) && `scaleY(${transform.scaleX})`, + isDefined(transform.scaleY) && `scaleY(${transform.scaleY})`, + ]; + + return transformations.filter(Boolean).join(' '); + }, [transform]); + + return ( + + ); } interface Props { - workItems: WorkItem[]; selectedDate: string; setSelectedDate: (newDate: string) => void; calendarComponentRef?: React.MutableRefObject<{ @@ -86,68 +161,65 @@ interface Props { function StartSidebar(props: Props) { const { calendarComponentRef, - workItems, selectedDate, setSelectedDate, } = props; - const { taskById } = useContext(EnumsContext); - const { enums } = useContext(EnumsContext); - - const [storedConfig, setStoredConfig] = useLocalStorage( - KEY_CONFIG_STORAGE, - defaultConfigValue, - ); + const [storedConfig, setStoredConfig] = useLocalStorage('timur-config'); const setConfigFieldValue = useSetFieldValue(setStoredConfig); - const handleCopyTextButtonClick = useCallback( - () => { - function toSubItem(workItem: WorkItem) { - const description = workItem.description ?? '??'; - const status: WorkItemStatus = workItem.status ?? 'TODO'; - const task = taskById?.[workItem.task]?.name ?? '??'; - - return description - .split('\n') - .map((item, i) => ([ - i === 0 ? ' -' : ' ', - status !== 'DONE' ? `\`${status.toUpperCase()}\`` : undefined, - i === 0 ? `${task}: ${item}` : item, - ].filter(isDefined).join(' '))) - .join('\n'); - } - - if (isNotDefined(taskById)) { - return; - } - - const groupedWorkItems = mapToList(listToGroupList( - workItems, - (workItem) => taskById[workItem.task].contract.project.id, - undefined, - (list) => ({ - project: taskById?.[list[0].task].contract.project, - workItems: list, - }), - )); - - const text = groupedWorkItems.map((projectGrouped) => { - const { project, workItems: projectWorkItems } = projectGrouped; - - return `- ${project.name}\n${projectWorkItems.map((workItem) => toSubItem(workItem)).join('\n')}`; - }).join('\n'); - - if (isFalsyString(text)) { - return; - } - - window.navigator.clipboard.writeText(text); - }, - [workItems, taskById], + const { year, month } = useContext(DateContext); + + const updateJournalGrouping = useCallback((value: number, name: 'groupLevel' | 'joinLevel') => { + const oldValue = storedConfig.dailyJournalGrouping + ?? defaultConfigValue.dailyJournalGrouping; + + if (name === 'groupLevel') { + setConfigFieldValue({ + groupLevel: value, + joinLevel: Math.min(oldValue.joinLevel, value), + } satisfies DailyJournalGrouping, 'dailyJournalGrouping'); + + return; + } + + setConfigFieldValue({ + groupLevel: oldValue.groupLevel, + joinLevel: Math.min(oldValue.groupLevel, value), + } satisfies DailyJournalGrouping, 'dailyJournalGrouping'); + }, [storedConfig.dailyJournalGrouping, setConfigFieldValue]); + + const sensors = useSensors( + useSensor(PointerSensor), ); - const date = new Date(selectedDate); + const handleDndEnd = useCallback((dragEndEvent: DragEndEvent) => { + const { + active, + over, + } = dragEndEvent; + + const oldAttributes = storedConfig.dailyJournalAttributeOrder + ?? defaultConfigValue.dailyJournalAttributeOrder; + + if (isNotDefined(active) || isNotDefined(over)) { + return; + } + + const newAttributes = [...oldAttributes]; + const sourceIndex = newAttributes.findIndex(({ key }) => active.id === key); + const destinationIndex = newAttributes.findIndex(({ key }) => over.id === key); + + if (sourceIndex === -1 || destinationIndex === -1) { + return; + } + + const [removedItem] = newAttributes.splice(sourceIndex, 1); + newAttributes.splice(destinationIndex, 0, removedItem); + + setConfigFieldValue(newAttributes, 'dailyJournalAttributeOrder'); + }, [setConfigFieldValue, storedConfig.dailyJournalAttributeOrder]); return (
-
- - Go to today - - +
+

Ordering

+
+ + ({ id: key }), + )} + strategy={verticalListSortingStrategy} + > + {storedConfig.dailyJournalAttributeOrder.map((attribute) => ( + + ))} + + +
-
+

- Quick Settings + Grouping

- - - - - -
diff --git a/src/views/DailyJournal/StartSidebar/styles.module.css b/src/views/DailyJournal/StartSidebar/styles.module.css index 5d69438..382fbc7 100644 --- a/src/views/DailyJournal/StartSidebar/styles.module.css +++ b/src/views/DailyJournal/StartSidebar/styles.module.css @@ -10,6 +10,55 @@ gap: var(--spacing-sm); } + .attributes { + display: flex; + flex-direction: column; + gap: var(--spacing-sm); + + .attribute-list { + display: flex; + flex-direction: column; + gap: var(--width-separator-md); + + &.dragging-over { + outline: var(--width-separator-md) solid var(--color-separator); + } + + .attribute { + display: flex; + align-items: center; + background-color: var(--color-foreground); + padding: var(--spacing-xs) var(--spacing-sm); + gap: var(--spacing-xs); + + &.dragging { + opacity: 0.8; + z-index: 1; + box-shadow: var(--box-shadow-md); + } + + .drag-handle { + cursor: grab; + } + + &:hover { + background-color: var(--color-tertiary); + } + + .label { + flex-grow: 1; + } + } + } + } + + .grouping { + display: flex; + flex-direction: column; + gap: var(--spacing-sm); + } + + .quick-settings { display: flex; flex-direction: column; diff --git a/src/views/DailyJournal/index.tsx b/src/views/DailyJournal/index.tsx index 98675ce..fe0bb2d 100644 --- a/src/views/DailyJournal/index.tsx +++ b/src/views/DailyJournal/index.tsx @@ -9,14 +9,14 @@ import { } from 'react'; import { FcHighPriority } from 'react-icons/fc'; import { - IoAdd, - IoCalendarOutline, - IoChevronBackSharp, - IoChevronForwardSharp, - IoNewspaperOutline, - IoStorefrontOutline, - IoTerminalOutline, -} from 'react-icons/io5'; + RiAddLine, + RiArrowLeftSLine, + RiArrowRightSLine, + RiCalendar2Line, + RiHomeOfficeLine, + RiStickyNoteAddLine, + RiTerminalBoxLine, +} from 'react-icons/ri'; import { useNavigate, useParams, @@ -27,6 +27,7 @@ import { encodeDate, isDefined, isNotDefined, + isTruthyString, } from '@togglecorp/fujs'; import { gql, @@ -40,6 +41,7 @@ import CalendarInput from '#components/CalendarInput'; import Link, { resolvePath } from '#components/Link'; import Page from '#components/Page'; import Portal from '#components/Portal'; +import DateContext from '#contexts/date'; import FocusContext from '#contexts/focus'; import NavbarContext from '#contexts/navbar'; import RouteContext from '#contexts/route'; @@ -58,13 +60,9 @@ import { addDays, getNewId, } from '#utils/common'; -import { - defaultConfigValue, - KEY_CONFIG_STORAGE, -} from '#utils/constants'; +import { defaultConfigValue } from '#utils/constants'; import { removeNull } from '#utils/nullHelper'; import { - ConfigStorage, EntriesAsList, WorkItem, } from '#utils/types'; @@ -105,6 +103,24 @@ const MY_TIME_ENTRIES_QUERY = gql` } `; +/* +query MyQuery { + private { + allTimeEntries(filters: {statuses: TODO, users: "9"}) { + clientId + id + description + date + startTime + duration + status + taskId + type + } + } +} +*/ + const BULK_TIME_ENTRY_MUTATION = gql` mutation BulkTimeEntry($timeEntries: [TimeEntryBulkCreateInput!], $deleteIds: [ID!]) { private { @@ -135,6 +151,7 @@ const BULK_TIME_ENTRY_MUTATION = gql` // TODO: Do not use JSON.stringify for comparison // TODO: use filtered localState instead of workItems +/** @knipignore */ // eslint-disable-next-line import/prefer-default-export export function Component() { const [workItems, setWorkItems] = useState([]); @@ -148,6 +165,7 @@ export function Component() { } = useFocusManager(); const { date: dateFromParams } = useParams<{ date: string | undefined}>(); + const { fullDate } = useContext(DateContext); // NOTE: We are opening the dialog from this parent component const dialogOpenTriggerRef = useRef<(() => void) | undefined>(); @@ -159,20 +177,18 @@ export function Component() { >(null); const selectedDate = useMemo(() => { - const today = new Date(); - if (isNotDefined(dateFromParams)) { - return encodeDate(today); + return fullDate; } const date = new Date(dateFromParams); if (Number.isNaN(date.getTime())) { - return encodeDate(today); + return fullDate; } return encodeDate(date); - }, [dateFromParams]); + }, [dateFromParams, fullDate]); useEffect( () => { @@ -188,8 +204,7 @@ export function Component() { ); const setSelectedDate = useCallback((newDateStr: string | undefined) => { - const today = encodeDate(new Date()); - const newDate = newDateStr === today ? undefined : newDateStr; + const newDate = newDateStr === fullDate ? undefined : newDateStr; const { resolvedPath } = resolvePath('dailyJournal', routes, { date: newDate }); if (isNotDefined(resolvedPath)) { @@ -197,34 +212,29 @@ export function Component() { } navigate(resolvedPath); - }, [routes, navigate]); + }, [routes, navigate, fullDate]); const getNextDay = useCallback(() => { const nextDay = addDays(selectedDate, 1); - const today = encodeDate(new Date()); - if (today === nextDay) { + if (fullDate === nextDay) { return undefined; } return nextDay; - }, [selectedDate]); + }, [selectedDate, fullDate]); const getPrevDay = useCallback(() => { const prevDay = addDays(selectedDate, -1); - const today = encodeDate(new Date()); - if (today === prevDay) { + if (fullDate === prevDay) { return undefined; } return prevDay; - }, [selectedDate]); + }, [selectedDate, fullDate]); - const [storedConfig] = useLocalStorage( - KEY_CONFIG_STORAGE, - defaultConfigValue, - ); + const [storedConfig] = useLocalStorage('timur-config'); const editMode = storedConfig.editingMode ?? defaultConfigValue.editingMode; @@ -536,7 +546,7 @@ export function Component() { } else if (event.ctrlKey && event.shiftKey && event.key === 'ArrowDown') { event.preventDefault(); event.stopPropagation(); - setSelectedDate(encodeDate(new Date())); + setSelectedDate(fullDate); } else if (event.ctrlKey && event.shiftKey && event.key === '?') { event.preventDefault(); event.stopPropagation(); @@ -544,6 +554,7 @@ export function Component() { } }, [ + fullDate, selectedDate, setSelectedDate, handleAddEntryClick, @@ -570,7 +581,7 @@ export function Component() { ); const { midActionsRef } = useContext(NavbarContext); - const { width: windowWidth } = useContext(SizeContext); + const { screen } = useContext(SizeContext); const handleSwipeLeft = useCallback( () => { @@ -609,7 +620,6 @@ export function Component() { )} @@ -639,7 +649,7 @@ export function Component() {
- {windowWidth >= 900 && ( + {screen === 'desktop' && ( <> - + - + )} @@ -666,8 +676,24 @@ export function Component() { value={selectedDate} onChange={setSelectedDate} > - + + {entriesWithoutTask > 0 && ( +
+ + + {`${entriesWithoutTask} uncategorized`} + +
+ )} + {entriesWithoutHours > 0 && ( +
+ + + {`${entriesWithoutHours} untracked`} + +
+ )}
- {windowWidth >= 900 && ( + {screen === 'desktop' && ( )} - {windowWidth >= 900 && ( + {screen === 'desktop' && ( )}
@@ -716,35 +742,23 @@ export function Component() { selectedDate={selectedDate} /> - {entriesWithoutTask + entriesWithoutHours > 0 && ( -
- {entriesWithoutTask > 0 && ( -
- - - {`${entriesWithoutTask} uncategorized entries`} - -
- )} - {entriesWithoutHours > 0 && ( -
- - - {`${entriesWithoutHours} untracked entries`} - -
- )} -
- )}
+ {!isTruthyString(dateFromParams) && ( + + Go to today + + )}
({ + query: DEADLINES_AND_EVENTS, + }); + + const projects = deadlinesAndEvents.data?.private.allProjects; + const events = deadlinesAndEvents.data?.private.relativeEvents; + + const formattedDate = dateFormatter.format(new Date(date)); + + const upcomingEvents = useMemo(() => { + const deadlines = projects?.flatMap( + (project) => project.deadlines.map((deadline) => ({ + ...deadline, + name: `${project.name}: ${deadline.name}`, + })), + ); + + const iconsMap: Record = { + DEADLINE: , + HOLIDAY: , + RETREAT: , + MISC: , + }; + + return [ + ...(deadlines?.map((deadline) => ({ + key: `DEADLINE-${deadline.id}`, + type: 'DEADLINE' as const, + typeDisplay: 'Deadline', + icon: iconsMap.DEADLINE, + name: deadline.name, + remainingDays: deadline.remainingDays, + })) ?? []), + ...(events?.map((otherEvent) => ({ + key: `${otherEvent.type}-${otherEvent.id}`, + type: otherEvent.type, + icon: iconsMap[otherEvent.type], + typeDisplay: otherEvent.typeDisplay, + name: otherEvent.name, + remainingDays: otherEvent.remainingDaysToStart, + })) ?? []), + ].sort((a, b) => compareNumber(a.remainingDays, b.remainingDays)); + }, [events, projects]); + + return ( + ( + + + {generalEvent.remainingDays < 0 + && upcomingEvents[index + 1]?.remainingDays >= 0 + && ( +
+
+ +
+
+ )} + + ), + )} + /> + ); +} + +export default DeadlineSection; diff --git a/src/views/DailyStandup/DeadlineSection/styles.module.css b/src/views/DailyStandup/DeadlineSection/styles.module.css new file mode 100644 index 0000000..d1200ed --- /dev/null +++ b/src/views/DailyStandup/DeadlineSection/styles.module.css @@ -0,0 +1,30 @@ +.separator { + display: flex; + align-items: center; + gap: var(--spacing-sm); + padding: 0 var(--spacing-lg); + + .icon { + animation: run var(--duration-animation-fast) ease-in-out infinite; + font-size: var(--font-size-xl); + } + + .line { + flex-grow: 1; + border-bottom: var(--width-separator-sm) solid var(--color-separator); + } +} + +@keyframes run { + 0% { + transform: rotate(0); + } + + 30% { + transform: rotate(5deg) translateY(2px); + } + 70% { + transform: rotate(-4deg) translateX(-2px); + } +} + diff --git a/src/views/DailyStandup/ProjectStandup/index.tsx b/src/views/DailyStandup/ProjectSection/index.tsx similarity index 86% rename from src/views/DailyStandup/ProjectStandup/index.tsx rename to src/views/DailyStandup/ProjectSection/index.tsx index 993189e..6a0a69d 100644 --- a/src/views/DailyStandup/ProjectStandup/index.tsx +++ b/src/views/DailyStandup/ProjectSection/index.tsx @@ -48,15 +48,6 @@ const DAILY_STANDUP_QUERY = gql` project { id name - description - deadlines { - id - name - startDate - totalDays - usedDays - remainingDays - } logoHd { url } @@ -73,17 +64,12 @@ const DAILY_STANDUP_QUERY = gql` } } } - quote { - id - text - author - } } } } `; -function ProjectStandup(props: Props) { +function ProjectSection(props: Props) { const { projectId, date, @@ -110,7 +96,7 @@ function ProjectStandup(props: Props) { return ( ({ + query: USERS_AVAILABILITY, + }); + + // FIXME: need to check how to sort these information + const sortedUsers = [...(usersAvailability.data?.private.users.items ?? [])].sort( + (foo, bar) => compareNumber( + getUnavailability(foo.leaveToday, foo.workFromHomeToday), + getUnavailability(bar.leaveToday, bar.workFromHomeToday), + -1, + ) || compareString( + foo.displayName, + bar.displayName, + ), + ); + + return ( + ( +
+ +
+ {user.displayName ?? 'Anon'} + {' '} + +
+
+ ))} + /> + ); +} + +export default StartSection; diff --git a/src/views/DailyStandup/StartSection/styles.module.css b/src/views/DailyStandup/StartSection/styles.module.css new file mode 100644 index 0000000..682e034 --- /dev/null +++ b/src/views/DailyStandup/StartSection/styles.module.css @@ -0,0 +1,16 @@ +.start-section { + .user { + display: flex; + font-size: var(--font-size-lg); + gap: var(--spacing-xs); + + .display-picture { + font-size: var(--font-size-xl); + } + + .name { + display: inline-flex; + gap: var(--spacing-xs); + } + } +} diff --git a/src/views/DailyStandup/index.tsx b/src/views/DailyStandup/index.tsx index 02ccd0e..2ae0c5a 100644 --- a/src/views/DailyStandup/index.tsx +++ b/src/views/DailyStandup/index.tsx @@ -1,5 +1,4 @@ import { - Fragment, useCallback, useContext, useEffect, @@ -8,23 +7,14 @@ import { useState, } from 'react'; import { - FcLandscape, - FcLeave, - FcNews, - FcNightLandscape, - FcSportsMode, -} from 'react-icons/fc'; -import { - IoChevronBack, - IoChevronForward, - IoExpandOutline, -} from 'react-icons/io5'; + RiArrowLeftSLine, + RiArrowRightSLine, + RiFullscreenLine, +} from 'react-icons/ri'; import { useParams } from 'react-router-dom'; import { _cs, - compareDate, encodeDate, - getDifferenceInDays, isDefined, isNotDefined, } from '@togglecorp/fujs'; @@ -36,94 +26,65 @@ import { import Button from '#components/Button'; import Page from '#components/Page'; import Portal from '#components/Portal'; +import DateContext from '#contexts/date'; import NavbarContext from '#contexts/navbar'; import { - AllProjectsAndEventsQuery, - AllProjectsAndEventsQueryVariables, + AllProjectsQuery, + AllProjectsQueryVariables, } from '#generated/types/graphql'; import useKeybind from '#hooks/useKeybind'; import useUrlQueryState from '#hooks/useUrlQueryState'; -import { type GeneralEvent } from '#utils/types'; +import DeadlineSection from './DeadlineSection'; import EndSection from './EndSection'; -import GeneralEventOutput from './GeneralEvent'; -import ProjectStandup from './ProjectStandup'; -import Slide from './Slide'; +import ProjectSection from './ProjectSection'; +import StartSection from './StartSection'; import styles from './styles.module.css'; -const dateFormatter = new Intl.DateTimeFormat( - [], - { - year: 'numeric', - month: 'long', - day: 'numeric', - weekday: 'long', - }, -); - -const ALL_PROJECTS_AND_EVENTS_QUERY = gql` - query AllProjectsAndEvents { +const ALL_PROJECTS = gql` + query AllProjects { private { id allProjects { id name - deadlines { - id - name - remainingDays - endDate - totalDays - usedDays - projectId - } - description logoHd { url } } - relativeEvents { - id - name - startDate - typeDisplay - dates - endDate - type - } } } `; +/** @knipignore */ // eslint-disable-next-line import/prefer-default-export export function Component() { const { date: dateFromParams } = useParams<{ date: string | undefined}>(); + const { fullDate } = useContext(DateContext); const { midActionsRef } = useContext(NavbarContext); const contentRef = useRef(null); const selectedDate = useMemo(() => { - const today = new Date(); - if (isNotDefined(dateFromParams)) { - return encodeDate(today); + return fullDate; } const date = new Date(dateFromParams); if (Number.isNaN(date.getTime())) { - return encodeDate(today); + return fullDate; } return encodeDate(date); - }, [dateFromParams]); + }, [dateFromParams, fullDate]); const [allProjectsResponse] = useQuery< - AllProjectsAndEventsQuery, - AllProjectsAndEventsQueryVariables + AllProjectsQuery, + AllProjectsQueryVariables >({ - query: ALL_PROJECTS_AND_EVENTS_QUERY, + query: ALL_PROJECTS, }); type UrlQueryKey = 'project' | 'page'; @@ -136,17 +97,20 @@ export function Component() { (value) => value, ); - const formattedDate = dateFormatter.format(new Date(selectedDate)); - const projectsMap = useMemo(() => { const allProjectsData = allProjectsResponse?.data?.private.allProjects; if (isNotDefined(allProjectsData)) { return undefined; } + const initialMap: Record> = { start: { prev: undefined, + next: 'deadlines', + }, + deadlines: { + prev: 'start', next: allProjectsData[0].id, }, end: { @@ -159,7 +123,7 @@ export function Component() { (acc, val, index) => { const currentMap = { next: index === (allProjectsData.length - 1) ? 'end' : allProjectsData[index + 1].id, - prev: index === 0 ? 'start' : allProjectsData[index - 1].id, + prev: index === 0 ? 'deadlines' : allProjectsData[index - 1].id, }; acc[val.id] = currentMap; @@ -179,6 +143,14 @@ export function Component() { return; } + if (pageId === 'deadlines') { + setUrlQuery({ + project: undefined, + page: 'deadlines', + }); + return; + } + if (pageId === 'end') { setUrlQuery({ project: undefined, @@ -193,18 +165,12 @@ export function Component() { }); }, [setUrlQuery]); - const mapId = urlQuery.page ?? urlQuery.project; - const prevButtonName = isDefined(mapId) - ? projectsMap?.[mapId]?.prev - : undefined; - const prevButtonDisabled = isNotDefined(mapId) || isNotDefined(projectsMap?.[mapId]?.prev); + const mapId = urlQuery.page ?? urlQuery.project ?? 'start'; + const prevButtonName = projectsMap?.[mapId].prev; + const prevButtonDisabled = isNotDefined(prevButtonName); - const nextButtonName = isDefined(mapId) - ? projectsMap?.[mapId].next - : projectsMap?.start.next; - const nextButtonDisabled = isNotDefined(mapId) - ? false - : isNotDefined(projectsMap?.[mapId].next); + const nextButtonName = projectsMap?.[mapId].next; + const nextButtonDisabled = isNotDefined(nextButtonName); const handleNextButtion = useCallback( () => { @@ -263,48 +229,6 @@ export function Component() { contentRef.current?.requestFullscreen(); }, []); - const events = useMemo(() => { - const allDeadlines = allProjectsResponse.data?.private.allProjects.flatMap( - (project) => project.deadlines.map((deadline) => ({ - ...deadline, - name: `${project.name}: ${deadline.name}`, - })), - ); - - const otherEvents = allProjectsResponse.data?.private.relativeEvents; - - const iconsMap: Record = { - DEADLINE: , - HOLIDAY: , - RETREAT: , - MISC: , - }; - - return [ - ...(allDeadlines?.map((deadline) => ({ - key: `DEADLINE-${deadline.id}`, - type: 'DEADLINE' as const, - typeDisplay: 'Deadline', - icon: iconsMap.DEADLINE, - name: deadline.name, - date: deadline.endDate, - remainingDays: deadline.remainingDays, - })) ?? []), - ...(otherEvents?.map((otherEvent) => ({ - key: `${otherEvent.type}-${otherEvent.id}`, - type: otherEvent.type, - icon: iconsMap[otherEvent.type], - typeDisplay: otherEvent.typeDisplay, - name: otherEvent.name, - date: otherEvent.startDate, - remainingDays: getDifferenceInDays( - otherEvent.startDate, - encodeDate(new Date()), - ), - })) ?? []), - ].sort((a, b) => compareDate(a.date, b.date)); - }, [allProjectsResponse]); - return ( - +
@@ -345,40 +270,23 @@ export function Component() { ref={contentRef} className={_cs(styles.content, isFullScreen && styles.presentationMode)} > - {isNotDefined(mapId) && ( - ( - - - {generalEvent.remainingDays < 0 - && events[i + 1]?.remainingDays >= 0 - && ( -
-
- -
-
- )} - - ), - )} + {mapId === 'start' && ( + + )} + {mapId === 'deadlines' && ( + )} - {isNotDefined(urlQuery.page) && isDefined(urlQuery.project) && ( - )} - {urlQuery.page === 'end' && ( + {mapId === 'end' && ( diff --git a/src/views/DailyStandup/styles.module.css b/src/views/DailyStandup/styles.module.css index b7ea5ad..937691b 100644 --- a/src/views/DailyStandup/styles.module.css +++ b/src/views/DailyStandup/styles.module.css @@ -19,40 +19,10 @@ flex-grow: 1; background-color: var(--color-background); overflow: auto; - - .separator { - display: flex; - align-items: center; - gap: var(--spacing-sm); - padding: 0 var(--spacing-lg); - - .icon { - animation: run var(--duration-animation-fast) ease-in-out infinite; - font-size: var(--font-size-xl); - } - - .line { - flex-grow: 1; - border-bottom: var(--width-separator-sm) solid var(--color-separator); - } - } } } } -@keyframes run { - 0% { - transform: rotate(0); - } - - 30% { - transform: rotate(5deg) translateY(2px); - } - 70% { - transform: rotate(-4deg) translateX(-2px); - } -} - .actions { display: flex; justify-content: flex-end; diff --git a/src/views/Home/index.tsx b/src/views/Home/index.tsx index 564068f..0f6f5a8 100644 --- a/src/views/Home/index.tsx +++ b/src/views/Home/index.tsx @@ -8,26 +8,26 @@ import { FcVoicePresentation, } from 'react-icons/fc'; import { useNavigate } from 'react-router-dom'; -import { - encodeDate, - isNotDefined, -} from '@togglecorp/fujs'; +import { isNotDefined } from '@togglecorp/fujs'; import Link, { resolvePath } from '#components/Link'; import MonthlyCalendar from '#components/MonthlyCalendar'; import Page from '#components/Page'; +import DateContext from '#contexts/date'; import RouteContext from '#contexts/route'; import styles from './styles.module.css'; +/** @knipignore */ // eslint-disable-next-line import/prefer-default-export export function Component() { const routes = useContext(RouteContext); const navigate = useNavigate(); + const { year, month, fullDate } = useContext(DateContext); + const handleDateClick = useCallback((dateStr: string) => { - const todayStr = encodeDate(new Date()); - const newDate = dateStr === todayStr ? undefined : dateStr; + const newDate = dateStr === fullDate ? undefined : dateStr; const { resolvedPath } = resolvePath('dailyJournal', routes, { date: newDate }); if (isNotDefined(resolvedPath)) { @@ -35,9 +35,7 @@ export function Component() { } navigate(resolvedPath); - }, [navigate, routes]); - - const today = new Date(); + }, [navigate, routes, fullDate]); return (
diff --git a/src/views/Settings/index.tsx b/src/views/Settings/index.tsx new file mode 100644 index 0000000..d5a4841 --- /dev/null +++ b/src/views/Settings/index.tsx @@ -0,0 +1,159 @@ +import { useContext } from 'react'; + +import Checkbox from '#components/Checkbox'; +import Page from '#components/Page'; +import SelectInput from '#components/SelectInput'; +import EnumsContext from '#contexts/enums'; +import { EnumsQuery } from '#generated/types/graphql'; +import useLocalStorage from '#hooks/useLocalStorage'; +import useSetFieldValue from '#hooks/useSetFieldValue'; +import { colorscheme } from '#utils/constants'; +import { EditingMode } from '#utils/types'; + +import WorkItemRow from '../DailyJournal/DayView/WorkItemRow'; + +import styles from './styles.module.css'; + +type EditingOption = { key: EditingMode, label: string }; +function editingOptionKeySelector(item: EditingOption) { + return item.key; +} +function editingOptionLabelSelector(item: EditingOption) { + return item.label; +} +const editingOptions: EditingOption[] = [ + { key: 'normal', label: 'Normies' }, + { key: 'vim', label: 'Vim Masterace' }, +]; + +type WorkItemTypeOption = EnumsQuery['enums']['TimeEntryType'][number]; +function workItemTypeKeySelector(item: WorkItemTypeOption) { + return item.key; +} +function workItemTypeLabelSelector(item: WorkItemTypeOption) { + return item.label; +} + +type WorkItemStatusOption = EnumsQuery['enums']['TimeEntryStatus'][number]; +function workItemStatusKeySelector(item: WorkItemStatusOption) { + return item.key; +} +function workItemStatusLabelSelector(item: WorkItemStatusOption) { + return item.label; +} +function workItemStatusColorSelector(item: WorkItemStatusOption): [string, string] { + if (item.key === 'DOING') { + return colorscheme[1]; + } + if (item.key === 'DONE') { + return colorscheme[5]; + } + return colorscheme[7]; +} + +function defaultColorSelector(_: T, i: number): [string, string] { + return colorscheme[i % colorscheme.length]; +} + +/** @knipignore */ +// eslint-disable-next-line import/prefer-default-export +export function Component() { + const { enums } = useContext(EnumsContext); + const [storedConfig, setStoredConfig] = useLocalStorage('timur-config'); + const setConfigFieldValue = useSetFieldValue(setStoredConfig); + + return ( + +
+

+ Entry +

+ + + + +
+
+

+ Create Entry +

+ + +
+
+

+ Create Notes +

+ +
+
+ ); +} + +Component.displayName = 'Settings'; diff --git a/src/views/Settings/styles.module.css b/src/views/Settings/styles.module.css new file mode 100644 index 0000000..211a494 --- /dev/null +++ b/src/views/Settings/styles.module.css @@ -0,0 +1,18 @@ +.settings { + .main-content { + display: flex; + flex-direction: column; + gap: var(--spacing-lg); + max-width: 1024px; + + .section { + display: flex; + flex-direction: column; + gap: var(--spacing-sm); + + .work-item { + background-color: var(--color-foreground); + } + } + } +} diff --git a/vite.config.ts b/vite.config.ts index 422e6a2..41b66f1 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,15 +1,20 @@ import { ValidateEnv as validateEnv } from '@julr/vite-plugin-validate-env'; -import { type HtmlTagDescriptor, defineConfig, loadEnv } from 'vite'; -import tsconfigPaths from 'vite-tsconfig-paths'; -import webfontDownload from 'vite-plugin-webfont-dl'; +import basicSsl from '@vitejs/plugin-basic-ssl'; import reactSwc from '@vitejs/plugin-react-swc'; import { execSync } from 'child_process'; import { visualizer } from 'rollup-plugin-visualizer'; +import { + defineConfig, + type HtmlTagDescriptor, + loadEnv, + type UserConfig, +} from 'vite'; import checker from 'vite-plugin-checker'; import { compression } from 'vite-plugin-compression2'; -import svgr from 'vite-plugin-svgr'; import { VitePWA } from 'vite-plugin-pwa'; -import basicSsl from '@vitejs/plugin-basic-ssl'; +import svgr from 'vite-plugin-svgr'; +import webfontDownload from 'vite-plugin-webfont-dl'; +import tsconfigPaths from 'vite-tsconfig-paths'; import envConfig from './env'; @@ -18,7 +23,7 @@ const commitHash = execSync('git rev-parse --short HEAD').toString(); function umamiPlugin(options: { id: string | undefined, src: string | undefined }) { return { - name: "html-transform", + name: 'html-transform', transformIndexHtml: () => { if (!options.id || !options.src) { console.warn('Umami src and id not set.'); @@ -28,24 +33,24 @@ function umamiPlugin(options: { id: string | undefined, src: string | undefined { tag: 'script', attrs: { - 'async': true, - 'defer': true, + async: true, + defer: true, 'data-website-id': options.id, - 'src': options.src, + src: options.src, }, - } + }, ]; return tags; }, }; -}; +} export default defineConfig(({ mode }) => { const isProd = mode === 'production'; console.log('Mode:', mode); - const env = loadEnv(mode, process.cwd(), '') + const env = loadEnv(mode, process.cwd(), ''); - return { + const config: UserConfig = { define: { 'import.meta.env.APP_COMMIT_HASH': JSON.stringify(commitHash), 'import.meta.env.APP_VERSION': JSON.stringify(env.npm_package_version), @@ -106,7 +111,6 @@ export default defineConfig(({ mode }) => { port: 3000, host: 'local.timur.dev.togglecorp.com', strictPort: true, - https: true, }, build: { outDir: './build', @@ -123,8 +127,8 @@ export default defineConfig(({ mode }) => { '@uiw/codemirror-theme-github', '@uiw/react-codemirror', ], - 'codemirror-vim-mode': ['@replit/codemirror-vim'] - } + 'codemirror-vim-mode': ['@replit/codemirror-vim'], + }, }, }, }, @@ -136,4 +140,5 @@ export default defineConfig(({ mode }) => { }, }, }; + return config; });