diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 8cd9252d9b..176a846ef0 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @amanmahajan7 @nstepien +* @grafana/dataviz-squad diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index cda0d86965..a6cdc26d01 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -2,6 +2,7 @@ name: Bug report about: Create a bug report title: '' +type: Bug labels: 'Status: Unconfirmed' assignees: '' --- diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index ec8bf57eca..f0eb8fdee2 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,4 +1,4 @@ contact_links: - name: Questions and discussions - url: https://github.com/adazzle/react-data-grid/discussions + url: https://github.com/Comcast/react-data-grid/discussions about: Please check the discussions tab for help and discussions. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 4a9623b95e..d1131d5d3b 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -2,7 +2,7 @@ name: Feature request about: Request a new feature or enhancement title: '' -labels: Feature Request +type: Feature assignees: '' --- diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e771bccfe2..6fd7e29382 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,4 +1,4 @@ -# https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates +# https://docs.github.com/en/code-security/reference/supply-chain-security/dependabot-options-reference version: 2 updates: @@ -11,24 +11,20 @@ updates: patterns: - 'react' - 'react-dom' - react-dnd: + tanstack-router: patterns: - - 'react-dnd' - - 'react-dnd-html5-backend' - babel: + - '@tanstack/react-router' + - '@tanstack/router-plugin' + tsdown: patterns: - - '@babel/*' - linaria: - patterns: - - '@linaria/*' - - '@wyw-in-js/*' - typescript-eslint: - patterns: - - '@typescript-eslint/*' + - 'tsdown' + - '@tsdown/*' vitest: patterns: - 'vitest' - '@vitest/*' + exclude-patterns: + - '@vitest/eslint-plugin' - package-ecosystem: 'github-actions' directory: '/' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 03c79e2342..023ef422b3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,49 +5,114 @@ on: - main pull_request: +permissions: + contents: read + jobs: test: runs-on: ubuntu-latest + timeout-minutes: 10 steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + persist-credentials: false + + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7 with: - node-version: 24 + node-version-file: 'package.json' check-latest: true - - name: npm install - run: npm i - - name: Biome - run: node --run biome:ci + + - name: Install dependencies + run: npm ci + - name: Typecheck run: node --run typecheck + - name: ESLint run: node --run eslint - - name: Prettier - run: node --run prettier:check + + - name: Oxfmt + run: node --run format:check + - name: Bundle run: node --run build + - name: Build website run: node --run build:website + + - name: Check routeTree.gen.ts + run: git diff --exit-code website/routeTree.gen.ts + - name: Install Playwright Browsers - run: npx playwright install chromium + run: npx playwright install chromium firefox + timeout-minutes: 2 + - name: Test - run: node --run test + run: node --run test:ci timeout-minutes: 4 + + - name: Upload test failure artifacts + if: failure() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + with: + name: test-artifacts + path: | + test/**/__screenshots__/** + test/**/__traces__/** + .vitest-attachments/test/** + if-no-files-found: ignore + - name: Upload coverage - uses: codecov/codecov-action@v5 + uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7 with: token: ${{ secrets.CODECOV_TOKEN }} - - name: Deploy gh-pages - if: github.event_name == 'push' && github.ref == 'refs/heads/main' + + publish: + name: Publish to NPM + runs-on: ubuntu-latest + needs: [test] + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + permissions: + contents: write # push the release tag + id-token: write # npm trusted publishing + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + fetch-depth: 0 + + # only publish when package.json version changes - https://github.com/EndBug/version-check + - name: Check version changes + uses: EndBug/version-check@36ff30f37c7deabe56a30caa043d127be658c425 # 2.1.5 + id: version_check + with: + diff-search: true + + - name: Setup Node for npm registry + if: steps.version_check.outputs.changed == 'true' + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7 + with: + node-version-file: 'package.json' + check-latest: true + registry-url: 'https://registry.npmjs.org' + + - name: Install dependencies + if: steps.version_check.outputs.changed == 'true' + run: npm ci + + - name: Bundle + if: steps.version_check.outputs.changed == 'true' + run: node --run build + + - name: Publish to npm + if: steps.version_check.outputs.changed == 'true' + run: npm publish --tag latest + + - name: Push tag and create GitHub release + if: steps.version_check.outputs.changed == 'true' + env: + GH_TOKEN: ${{ github.token }} + NEW_VERSION: ${{ steps.version_check.outputs.version }} run: | - git config --global user.email 'action@github.com' - git config --global user.name 'GitHub Action' - git fetch origin gh-pages - git worktree add gh-pages gh-pages - cd gh-pages - git rm -r . - mv ../dist/* . - touch .nojekyll - git add . - git commit -m "gh-pages deployment" || echo "Nothing to commit" - git push -f https://adazzle:${{secrets.GITHUB_TOKEN}}@github.com/adazzle/react-data-grid.git + git tag "v${NEW_VERSION}" + git push origin "v${NEW_VERSION}" + gh release create "v${NEW_VERSION}" --title "v${NEW_VERSION}" --generate-notes diff --git a/.gitignore b/.gitignore index 9ad8d4c877..9b61313b75 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,16 @@ /.cache -/coverage +/.claude /dist /lib /node_modules -/package-lock.json -__screenshots__ npm-debug.log **.orig .idea + +# Vitest +/.vitest-attachments +/coverage +/test/**/__screenshots__ +/test/**/__traces__ +/test/**/screenshots/**/*-win32.png diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 80bcbed90c..0000000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -legacy-peer-deps = true diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 0000000000..a85ef2fcc6 --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,68 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "ignorePatterns": ["/website/routeTree.gen.ts"], + "singleQuote": true, + "trailingComma": "none", + "sortImports": { + "customGroups": [ + { + "groupName": "react", + "elementNamePattern": ["react", "react/**", "react-dom", "react-dom/**"] + }, + { + "groupName": "ecij", + "elementNamePattern": ["ecij"] + }, + { + "groupName": "clsx", + "elementNamePattern": ["clsx"] + }, + { + "groupName": "./src", + "elementNamePattern": ["**/src", "**/src/**"] + }, + { + "groupName": "./renderers", + "elementNamePattern": ["**/renderers", "**/renderers/**"] + }, + { + "groupName": "./components", + "elementNamePattern": ["**/components", "**/components/**"] + }, + { + "groupName": "./hooks", + "elementNamePattern": ["**/hooks", "**/hooks/**"] + }, + { + "groupName": "./utils", + "elementNamePattern": ["**/utils", "**/utils/**"] + }, + { + "groupName": "./types", + "elementNamePattern": ["**/types", "**/types/**"] + } + ], + "groups": [ + "side_effect_style", + "side_effect", + { "newlinesBetween": true }, + "builtin", + "react", + "external", + "ecij", + "clsx", + { "newlinesBetween": true }, + "./src", + "./renderers", + "./components", + "./hooks", + "./utils", + "./types", + "index", + "sibling", + "parent", + "unknown" + ], + "newlinesBetween": false + } +} diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 81a70c147d..0000000000 --- a/.prettierignore +++ /dev/null @@ -1,4 +0,0 @@ -*.js -*.json -*.css -/website/routeTree.gen.ts diff --git a/.prettierrc.json b/.prettierrc.json deleted file mode 100644 index 1511954754..0000000000 --- a/.prettierrc.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "none", - "printWidth": 100, - "plugins": ["@ianvs/prettier-plugin-sort-imports"], - "importOrder": [ - "", - "^react$", - "^react-dom", - "^react", - "", - "^@linaria/core$", - "^clsx$", - "", - "./src", - "./renderers", - "./components", - "./hooks", - "./utils", - "./types", - "^\\.$", - "^\\./", - "^\\.\\./" - ] -} diff --git a/.vscode/extensions.json b/.vscode/extensions.json index f05755bcdb..cf3caf0895 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,3 +1,3 @@ { - "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode", "biomejs.biome"] + "recommendations": ["dbaeumer.vscode-eslint", "oxc.oxc-vscode", "typescriptteam.native-preview"] } diff --git a/.vscode/settings.json b/.vscode/settings.json index bb939b6158..4a59117848 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,14 +1,16 @@ { "editor.codeActionsOnSave": { - "source.fixAll": "explicit" + "source.fixAll": "explicit", + "source.organizeLinkDefinitions": "explicit", + "source.removeUnusedImports": "explicit", + "source.format.oxc": "explicit" }, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnSave": true, - "[javascript][json][jsonc][css]": { - "editor.defaultFormatter": "biomejs.biome" + "editor.defaultFormatter": "oxc.oxc-vscode", + "js/ts.experimental.useTsgo": true, + "eslint.options": { + "flags": ["unstable_native_nodejs_ts_config"] }, - "typescript.enablePromptUseWorkspaceTsdk": true, - "typescript.tsdk": "node_modules/typescript/lib", + "eslint.problems.shortenToSingleLine": true, "files.readonlyInclude": { "**/routeTree.gen.ts": true }, diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000000..008aa423b8 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,62 @@ +# AGENTS.md + +## Commands + +```shell +npm ci # setup +node --run build # library → lib/ +node --run typecheck # tsc --build +node --run eslint # eslint --max-warnings 0 +node --run eslint:fix # eslint --fix +node --run format # oxfmt +node --run test # vitest (browser + node) +node --run test -- # single test, e.g. test/browser/rowHeight.test.ts +``` + +## Architecture + +react-data-grid is a data grid with **zero `dependencies`** (peer dependency: React 19.2+). It uses CSS Grid for layout and implements row/column virtualization in JS. + +```text +src/ + index.ts # public API surface; all exports go through here + DataGrid.tsx # main component (generic: ) + TreeDataGrid.tsx # wraps DataGrid, adds row grouping (role="treegrid") + types.ts # shared type definitions (e.g. Column, CalculatedColumn, render props, events) + hooks/ # shared custom React hooks + utils/ # pure utilities (e.g. keyboard, DOM, events, colSpan, style) + style/ # build-time CSS via ecij tagged templates; layers.css declares @layer order + cellRenderers/ # default cell renderers (e.g. checkbox, toggleGroup, value) + editors/ # default editors (renderTextEditor) +test/ + browser/ # vitest browser-mode tests (Playwright, Chromium + Firefox) + node/ # vitest SSR tests (Node.js) + visual/ # vitest visual regression tests (CI-only — never run locally) +website/ # demo site (Vite + TanStack Router) +``` + +## Conventions + +- **Public API** — all exports flow through `src/index.ts`. Keep `README.md` in sync with user-facing changes. +- **Docs** — keep `AGENTS.md` in sync with tooling, conventions, or architectural changes. +- **Default renderers** — `DataGridDefaultRenderersContext` allows overriding default renderers (`renderCheckbox`, `renderSortStatus`, `renderRow`, `renderCell`, `noRowsFallback`) without prop-drilling. +- **TypeScript strict** with `exactOptionalPropertyTypes`, `verbatimModuleSyntax`, `erasableSyntaxOnly`. Distinguish missing properties from `undefined` values. +- **`Maybe`** (`T | undefined | null`) — used for all nullable column/render props. Do not use bare `T | undefined`. +- **`NoInfer<>`** — wrap callback parameters to prevent reverse type inference into component generics. +- **CSS layers** — all styles live in nested `@layer rdg.` sub-layers (e.g. `rdg.Cell`, `rdg.Row`; declared in `src/style/layers.css`). Use `ecij` `css` tagged templates (build-time extraction, not runtime CSS-in-JS). Co-locate styles in component files; `src/style/` is for shared styles. +- **Dual classnames** — components apply both a semantic class (`rdg-cell`) and a generated hash. Preserve both. +- **Light/dark mode** — handled via CSS `light-dark()` + `color-scheme`, not JS. +- **Accessibility first** — ARIA attributes (e.g. `aria-colindex`, `aria-rowindex`, `aria-selected`, roles) are required. Tests query by role. +- **Formatting** — oxfmt (not Prettier). **Linting** — ESLint (must pass with zero warnings). +- **Build** — tsdown bundles library to `lib/`; `ecij` plugin prefixes classes with `rdg-{version}-` (dots→dashes) to avoid cross-version conflicts. + +## Testing + +- Browser tests use `vitest/browser` + Playwright. `test/setupBrowser.ts` configures `page.render()` via `vitest-browser-react` and registers custom locators via `locators.extend()` — prefer `page.getGrid()`, `page.getCell({ name })`, `page.getRow()`, `page.getHeaderCell()`, `page.getActiveCell()`, etc. over raw `page.getByRole()`. +- Test helpers in `test/browser/utils.tsx`: `setup()`, `getRowWithCell()`, `getCellsAtRowIndex()`, `validateCellPosition()`, `scrollGrid()`, `safeTab()`, `testCount()`, `testRowCount()`. +- `test/failOnConsole.ts` fails tests on unexpected console warnings/errors. +- **Never run visual regression tests** — screenshots are environment-dependent so visual regression tests must run in CI only. + +## Validation + +Run before submitting changes: `node --run typecheck`, `node --run eslint`, `node --run format`, `node --run test`. diff --git a/CHANGELOG.md b/CHANGELOG.md index 06b0eb6bef..6685f21a6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,129 +2,129 @@ ## v7.0.0-canary.48 -- Fixed an edge case where clicking outside the grid wouldn't close and commit an open editor quickly enough, resulting in the previous rows state being used by parent components in `click` handlers. ([PR](https://github.com/adazzle/react-data-grid/pull/2415)) -- Support for filters has been removed, along with: ([PR](https://github.com/adazzle/react-data-grid/pull/2412)) +- Fixed an edge case where clicking outside the grid wouldn't close and commit an open editor quickly enough, resulting in the previous rows state being used by parent components in `click` handlers. ([PR](https://github.com/Comcast/react-data-grid/pull/2415)) +- Support for filters has been removed, along with: ([PR](https://github.com/Comcast/react-data-grid/pull/2412)) - The `` props: `headerFiltersHeight`, `filters`, `onFiltersChange`, `enableFilterRow` - `Column.filterRenderer` - The exports: `FilterRendererProps`, `Filters` -- Optional `Column` props can now also be `null` in addition to `undefined`. ([PR](https://github.com/adazzle/react-data-grid/pull/2409)) +- Optional `Column` props can now also be `null` in addition to `undefined`. ([PR](https://github.com/Comcast/react-data-grid/pull/2409)) ## v7.0.0-canary.47 -- Added a third, optional generic on `` to specify the row key type. ([PR](https://github.com/adazzle/react-data-grid/pull/2311)) -- Added the `useRowSelection` hook for custom cell renderers to access `isRowSelected` and `onRowSelectionChange`. ([PR](https://github.com/adazzle/react-data-grid/pull/2338)) -- `HeaderRendererProps.allRowsSelected` tweaks, affecting the `SelectColumn`: ([PR](https://github.com/adazzle/react-data-grid/pull/2402)) +- Added a third, optional generic on `` to specify the row key type. ([PR](https://github.com/Comcast/react-data-grid/pull/2311)) +- Added the `useRowSelection` hook for custom cell renderers to access `isRowSelected` and `onRowSelectionChange`. ([PR](https://github.com/Comcast/react-data-grid/pull/2338)) +- `HeaderRendererProps.allRowsSelected` tweaks, affecting the `SelectColumn`: ([PR](https://github.com/Comcast/react-data-grid/pull/2402)) - It will now be `false` when `rows.length === 0` instead of `true`. - `selectedRows` must contain all the row keys for `allRowsSelected` to be `true`, instead of naively comparing the `size` and `length`. -- Optional props on `` can now also be `null` in addition to `undefined`. ([PR](https://github.com/adazzle/react-data-grid/pull/2406)) +- Optional props on `` can now also be `null` in addition to `undefined`. ([PR](https://github.com/Comcast/react-data-grid/pull/2406)) ## v7.0.0-canary.46 -- Optimize onRowsChange: only update changed rows ([PR](https://github.com/adazzle/react-data-grid/pull/2390)) +- Optimize onRowsChange: only update changed rows ([PR](https://github.com/Comcast/react-data-grid/pull/2390)) ## v7.0.0-canary.45 -- Fixed issue where the scrollbars would flicker in edge cases ([PR](https://github.com/adazzle/react-data-grid/pull/2389)) +- Fixed issue where the scrollbars would flicker in edge cases ([PR](https://github.com/Comcast/react-data-grid/pull/2389)) ## v7.0.0-canary.44 -- Use aria-selected to style selected cell/rows ([PR](https://github.com/adazzle/react-data-grid/pull/2386)) -- Add support for variable row heights ([PR](https://github.com/adazzle/react-data-grid/pull/2384)) +- Use aria-selected to style selected cell/rows ([PR](https://github.com/Comcast/react-data-grid/pull/2386)) +- Add support for variable row heights ([PR](https://github.com/Comcast/react-data-grid/pull/2384)) ## v7.0.0-canary.43 -- Fix `aria-readonly` ([PR](https://github.com/adazzle/react-data-grid/pull/2380)) +- Fix `aria-readonly` ([PR](https://github.com/Comcast/react-data-grid/pull/2380)) ## v7.0.0-canary.42 -- Add missing `aria-colspan` ([PR](https://github.com/adazzle/react-data-grid/pull/2374)) -- Add `aria-readonly` to readonly cells ([PR](https://github.com/adazzle/react-data-grid/pull/2379)) +- Add missing `aria-colspan` ([PR](https://github.com/Comcast/react-data-grid/pull/2374)) +- Add `aria-readonly` to readonly cells ([PR](https://github.com/Comcast/react-data-grid/pull/2379)) ## v7.0.0-canary.41 -- Fix summary row colSpan ([PR](https://github.com/adazzle/react-data-grid/pull/2372)) -- HeaderCell: Add missing event parameter to onPointerUp, fix #2305 ([PR](https://github.com/adazzle/react-data-grid/pull/2371)) +- Fix summary row colSpan ([PR](https://github.com/Comcast/react-data-grid/pull/2372)) +- HeaderCell: Add missing event parameter to onPointerUp, fix #2305 ([PR](https://github.com/Comcast/react-data-grid/pull/2371)) ## v7.0.0-canary.40 -- Add `column.colSpan` prop to merge cells ([PR](https://github.com/adazzle/react-data-grid/pull/2356)) -- Removed prefixed css properties from the generated style file ([PR](https://github.com/adazzle/react-data-grid/pull/2370)) +- Add `column.colSpan` prop to merge cells ([PR](https://github.com/Comcast/react-data-grid/pull/2356)) +- Removed prefixed css properties from the generated style file ([PR](https://github.com/Comcast/react-data-grid/pull/2370)) ## v7.0.0-canary.39 -- Add `enableVirtualization` prop ([PR](https://github.com/adazzle/react-data-grid/pull/2355)). Grid renders all the rows/columns when it is set to false. +- Add `enableVirtualization` prop ([PR](https://github.com/Comcast/react-data-grid/pull/2355)). Grid renders all the rows/columns when it is set to false. ## v7.0.0-canary.38 -- Fix summary row position ([PR](https://github.com/adazzle/react-data-grid/pull/2335)) +- Fix summary row position ([PR](https://github.com/Comcast/react-data-grid/pull/2335)) ## v7.0.0-canary.37 -- Add `summaryRowHeight` prop ([PR](https://github.com/adazzle/react-data-grid/pull/2325)) -- Rollup type definitions ([PR](https://github.com/adazzle/react-data-grid/pull/2301)) +- Add `summaryRowHeight` prop ([PR](https://github.com/Comcast/react-data-grid/pull/2325)) +- Rollup type definitions ([PR](https://github.com/Comcast/react-data-grid/pull/2301)) ## v7.0.0-canary.36 -- Fixed column headers not showing when grid is horizontally scrolled ([PR](https://github.com/adazzle/react-data-grid/pull/2297)) +- Fixed column headers not showing when grid is horizontally scrolled ([PR](https://github.com/Comcast/react-data-grid/pull/2297)) ## v7.0.0-canary.35 -- Migrate to css-in-js with linaria ([PR](https://github.com/adazzle/react-data-grid/pull/2256)). RDG now internally uses [linaria](https://github.com/callstack/linaria) to manage styles. The stylesheets are automatically injected and there is no stylesheet to manually import anymore. -- Expose data grid root element reference ([PR](https://github.com/adazzle/react-data-grid/pull/2258)). -- (Bug fix) Tabbing into the grid should initiate keyboard navigation ([PR](https://github.com/adazzle/react-data-grid/pull/2289)). +- Migrate to css-in-js with linaria ([PR](https://github.com/Comcast/react-data-grid/pull/2256)). RDG now internally uses [linaria](https://github.com/callstack/linaria) to manage styles. The stylesheets are automatically injected and there is no stylesheet to manually import anymore. +- Expose data grid root element reference ([PR](https://github.com/Comcast/react-data-grid/pull/2258)). +- (Bug fix) Tabbing into the grid should initiate keyboard navigation ([PR](https://github.com/Comcast/react-data-grid/pull/2289)). ## v7.0.0-canary.34 -- Only show the vertical scrollbar when necessary ([PR](https://github.com/adazzle/react-data-grid/pull/2231)) -- Fix `editorPortalTarget` default value for server-side rendering ([PR](https://github.com/adazzle/react-data-grid/pull/2245)) -- Use grid layout for rows, split column metrics from compute columns ([PR](https://github.com/adazzle/react-data-grid/pull/2272)). Resizing columns no longer recreates columns so less re-renders -- Augment `onRowsChange` with `indexes` and `column` data ([PR](https://github.com/adazzle/react-data-grid/pull/2278)) +- Only show the vertical scrollbar when necessary ([PR](https://github.com/Comcast/react-data-grid/pull/2231)) +- Fix `editorPortalTarget` default value for server-side rendering ([PR](https://github.com/Comcast/react-data-grid/pull/2245)) +- Use grid layout for rows, split column metrics from compute columns ([PR](https://github.com/Comcast/react-data-grid/pull/2272)). Resizing columns no longer recreates columns so less re-renders +- Augment `onRowsChange` with `indexes` and `column` data ([PR](https://github.com/Comcast/react-data-grid/pull/2278)) ## v7.0.0-canary.33 -- (Bug) Commit changes before exiting grid ([PR](https://github.com/adazzle/react-data-grid/pull/2224)) +- (Bug) Commit changes before exiting grid ([PR](https://github.com/Comcast/react-data-grid/pull/2224)) ## v7.0.0-canary.32 -- Fix importing rdg with webpack 4 ([PR](https://github.com/adazzle/react-data-grid/pull/2221)) +- Fix importing rdg with webpack 4 ([PR](https://github.com/Comcast/react-data-grid/pull/2221)) ## v7.0.0-canary.31 -- (Breaking) Remove some exports from the grid ([PR](https://github.com/adazzle/react-data-grid/pull/2210)) -- Use a pseudo-element for header resizer ([PR](https://github.com/adazzle/react-data-grid/pull/2217)) -- (new) Formatters now receive a new onRowChange prop ([PR](https://github.com/adazzle/react-data-grid/pull/2220)) -- (new) Change `column.name` type from `string` to `string/ReactElement` ([PR](https://github.com/adazzle/react-data-grid/pull/2220)) -- Publish bundles instead of modules, use babel only for transpilation ([PR](https://github.com/adazzle/react-data-grid/pull/2214)) -- Use the new jsx runtime ([PR](https://github.com/adazzle/react-data-grid/pull/2184)). The minimum supported react version is 16.14 now. +- (Breaking) Remove some exports from the grid ([PR](https://github.com/Comcast/react-data-grid/pull/2210)) +- Use a pseudo-element for header resizer ([PR](https://github.com/Comcast/react-data-grid/pull/2217)) +- (new) Formatters now receive a new onRowChange prop ([PR](https://github.com/Comcast/react-data-grid/pull/2220)) +- (new) Change `column.name` type from `string` to `string/ReactElement` ([PR](https://github.com/Comcast/react-data-grid/pull/2220)) +- Publish bundles instead of modules, use babel only for transpilation ([PR](https://github.com/Comcast/react-data-grid/pull/2214)) +- Use the new jsx runtime ([PR](https://github.com/Comcast/react-data-grid/pull/2184)). The minimum supported react version is 16.14 now. ## v7.0.0-canary.30 -- Forward sorting props to `headerRenderer` ([PR](https://github.com/adazzle/react-data-grid/pull/2204)) -- Disable cell navigation while editing. This behavior can be controlled using the new `column.editorOptions.onNavigation` option ([PR](https://github.com/adazzle/react-data-grid/pull/2196)) +- Forward sorting props to `headerRenderer` ([PR](https://github.com/Comcast/react-data-grid/pull/2204)) +- Disable cell navigation while editing. This behavior can be controlled using the new `column.editorOptions.onNavigation` option ([PR](https://github.com/Comcast/react-data-grid/pull/2196)) ## v7.0.0-canary.29 -- Fix crash when `rows` are `undefined` ([PR](https://github.com/adazzle/react-data-grid/pull/2197)) -- Fix a scrolling bug caused by `scroll-behavior: smooth` ([PR](https://github.com/adazzle/react-data-grid/pull/2200)) +- Fix crash when `rows` are `undefined` ([PR](https://github.com/Comcast/react-data-grid/pull/2197)) +- Fix a scrolling bug caused by `scroll-behavior: smooth` ([PR](https://github.com/Comcast/react-data-grid/pull/2200)) ## v7.0.0-canary.28 -- (Breaking) Removed `onRowsUpdate`, `enableCellCopyPaste`, and `enableCellDragAndDrop` props. Added 2 new props (`onFill` and `onPaste`) ([PR](https://github.com/adazzle/react-data-grid/pull/2194)) -- (Breaking) Rename `enableFilters` to `enableFilterRow` ([PR](https://github.com/adazzle/react-data-grid/pull/2195)) +- (Breaking) Removed `onRowsUpdate`, `enableCellCopyPaste`, and `enableCellDragAndDrop` props. Added 2 new props (`onFill` and `onPaste`) ([PR](https://github.com/Comcast/react-data-grid/pull/2194)) +- (Breaking) Rename `enableFilters` to `enableFilterRow` ([PR](https://github.com/Comcast/react-data-grid/pull/2195)) ## v7.0.0-canary.27 -- (Breaking) Removed old editor API ([PR](https://github.com/adazzle/react-data-grid/pull/2149)) -- (Breaking) Removed `onCheckCellIsEditable` prop ([PR](https://github.com/adazzle/react-data-grid/pull/2016)). Use `column.editable` instead. - = (Breaking) Replaced rowKey prop with rowKeyGetter ([PR](https://github.com/adazzle/react-data-grid/pull/2190)) +- (Breaking) Removed old editor API ([PR](https://github.com/Comcast/react-data-grid/pull/2149)) +- (Breaking) Removed `onCheckCellIsEditable` prop ([PR](https://github.com/Comcast/react-data-grid/pull/2016)). Use `column.editable` instead. + = (Breaking) Replaced rowKey prop with rowKeyGetter ([PR](https://github.com/Comcast/react-data-grid/pull/2190)) ## v7.0.0-canary.26 -- Fixed Copy & Paste events not working properly in non-English keyboards ([PR](https://github.com/adazzle/react-data-grid/pull/2097)) +- Fixed Copy & Paste events not working properly in non-English keyboards ([PR](https://github.com/Comcast/react-data-grid/pull/2097)) ## v7.0.0-canary.25 -- Added support for webpack 5 ([PR](https://github.com/adazzle/react-data-grid/pull/2178)) +- Added support for webpack 5 ([PR](https://github.com/Comcast/react-data-grid/pull/2178)) ## v7.0.0-canary.24 @@ -136,37 +136,37 @@ ## v7.0.0-canary.22 -- Add Grouping ([PR](https://github.com/adazzle/react-data-grid/pull/2106)). Check the new [example](https://adazzle.github.io/react-data-grid/#/grouping). -- (Breaking) Removed `height` and `width` props and added new `className` and `style` props. We are now using `ResizeObserver` to calculate all the grid dimensions ([PR](https://github.com/adazzle/react-data-grid/pull/2130)) -- (Breaking) Removed formatterOptions. Grid now handles formatter focus internally so this prop is no longer required ([PR](https://github.com/adazzle/react-data-grid/pull/2138)) +- Add Grouping ([PR](https://github.com/Comcast/react-data-grid/pull/2106)). Check the new [example](https://comcast.github.io/react-data-grid/#/grouping). +- (Breaking) Removed `height` and `width` props and added new `className` and `style` props. We are now using `ResizeObserver` to calculate all the grid dimensions ([PR](https://github.com/Comcast/react-data-grid/pull/2130)) +- (Breaking) Removed formatterOptions. Grid now handles formatter focus internally so this prop is no longer required ([PR](https://github.com/Comcast/react-data-grid/pull/2138)) - Added support for React 17 ## v7.0.0-canary.21 -- Editor2 bug fixes ([PR](https://github.com/adazzle/react-data-grid/pull/2126)) +- Editor2 bug fixes ([PR](https://github.com/Comcast/react-data-grid/pull/2126)) - `formatterOptions.focusable` can be a function now so different rows can have different focus behavior for the same column -- Grid now internally uses `ResizeObserver` API to calculate the available width ([PR](https://github.com/adazzle/react-data-grid/pull/2129)) +- Grid now internally uses `ResizeObserver` API to calculate the available width ([PR](https://github.com/Comcast/react-data-grid/pull/2129)) ## v7.0.0-canary.20 -- A new editor api that does not require a ref ([PR](https://github.com/adazzle/react-data-grid/pull/2102)) -- A new `columnDefaultOptions` prop. This replaces `minColumnWidth` and `defaultFormatter` props ([PR](https://github.com/adazzle/react-data-grid/pull/2117)) +- A new editor api that does not require a ref ([PR](https://github.com/Comcast/react-data-grid/pull/2102)) +- A new `columnDefaultOptions` prop. This replaces `minColumnWidth` and `defaultFormatter` props ([PR](https://github.com/Comcast/react-data-grid/pull/2117)) ## v7.0.0-canary.19 -- Allow setting ref on `Cell/Row` renderers ([PR](https://github.com/adazzle/react-data-grid/pull/2111)) +- Allow setting ref on `Cell/Row` renderers ([PR](https://github.com/Comcast/react-data-grid/pull/2111)) ## v7.0.0-canary.18 -- Accessibility improvements. Added various aria attributes. ([PR](https://github.com/adazzle/react-data-grid/pull/2084)) -- Removed enableCellAutoFocus prop ([PR](https://github.com/adazzle/react-data-grid/pull/2073)) +- Accessibility improvements. Added various aria attributes. ([PR](https://github.com/Comcast/react-data-grid/pull/2084)) +- Removed enableCellAutoFocus prop ([PR](https://github.com/Comcast/react-data-grid/pull/2073)) - Removed InteractionMasks component. This is an internal change to prepare for grouping and it fixes a few selected cell position bugs -- Improved focus for custom formatters using the new formatterOptions ([PR](https://github.com/adazzle/react-data-grid/pull/2104)) +- Improved focus for custom formatters using the new formatterOptions ([PR](https://github.com/Comcast/react-data-grid/pull/2104)) ## v7.0.0-canary.17 -- Performance improvements ([PR](https://github.com/adazzle/react-data-grid/pull/2015)) -- A new rowClass prop ([PR](https://github.com/adazzle/react-data-grid/pull/2058)) +- Performance improvements ([PR](https://github.com/Comcast/react-data-grid/pull/2015)) +- A new rowClass prop ([PR](https://github.com/Comcast/react-data-grid/pull/2058)) ## `alpha` to `canary` @@ -190,7 +190,7 @@ - ⚠️ This replaces the `minColumnWidth` and `defaultFormatter` props - `groupBy` - `rowGrouper` - - More info in [#2106](https://github.com/adazzle/react-data-grid/pull/2106) + - More info in [#2106](https://github.com/Comcast/react-data-grid/pull/2106) - `column.cellClass(row)` function support: - `column = { ..., cellClass(row) { return string; } }` - `column.minWidth` @@ -199,9 +199,9 @@ - `column.editor` - New API - `column.editorOptions` - - More info in [#2102](https://github.com/adazzle/react-data-grid/pull/2102) + - More info in [#2102](https://github.com/Comcast/react-data-grid/pull/2102) - `column.groupFormatter` - - More info in [#2106](https://github.com/adazzle/react-data-grid/pull/2106) + - More info in [#2106](https://github.com/Comcast/react-data-grid/pull/2106) - `scrollToRow` method - ⚠️ This replaces the `scrollToRowIndex` prop - Dark mode support @@ -217,7 +217,7 @@ - ⚠️ `height` - ⚠️ `cellContentRenderer` - ⚠️ `contextMenu` - - Check the [Context Menu](https://adazzle.github.io/react-data-grid/#/context-menu) example + - Check the [Context Menu](https://comcast.github.io/react-data-grid/#/context-menu) example - ⚠️ `enableCellSelect` - ⚠️ `enableCellAutoFocus` - ⚠️ `getValidFilterValues` @@ -232,13 +232,13 @@ - Use `onRowsChange`, `onFill`, and `onPaste` instead. - ⚠️ `onHeaderDrop` - ⚠️ `draggableHeaderCell` - - Check [#2007](https://github.com/adazzle/react-data-grid/pull/2007) on how to migrate + - Check [#2007](https://github.com/Comcast/react-data-grid/pull/2007) on how to migrate - ⚠️ `rowGroupRenderer` - ⚠️ `onRowExpandToggle` - - Check [#2012](https://github.com/adazzle/react-data-grid/pull/2012) on how to migrate + - Check [#2012](https://github.com/Comcast/react-data-grid/pull/2012) on how to migrate - ⚠️ `rowsContainer` - ⚠️ Subrow props: `getSubRowDetails`, `onCellExpand`, `onDeleteSubRow`, and `onAddSubRow` - - Check [#1853](https://github.com/adazzle/react-data-grid/pull/1853) on how to migrate + - Check [#1853](https://github.com/Comcast/react-data-grid/pull/1853) on how to migrate - ⚠️ `cellMetaData` (from `Row` and `Cell` props) - ⚠️ `value` (from `column.formatter` props) - **Ref handlers:** @@ -255,7 +255,7 @@ ``` - ⚠️ `column.events` - ⚠️ `column.getCellActions` - - Check [#1845](https://github.com/adazzle/react-data-grid/pull/1845) on how to migrate + - Check [#1845](https://github.com/Comcast/react-data-grid/pull/1845) on how to migrate - ⚠️ `column.getRowMetaData` - ⚠️ `column.minColumnWidth` - ⚠️ `column.filterable` @@ -279,7 +279,7 @@ - `summaryRows` types are now independent from `rows` - Added `column.summaryCellClass` and `column.summaryFormatter` props - `column.formatter` isn't used anymore to render summary row cells. - - Only visible headers cells are now rendered. [#1837](https://github.com/adazzle/react-data-grid/pull/1837) + - Only visible headers cells are now rendered. [#1837](https://github.com/Comcast/react-data-grid/pull/1837) - ⚠️ the `rowKeyGetter` prop is now required for row selection. - ⚠️ `column.cellClass` does not affect header cells anymore. - ⚠️ `onScroll` will directly pass the UIEvent rather than the scrollLeft and scrollRight only. @@ -291,14 +291,14 @@ - TypeScript declaration files - `column.cellContentRenderer` - More info in this [gist](https://gist.github.com/nstepien/090298c3c2d94324cb332c33d82fdcfb) - - `summaryRows` prop [#1773](https://github.com/adazzle/react-data-grid/pull/1773) + - `summaryRows` prop [#1773](https://github.com/Comcast/react-data-grid/pull/1773) - `sortColumn` and `sortDirection` props - ⚠️ The internal sort states have been removed. - - Check [#1768](https://github.com/adazzle/react-data-grid/pull/1768) on how to migrate. + - Check [#1768](https://github.com/Comcast/react-data-grid/pull/1768) on how to migrate. - `selectedRows` and `onSelectedRowsChange` props - ⚠️ Row selection has been reimplemented. - A new `SelectColumn` is now available to import and add a row selection column. - - Check [#1762](https://github.com/adazzle/react-data-grid/pull/1762) on how to migrate. + - Check [#1762](https://github.com/Comcast/react-data-grid/pull/1762) on how to migrate. - **Removed:** - **Packages:** - `react-data-grid-examples` @@ -310,13 +310,13 @@ - ⚠️ `onRowUpdated` - ⚠️ `rowScrollTimeout` - ⚠️ `toolbar` - - Check [#1769](https://github.com/adazzle/react-data-grid/pull/1769) on how to migrate + - Check [#1769](https://github.com/Comcast/react-data-grid/pull/1769) on how to migrate - ⚠️ `isScrolling` (from `column.formatter` props) - ⚠️ `ContainerEditorWrapper` - ⚠️ `EditorBase` - ⚠️ `setScrollLeft` from `Row` and `Cell` renderers - `setScrollLeft` instance method was previously required on custom Cell and Row renderers and it can be safely removed now. - - More info in [#1793](https://github.com/adazzle/react-data-grid/pull/1793) + - More info in [#1793](https://github.com/Comcast/react-data-grid/pull/1793) - ⚠️ Dropped ImmutableJS support. - ⚠️ Dropped dynamic height row support. - This was not officially supported, but it was still possible to implement dynamic rows via custom Row renderer. This was a buggy feature so it has been removed. @@ -326,7 +326,7 @@ - **Changed:** - ⚠️ The stylesheets are now bundled separately: - `react-data-grid/dist/react-data-grid.css` - - ⚠️ Reimplemented stylesheets, renamed various class names [#1780](https://github.com/adazzle/react-data-grid/pull/1780) + - ⚠️ Reimplemented stylesheets, renamed various class names [#1780](https://github.com/Comcast/react-data-grid/pull/1780) - No longer depends on bootstrap - Resizing a column now immediately resizes all its cells instead of just its header. - Improved performance across the board. @@ -343,77 +343,77 @@ ## 5.0.5 (Dec 6, 2018) -- **Bugfix:** fix: draggable resizing col jumps to right ([1421](https://github.com/adazzle/react-data-grid/pull/1421)) -- **Bugfix:** Cell Tooltip - Focus Issues ([1422](https://github.com/adazzle/react-data-grid/pull/1422)) +- **Bugfix:** fix: draggable resizing col jumps to right ([1421](https://github.com/Comcast/react-data-grid/pull/1421)) +- **Bugfix:** Cell Tooltip - Focus Issues ([1422](https://github.com/Comcast/react-data-grid/pull/1422)) ## 6.0.1 (Nov 30, 2018) -- **Bugfix:** Fix formatter exports ([1409](https://github.com/adazzle/react-data-grid/pull/1409)) +- **Bugfix:** Fix formatter exports ([1409](https://github.com/Comcast/react-data-grid/pull/1409)) ## 6.0.0 (Nov 30, 2018) -- **Bugfix:** Fix outside click logic for committing changes ([1404](https://github.com/adazzle/react-data-grid/pull/1404)) -- **TechDebt** Add ESLint Rules ([1396](https://github.com/adazzle/react-data-grid/pull/1396) [1397](https://github.com/adazzle/react-data-grid/pull/1397) [1396](https://github.com/adazzle/react-data-grid/pull/1398) [1399](https://github.com/adazzle/react-data-grid/pull/1399)) -- **TechDebt:** Upgrade build tools to latest versions ([1350](https://github.com/adazzle/react-data-grid/pull/1350)) -- **Feature:** Cleanup zIndex logic ([1393](https://github.com/adazzle/react-data-grid/pull/1393)) -- **Breaking** Use react portals for cell editors ([1369](https://github.com/adazzle/react-data-grid/pull/1369)) -- **TechDebt:** Upgrade build tools to latest versions ([1350](https://github.com/adazzle/react-data-grid/pull/1350)) +- **Bugfix:** Fix outside click logic for committing changes ([1404](https://github.com/Comcast/react-data-grid/pull/1404)) +- **TechDebt** Add ESLint Rules ([1396](https://github.com/Comcast/react-data-grid/pull/1396) [1397](https://github.com/Comcast/react-data-grid/pull/1397) [1396](https://github.com/Comcast/react-data-grid/pull/1398) [1399](https://github.com/Comcast/react-data-grid/pull/1399)) +- **TechDebt:** Upgrade build tools to latest versions ([1350](https://github.com/Comcast/react-data-grid/pull/1350)) +- **Feature:** Cleanup zIndex logic ([1393](https://github.com/Comcast/react-data-grid/pull/1393)) +- **Breaking** Use react portals for cell editors ([1369](https://github.com/Comcast/react-data-grid/pull/1369)) +- **TechDebt:** Upgrade build tools to latest versions ([1350](https://github.com/Comcast/react-data-grid/pull/1350)) ## 5.0.4 (Nov 14, 2018) -- **Bugfix:** Custom Formatters Example - Styling Fix ([1364](https://github.com/adazzle/react-data-grid/pull/1364)) -- **Bugfix:** Fix website publishing and remove ImmutableJS dependency ([1366](https://github.com/adazzle/react-data-grid/pull/1366)) -- **Bugfix:** Remove react-data-grid dependency from the addons package ([1354](https://github.com/adazzle/react-data-grid/pull/1354)) -- **Bugfix:** Fix drag fill in IE 11 ([1359](https://github.com/adazzle/react-data-grid/pull/1359)) -- **Bugfix:** Ensure webpack uses correct common js external ref ([1370](https://github.com/adazzle/react-data-grid/pull/1370)) -- **Feature:** Move DropTargetRowContainer static styles to CSS class for user customization ([1308](https://github.com/adazzle/react-data-grid/pull/1308)) -- **Bugfix:** Replace use of i for column index which is no longer passed in ([1344](https://github.com/adazzle/react-data-grid/pull/1344)) -- **Bugfix:** Remove utils from documentation as an exported module ([1374](https://github.com/adazzle/react-data-grid/pull/1374)) -- **TechDebt:** Upgrade eslint packages ([1376](https://github.com/adazzle/react-data-grid/pull/1376)) -- **Bugfix:** Cleanup DraggableContainer and fix styles ([1379](https://github.com/adazzle/react-data-grid/pull/1379)) +- **Bugfix:** Custom Formatters Example - Styling Fix ([1364](https://github.com/Comcast/react-data-grid/pull/1364)) +- **Bugfix:** Fix website publishing and remove ImmutableJS dependency ([1366](https://github.com/Comcast/react-data-grid/pull/1366)) +- **Bugfix:** Remove react-data-grid dependency from the addons package ([1354](https://github.com/Comcast/react-data-grid/pull/1354)) +- **Bugfix:** Fix drag fill in IE 11 ([1359](https://github.com/Comcast/react-data-grid/pull/1359)) +- **Bugfix:** Ensure webpack uses correct common js external ref ([1370](https://github.com/Comcast/react-data-grid/pull/1370)) +- **Feature:** Move DropTargetRowContainer static styles to CSS class for user customization ([1308](https://github.com/Comcast/react-data-grid/pull/1308)) +- **Bugfix:** Replace use of i for column index which is no longer passed in ([1344](https://github.com/Comcast/react-data-grid/pull/1344)) +- **Bugfix:** Remove utils from documentation as an exported module ([1374](https://github.com/Comcast/react-data-grid/pull/1374)) +- **TechDebt:** Upgrade eslint packages ([1376](https://github.com/Comcast/react-data-grid/pull/1376)) +- **Bugfix:** Cleanup DraggableContainer and fix styles ([1379](https://github.com/Comcast/react-data-grid/pull/1379)) ## 5.0.3 (Nov 1, 2018) -- **Bugfix:** Fix frozen-columns source url ([1355](https://github.com/adazzle/react-data-grid/pull/1355)) -- **TechDebt:** Defining the ref callback as a bound method ([1353](https://github.com/adazzle/react-data-grid/pull/1353)) -- **Bugfix:** Fix cell focusing logic ([1352](https://github.com/adazzle/react-data-grid/pull/1352)) -- **Bugfix:** RDG Tree Cell Expand Styling Issues ([1316](https://github.com/adazzle/react-data-grid/pull/1316)) +- **Bugfix:** Fix frozen-columns source url ([1355](https://github.com/Comcast/react-data-grid/pull/1355)) +- **TechDebt:** Defining the ref callback as a bound method ([1353](https://github.com/Comcast/react-data-grid/pull/1353)) +- **Bugfix:** Fix cell focusing logic ([1352](https://github.com/Comcast/react-data-grid/pull/1352)) +- **Bugfix:** RDG Tree Cell Expand Styling Issues ([1316](https://github.com/Comcast/react-data-grid/pull/1316)) ## 5.0.2 (Oct 30, 2018) -- **Bugfix:** Fix grouping example ([1311](https://github.com/adazzle/react-data-grid/pull/1311)) -- **Bugfix:** Remove contain layout css ([1346](https://github.com/adazzle/react-data-grid/pull/1346)) -- **Bugfix:** Preserve window scroll position on cell selection ([1349](https://github.com/adazzle/react-data-grid/pull/1346)) +- **Bugfix:** Fix grouping example ([1311](https://github.com/Comcast/react-data-grid/pull/1311)) +- **Bugfix:** Remove contain layout css ([1346](https://github.com/Comcast/react-data-grid/pull/1346)) +- **Bugfix:** Preserve window scroll position on cell selection ([1349](https://github.com/Comcast/react-data-grid/pull/1346)) ## 5.0.1 (Oct 22, 2018) ### React-Data-Grid -- **Bugfix:** Fix CopyMask columns ([1289](https://github.com/adazzle/react-data-grid/pull/1272)) +- **Bugfix:** Fix CopyMask columns ([1289](https://github.com/Comcast/react-data-grid/pull/1272)) ## 5.0.0 (Oct 22, 2018) ### React-Data-Grid -- **Feature:** Improve Cell navigation Performance ([1123](https://github.com/adazzle/react-data-grid/pull/1123)) -- **Feature:** Scrolling improvements ([1254](https://github.com/adazzle/react-data-grid/pull/1254)) -- **Feature:** Remove react-data-grid dependency from react-data-grid-addons bundle ([1272](https://github.com/adazzle/react-data-grid/pull/1272)) +- **Feature:** Improve Cell navigation Performance ([1123](https://github.com/Comcast/react-data-grid/pull/1123)) +- **Feature:** Scrolling improvements ([1254](https://github.com/Comcast/react-data-grid/pull/1254)) +- **Feature:** Remove react-data-grid dependency from react-data-grid-addons bundle ([1272](https://github.com/Comcast/react-data-grid/pull/1272)) ## 4.0.8 (May 10, 2018) ### React-Data-Grid -- **Bugfix:** Fix editor refs ([#1183](https://github.com/adazzle/react-data-grid/pull/1183)) +- **Bugfix:** Fix editor refs ([#1183](https://github.com/Comcast/react-data-grid/pull/1183)) ## 4.0.7 (April 19, 2018) ### React-Data-Grid -- **Feature:** Support `React v16` ([#1116](https://github.com/adazzle/react-data-grid/pull/1116)) -- **Feature:** Set sort column and direction with props ([#649](https://github.com/adazzle/react-data-grid/pull/649)) -- **Bugfix:** Filtering should ignore null values ([#1147](https://github.com/adazzle/react-data-grid/pull/1147)) -- **Bugfix:** Resize column doesnt work on firefox when also draggable ([#1121](https://github.com/adazzle/react-data-grid/pull/1121)) +- **Feature:** Support `React v16` ([#1116](https://github.com/Comcast/react-data-grid/pull/1116)) +- **Feature:** Set sort column and direction with props ([#649](https://github.com/Comcast/react-data-grid/pull/649)) +- **Bugfix:** Filtering should ignore null values ([#1147](https://github.com/Comcast/react-data-grid/pull/1147)) +- **Bugfix:** Resize column doesnt work on firefox when also draggable ([#1121](https://github.com/Comcast/react-data-grid/pull/1121)) ### React-Data-Grid-Addons -- **Breaking:** Migrate to `react-context-menu 2.9.2` ([#1081](https://github.com/adazzle/react-data-grid/pull/1081)) +- **Breaking:** Migrate to `react-context-menu 2.9.2` ([#1081](https://github.com/Comcast/react-data-grid/pull/1081)) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index ad97190bc4..0000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,23 +0,0 @@ -### Release process - -For maintainers only. - -- `cd` to the root of the repo. -- Checkout the `main` branch. -- Make sure your local branch is up to date, no unpushed or missing commits, stash any changes. -- Update the changelog, if necessary, and commit. -- Login to the `adazzle` npm account if you haven't already done so: - - `npm login` - - You can use `npm whoami` to check who you are logged in as. -- Bump the version and publish on npm: - - - To release a new `beta` version: - - `npm version prerelease --preid=beta -m "Publish %s"` - - `npm publish --tag beta` - - Relevant docs: - - https://docs.npmjs.com/cli/commands/npm-version - - https://docs.npmjs.com/cli/commands/npm-publish - - https://docs.npmjs.com/cli/using-npm/scripts - - https://git-scm.com/docs/git-push diff --git a/LICENSE b/LICENSE index 45955c9893..00f9bdff4b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ The MIT License (MIT) Original work Copyright (c) 2014 Prometheus Research -Modified work Copyright 2015 Adazzle +Modified work Copyright 2015 Comcast For the original source code please see https://github.com/prometheusresearch-archive/react-grid diff --git a/README.md b/README.md index 0bba832f16..fe69903430 100644 --- a/README.md +++ b/README.md @@ -6,52 +6,52 @@ [![codecov-badge]][codecov-url] [![ci-badge]][ci-url] -[npm-badge]: https://img.shields.io/npm/v/react-data-grid -[npm-url]: https://www.npmjs.com/package/react-data-grid -[size-badge]: https://img.shields.io/bundlephobia/minzip/react-data-grid -[size-url]: https://bundlephobia.com/package/react-data-grid -[type-badge]: https://img.shields.io/npm/types/react-data-grid -[codecov-badge]: https://codecov.io/gh/adazzle/react-data-grid/branch/main/graph/badge.svg?token=cvrRSWiz0Q -[codecov-url]: https://app.codecov.io/gh/adazzle/react-data-grid -[ci-badge]: https://github.com/adazzle/react-data-grid/workflows/CI/badge.svg -[ci-url]: https://github.com/adazzle/react-data-grid/actions +_Note: This package is a Grafana-maintained fork of [react-data-grid](https://github.com/Comcast/react-data-grid), published as `@grafana/react-data-grid`. It adds auto-height support for non-virtualized rendering and a few accessibility improvements on top of upstream._ The DataGrid component is designed to handle large datasets efficiently while offering a rich set of features for customization and interactivity. +## Table of contents + +- [Features](#features) +- [Links](#links) +- [Installation](#installation) +- [Getting started](#getting-started) +- [Styling and Customization](#styling-and-customization) +- [API Reference](#api-reference) + ## Features -- [React 19.0+](package.json) support -- [Evergreen browsers and server-side rendering](browserslist) support -- Tree-shaking support and only [one npm dependency](package.json) to keep your bundles slim +- [React 19.2+](package.json) support +- Evergreen browsers and server-side rendering support +- Tree-shaking support with no external dependencies to keep your bundles slim - Great performance thanks to virtualization: columns and rows outside the viewport are not rendered - Strictly typed with TypeScript -- [Keyboard accessibility](https://adazzle.github.io/react-data-grid/#/CommonFeatures) -- Light and dark mode support out of the box. The light or dark themes can be enforced using the `rdg-light` or `rdg-dark` classes. -- [Frozen columns](https://adazzle.github.io/react-data-grid/#/CommonFeatures): Freeze columns to keep them visible during horizontal scrolling. -- [Column resizing](https://adazzle.github.io/react-data-grid/#/CommonFeatures) -- [Multi-column sorting](https://adazzle.github.io/react-data-grid/#/CommonFeatures) +- [Keyboard accessibility](https://comcast.github.io/react-data-grid/#/CommonFeatures) +- Light and dark mode support out of the box via `color-scheme`. +- [Frozen columns](https://comcast.github.io/react-data-grid/#/CommonFeatures): Freeze columns to keep them visible during horizontal scrolling. +- [Column resizing](https://comcast.github.io/react-data-grid/#/CommonFeatures) +- [Multi-column sorting](https://comcast.github.io/react-data-grid/#/CommonFeatures) - Click on a sortable column header to toggle between its ascending/descending sort order - Ctrl+Click / Meta+Click to sort an additional column -- [Column spanning](https://adazzle.github.io/react-data-grid/#/ColumnSpanning) -- [Column grouping](https://adazzle.github.io/react-data-grid/#/ColumnGrouping) -- [Row selection](https://adazzle.github.io/react-data-grid/#/CommonFeatures) -- [Row grouping](https://adazzle.github.io/react-data-grid/#/RowGrouping) -- [Summary rows](https://adazzle.github.io/react-data-grid/#/CommonFeatures) -- [Dynamic row heights](https://adazzle.github.io/react-data-grid/#/VariableRowHeight) -- [No rows fallback](https://adazzle.github.io/react-data-grid/#/NoRows) -- [Cell formatting](https://adazzle.github.io/react-data-grid/#/CommonFeatures) -- [Cell editing](https://adazzle.github.io/react-data-grid/#/CommonFeatures) -- [Cell copy / pasting](https://adazzle.github.io/react-data-grid/#/AllFeatures) -- [Cell value dragging / filling](https://adazzle.github.io/react-data-grid/#/AllFeatures) -- [Customizable Renderers](https://adazzle.github.io/react-data-grid/#/CustomizableRenderers) +- [Column spanning](https://comcast.github.io/react-data-grid/#/ColumnSpanning) +- [Column grouping](https://comcast.github.io/react-data-grid/#/ColumnGrouping) +- [Row selection](https://comcast.github.io/react-data-grid/#/CommonFeatures) +- [Row grouping](https://comcast.github.io/react-data-grid/#/RowGrouping) +- [Summary rows](https://comcast.github.io/react-data-grid/#/CommonFeatures) +- [Dynamic row heights](https://comcast.github.io/react-data-grid/#/VariableRowHeight) +- [No rows fallback](https://comcast.github.io/react-data-grid/#/NoRows) +- [Cell formatting](https://comcast.github.io/react-data-grid/#/CommonFeatures) +- [Cell editing](https://comcast.github.io/react-data-grid/#/CommonFeatures) +- [Cell copy / pasting](https://comcast.github.io/react-data-grid/#/AllFeatures) +- [Cell value dragging / filling](https://comcast.github.io/react-data-grid/#/AllFeatures) +- [Customizable Renderers](https://comcast.github.io/react-data-grid/#/CustomizableRenderers) - Right-to-left (RTL) support. ## Links -- [Examples website](https://adazzle.github.io/react-data-grid/) +- [Examples website](https://comcast.github.io/react-data-grid/) - [Source code](website) - [Changelog](CHANGELOG.md) -- [Contributing](CONTRIBUTING.md) ## Installation @@ -81,6 +81,17 @@ import 'react-data-grid/lib/styles.css'; `react-data-grid` is published as ECMAScript modules for evergreen browsers, bundlers, and server-side rendering. +> **Important**
+> Vite 8+ by default uses `lightningcss` to minify css which has a [bug minifying light-dark syntax](https://github.com/parcel-bundler/lightningcss/issues/873). You can tweak the `cssMinify` or `cssTarget` [settings](https://main.vite.dev/config/build-options) as a workaround. + +```ts +build: { + cssMinify: 'esbuild', + // or + cssTarget: 'esnext' +} +``` + ## Getting started Here is a basic example of how to use `react-data-grid` in your React application: @@ -95,12 +106,12 @@ interface Row { title: string; } -const columns: Column[] = [ +const columns: readonly Column[] = [ { key: 'id', name: 'ID' }, { key: 'title', name: 'Title' } ]; -const rows: Row[] = [ +const rows: readonly Row[] = [ { id: 0, title: 'Example' }, { id: 1, title: 'Demo' } ]; @@ -110,6 +121,118 @@ function App() { } ``` +## Styling and Customization + +The DataGrid provides multiple ways to customize its appearance and behavior. + +### Light/Dark Themes + +The DataGrid supports both light and dark color schemes out of the box using the `light-dark()` CSS function. The theme automatically adapts based on the user's system preference when `color-scheme: light dark;` is set. + +To enforce a specific theme, we recommend setting the standard `color-scheme` CSS property on the `:root`: + +```css +:root { + color-scheme: light; /* or 'dark', or 'light dark' for auto */ +} +``` + +Alternatively, you can add the `rdg-light` or `rdg-dark` class to individual grids: + +```tsx +// Force light theme + + +// Force dark theme + +``` + +### CSS Variables + +The DataGrid supports the following CSS variables for customization: + +```css +.rdg { + /* Selection */ + --rdg-selection-width: 2px; + --rdg-selection-color: hsl(207, 75%, 66%); + + /* Typography */ + --rdg-font-size: 14px; + + /* Colors (using light-dark() for automatic theme switching) */ + --rdg-color: light-dark(#000, #ddd); + --rdg-background-color: light-dark(hsl(0deg 0% 100%), hsl(0deg 0% 13%)); + + /* Header */ + --rdg-header-background-color: light-dark(hsl(0deg 0% 97.5%), hsl(0deg 0% 10.5%)); + --rdg-header-draggable-background-color: light-dark(hsl(0deg 0% 90.5%), hsl(0deg 0% 17.5%)); + + /* Rows */ + --rdg-row-hover-background-color: light-dark(hsl(0deg 0% 96%), hsl(0deg 0% 9%)); + --rdg-row-selected-background-color: light-dark(hsl(207deg 76% 92%), hsl(207deg 76% 42%)); + --rdg-row-selected-hover-background-color: light-dark(hsl(207deg 76% 88%), hsl(207deg 76% 38%)); + + /* Borders */ + --rdg-border-width: 1px; + --rdg-border-color: light-dark(#ddd, #444); + --rdg-summary-border-width: calc(var(--rdg-border-width) * 2); + --rdg-summary-border-color: light-dark(#aaa, #555); + + /* Checkboxes */ + --rdg-checkbox-focus-color: hsl(207deg 100% 69%); +} +``` + +Example of customizing colors: + +```css +.my-custom-grid { + --rdg-background-color: #f0f0f0; + --rdg-selection-color: #ff6b6b; + --rdg-font-size: 16px; +} +``` + +```tsx + +``` + +### Standard Props + +The DataGrid accepts standard [`className`](#classname-string--undefined) and [`style`](#style-cssproperties--undefined) props: + +```tsx + +``` + +### Row and Cell Styling + +#### Row Heights + +Control row heights using the [`rowHeight`](#rowheight-maybenumber--row-r--number), [`headerRowHeight`](#headerrowheight-maybenumber), and [`summaryRowHeight`](#summaryrowheight-maybenumber) props. The `rowHeight` prop supports both fixed heights and dynamic heights per row. + +#### Row Classes + +Apply custom CSS classes to rows using the [`rowClass`](#rowclass-mayberow-r-rowidx-number--maybestring) prop, and to header rows using the [`headerRowClass`](#headerrowclass-maybestring) prop. + +#### Cell Classes + +Apply custom CSS classes to cells using the [`cellClass`](#cellclass-maybestring--row-trow--maybestring) property in column definitions. You can also use [`headerCellClass`](#headercellclass-maybestring) and [`summaryCellClass`](#summarycellclass-maybestring--row-tsummaryrow--maybestring) for header and summary cells respectively. + +#### Column Widths + +Control column widths using the [`width`](#width-maybenumber--string), [`minWidth`](#minwidth-maybenumber), and [`maxWidth`](#maxwidth-maybenumber) properties in column definitions. Enable column resizing using the [`resizable`](#resizable-maybeboolean) property, or use [`defaultColumnOptions`](#defaultcolumnoptions-maybedefaultcolumnoptionsr-sr) to apply it to all columns. + +### Custom Renderers + +Replace default components with custom implementations using the [`renderers`](#renderers-mayberenderersr-sr) prop. Columns can also have custom renderers using the [`renderCell`](#rendercell-maybeprops-rendercellpropstrow-tsummaryrow--reactnode), [`renderHeaderCell`](#renderheadercell-maybeprops-renderheadercellpropstrow-tsummaryrow--reactnode), [`renderSummaryCell`](#rendersummarycell-maybeprops-rendersummarycellpropstsummaryrow-trow--reactnode), [`renderGroupCell`](#rendergroupcell-maybeprops-rendergroupcellpropstrow-tsummaryrow--reactnode), and [`renderEditCell`](#rendereditcell-maybeprops-rendereditcellpropstrow-tsummaryrow--reactnode) properties. + ## API Reference ### Components @@ -118,18 +241,35 @@ function App() { ##### DataGridProps -###### `columns: readonly Column[]` +###### `columns: readonly ColumnOrColumnGroup[]` -See [`Column`](#column). +An array of column definitions and/or column groups. See the [`ColumnOrColumnGroup`](#columnorcolumngrouptrow-tsummaryrow) type for all available options. -An array of column definitions. Each column should have a key and name. - -:warning: Passing a new `columns` array will trigger a re-render for the whole grid, avoid changing it as much as possible for optimal performance. +:warning: **Performance:** Passing a new `columns` array will trigger a re-render and recalculation for the entire grid. Always memoize this prop using `useMemo` or define it outside the component to avoid unnecessary re-renders. ###### `rows: readonly R[]` An array of rows, the rows data can be of any type. +:bulb: **Performance:** The grid is optimized for efficient rendering: + +- **Virtualization**: Only visible rows are rendered in the DOM +- **Individual row updates**: Row components are memoized, so updating a single row object will only re-render that specific row, not all rows +- **Array reference matters**: Changing the array reference itself (e.g., `setRows([...rows])`) triggers viewport and layout recalculations, even if the row objects are unchanged +- **Best practice**: When updating rows, create a new array but reuse unchanged row objects. For example: + + ```tsx + // ✅ Good: Only changed row is re-rendered + setRows(rows.map((row, idx) => (idx === targetIdx ? { ...row, updated: true } : row))); + + // ❌ Avoid: Creates new references for all rows, causing all visible rows to re-render + setRows(rows.map((row) => ({ ...row }))); + ``` + +###### `ref?: Maybe>` + +Optional ref for imperative APIs like scrolling to or focusing a cell. See [`DataGridHandle`](#datagridhandle). + ###### `topSummaryRows?: Maybe` Rows pinned at the top of the grid for summary purposes. @@ -161,6 +301,8 @@ function MyGrid() { :bulb: While optional, setting this prop is recommended for optimal performance as the returned value is used to set the `key` prop on the row elements. +:warning: **Performance:** Define this function outside your component or memoize it with `useCallback` to prevent unnecessary re-renders. + ###### `onRowsChange?: Maybe<(rows: R[], data: RowsChangeData) => void>` Callback triggered when rows are changed. @@ -185,18 +327,43 @@ function MyGrid() { Height of each row in pixels. A function can be used to set different row heights. +```tsx +// Fixed height for all rows +; + +// Dynamic height per row +function getRowHeight(row) { + return row.isExpanded ? 100 : 35; +} + +; +``` + +:warning: **Performance:** When using a function, the heights of all rows are processed upfront. For large datasets (1000+ rows), this can cause performance issues if the identity of the function changes and invalidates internal memoization. Consider using a static function when possible, or memoize the `rowHeight` function. + ###### `headerRowHeight?: Maybe` -**Default:** `35` pixels +**Default:** `rowHeight` when it is a number, otherwise `35` pixels Height of the header row in pixels. ###### `summaryRowHeight?: Maybe` -**Default:** `35` pixels +**Default:** `rowHeight` when it is a number, otherwise `35` pixels Height of each summary row in pixels. +```tsx + +``` + ###### `columnWidths?: Maybe` A map of column widths containing both measured and resized widths. If not provided then an internal state is used. @@ -233,13 +400,21 @@ Callback triggered when the selection changes. import { useState } from 'react'; import { DataGrid, SelectColumn } from 'react-data-grid'; -const rows: readonly Rows[] = [...]; +const rows: readonly Row[] = [...]; const columns: readonly Column[] = [ SelectColumn, // other columns ]; +function rowKeyGetter(row: Row) { + return row.id; +} + +function isRowSelectionDisabled(row: Row) { + return !row.isActive; +} + function MyGrid() { const [selectedRows, setSelectedRows] = useState((): ReadonlySet => new Set()); @@ -254,20 +429,14 @@ function MyGrid() { /> ); } - -function rowKeyGetter(row: Row) { - return row.id; -} - -function isRowSelectionDisabled(row: Row) { - return !row.isActive; -} ``` ###### `sortColumns?: Maybe` An array of sorted columns. +Sorting is controlled: the grid does not reorder `rows` for you. Apply the sorting to your `rows` state (or derived rows) based on `sortColumns`. + ###### `onSortColumnsChange?: Maybe<(sortColumns: SortColumn[]) => void>` Callback triggered when sorting changes. @@ -276,7 +445,7 @@ Callback triggered when sorting changes. import { useState } from 'react'; import { DataGrid, SelectColumn } from 'react-data-grid'; -const rows: readonly Rows[] = [...]; +const rows: readonly Row[] = [...]; const columns: readonly Column[] = [ { @@ -330,14 +499,12 @@ function MyGrid() { } ``` -###### `onFill?: Maybe<(event: FillEvent) => R>` - -###### `onCellMouseDown: Maybe<(args: CellMouseArgs, event: CellMouseEvent) => void>` +###### `onCellMouseDown?: CellMouseEventHandler` -Callback triggered when a pointer becomes active in a cell. The default behavior is to select the cell. Call `preventGridDefault` to prevent the default behavior. +Callback triggered when a pointer becomes active in a cell. The default behavior is to focus the cell. Call `preventGridDefault` to prevent the default behavior. ```tsx -function onCellMouseDown(args: CellMouseDownArgs, event: CellMouseEvent) { +function onCellMouseDown(args: CellMouseArgs, event: CellMouseEvent) { if (args.column.key === 'id') { event.preventGridDefault(); } @@ -346,9 +513,7 @@ function onCellMouseDown(args: CellMouseDownArgs, event: CellMouseEvent) ; ``` -See [`CellMouseArgs`](#cellmouseargs) and [`CellMouseEvent`](#cellmouseevent) - -###### `onCellClick?: Maybe<(args: CellMouseArgs, event: CellMouseEvent) => void>` +###### `onCellClick?: CellMouseEventHandler` Callback triggered when a cell is clicked. @@ -367,14 +532,12 @@ This event can be used to open cell editor on single click ```tsx function onCellClick(args: CellMouseArgs, event: CellMouseEvent) { if (args.column.key === 'id') { - args.selectCell(true); + args.setActivePosition(true); } } ``` -See [`CellMouseArgs`](#cellmouseargs) and [`CellMouseEvent`](#cellmouseevent) - -###### `onCellDoubleClick?: Maybe<(args: CellMouseArgs, event: CellMouseEvent) => void>` +###### `onCellDoubleClick?: CellMouseEventHandler` Callback triggered when a cell is double-clicked. The default behavior is to open the editor if the cell is editable. Call `preventGridDefault` to prevent the default behavior. @@ -388,9 +551,7 @@ function onCellDoubleClick(args: CellMouseArgs, event: CellMouseEvent) { ; ``` -See [`CellMouseArgs`](#cellmouseargs) and [`CellMouseEvent`](#cellmouseevent) - -###### `onCellContextMenu?: Maybe<(args: CellMouseArgs, event: CellMouseEvent) => void>` +###### `onCellContextMenu?: CellMouseEventHandler` Callback triggered when a cell is right-clicked. @@ -405,8 +566,6 @@ function onCellContextMenu(args: CellMouseArgs, event: CellMouseEvent) { ; ``` -See [`CellMouseArgs`](#cellmouseargs) and [`CellMouseEvent`](#cellmouseevent) - ###### `onCellKeyDown?: Maybe<(args: CellKeyDownArgs, event: CellKeyboardEvent) => void>` A function called when keydown event is triggered on a cell. This event can be used to customize cell navigation and editing behavior. @@ -417,7 +576,7 @@ A function called when keydown event is triggered on a cell. This event can be u ```tsx function onCellKeyDown(args: CellKeyDownArgs, event: CellKeyboardEvent) { - if (args.mode === 'SELECT' && event.key === 'Enter') { + if (args.mode === 'ACTIVE' && event.key === 'Enter') { event.preventGridDefault(); } } @@ -427,7 +586,7 @@ function onCellKeyDown(args: CellKeyDownArgs, event: CellKeyboardEvent) { ```tsx function onCellKeyDown(args: CellKeyDownArgs, event: CellKeyboardEvent) { - if (args.mode === 'SELECT' && event.key === 'Tab') { + if (args.mode === 'ACTIVE' && event.key === 'Tab') { event.preventGridDefault(); } } @@ -439,23 +598,23 @@ Check [more examples](website/routes/CellNavigation.tsx) Callback triggered when a cell's content is copied. -###### `onCellPaste?: Maybe<(args: CellPasteArgs, NoInfer>, event: CellClipboardEvent) => void>` +###### `onCellPaste?: Maybe<(args: CellPasteArgs, NoInfer>, event: CellClipboardEvent) => R>` Callback triggered when content is pasted into a cell. -###### `onSelectedCellChange?: Maybe<(args: CellSelectArgs) => void>;` +Return the updated row; the grid will call `onRowsChange` with it. + +###### `onActivePositionChange?: Maybe<(args: PositionChangeArgs) => void>` -Triggered when the selected cell is changed. +Triggered when the active position changes. -Arguments: +See the [`PositionChangeArgs`](#positionchangeargstrow-tsummaryrow) type in the Types section below. -- `args.rowIdx`: `number` - row index -- `args.row`: `R` - row object of the currently selected cell -- `args.column`: `CalculatedColumn` - column object of the currently selected cell +###### `onFill?: Maybe<(event: FillEvent) => R>` -###### `onScroll?: Maybe<(event: React.UIEvent) => void>` +###### `onScroll?: React.UIEventHandler | undefined` -Callback triggered when the grid is scrolled. +Native DOM `onScroll` prop. ###### `onColumnResize?: Maybe<(column: CalculatedColumn, width: number) => void>` @@ -475,22 +634,51 @@ This prop can be used to disable virtualization. Custom renderers for cells, rows, and other components. +See the [`Renderers`](#rendererstrow-tsummaryrow) type for the full shape. + +Example of replacing default components: + ```tsx -interface Renderers { - renderCell?: Maybe<(key: Key, props: CellRendererProps) => ReactNode>; - renderCheckbox?: Maybe<(props: RenderCheckboxProps) => ReactNode>; - renderRow?: Maybe<(key: Key, props: RenderRowProps) => ReactNode>; - renderSortStatus?: Maybe<(props: RenderSortStatusProps) => ReactNode>; - noRowsFallback?: Maybe; -} +import { DataGrid, type Renderers } from 'react-data-grid'; + +const customRenderers: Renderers = { + // Custom row render function + renderRow(key, props) { + return ; + }, + + // Custom cell render function + renderCell(key, props) { + return ; + }, + + // Custom checkbox render function + renderCheckbox(props) { + return ; + }, + + // Custom sort status indicator + renderSortStatus(props) { + return ; + }, + + // Custom empty state + noRowsFallback:
No data available
+}; + +; ``` -For example, the default `` component can be wrapped via the `renderRow` prop to add contexts or tweak props +The default `` component can be wrapped via the `renderRow` prop to add contexts or tweak props: ```tsx -import { DataGrid, RenderRowProps, Row } from 'react-data-grid'; +import { DataGrid, Row, type RenderRowProps } from 'react-data-grid'; -function myRowRenderer(key: React.Key, props: RenderRowProps) { +interface MyRow { + id: number; +} + +function myRowRenderer(key: React.Key, props: RenderRowProps) { return ( @@ -503,8 +691,6 @@ function MyGrid() { } ``` -:warning: To prevent all rows from being unmounted on re-renders, make sure to pass a static or memoized render function to `renderRow`. - ###### `rowClass?: Maybe<(row: R, rowIdx: number) => Maybe>` Function to apply custom class names to rows. @@ -512,25 +698,31 @@ Function to apply custom class names to rows. ```tsx import { DataGrid } from 'react-data-grid'; -function MyGrid() { - return ; -} - function rowClass(row: Row, rowIdx: number) { return rowIdx % 2 === 0 ? 'even' : 'odd'; } + +function MyGrid() { + return ; +} ``` -###### `headerRowClass?: Maybe>` +:warning: **Performance:** Define this function outside your component or memoize it with `useCallback` to avoid re-rendering all rows on every render. + +###### `headerRowClass?: Maybe` Custom class name for the header row. +```tsx + +``` + ###### `direction?: Maybe<'ltr' | 'rtl'>` This property sets the text direction of the grid, it defaults to `'ltr'` (left-to-right). Setting `direction` to `'rtl'` has the following effects: - Columns flow from right to left -- Frozen columns are pinned on the right +- Start-frozen columns are pinned on the right, and end-frozen columns are pinned on the left - Column resize cursor is shown on the left edge of the column - Scrollbar is moved to the left @@ -542,6 +734,10 @@ Custom class name for the grid. Custom styles for the grid. +###### `role?: string | undefined` + +ARIA role for the grid container. Defaults to `grid`. + ###### `'aria-label'?: string | undefined` The label of the grid. We recommend providing a label using `aria-label` or `aria-labelledby` @@ -550,6 +746,10 @@ The label of the grid. We recommend providing a label using `aria-label` or `ari The id of the element containing a label for the grid. We recommend providing a label using `aria-label` or `aria-labelledby` +###### `'aria-rowcount'?: number | undefined` + +Total number of rows for assistive technologies. + ###### `'aria-description'?: string | undefined` ###### `'aria-describedby'?: string | undefined` @@ -558,189 +758,650 @@ If the grid has a caption or description, `aria-describedby` can be set on the g ###### `'data-testid'?: Maybe` -This prop can be used to add a testid for testing. We recommend querying the grid by by its `role` and `name`. +This prop can be used to add a testid for testing. We recommend querying the grid by its `role` and `name`. ```tsx function MyGrid() { return ; } -test('grid', () => { - render(); - const grid = screen.getByRole('grid', { name: 'my-grid' }); +test('grid', async () => { + await page.render(); + const grid = page.getByRole('grid', { name: 'my-grid' }); }); ``` +###### `'data-cy'?: Maybe` + +Optional attribute to help with Cypress (or similar) selectors. + #### `` -`TreeDataGrid` is component built on top of `DataGrid` to add row grouping. This implements the [Treegrid pattern](https://www.w3.org/WAI/ARIA/apg/patterns/treegrid/). At the moment `TreeDataGrid` does not support `onFill` and `isRowSelectionDisabled` props +`TreeDataGrid` is a component built on top of `DataGrid` to add hierarchical row grouping. This implements the [Treegrid pattern](https://www.w3.org/WAI/ARIA/apg/patterns/treegrid/). -##### TreeDataGridProps +**How it works:** -###### `groupBy?: Maybe` +1. The `groupBy` prop specifies which columns should be used for grouping +2. The `rowGrouper` function groups rows by the specified column keys +3. Group rows are rendered with expand/collapse toggles +4. Child rows are nested under their parent groups +5. Groups can be expanded/collapsed by clicking the toggle or using keyboard navigation (, ) -###### `rowGrouper?: Maybe<(rows: readonly R[], columnKey: string) => Record>` +**Keyboard Navigation:** -###### `expandedGroupIds?: Maybe>` +- (Right Arrow): Expand a collapsed group row when focused +- (Left Arrow): Collapse an expanded group row when focused, or navigate to parent group -###### `onExpandedGroupIdsChange?: Maybe<(expandedGroupIds: Set) => void>` +**Unsupported Props:** -###### `groupIdGetter?: Maybe<(groupKey: string, parentId?: string) => string>` +The following `DataGrid` props are not supported in `TreeDataGrid`: -#### `` +- `onFill` - Drag-fill is disabled for tree grids +- `isRowSelectionDisabled` - Row selection disabling is not available +- `role` - `TreeDataGrid` manages the ARIA role +- `aria-rowcount` - `TreeDataGrid` manages the ARIA row count -##### Props +**Caveats:** -See [`RenderEditCellProps`](#rendereditcellprops) +- Group columns cannot be rendered under one column +- Group columns are automatically frozen and cannot be unfrozen +- Cell copy/paste does not work on group rows +- Column groups are not supported; `columns` must be `Column[]` -#### `` +##### TreeDataGridProps -See [`renderers`](#renderers-mayberenderersr-sr) +All [`DataGridProps`](#datagridprops) are supported except those listed above. The `columns` prop only supports `Column[]` (no column groups). When `rowHeight` is a function, it receives [`RowHeightArgs`](#rowheightargstrow) instead of just the row. Additional props are listed below: -##### Props +###### `groupBy: readonly string[]` -See [`RenderRowProps`](#renderrowprops) +**Required.** An array of column keys to group by. The order determines the grouping hierarchy (first key is the top level, second key is nested under the first, etc.). -The `ref` prop is supported. +```tsx +import { TreeDataGrid, type Column } from 'react-data-grid'; -#### `` +interface Row { + id: number; + country: string; + city: string; + name: string; +} -##### Props +const columns: readonly Column[] = [ + { key: 'country', name: 'Country' }, + { key: 'city', name: 'City' }, + { key: 'name', name: 'Name' } +]; -###### `onSort: (ctrlClick: boolean) => void` +function MyGrid() { + return ( + + ); +} +``` -###### `sortDirection: SortDirection | undefined` +###### `rowGrouper: (rows: readonly R[], columnKey: string) => Record` -###### `priority: number | undefined` +**Required.** A function that groups rows by the specified column key. Returns an object where keys are the group values and values are arrays of rows belonging to that group. -###### `tabIndex: number` +```tsx +function rowGrouper(rows: readonly Row[], columnKey: string): Record { + return Object.groupBy(rows, (row) => row[columnKey]); +} +``` -###### `children: React.ReactNode` +###### `expandedGroupIds: ReadonlySet` -#### `` +**Required.** A set of group IDs that are currently expanded. Group IDs are generated by `groupIdGetter`. -##### Props +```tsx +import { useState } from 'react'; +import { TreeDataGrid } from 'react-data-grid'; -See [`FormatterProps`](#formatterprops) +function MyGrid() { + const [expandedGroupIds, setExpandedGroupIds] = useState((): ReadonlySet => new Set()); -#### `` + return ( + + ); +} +``` -##### Props +###### `onExpandedGroupIdsChange: (expandedGroupIds: Set) => void` -###### `value: boolean` +**Required.** Callback triggered when groups are expanded or collapsed. + +###### `groupIdGetter?: Maybe<(groupKey: string, parentId?: string) => string>` -###### `tabIndex: number` +Function to generate unique IDs for group rows. If not provided, a default implementation is used that concatenates parent and group keys with `__`. -###### `disabled?: boolean | undefined` +###### `rowHeight?: Maybe) => number)>` -###### `onChange: (value: boolean, isShiftClick: boolean) => void` +**Note:** Unlike `DataGrid`, the `rowHeight` function receives [`RowHeightArgs`](#rowheightargstrow) which includes a `type` property to distinguish between regular rows and group rows: -###### `onClick?: MouseEventHandler | undefined` +```tsx +function getRowHeight(args: RowHeightArgs): number { + if (args.type === 'GROUP') { + return 50; // Custom height for group rows + } + return 35; // Height for regular rows +} -###### `'aria-label'?: string | undefined` + +``` -###### `'aria-labelledby'?: string | undefined` +#### `` -#### `` +The default row component. Can be wrapped via the `renderers.renderRow` prop. ##### Props -See [`RenderGroupCellProps`](#rendergroupcellprops) +[`RenderRowProps`](#renderrowpropstrow-tsummaryrow) -### Hooks +#### `` -#### `useHeaderRowSelection(): { isIndeterminate, isRowSelected, onRowSelectionChange }` +The default cell component. Can be wrapped via the `renderers.renderCell` prop. -#### `useRowSelection(): { isRowSelectionDisabled, isRowSelected, onRowSelectionChange }` +##### Props -### Other +[`CellRendererProps`](#cellrendererpropstrow-tsummaryrow) -#### `SelectColumn: Column` +#### `` -#### `SELECT_COLUMN_KEY = 'rdg-select-column'` +A formatter component for rendering row selection checkboxes. -### Types +##### Props -#### `Column` +###### `value: boolean` -##### `name: string | ReactElement` +Whether the checkbox is checked. -The name of the column. Displayed in the header cell by default. +###### `tabIndex?: number | undefined` -##### `key: string` +The tab index for keyboard navigation. -A unique key to distinguish each column +###### `indeterminate?: boolean | undefined` -##### `width?: Maybe` +Whether the checkbox is in an indeterminate state. -**Default** `auto` +###### `disabled?: boolean | undefined` -Width can be any valid css grid column value. If not specified, it will be determined automatically based on grid width and specified widths of other columns. +Whether the checkbox is disabled. -```tsx -width: 80, // pixels -width: '25%', -width: 'max-content', -width: 'minmax(100px, max-content)', -``` +###### `onChange: (checked: boolean, shift: boolean) => void` -`max-content` can be used to expand the column to show all the content. Note that the grid is only able to calculate column width for visible rows. +Callback when the checkbox state changes. -##### `minWidth?: Maybe` +###### `'aria-label'?: string | undefined` -**Default**: `50` pixels +Accessible label for the checkbox. -Minimum column width in pixels. +###### `'aria-labelledby'?: string | undefined` -##### `maxWidth?: Maybe` +ID of the element that labels the checkbox. -Maximum column width in pixels. +#### `` -##### `cellClass?: Maybe Maybe)>` +Low-level component used by `renderToggleGroup` to render the expand/collapse control. Useful if you build a custom group cell renderer. -Class name(s) for the cell +### Hooks -##### `headerCellClass?: Maybe` +#### `useHeaderRowSelection()` -Class name(s) for the header cell. +Hook for managing header row selection state. Used within custom header cell renderers to implement custom "select all" functionality. -##### `summaryCellClass?: Maybe Maybe)>` +**Returns:** -Class name(s) for the summary cell. +- `isIndeterminate: boolean` - Whether some (but not all) rows are selected +- `isRowSelected: boolean` - Whether all rows are selected +- `onRowSelectionChange: (event: SelectHeaderRowEvent) => void` - Callback to change selection state -##### `renderCell?: Maybe<(props: RenderCellProps) => ReactNode>` +**Example:** -Render function to render the content of cells. +```tsx +import { useLayoutEffect, useRef } from 'react'; -##### `renderHeaderCell?: Maybe<(props: RenderHeaderCellProps) => ReactNode>` +function CustomHeaderCell() { + const { isIndeterminate, isRowSelected, onRowSelectionChange } = useHeaderRowSelection(); + const checkboxRef = useRef(null); -Render function to render the content of the header cell. + useLayoutEffect(() => { + if (checkboxRef.current) { + checkboxRef.current.indeterminate = isIndeterminate && !isRowSelected; + } + }, [isIndeterminate, isRowSelected]); -##### `renderSummaryCell?: Maybe<(props: RenderSummaryCellProps) => ReactNode>` + return ( + onRowSelectionChange({ checked: event.target.checked })} + /> + ); +} +``` -Render function to render the content of summary cells +#### `useRowSelection()` -##### `renderEditCell?: Maybe<(props: RenderEditCellProps) => ReactNode>` +Hook for managing row selection state. Used within custom cell renderers to implement custom row selection. -Render function to render the content of edit cells. When set, the column is automatically set to be editable +**Returns:** -##### `editable?: Maybe boolean)>` +- `isRowSelectionDisabled: boolean` - Whether selection is disabled for this row +- `isRowSelected: boolean` - Whether this row is selected +- `onRowSelectionChange: (event: SelectRowEvent) => void` - Callback to change selection state -Enables cell editing. If set and no editor property specified, then a text input will be used as the cell editor. +**Example:** -##### `colSpan?: Maybe<(args: ColSpanArgs) => Maybe>` +```tsx +function CustomSelectCell({ row }: RenderCellProps) { + const { isRowSelectionDisabled, isRowSelected, onRowSelectionChange } = useRowSelection(); -##### `frozen?: Maybe` + return ( + + onRowSelectionChange({ + row, + checked: event.currentTarget.checked, + isShiftClick: event.nativeEvent.shiftKey + }) + } + /> + ); +} +``` -**Default**: `false` +### Render Functions -Determines whether column is frozen. Frozen columns are pinned on the left. At the moment we do not support pinning columns on the right. +#### `renderHeaderCell(props: RenderHeaderCellProps)` -##### `resizable?: Maybe` +The default header cell renderer. Renders sortable columns with sort indicators. -**Default**: `false` +**Example:** -Enable resizing of the column +```tsx +import { renderHeaderCell, type Column } from 'react-data-grid'; + +const columns: readonly Column[] = [ + { + key: 'name', + name: 'Name', + sortable: true, + renderHeaderCell + } +]; +``` + +#### `renderTextEditor(props: RenderEditCellProps)` + +A basic text editor provided for convenience. + +**Example:** + +```tsx +import { renderTextEditor, type Column } from 'react-data-grid'; + +const columns: readonly Column[] = [ + { + key: 'title', + name: 'Title', + renderEditCell: renderTextEditor + } +]; +``` + +#### `renderSortIcon(props: RenderSortIconProps)` + +Renders the sort direction arrow icon. + +**Props:** + +- `sortDirection: SortDirection | undefined` - 'ASC', 'DESC', or undefined + +#### `renderSortPriority(props: RenderSortPriorityProps)` + +Renders the sort priority number for multi-column sorting. + +**Props:** + +- `priority: number | undefined` - The sort priority (1, 2, 3, etc.) + +#### `renderCheckbox(props: RenderCheckboxProps)` + +Renders a checkbox input with proper styling and accessibility. + +**Props:** + +- `checked: boolean` - Whether the checkbox is checked +- `indeterminate?: boolean` - Whether the checkbox is in indeterminate state +- `disabled?: boolean` - Whether the checkbox is disabled +- `onChange: (checked: boolean, shift: boolean) => void` - Change handler +- `tabIndex: number` - Tab index for keyboard navigation +- `aria-label?: string` - Accessible label +- `aria-labelledby?: string` - ID of labeling element + +**Example:** + +```tsx +import { DataGrid, renderCheckbox } from 'react-data-grid'; + + renderCheckbox({ ...props, 'aria-label': 'Select row' }) + }} +/>; +``` + +#### `renderToggleGroup(props: RenderGroupCellProps)` + +The default group cell renderer used by the columns used for grouping (`groupBy` prop). This renders the expand/collapse toggle. + +##### Props + +[`RenderGroupCellProps`](#rendergroupcellpropstrow-tsummaryrow) + +**Example:** + +```tsx +import { renderToggleGroup, type Column } from 'react-data-grid'; + +const columns: readonly Column[] = [ + { + key: 'group', + name: 'Group', + renderGroupCell: renderToggleGroup + } +]; +``` + +#### `renderValue(props: RenderCellProps)` + +The default cell renderer that renders the value of `row[column.key]`. + +**Example:** + +```tsx +import { renderValue, type Column } from 'react-data-grid'; + +const columns: readonly Column[] = [ + { + key: 'title', + name: 'Title', + renderCell: renderValue + } +]; +``` + +### Context + +#### `DataGridDefaultRenderersContext` + +Context for providing default renderers to DataGrids in your app. + +**Example:** + +```tsx +import { + DataGridDefaultRenderersContext, + renderCheckbox, + renderSortIcon, + renderSortPriority, + type Renderers +} from 'react-data-grid'; + +// custom implementations of renderers +const defaultGridRenderers: Renderers = { + renderCheckbox, + renderSortStatus(props) { + return ( + <> + {renderSortIcon(props)} + {renderSortPriority(props)} + + ); + } +}; + +function AppProvider({ children }) { + return ( + + {children} + + ); +} +``` + +### Other + +#### `SelectColumn: Column` + +A pre-configured column for row selection. +Includes checkbox renderers for header, regular rows, and grouped rows. + +**Example:** + +```tsx +import { DataGrid, SelectColumn, type Column } from 'react-data-grid'; + +const columns: readonly Column[] = [SelectColumn, ...otherColumns]; + +function rowKeyGetter(row: Row) { + return row.id; +} + +function MyGrid() { + return ( + + ); +} +``` + +#### `SELECT_COLUMN_KEY = 'rdg-select-column'` + +The key used for the `SelectColumn`. Useful for identifying or filtering the select column. + +**Example:** + +```tsx +import { SELECT_COLUMN_KEY } from 'react-data-grid'; + +const nonSelectColumns = columns.filter((column) => column.key !== SELECT_COLUMN_KEY); +``` + +### Types + +#### `Column` + +Defines the configuration for a column in the grid. + +##### `name: string | ReactElement` + +The name of the column. Displayed in the header cell by default. + +##### `key: string` + +A unique key to distinguish each column + +##### `width?: Maybe` + +**Default** `auto` + +Width can be any valid css grid column value. If not specified, it will be determined automatically based on grid width and specified widths of other columns. + +```tsx +const columns: Column[] = [ + { + key: 'id', + name: 'ID', + width: 80, // Fixed width in pixels + resizable: false + }, + { + key: 'name', + name: 'Name', + width: '30%', // Percentage width + minWidth: 100, + maxWidth: 400 + }, + { + key: 'description', + name: 'Description' + // No width specified - automatically sized + } +]; +``` + +Other examples: + +```tsx +width: 80, // pixels +width: '25%', +width: 'max-content', +width: 'minmax(100px, max-content)', +``` + +`max-content` can be used to expand the column to show all the content. Note that the grid is only able to calculate column width for visible rows. + +##### `minWidth?: Maybe` + +**Default**: `50` pixels + +Minimum column width in pixels. + +##### `maxWidth?: Maybe` + +Maximum column width in pixels. + +##### `cellClass?: Maybe Maybe)>` + +Class name(s) for cells. Can be a string or a function that returns a class name based on the row. + +```tsx +const columns: Column[] = [ + { + key: 'status', + name: 'Status', + cellClass: (row) => `status-${row.status}` + }, + { + key: 'price', + name: 'Price', + cellClass: 'text-right' // Static class + } +]; +``` + +```css +.status-active { + color: green; + font-weight: bold; +} + +.status-inactive { + color: grey; +} + +.text-right { + text-align: right; +} +``` + +##### `headerCellClass?: Maybe` + +Class name(s) for the header cell. + +##### `summaryCellClass?: Maybe Maybe)>` + +Class name(s) for summary cells. Can be a string or a function that returns a class name based on the summary row. + +##### `renderCell?: Maybe<(props: RenderCellProps) => ReactNode>` + +Render function to render the content of cells. + +##### `renderHeaderCell?: Maybe<(props: RenderHeaderCellProps) => ReactNode>` + +Render function to render the content of the header cell. + +##### `renderSummaryCell?: Maybe<(props: RenderSummaryCellProps) => ReactNode>` + +Render function to render the content of summary cells + +##### `renderGroupCell?: Maybe<(props: RenderGroupCellProps) => ReactNode>` + +Render function to render the content of group cells when using `TreeDataGrid`. + +##### `renderEditCell?: Maybe<(props: RenderEditCellProps) => ReactNode>` + +Render function to render the content of edit cells. When set, the column is automatically set to be editable + +##### `editable?: Maybe boolean)>` + +Control whether cells can be edited with `renderEditCell`. + +##### `colSpan?: Maybe<(args: ColSpanArgs) => Maybe>` + +Function to determine how many columns this cell should span. Returns the number of columns to span, or `undefined` for no spanning. See the [`ColSpanArgs`](#colspanargstrow-tsummaryrow) type in the Types section below. + +**Example:** + +```tsx +import type { Column } from 'react-data-grid'; + +const columns: readonly Column[] = [ + { + key: 'title', + name: 'Title', + colSpan(args) { + if (args.type === 'ROW' && args.row.isFullWidth) { + return 5; // Span 5 columns for full-width rows + } + return undefined; + } + } +]; +``` + +##### `frozen?: Maybe` + +**Default**: `false` + +Determines whether the column is frozen, and on which edge. Frozen columns stay in place when the grid is scrolled horizontally. + +- `'start'` (or `true` for backwards compatibility) — pins the column to the start edge (left in LTR, right in RTL). +- `'end'` — pins the column to the end edge (right in LTR, left in RTL). +- `false` (default) — the column scrolls with the rest of the grid. + +```tsx +const columns: readonly Column[] = [ + { key: 'id', name: 'ID', frozen: 'start' }, + { key: 'name', name: 'Name' }, + { key: 'actions', name: 'Actions', frozen: 'end' } +]; +``` + +##### `resizable?: Maybe` + +**Default**: `false` + +Enable resizing of the column ##### `sortable?: Maybe` @@ -768,7 +1429,7 @@ Options for cell editing. **Default**: `false` -Render the cell content in addition to the edit cell. Enable this option when the editor is rendered outside the grid, like a modal for example. +Render the cell content in addition to the edit cell content. Enable this option when the editor is rendered outside the grid, like a modal for example. ###### `commitOnOutsideClick?: Maybe` @@ -780,46 +1441,680 @@ Commit changes when clicking outside the cell. **Default**: `true` -Close the editor when the row changes externally. +Close the editor when the row value changes externally. + +#### `ColumnGroup` -#### `CellMouseArgs` +Defines a group of columns that share a common header. + +```tsx +interface ColumnGroup { + readonly name: string | ReactElement; + readonly headerCellClass?: Maybe; + readonly children: readonly ColumnOrColumnGroup[]; +} +``` -##### `rowIdx: number` +**Example:** -Row index of the currently selected cell +```tsx +import type { ColumnOrColumnGroup } from 'react-data-grid'; -##### `row: TRow` +const columns: readonly ColumnOrColumnGroup[] = [ + { + name: 'Personal Info', + children: [ + { key: 'firstName', name: 'First Name' }, + { key: 'lastName', name: 'Last Name' } + ] + } +]; +``` -row object of the currently selected cell +#### `ColumnOrColumnGroup` -##### `column: CalculatedColumn` +Union type representing either a `Column` or a `ColumnGroup`. -column object of the currently selected cell +#### `CalculatedColumn` -##### `selectCell: (enableEditor?: boolean) => void` +Extends `Column` with additional computed properties used internally by the grid. This is the type passed to render functions. -function to manually select the cell and optionally pass `true` to start editing +**Additional properties:** -#### `CellMouseEvent` +- `idx: number` - The column index +- `level: number` - Nesting level when using column groups +- `parent: CalculatedColumnParent | undefined` - Parent column group if nested +- Multiple Column properties have their values set to their default value -Extends `React.MouseEvent` +#### `CalculatedColumnParent` -##### `event.preventGridDefault: () => void` +Represents a parent column group in the calculated column structure. -##### `event.isGridDefaultPrevented: boolean` +```tsx +interface CalculatedColumnParent { + readonly name: string | ReactElement; + readonly parent: CalculatedColumnParent | undefined; + readonly idx: number; + readonly colSpan: number; + readonly level: number; + readonly headerCellClass?: Maybe; +} +``` -#### `DataGridHandle` +#### `CalculatedColumnOrColumnGroup` -#### `RenderEditCellProps` +Union type representing either a `CalculatedColumnParent` or a `CalculatedColumn`. -#### `RenderCellProps` +```tsx +type CalculatedColumnOrColumnGroup = CalculatedColumnParent | CalculatedColumn; +``` -#### `RenderGroupCellProps` +#### `RowHeightArgs` -#### `RenderRowProps` +Arguments passed to `TreeDataGrid`'s `rowHeight` prop when it is a function. -### Generics +```tsx +type RowHeightArgs = { type: 'ROW'; row: TRow } | { type: 'GROUP'; row: GroupRow }; +``` -- `R`, `TRow`: Row type -- `SR`, `TSummaryRow`: Summary row type -- `K`: Row key type +**Example:** + +```tsx +function getRowHeight(args: RowHeightArgs): number { + if (args.type === 'GROUP') { + return 40; + } + return args.row.isLarge ? 60 : 35; +} + + +``` + +#### `RenderCellProps` + +Props passed to custom cell renderers. + +```tsx +interface RenderCellProps { + column: CalculatedColumn; + row: TRow; + rowIdx: number; + isCellEditable: boolean; + tabIndex: number; + onRowChange: (row: TRow) => void; +} +``` + +**Example:** + +```tsx +import type { RenderCellProps } from 'react-data-grid'; + +function renderCell({ row, column, onRowChange }: RenderCellProps) { + return ( +
+ {row[column.key]} + +
+ ); +} +``` + +#### `RenderHeaderCellProps` + +Props passed to custom header cell renderers. + +```tsx +interface RenderHeaderCellProps { + column: CalculatedColumn; + sortDirection: SortDirection | undefined; + priority: number | undefined; + tabIndex: number; +} +``` + +#### `RenderEditCellProps` + +Props passed to custom edit cell renderers (editors). + +```tsx +interface RenderEditCellProps { + column: CalculatedColumn; + row: TRow; + rowIdx: number; + onRowChange: (row: TRow, commitChanges?: boolean) => void; + onClose: (commitChanges?: boolean, shouldFocus?: boolean) => void; +} +``` + +**Example:** + +```tsx +import type { RenderEditCellProps } from 'react-data-grid'; + +function CustomEditor({ row, column, onRowChange, onClose }: RenderEditCellProps) { + return ( + onRowChange({ ...row, [column.key]: event.target.value })} + onBlur={() => onClose(true)} + /> + ); +} +``` + +#### `RenderSummaryCellProps` + +Props passed to summary cell renderers. + +```tsx +interface RenderSummaryCellProps { + column: CalculatedColumn; + row: TSummaryRow; + tabIndex: number; +} +``` + +#### `RenderGroupCellProps` + +Props passed to group cell renderers when using `TreeDataGrid`. + +```tsx +interface RenderGroupCellProps { + groupKey: unknown; + column: CalculatedColumn; + row: GroupRow; + childRows: readonly TRow[]; + isExpanded: boolean; + tabIndex: number; + toggleGroup: () => void; +} +``` + +#### `RenderRowProps` + +Props passed to custom row renderers. + +```tsx +interface RenderRowProps { + row: TRow; + iterateOverViewportColumnsForRow: IterateOverViewportColumnsForRow; + rowIdx: number; + activeCellIdx: number | undefined; + isRowSelectionDisabled: boolean; + isRowSelected: boolean; + gridRowStart: number; + draggedOverCellIdx: number | undefined; + activeCellEditor: ReactElement> | undefined; + onRowChange: (column: CalculatedColumn, rowIdx: number, newRow: TRow) => void; + rowClass: Maybe<(row: TRow, rowIdx: number) => Maybe>; + isTreeGrid: boolean; + // ... and event handlers +} +``` + +#### `CellRendererProps` + +Props passed to the cell renderer when using `renderers.renderCell`. + +Shares a base type with row render props (DOM props and cell event handlers) but only includes cell-specific fields like `column`, `row`, `rowIdx`, `colSpan`, and position state. + +#### `Renderers` + +Custom renderer configuration for the grid. + +```tsx +interface Renderers { + renderCell?: Maybe<(key: Key, props: CellRendererProps) => ReactNode>; + renderCheckbox?: Maybe<(props: RenderCheckboxProps) => ReactNode>; + renderRow?: Maybe<(key: Key, props: RenderRowProps) => ReactNode>; + renderSortStatus?: Maybe<(props: RenderSortStatusProps) => ReactNode>; + noRowsFallback?: Maybe; +} +``` + +#### `CellMouseArgs` + +Arguments passed to cell mouse event handlers. + +```tsx +interface CellMouseArgs { + /** The column object of the cell. */ + column: CalculatedColumn; + /** The row object of the cell. */ + row: TRow; + /** The row index of the cell. */ + rowIdx: number; + /** Function to manually focus the cell. Pass `true` to immediately start editing. */ + setActivePosition: (enableEditor?: boolean) => void; +} +``` + +**Example:** + +```tsx +import type { CellMouseArgs, CellMouseEvent } from 'react-data-grid'; + +function onCellClick(args: CellMouseArgs, event: CellMouseEvent) { + console.log('Clicked cell at row', args.rowIdx, 'column', args.column.key); + args.setActivePosition(true); // Focus and start editing +} +``` + +#### `CellMouseEventHandler` (internal) + +Handler type used by `onCellMouseDown`, `onCellClick`, `onCellDoubleClick`, and `onCellContextMenu`. This helper type is not exported; the shape is shown for reference. + +```tsx +type CellMouseEventHandler = Maybe< + (args: CellMouseArgs, event: CellMouseEvent) => void +>; +``` + +#### `CellMouseEvent` + +Extends `React.MouseEvent` with grid-specific methods. + +##### `event.preventGridDefault(): void` + +Prevents the default grid behavior for this event. + +##### `event.isGridDefaultPrevented(): boolean` + +Returns whether `preventGridDefault` was called. + +**Example:** + +```tsx +import type { CellMouseArgs, CellMouseEvent } from 'react-data-grid'; + +function onCellClick(args: CellMouseArgs, event: CellMouseEvent) { + if (args.column.key === 'actions') { + event.preventGridDefault(); // Prevent cell focus + } +} +``` + +#### `CellKeyboardEvent` + +Extends `React.KeyboardEvent` with grid-specific methods. + +##### `event.preventGridDefault(): void` + +Prevents the default grid behavior for this keyboard event. + +##### `event.isGridDefaultPrevented(): boolean` + +Returns whether `preventGridDefault` was called. + +#### `CellClipboardEvent` + +Type alias for `React.ClipboardEvent`. Used for copy and paste events. + +```tsx +type CellClipboardEvent = React.ClipboardEvent; +``` + +#### `CellKeyDownArgs` + +Arguments passed to the `onCellKeyDown` handler. The shape differs based on whether the cell is in ACTIVE or EDIT mode. + +**ACTIVE mode:** + +```tsx +interface ActiveCellKeyDownArgs { + mode: 'ACTIVE'; + column: CalculatedColumn | undefined; + row: TRow | undefined; + rowIdx: number; + setActivePosition: (position: Position, options?: SetActivePositionOptions) => void; +} +``` + +**EDIT mode:** + +```tsx +interface EditCellKeyDownArgs { + mode: 'EDIT'; + column: CalculatedColumn; + row: TRow; + rowIdx: number; + navigate: () => void; + onClose: (commitChanges?: boolean, shouldFocus?: boolean) => void; +} +``` + +**Example:** + +```tsx +import type { CellKeyboardEvent, CellKeyDownArgs } from 'react-data-grid'; + +function onCellKeyDown(args: CellKeyDownArgs, event: CellKeyboardEvent) { + if (args.mode === 'EDIT' && event.key === 'Escape') { + args.onClose(false); // Close without committing + event.preventGridDefault(); + } +} +``` + +#### `PositionChangeArgs` + +Arguments passed to `onActivePositionChange`. + +```tsx +interface PositionChangeArgs { + /** row index of the active position */ + rowIdx: number; + /** + * row object of the active position, + * undefined if the active position is on a header or summary row + */ + row: TRow | undefined; + /** + * column object of the active position, + * undefined if the active position is a row instead of a cell + */ + column: CalculatedColumn | undefined; +} +``` + +#### `CellCopyArgs` + +Arguments passed to `onCellCopy`. + +```tsx +interface CellCopyArgs { + column: CalculatedColumn; + row: TRow; +} +``` + +#### `CellPasteArgs` + +Arguments passed to `onCellPaste`. + +```tsx +interface CellPasteArgs { + column: CalculatedColumn; + row: TRow; +} +``` + +#### `ColSpanArgs` + +Arguments passed to the `colSpan` function. + +```tsx +type ColSpanArgs = + | { readonly type: 'HEADER' } + | { readonly type: 'ROW'; readonly row: TRow } + | { readonly type: 'SUMMARY'; readonly row: TSummaryRow }; +``` + +**Example:** + +```tsx +import type { Column } from 'react-data-grid'; + +const columns: readonly Column[] = [ + { + key: 'title', + name: 'Title', + colSpan(args) { + if (args.type === 'ROW' && args.row.isFullWidth) { + return 3; // Span 3 columns + } + return undefined; + } + } +]; +``` + +#### `SortColumn` + +Describes a sorted column. + +```tsx +interface SortColumn { + readonly columnKey: string; + readonly direction: SortDirection; +} +``` + +#### `SortDirection` + +```tsx +type SortDirection = 'ASC' | 'DESC'; +``` + +#### `RowsChangeData` + +Data provided to `onRowsChange` callback. + +```tsx +interface RowsChangeData { + indexes: number[]; + column: CalculatedColumn; +} +``` + +- `indexes`: Array of row indexes that changed +- `column`: The column where changes occurred + +#### `SelectRowEvent` + +Event object for row selection changes. + +```tsx +interface SelectRowEvent { + row: TRow; + checked: boolean; + isShiftClick: boolean; +} +``` + +#### `SelectHeaderRowEvent` + +Event object for header row selection changes. + +```tsx +interface SelectHeaderRowEvent { + checked: boolean; +} +``` + +#### `FillEvent` + +Event object for drag-fill operations. + +```tsx +interface FillEvent { + columnKey: string; + sourceRow: TRow; + targetRow: TRow; +} +``` + +Used with the `onFill` prop to handle cell value dragging. + +#### `GroupRow` (internal) + +Represents a grouped row in `TreeDataGrid`. This helper type is not exported; the shape is shown for reference. + +```tsx +interface GroupRow { + readonly childRows: readonly TRow[]; + readonly id: string; + readonly parentId: unknown; + readonly groupKey: unknown; + readonly isExpanded: boolean; + readonly level: number; + readonly posInSet: number; + readonly setSize: number; + readonly startRowIndex: number; +} +``` + +#### `ColumnWidths` + +A map of column widths. + +```tsx +type ColumnWidths = ReadonlyMap; + +interface ColumnWidth { + readonly type: 'resized' | 'measured'; + readonly width: number; +} +``` + +Used with `columnWidths` and `onColumnWidthsChange` props to control column widths externally. + +#### `Position` + +Represents a cell position in the grid. + +```tsx +interface Position { + readonly idx: number; // Column index + readonly rowIdx: number; // Row index +} +``` + +#### `SetActivePositionOptions` + +Options for programmatically updating the grid's active position. + +```tsx +interface SetActivePositionOptions { + enableEditor?: Maybe; + shouldFocus?: Maybe; +} +``` + +#### `RenderCheckboxProps` + +Props for custom checkbox renderers. + +```tsx +interface RenderCheckboxProps { + checked: boolean; + indeterminate?: boolean; + disabled?: boolean; + onChange: (checked: boolean, shift: boolean) => void; + tabIndex: number; + 'aria-label'?: string; + 'aria-labelledby'?: string; +} +``` + +#### `RenderSortStatusProps` + +Props for custom sort status renderers. + +```tsx +interface RenderSortStatusProps { + sortDirection: SortDirection | undefined; + priority: number | undefined; +} +``` + +#### `RenderSortIconProps` + +Props for custom sort icon renderers. + +```tsx +interface RenderSortIconProps { + sortDirection: SortDirection | undefined; +} +``` + +#### `RenderSortPriorityProps` + +Props for custom sort priority renderers. + +```tsx +interface RenderSortPriorityProps { + priority: number | undefined; +} +``` + +#### `DataGridHandle` + +Handle type assigned to a grid's `ref` for programmatic grid control. + +```tsx +interface DataGridHandle { + element: HTMLDivElement | null; + scrollToCell: (position: PartialPosition) => void; + setActivePosition: (position: Position, options?: SetActivePositionOptions) => void; +} +``` + +**Example:** + +```tsx +import { useRef } from 'react'; +import { DataGrid, DataGridHandle } from 'react-data-grid'; + +function MyGrid() { + const gridRef = useRef(null); + + function scrollToTop() { + gridRef.current?.scrollToCell({ rowIdx: 0 }); + } + + return ; +} +``` + +#### `DefaultColumnOptions` + +Default options applied to all columns. + +```tsx +type DefaultColumnOptions = Pick< + Column, + | 'renderCell' + | 'renderHeaderCell' + | 'width' + | 'minWidth' + | 'maxWidth' + | 'resizable' + | 'sortable' + | 'draggable' +>; +``` + +#### `Direction` + +Grid layout bidirectionality. + +```tsx +type Direction = 'ltr' | 'rtl'; +``` + +#### `Maybe` (internal) + +Utility type for optional values. This helper type is not exported; the shape is shown for reference. + +```tsx +type Maybe = T | undefined | null; +``` + +### Generics + +- `R`, `TRow`: Row type +- `SR`, `TSummaryRow`: Summary row type +- `K`: Row key type + +[ci-badge]: https://github.com/Comcast/react-data-grid/workflows/CI/badge.svg +[ci-url]: https://github.com/Comcast/react-data-grid/actions +[codecov-badge]: https://codecov.io/gh/Comcast/react-data-grid/branch/main/graph/badge.svg?token=cvrRSWiz0Q +[codecov-url]: https://app.codecov.io/gh/Comcast/react-data-grid +[npm-badge]: https://img.shields.io/npm/v/react-data-grid +[npm-url]: https://www.npmjs.com/package/react-data-grid +[size-badge]: https://img.shields.io/bundlephobia/minzip/react-data-grid +[size-url]: https://bundlephobia.com/package/react-data-grid +[type-badge]: https://img.shields.io/npm/types/react-data-grid diff --git a/babel.config.json b/babel.config.json deleted file mode 100644 index f878e8f9f9..0000000000 --- a/babel.config.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["@babel/typescript"] -} diff --git a/biome.json b/biome.json deleted file mode 100644 index 4011dcfe47..0000000000 --- a/biome.json +++ /dev/null @@ -1,324 +0,0 @@ -{ - "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", - "files": { - "includes": [ - "**", - "!.cache/**/*", - "!coverage/**/*", - "!dist/**/*", - "!lib/**/*", - "!node_modules/**/*", - "!website/routeTree.gen.ts" - ] - }, - "formatter": { - "includes": ["**", "!**/*.ts", "!**/*.tsx", "!package.json"], - "indentStyle": "space", - "lineWidth": 100 - }, - "json": { - "parser": { - "allowComments": true, - "allowTrailingCommas": true - } - }, - "javascript": { - "formatter": { - "quoteStyle": "single", - "trailingCommas": "none" - } - }, - "css": { - "formatter": { - "quoteStyle": "single" - } - }, - "linter": { - "domains": { - "project": "recommended" - }, - "rules": { - "recommended": false, - "a11y": { - "noAccessKey": "warn", - "noAriaHiddenOnFocusable": "warn", - "noAriaUnsupportedElements": "warn", - "noAutofocus": "off", - "noDistractingElements": "warn", - "noHeaderScope": "warn", - "noInteractiveElementToNoninteractiveRole": "warn", - "noLabelWithoutControl": "off", - "noNoninteractiveElementToInteractiveRole": "warn", - "noNoninteractiveTabindex": "warn", - "noPositiveTabindex": "warn", - "noRedundantAlt": "warn", - "noRedundantRoles": "warn", - "noSvgWithoutTitle": "off", - "useAltText": "warn", - "useAnchorContent": "warn", - "useAriaActivedescendantWithTabindex": "warn", - "useAriaPropsForRole": "warn", - "useButtonType": "warn", - "useFocusableInteractive": "off", - "useGenericFontNames": "warn", - "useHeadingContent": "warn", - "useHtmlLang": "warn", - "useIframeTitle": "warn", - "useKeyWithClickEvents": "off", - "useKeyWithMouseEvents": "warn", - "useMediaCaption": "off", - "useSemanticElements": "off", - "useValidAnchor": "warn", - "useValidAriaProps": "warn", - "useValidAriaRole": "warn", - "useValidAriaValues": "warn", - "useValidLang": "warn" - }, - "complexity": { - "noAdjacentSpacesInRegex": "warn", - "noArguments": "warn", - "noBannedTypes": "warn", - "noCommaOperator": "warn", - "noEmptyTypeParameters": "warn", - "noExcessiveCognitiveComplexity": "off", - "noExcessiveNestedTestSuites": "off", - "noExtraBooleanCast": "warn", - "noFlatMapIdentity": "warn", - "noForEach": "warn", - "noStaticOnlyClass": "warn", - "noThisInStatic": "warn", - "noUselessCatch": "warn", - "noUselessConstructor": "warn", - "noUselessContinue": "warn", - "noUselessEmptyExport": "warn", - "noUselessFragments": "warn", - "noUselessLabel": "warn", - "noUselessLoneBlockStatements": "warn", - "noUselessRename": "warn", - "noUselessStringConcat": "warn", - "noUselessSwitchCase": "warn", - "noUselessTernary": "warn", - "noUselessThisAlias": "warn", - "noUselessTypeConstraint": "warn", - "noUselessUndefinedInitialization": "warn", - "noVoid": "warn", - "useArrowFunction": "warn", - "useDateNow": "warn", - "useFlatMap": "warn", - "useLiteralKeys": "warn", - "useNumericLiterals": "warn", - "useOptionalChain": "warn", - "useRegexLiterals": "warn", - "useSimpleNumberKeys": "warn", - "useSimplifiedLogicExpression": "off", - "useWhile": "warn" - }, - "correctness": { - "noChildrenProp": "off", - "noConstAssign": "warn", - "noConstantCondition": "warn", - "noConstantMathMinMaxClamp": "warn", - "noConstructorReturn": "warn", - "noEmptyCharacterClassInRegex": "warn", - "noEmptyPattern": "warn", - "noGlobalObjectCalls": "warn", - "noInnerDeclarations": "warn", - "noInvalidBuiltinInstantiation": "warn", - "noInvalidConstructorSuper": "warn", - "noInvalidDirectionInLinearGradient": "warn", - "noInvalidGridAreas": "warn", - "noInvalidPositionAtImportRule": "warn", - "noInvalidUseBeforeDeclaration": "warn", - "noNodejsModules": "warn", - "noNonoctalDecimalEscape": "warn", - "noPrecisionLoss": "warn", - "noPrivateImports": "warn", - "noRenderReturnValue": "warn", - "noSelfAssign": "warn", - "noSetterReturn": "warn", - "noStringCaseMismatch": "warn", - "noSwitchDeclarations": "warn", - "noUndeclaredDependencies": "warn", - "noUndeclaredVariables": "off", - "noUnknownFunction": "warn", - "noUnknownMediaFeatureName": "warn", - "noUnknownProperty": "warn", - "noUnknownUnit": "warn", - "noUnmatchableAnbSelector": "warn", - "noUnreachable": "warn", - "noUnreachableSuper": "warn", - "noUnsafeFinally": "warn", - "noUnsafeOptionalChaining": "warn", - "noUnusedFunctionParameters": "off", - "noUnusedImports": "warn", - "noUnusedLabels": "warn", - "noUnusedPrivateClassMembers": "warn", - "noUnusedVariables": "warn", - "noVoidElementsWithChildren": "warn", - "noVoidTypeReturn": "warn", - "useExhaustiveDependencies": "off", - "useHookAtTopLevel": "warn", - "useImportExtensions": "off", - "useIsNan": "warn", - "useJsxKeyInIterable": "off", - "useValidForDirection": "warn", - "useYield": "warn", - "useValidTypeof": "warn" - }, - "performance": { - "noAccumulatingSpread": "warn", - "noBarrelFile": "off", - "noDelete": "warn", - "noNamespaceImport": "warn", - "noReExportAll": "off", - "useTopLevelRegex": "warn" - }, - "security": { - "noBlankTarget": "warn", - "noDangerouslySetInnerHtml": "warn", - "noDangerouslySetInnerHtmlWithChildren": "warn", - "noGlobalEval": "warn" - }, - "style": { - "noDefaultExport": "off", - "noDoneCallback": "warn", - "noImplicitBoolean": "off", - "noInferrableTypes": "warn", - "noNamespace": "warn", - "noNegationElse": "warn", - "noNonNullAssertion": "off", - "noParameterAssign": "off", - "noParameterProperties": "warn", - "noRestrictedGlobals": "warn", - "noShoutyConstants": "warn", - "noUnusedTemplateLiteral": "warn", - "noUselessElse": "warn", - "noYodaExpression": "warn", - "useArrayLiterals": "warn", - "useAsConstAssertion": "warn", - "useBlockStatements": "off", - "useCollapsedElseIf": "warn", - "useConsistentArrayType": "warn", - "useConsistentBuiltinInstantiation": "warn", - "useConst": "warn", - "useDefaultParameterLast": "off", - "useDefaultSwitchClause": "warn", - "useEnumInitializers": "warn", - "useExplicitLengthCheck": "off", - "useExponentiationOperator": "warn", - "useExportType": "warn", - "useFilenamingConvention": "off", - "useForOf": "off", - "useFragmentSyntax": "warn", - "useImportType": "warn", - "useLiteralEnumMembers": "warn", - "useNamingConvention": "off", - "useNodeAssertStrict": "warn", - "useNodejsImportProtocol": "warn", - "useNumberNamespace": "warn", - "useSelfClosingElements": "warn", - "useShorthandAssign": "warn", - "useShorthandFunctionType": "warn", - "useSingleVarDeclarator": "warn", - "useTemplate": "warn", - "useThrowNewError": "warn", - "useThrowOnlyError": "warn" - }, - "suspicious": { - "noApproximativeNumericConstant": "warn", - "noArrayIndexKey": "off", - "noAssignInExpressions": "warn", - "noAsyncPromiseExecutor": "warn", - "noCatchAssign": "warn", - "noClassAssign": "warn", - "noCommentText": "warn", - "noCompareNegZero": "warn", - "noConfusingLabels": "warn", - "noConfusingVoidType": "warn", - "noConsole": "warn", - "noConstEnum": "warn", - "noControlCharactersInRegex": "warn", - "noDebugger": "warn", - "noDoubleEquals": "warn", - "noDuplicateAtImportRules": "warn", - "noDuplicateCase": "warn", - "noDuplicateClassMembers": "warn", - "noDuplicateFontNames": "warn", - "noDuplicateJsxProps": "warn", - "noDuplicateObjectKeys": "warn", - "noDuplicateParameters": "warn", - "noDuplicateSelectorsKeyframeBlock": "warn", - "noDuplicateTestHooks": "warn", - "noEmptyBlock": "warn", - "noEmptyBlockStatements": "off", - "noEmptyInterface": "warn", - "noEvolvingTypes": "off", - "noExplicitAny": "off", - "noExportsInTest": "warn", - "noExtraNonNullAssertion": "warn", - "noFallthroughSwitchClause": "warn", - "noFocusedTests": "warn", - "noFunctionAssign": "warn", - "noGlobalAssign": "warn", - "noGlobalIsFinite": "warn", - "noGlobalIsNan": "warn", - "noImplicitAnyLet": "off", - "noImportAssign": "warn", - "noImportantInKeyframe": "warn", - "noLabelVar": "warn", - "noMisleadingCharacterClass": "warn", - "noMisleadingInstantiator": "warn", - "noMisplacedAssertion": "off", - "noMisrefactoredShorthandAssign": "warn", - "noPrototypeBuiltins": "warn", - "noReactSpecificProps": "off", - "noRedeclare": "warn", - "noRedundantUseStrict": "warn", - "noSelfCompare": "warn", - "noShadowRestrictedNames": "warn", - "noShorthandPropertyOverrides": "warn", - "noSkippedTests": "warn", - "noSparseArray": "warn", - "noSuspiciousSemicolonInJsx": "warn", - "noThenProperty": "warn", - "noUnsafeDeclarationMerging": "warn", - "noUnsafeNegation": "warn", - "noVar": "warn", - "noWith": "warn", - "useAwait": "warn", - "useDefaultSwitchClauseLast": "warn", - "useErrorMessage": "warn", - "useGetterReturn": "warn", - "useIsArray": "warn", - "useNamespaceKeyword": "warn", - "useNumberToFixedDigitsArgument": "warn" - } - } - }, - "assist": { "actions": { "source": { "organizeImports": "off" } } }, - "overrides": [ - { - "includes": ["**/*.test.*"], - "linter": { - "rules": { - "performance": { - "useTopLevelRegex": "off" - } - } - } - }, - { - "includes": ["**/*.js", "**/rolldown.config.ts"], - "linter": { - "rules": { - "correctness": { - "noNodejsModules": "off" - }, - "suspicious": { - "noConsole": "off" - } - } - } - } - ] -} diff --git a/browserslist b/browserslist deleted file mode 100644 index 524f5934f7..0000000000 --- a/browserslist +++ /dev/null @@ -1,5 +0,0 @@ -last 2 chrome versions -last 2 edge versions -last 2 firefox versions -last 2 safari versions -maintained node versions diff --git a/eslint.config.js b/eslint.config.js deleted file mode 100644 index e94437ee9d..0000000000 --- a/eslint.config.js +++ /dev/null @@ -1,741 +0,0 @@ -import typescriptEslint from '@typescript-eslint/eslint-plugin'; -import tsParser from '@typescript-eslint/parser'; -import vitest from '@vitest/eslint-plugin'; -import { defineConfig, globalIgnores } from 'eslint/config'; -import jestDom from 'eslint-plugin-jest-dom'; -import react from 'eslint-plugin-react'; -import reactCompiler from 'eslint-plugin-react-compiler'; -import reactHooks from 'eslint-plugin-react-hooks'; -import reactHooksExtra from 'eslint-plugin-react-hooks-extra'; -import sonarjs from 'eslint-plugin-sonarjs'; -import testingLibrary from 'eslint-plugin-testing-library'; -import markdown from '@eslint/markdown'; - -export default defineConfig([ - globalIgnores(['.cache', 'coverage', 'dist', 'lib']), - - { - linterOptions: { - reportUnusedInlineConfigs: 'warn' - } - }, - - { - name: 'common', - files: ['**/*.{js,ts,tsx}'], - - plugins: { - react, - 'react-compiler': reactCompiler, - 'react-hooks': reactHooks, - 'react-hooks-extra': reactHooksExtra, - sonarjs, - '@typescript-eslint': typescriptEslint - }, - - languageOptions: { - parser: tsParser, - - parserOptions: { - ecmaVersion: 'latest', - jsxPragma: null, - projectService: true, - warnOnUnsupportedTypeScriptVersion: false - } - }, - - settings: { - react: { - version: 'detect' - } - }, - - rules: { - // Possible Problems - // https://eslint.org/docs/latest/rules/#possible-problems - 'array-callback-return': [1, { checkForEach: true }], - 'constructor-super': 0, // covered by TS - 'for-direction': 1, - 'getter-return': 1, - 'no-async-promise-executor': 1, - 'no-await-in-loop': 0, - 'no-class-assign': 0, - 'no-compare-neg-zero': 1, - 'no-cond-assign': 1, - 'no-const-assign': 0, - 'no-constant-binary-expression': 1, - 'no-constant-condition': 1, - 'no-constructor-return': 1, - 'no-control-regex': 1, - 'no-debugger': 1, - 'no-dupe-args': 1, - 'no-dupe-class-members': 0, - 'no-dupe-else-if': 1, - 'no-dupe-keys': 1, - 'no-duplicate-case': 1, - 'no-duplicate-imports': 0, - 'no-empty-character-class': 1, - 'no-empty-pattern': 1, - 'no-ex-assign': 1, - 'no-fallthrough': [1, { reportUnusedFallthroughComment: true }], - 'no-func-assign': 1, - 'no-import-assign': 1, - 'no-inner-declarations': 0, - 'no-invalid-regexp': 1, - 'no-irregular-whitespace': 1, - 'no-loss-of-precision': 1, - 'no-misleading-character-class': 1, - 'no-new-native-nonconstructor': 1, - 'no-obj-calls': 1, - 'no-promise-executor-return': 1, - 'no-prototype-builtins': 1, - 'no-self-assign': [1, { props: true }], - 'no-self-compare': 1, - 'no-setter-return': 1, - 'no-sparse-arrays': 1, - 'no-template-curly-in-string': 1, - 'no-this-before-super': 0, - 'no-unassigned-vars': 1, - 'no-undef': 0, - 'no-unexpected-multiline': 0, - 'no-unmodified-loop-condition': 1, - 'no-unreachable': 1, - 'no-unreachable-loop': 1, - 'no-unsafe-finally': 1, - 'no-unsafe-negation': [1, { enforceForOrderingRelations: true }], - 'no-unsafe-optional-chaining': [1, { disallowArithmeticOperators: true }], - 'no-unused-private-class-members': 0, - 'no-unused-vars': 0, // replaced by @typescript-eslint/no-unused-vars - 'no-use-before-define': 0, - 'no-useless-backreference': 1, - 'require-atomic-updates': 1, - 'use-isnan': [1, { enforceForIndexOf: true }], - 'valid-typeof': [1, { requireStringLiterals: true }], - - // Suggestions - // https://eslint.org/docs/latest/rules/#suggestions - 'accessor-pairs': 1, - 'arrow-body-style': 0, - 'block-scoped-var': 1, - camelcase: 0, - 'capitalized-comments': 0, - 'class-methods-use-this': 1, - complexity: 0, - 'consistent-return': 0, - 'consistent-this': 0, - curly: 0, - 'default-case': 1, - 'default-case-last': 1, - 'default-param-last': 0, - 'dot-notation': 0, // replaced by @typescript-eslint/dot-notation - eqeqeq: [1, 'always', { null: 'ignore' }], - 'func-name-matching': 0, - 'func-names': 0, - 'func-style': 0, - 'grouped-accessor-pairs': [1, 'getBeforeSet'], - 'guard-for-in': 0, - 'id-denylist': 0, - 'id-length': 0, - 'id-match': 0, - 'init-declarations': 0, - 'logical-assignment-operators': [1, 'always', { enforceForIfStatements: true }], - 'max-classes-per-file': 0, - 'max-depth': 0, - 'max-lines': 0, - 'max-lines-per-function': 0, - 'max-nested-callbacks': 0, - 'max-params': 0, - 'max-statements': 0, - 'multiline-comment-style': 0, - 'new-cap': 0, - 'no-alert': 0, - 'no-array-constructor': 1, - 'no-bitwise': 0, - 'no-caller': 1, - 'no-case-declarations': 1, - 'no-console': 1, - 'no-continue': 0, - 'no-delete-var': 1, - 'no-div-regex': 0, - 'no-else-return': [1, { allowElseIf: false }], - 'no-empty': [1, { allowEmptyCatch: true }], - 'no-empty-function': 0, - 'no-empty-static-block': 1, - 'no-eq-null': 0, - 'no-eval': 1, - 'no-extend-native': 1, - 'no-extra-bind': 1, - 'no-extra-boolean-cast': [1, { enforceForLogicalOperands: true }], - 'no-extra-label': 1, - 'no-global-assign': 1, - 'no-implicit-coercion': 0, - 'no-implicit-globals': 0, - 'no-implied-eval': 0, // replaced by @typescript-eslint/no-implied-eval - 'no-inline-comments': 0, - 'no-invalid-this': 0, - 'no-iterator': 1, - 'no-label-var': 1, - 'no-labels': 1, - 'no-lone-blocks': 1, - 'no-lonely-if': 1, - 'no-loop-func': 0, - 'no-magic-numbers': 0, - 'no-multi-assign': 0, - 'no-multi-str': 1, - 'no-negated-condition': 0, - 'no-nested-ternary': 0, - 'no-new': 1, - 'no-new-func': 1, - 'no-new-wrappers': 1, - 'no-nonoctal-decimal-escape': 1, - 'no-object-constructor': 1, - 'no-octal': 1, - 'no-octal-escape': 1, - 'no-param-reassign': 0, - 'no-plusplus': 0, - 'no-proto': 1, - 'no-redeclare': 0, // replaced by @typescript-eslint/no-redeclare - 'no-regex-spaces': 1, - 'no-restricted-exports': 0, - 'no-restricted-globals': [ - 1, - { - name: 'Omit', - message: 'Use Omit from types instead.' - } - ], - 'no-restricted-imports': 0, // replaced by @typescript-eslint/no-restricted-imports - 'no-restricted-properties': 0, - 'no-restricted-syntax': 0, - 'no-return-assign': 0, - 'no-return-await': 0, // replaced by @typescript-eslint/return-await - 'no-script-url': 1, - 'no-sequences': [1, { allowInParentheses: false }], - 'no-shadow': 0, - 'no-shadow-restricted-names': 1, - 'no-ternary': 0, - 'no-throw-literal': 0, // replaced by @typescript-eslint/only-throw-error - 'no-undef-init': 1, - 'no-undefined': 0, - 'no-underscore-dangle': 0, - 'no-unneeded-ternary': [1, { defaultAssignment: false }], - 'no-unused-expressions': [1, { allowTaggedTemplates: true, enforceForJSX: true }], - 'no-unused-labels': 1, - 'no-useless-call': 1, - 'no-useless-catch': 1, - 'no-useless-computed-key': 1, - 'no-useless-concat': 1, - 'no-useless-constructor': 1, - 'no-useless-escape': 1, - 'no-useless-rename': 1, - 'no-useless-return': 1, - 'no-var': 1, - 'no-void': 1, - 'no-warning-comments': 0, - 'no-with': 1, - 'object-shorthand': [1, 'always', { avoidExplicitReturnArrows: true }], - 'one-var': [1, 'never'], - 'operator-assignment': 1, - 'prefer-arrow-callback': [1, { allowNamedFunctions: true }], - 'prefer-const': [1, { destructuring: 'all' }], - 'prefer-destructuring': 0, // replaced by @typescript-eslint/prefer-destructuring - 'prefer-exponentiation-operator': 1, - 'prefer-named-capture-group': 0, - 'prefer-numeric-literals': 1, - 'prefer-object-has-own': 1, - 'prefer-object-spread': 1, - 'prefer-promise-reject-errors': 0, // replaced by @typescript-eslint/prefer-promise-reject-errors - 'prefer-regex-literals': [1, { disallowRedundantWrapping: true }], - 'prefer-rest-params': 1, - 'prefer-spread': 1, - 'prefer-template': 1, - radix: 1, - 'require-await': 0, // replaced by @typescript-eslint/require-await - 'require-unicode-regexp': 0, - 'require-yield': 1, - 'sort-imports': 0, - 'sort-keys': 0, - 'sort-vars': 0, - strict: 1, - 'symbol-description': 1, - 'vars-on-top': 0, - yoda: 0, - - // Layout & Formatting - // https://eslint.org/docs/latest/rules/#layout--formatting - 'unicode-bom': 1, - - // React rules - // https://github.com/jsx-eslint/eslint-plugin-react#list-of-supported-rules - 'react/boolean-prop-naming': 0, - 'react/button-has-type': 0, - 'react/checked-requires-onchange-or-readonly': 1, - 'react/default-props-match-prop-types': 0, - 'react/destructuring-assignment': 0, - 'react/display-name': 0, - 'react/forbid-component-props': 0, - 'react/forbid-dom-props': 0, - 'react/forbid-elements': 0, - 'react/forbid-foreign-prop-types': 0, - 'react/forbid-prop-types': 0, - 'react/forward-ref-uses-ref': 1, - 'react/function-component-definition': [ - 1, - { - namedComponents: 'function-declaration', - unnamedComponents: 'function-expression' - } - ], - 'react/hook-use-state': 0, - 'react/iframe-missing-sandbox': 1, - 'react/jsx-boolean-value': 1, - 'react/jsx-child-element-spacing': 0, - 'react/jsx-closing-bracket-location': 0, - 'react/jsx-closing-tag-location': 0, - 'react/jsx-curly-brace-presence': 1, - 'react/jsx-curly-newline': 0, - 'react/jsx-curly-spacing': 0, - 'react/jsx-equals-spacing': 0, - 'react/jsx-filename-extension': [1, { extensions: ['.tsx'] }], - 'react/jsx-first-prop-new-line': 0, - 'react/jsx-fragments': 1, - 'react/jsx-handler-names': 0, - 'react/jsx-indent': 0, - 'react/jsx-indent-props': 0, - 'react/jsx-key': [ - 1, - { - checkFragmentShorthand: true, - checkKeyMustBeforeSpread: true, - warnOnDuplicates: true - } - ], - 'react/jsx-max-depth': 0, - 'react/jsx-max-props-per-line': 0, - 'react/jsx-newline': 0, - 'react/jsx-no-bind': 0, - 'react/jsx-no-comment-textnodes': 1, - 'react/jsx-no-constructed-context-values': 1, - 'react/jsx-no-duplicate-props': 0, - 'react/jsx-no-leaked-render': 0, - 'react/jsx-no-literals': 0, - 'react/jsx-no-script-url': 1, - 'react/jsx-no-target-blank': 1, - 'react/jsx-no-undef': 0, - 'react/jsx-no-useless-fragment': 1, - 'react/jsx-one-expression-per-line': 0, - 'react/jsx-pascal-case': 1, - 'react/jsx-props-no-multi-spaces': 0, - 'react/jsx-props-no-spread-multi': 1, - 'react/jsx-props-no-spreading': 0, - 'react/jsx-sort-props': 0, - 'react/jsx-tag-spacing': 0, - 'react/jsx-uses-react': 0, - 'react/jsx-uses-vars': 1, - 'react/jsx-wrap-multilines': 0, - 'react/no-access-state-in-setstate': 1, - 'react/no-adjacent-inline-elements': 0, - 'react/no-array-index-key': 0, - 'react/no-arrow-function-lifecycle': 0, - 'react/no-children-prop': 0, - 'react/no-danger': 1, - 'react/no-danger-with-children': 1, - 'react/no-deprecated': 1, - 'react/no-did-mount-set-state': 1, - 'react/no-did-update-set-state': 1, - 'react/no-direct-mutation-state': 1, - 'react/no-find-dom-node': 0, - 'react/no-invalid-html-attribute': 1, - 'react/no-is-mounted': 1, - 'react/no-multi-comp': 0, - 'react/no-namespace': 0, - 'react/no-object-type-as-default-prop': 1, - 'react/no-redundant-should-component-update': 1, - 'react/no-render-return-value': 0, - 'react/no-set-state': 0, - 'react/no-string-refs': [1, { noTemplateLiterals: true }], - 'react/no-this-in-sfc': 0, - 'react/no-typos': 1, - 'react/no-unescaped-entities': 0, - 'react/no-unknown-property': 0, - 'react/no-unsafe': 1, - 'react/no-unstable-nested-components': [1, { allowAsProps: true }], - 'react/no-unused-class-component-methods': 0, - 'react/no-unused-prop-types': 0, - 'react/no-unused-state': 0, - 'react/no-will-update-set-state': 1, - 'react/prefer-es6-class': 1, - 'react/prefer-exact-props': 0, - 'react/prefer-read-only-props': 0, - 'react/prefer-stateless-function': 0, - 'react/prop-types': 0, - 'react/react-in-jsx-scope': 0, - 'react/require-default-props': 0, - 'react/require-optimization': 0, - 'react/require-render-return': 1, - 'react/self-closing-comp': 1, - 'react/sort-comp': 0, - 'react/sort-default-props': 0, - 'react/sort-prop-types': 0, - 'react/state-in-constructor': 0, - 'react/static-property-placement': 1, - 'react/style-prop-object': 0, - 'react/void-dom-elements-no-children': 1, - - // React Compiler - // https://react.dev/learn/react-compiler#installing-eslint-plugin-react-compiler - 'react-compiler/react-compiler': 1, - - // React Hooks - // https://www.npmjs.com/package/eslint-plugin-react-hooks - 'react-hooks/rules-of-hooks': 1, - 'react-hooks/exhaustive-deps': 1, - - // React Hooks Extra - // https://eslint-react.xyz/ - 'react-hooks-extra/no-unnecessary-use-callback': 1, - 'react-hooks-extra/no-unnecessary-use-memo': 1, - 'react-hooks-extra/no-unnecessary-use-prefix': 1, - 'react-hooks-extra/prefer-use-state-lazy-initialization': 1, - - // SonarJS rules - // https://github.com/SonarSource/eslint-plugin-sonarjs#rules - 'sonarjs/no-all-duplicated-branches': 1, - 'sonarjs/no-element-overwrite': 1, - 'sonarjs/no-empty-collection': 1, - 'sonarjs/no-extra-arguments': 0, - 'sonarjs/no-identical-conditions': 1, - 'sonarjs/no-identical-expressions': 1, - 'sonarjs/no-ignored-return': 1, - 'sonarjs/no-one-iteration-loop': 1, - 'sonarjs/no-use-of-empty-return-value': 1, - 'sonarjs/non-existent-operator': 1, - 'sonarjs/cognitive-complexity': 0, - 'sonarjs/elseif-without-else': 0, - 'sonarjs/max-switch-cases': 0, - 'sonarjs/no-collapsible-if': 1, - 'sonarjs/no-collection-size-mischeck': 1, - 'sonarjs/no-duplicate-string': 0, - 'sonarjs/no-duplicated-branches': 1, - 'sonarjs/no-gratuitous-expressions': 1, - 'sonarjs/no-identical-functions': 1, - 'sonarjs/no-inverted-boolean-check': 1, - 'sonarjs/no-nested-switch': 1, - 'sonarjs/no-nested-template-literals': 1, - 'sonarjs/no-redundant-boolean': 1, - 'sonarjs/no-redundant-jump': 1, - 'sonarjs/no-same-line-conditional': 1, - 'sonarjs/no-small-switch': 1, - 'sonarjs/no-unused-collection': 1, - 'sonarjs/no-useless-catch': 1, - 'sonarjs/prefer-immediate-return': 1, - 'sonarjs/prefer-object-literal': 1, - 'sonarjs/prefer-single-boolean-return': 1, - 'sonarjs/prefer-while': 1, - - // @typescript-eslint/eslint-plugin rules - // https://typescript-eslint.io/rules/#supported-rules - '@typescript-eslint/adjacent-overload-signatures': 1, - '@typescript-eslint/array-type': 0, - '@typescript-eslint/await-thenable': 1, - '@typescript-eslint/ban-ts-comment': [1, { 'ts-expect-error': false }], - '@typescript-eslint/ban-tslint-comment': 0, - '@typescript-eslint/class-literal-property-style': 0, - '@typescript-eslint/class-methods-use-this': 0, - '@typescript-eslint/consistent-generic-constructors': 1, - '@typescript-eslint/consistent-indexed-object-style': 1, - '@typescript-eslint/consistent-return': 0, - '@typescript-eslint/consistent-type-assertions': [ - 1, - { assertionStyle: 'as', objectLiteralTypeAssertions: 'never' } - ], - '@typescript-eslint/consistent-type-definitions': 1, - '@typescript-eslint/consistent-type-exports': 0, - '@typescript-eslint/consistent-type-imports': [1, { fixStyle: 'inline-type-imports' }], - '@typescript-eslint/explicit-function-return-type': 0, - '@typescript-eslint/explicit-member-accessibility': 0, - '@typescript-eslint/explicit-module-boundary-types': 0, - '@typescript-eslint/member-ordering': 0, - '@typescript-eslint/method-signature-style': 1, - '@typescript-eslint/naming-convention': 0, - '@typescript-eslint/no-array-delete': 1, - '@typescript-eslint/no-base-to-string': 0, - '@typescript-eslint/no-confusing-non-null-assertion': 0, - '@typescript-eslint/no-confusing-void-expression': [1, { ignoreArrowShorthand: true }], - '@typescript-eslint/no-deprecated': 1, - '@typescript-eslint/no-duplicate-enum-values': 1, - '@typescript-eslint/no-duplicate-type-constituents': 1, - '@typescript-eslint/no-dynamic-delete': 0, - '@typescript-eslint/no-empty-object-type': 1, - '@typescript-eslint/no-explicit-any': [1, { fixToUnknown: true }], - '@typescript-eslint/no-extra-non-null-assertion': 1, - '@typescript-eslint/no-extraneous-class': 1, - '@typescript-eslint/no-floating-promises': 0, - '@typescript-eslint/no-for-in-array': 1, - '@typescript-eslint/no-import-type-side-effects': 0, - '@typescript-eslint/no-inferrable-types': 1, - '@typescript-eslint/no-invalid-void-type': 1, - '@typescript-eslint/no-meaningless-void-operator': 0, - '@typescript-eslint/no-misused-new': 1, - '@typescript-eslint/no-misused-promises': 0, - '@typescript-eslint/no-misused-spread': 1, - '@typescript-eslint/no-mixed-enums': 1, - '@typescript-eslint/no-namespace': 1, - '@typescript-eslint/no-non-null-asserted-nullish-coalescing': 1, - '@typescript-eslint/no-non-null-asserted-optional-chain': 1, - '@typescript-eslint/no-non-null-assertion': 0, - '@typescript-eslint/no-redundant-type-constituents': 1, - '@typescript-eslint/no-require-imports': 1, - '@typescript-eslint/no-restricted-types': 0, - '@typescript-eslint/no-this-alias': 0, - '@typescript-eslint/no-type-alias': 0, - '@typescript-eslint/no-unnecessary-boolean-literal-compare': 1, - '@typescript-eslint/no-unnecessary-condition': [1, { checkTypePredicates: true }], - '@typescript-eslint/no-unnecessary-parameter-property-assignment': 1, - '@typescript-eslint/no-unnecessary-qualifier': 0, - '@typescript-eslint/no-unnecessary-template-expression': 1, - '@typescript-eslint/no-unnecessary-type-arguments': 1, - '@typescript-eslint/no-unnecessary-type-assertion': 1, - '@typescript-eslint/no-unnecessary-type-constraint': 1, - '@typescript-eslint/no-unnecessary-type-conversion': 1, - '@typescript-eslint/no-unnecessary-type-parameters': 1, - '@typescript-eslint/no-unsafe-argument': 0, - '@typescript-eslint/no-unsafe-assignment': 0, - '@typescript-eslint/no-unsafe-call': 0, - '@typescript-eslint/no-unsafe-declaration-merging': 1, - '@typescript-eslint/no-unsafe-enum-comparison': 1, - '@typescript-eslint/no-unsafe-function-type': 1, - '@typescript-eslint/no-unsafe-member-access': 0, - '@typescript-eslint/no-unsafe-return': 1, - '@typescript-eslint/no-unsafe-type-assertion': 0, - '@typescript-eslint/no-unsafe-unary-minus': 1, - '@typescript-eslint/no-useless-empty-export': 1, - '@typescript-eslint/no-var-requires': 0, - '@typescript-eslint/no-wrapper-object-types': 1, - '@typescript-eslint/non-nullable-type-assertion-style': 1, - '@typescript-eslint/parameter-properties': 1, - '@typescript-eslint/prefer-as-const': 1, - '@typescript-eslint/prefer-destructuring': [1, { array: false }], - '@typescript-eslint/prefer-enum-initializers': 0, - '@typescript-eslint/prefer-find': 1, - '@typescript-eslint/prefer-for-of': 1, - '@typescript-eslint/prefer-function-type': 1, - '@typescript-eslint/prefer-includes': 1, - '@typescript-eslint/prefer-literal-enum-member': 1, - '@typescript-eslint/prefer-namespace-keyword': 0, - '@typescript-eslint/prefer-nullish-coalescing': [ - 1, - { ignorePrimitives: { boolean: true, string: true } } - ], - '@typescript-eslint/prefer-optional-chain': 1, - '@typescript-eslint/prefer-promise-reject-errors': [1, { allowEmptyReject: true }], - '@typescript-eslint/prefer-readonly': 1, - '@typescript-eslint/prefer-readonly-parameter-types': 0, - '@typescript-eslint/prefer-reduce-type-parameter': 1, - '@typescript-eslint/prefer-regexp-exec': 1, - '@typescript-eslint/prefer-return-this-type': 0, - '@typescript-eslint/prefer-string-starts-ends-with': 1, - '@typescript-eslint/promise-function-async': 0, - '@typescript-eslint/require-array-sort-compare': 1, - '@typescript-eslint/restrict-plus-operands': 0, - '@typescript-eslint/restrict-template-expressions': 0, - '@typescript-eslint/sort-type-constituents': 0, - '@typescript-eslint/strict-boolean-expressions': 0, - '@typescript-eslint/switch-exhaustiveness-check': 1, - '@typescript-eslint/triple-slash-reference': [ - 1, - { path: 'never', types: 'never', lib: 'never' } - ], - '@typescript-eslint/typedef': 0, - '@typescript-eslint/unbound-method': 0, - '@typescript-eslint/unified-signatures': 0, - - // @typescript-eslint/eslint-plugin Extension Rules - // https://typescript-eslint.io/rules/#extension-rules - '@typescript-eslint/default-param-last': 0, - '@typescript-eslint/dot-notation': 1, - '@typescript-eslint/init-declarations': 0, - '@typescript-eslint/max-params': 0, - '@typescript-eslint/no-array-constructor': 0, - '@typescript-eslint/no-dupe-class-members': 0, - '@typescript-eslint/no-empty-function': 0, - '@typescript-eslint/no-implied-eval': 1, - '@typescript-eslint/no-invalid-this': 0, - '@typescript-eslint/no-loop-func': 0, - '@typescript-eslint/no-magic-numbers': 0, - '@typescript-eslint/no-redeclare': 1, - '@typescript-eslint/no-restricted-imports': [ - 1, - { - name: 'react', - importNames: ['default'], - message: 'Use named imports instead.' - }, - { - name: 'react-dom', - importNames: ['default'], - message: 'Use named imports instead.' - } - ], - '@typescript-eslint/no-shadow': 0, - '@typescript-eslint/no-unused-expressions': 0, - '@typescript-eslint/no-unused-vars': [1, { ignoreRestSiblings: true }], - '@typescript-eslint/no-use-before-define': 0, - '@typescript-eslint/no-useless-constructor': 0, - '@typescript-eslint/only-throw-error': 1, - '@typescript-eslint/require-await': 1, - '@typescript-eslint/return-await': 1, - '@typescript-eslint/use-unknown-in-catch-callback-variable': 1 - } - }, - - { - name: 'test', - - files: ['test/**/*'], - - plugins: { - vitest, - 'jest-dom': jestDom, - 'testing-library': testingLibrary - }, - - rules: { - '@typescript-eslint/no-floating-promises': 1, - - // https://github.com/vitest-dev/eslint-plugin-vitest?tab=readme-ov-file#rules - 'vitest/consistent-test-filename': 0, - 'vitest/consistent-test-it': 1, - 'vitest/expect-expect': 0, - 'vitest/max-expects': 0, - 'vitest/max-nested-describe': 0, - 'vitest/no-alias-methods': 1, - 'vitest/no-commented-out-tests': 1, - 'vitest/no-conditional-expect': 1, - 'vitest/no-conditional-in-test': 0, - 'vitest/no-conditional-tests': 1, - 'vitest/no-disabled-tests': 0, - 'vitest/no-done-callback': 0, - 'vitest/no-duplicate-hooks': 1, - 'vitest/no-focused-tests': 1, - 'vitest/no-hooks': 1, - 'vitest/no-identical-title': 1, - 'vitest/no-import-node-test': 1, - 'vitest/no-interpolation-in-snapshots': 0, - 'vitest/no-large-snapshots': 0, - 'vitest/no-mocks-import': 1, - 'vitest/no-restricted-matchers': 0, - 'vitest/no-restricted-vi-methods': 0, - 'vitest/no-standalone-expect': 1, - 'vitest/no-test-prefixes': 0, - 'vitest/no-test-return-statement': 0, - 'vitest/prefer-called-with': 0, - 'vitest/prefer-comparison-matcher': 1, - 'vitest/prefer-each': 1, - 'vitest/prefer-equality-matcher': 1, - 'vitest/prefer-expect-assertions': 0, - 'vitest/prefer-expect-resolves': 1, - 'vitest/prefer-hooks-in-order': 1, - 'vitest/prefer-hooks-on-top': 1, - 'vitest/prefer-lowercase-title': 0, - 'vitest/prefer-mock-promise-shorthand': 1, - 'vitest/prefer-snapshot-hint': 0, - 'vitest/prefer-spy-on': 1, - 'vitest/prefer-strict-boolean-matchers': 1, - 'vitest/prefer-strict-equal': 1, - 'vitest/prefer-to-be': 1, - 'vitest/prefer-to-be-falsy': 0, - 'vitest/prefer-to-be-object': 0, - 'vitest/prefer-to-be-truthy': 0, - 'vitest/prefer-to-contain': 1, - 'vitest/prefer-to-have-length': 1, - 'vitest/prefer-todo': 1, - 'vitest/prefer-vi-mocked': 1, - 'vitest/require-hook': 0, - 'vitest/require-local-test-context-for-concurrent-snapshots': 0, - 'vitest/require-mock-type-parameters': 0, - 'vitest/require-to-throw-message': 0, - 'vitest/require-top-level-describe': 0, - 'vitest/valid-describe-callback': 1, - 'vitest/valid-expect-in-promise': 1, - 'vitest/valid-expect': [1, { alwaysAwait: true }], - 'vitest/valid-title': 1, - - // https://github.com/testing-library/eslint-plugin-jest-dom#supported-rules - 'jest-dom/prefer-checked': 1, - 'jest-dom/prefer-empty': 1, - 'jest-dom/prefer-enabled-disabled': 1, - 'jest-dom/prefer-focus': 1, - 'jest-dom/prefer-in-document': 1, - 'jest-dom/prefer-required': 1, - 'jest-dom/prefer-to-have-attribute': 1, - 'jest-dom/prefer-to-have-class': 1, - 'jest-dom/prefer-to-have-style': 1, - 'jest-dom/prefer-to-have-text-content': 1, - 'jest-dom/prefer-to-have-value': 1, - - // eslint-plugin-testing-library Rules - // https://github.com/testing-library/eslint-plugin-testing-library#supported-rules - 'testing-library/await-async-events': 0, - 'testing-library/await-async-queries': 0, - 'testing-library/await-async-utils': 0, - 'testing-library/consistent-data-testid': 0, - 'testing-library/no-await-sync-events': 0, - 'testing-library/no-await-sync-queries': 0, - 'testing-library/no-container': 1, - 'testing-library/no-debugging-utils': 1, - 'testing-library/no-dom-import': 1, - 'testing-library/no-global-regexp-flag-in-query': 1, - 'testing-library/no-manual-cleanup': 0, - 'testing-library/no-node-access': 0, - 'testing-library/no-promise-in-fire-event': 0, - 'testing-library/no-render-in-lifecycle': 0, - 'testing-library/no-unnecessary-act': 1, - 'testing-library/no-wait-for-multiple-assertions': 1, - 'testing-library/no-wait-for-side-effects': 1, - 'testing-library/no-wait-for-snapshot': 0, - 'testing-library/prefer-explicit-assert': 1, - 'testing-library/prefer-find-by': 1, - 'testing-library/prefer-implicit-assert': 0, - 'testing-library/prefer-presence-queries': 0, - 'testing-library/prefer-query-by-disappearance': 1, - 'testing-library/prefer-query-matchers': 0, - 'testing-library/prefer-screen-queries': 0, - 'testing-library/prefer-user-event': 1, - 'testing-library/render-result-naming-convention': 0 - } - }, - - { - name: 'node', - - files: ['**/*.js'], - - rules: { - // Best Practices - 'default-param-last': 1, - // Possible Errors - 'no-console': 0, - 'no-undef': 1, - 'no-use-before-define': [1, { functions: false, classes: false, variables: false }] - } - }, - - { - name: 'markdown', - files: ['**/*.md'], - plugins: { - markdown - }, - language: 'markdown/commonmark', - rules: { - 'markdown/fenced-code-language': 1, - 'markdown/heading-increment': 1, - 'markdown/no-duplicate-headings': 0, - 'markdown/no-empty-links': 1, - 'markdown/no-html': 0, - 'markdown/no-invalid-label-refs': 1, - 'markdown/no-missing-label-refs': 1 - } - } -]); diff --git a/eslint.config.ts b/eslint.config.ts new file mode 100644 index 0000000000..2e47a7ffae --- /dev/null +++ b/eslint.config.ts @@ -0,0 +1,1064 @@ +import eslintReact from '@eslint-react/eslint-plugin'; +import markdown from '@eslint/markdown'; +import vitest from '@vitest/eslint-plugin'; +import reactHooks from 'eslint-plugin-react-hooks'; +import sonarjs from 'eslint-plugin-sonarjs'; +import { defineConfig, globalIgnores } from 'eslint/config'; +import tseslint from 'typescript-eslint'; + +export default defineConfig([ + globalIgnores(['.cache', '.claude', '.nitro', '.output', '.tanstack', 'coverage', 'dist', 'lib']), + + { + linterOptions: { + reportUnusedInlineConfigs: 'warn' + } + }, + + { + name: 'common', + files: ['**/*.{js,ts,tsx}'], + + plugins: { + // @ts-expect-error + 'react-hooks': reactHooks, + '@eslint-react': eslintReact, + sonarjs, + '@typescript-eslint': tseslint.plugin + }, + + languageOptions: { + parser: tseslint.parser, + + parserOptions: { + ecmaVersion: 'latest', + jsxPragma: null, + projectService: true, + warnOnUnsupportedTypeScriptVersion: false + } + }, + + rules: { + // Possible Problems + // https://eslint.org/docs/latest/rules/#possible-problems + 'array-callback-return': [1, { checkForEach: true }], + 'constructor-super': 0, // covered by TS + 'for-direction': 1, + 'getter-return': 1, + 'no-async-promise-executor': 1, + 'no-await-in-loop': 0, + 'no-class-assign': 0, + 'no-compare-neg-zero': 1, + 'no-cond-assign': 1, + 'no-const-assign': 0, + 'no-constant-binary-expression': 1, + 'no-constant-condition': 1, + 'no-constructor-return': 1, + 'no-control-regex': 1, + 'no-debugger': 1, + 'no-dupe-args': 1, + 'no-dupe-class-members': 0, // replaced by @typescript-eslint/no-dupe-class-members + 'no-dupe-else-if': 1, + 'no-dupe-keys': 1, + 'no-duplicate-case': 1, + 'no-duplicate-imports': 0, + 'no-empty-character-class': 1, + 'no-empty-pattern': 1, + 'no-ex-assign': 1, + 'no-fallthrough': [1, { reportUnusedFallthroughComment: true }], + 'no-func-assign': 1, + 'no-import-assign': 1, + 'no-inner-declarations': 0, + 'no-invalid-regexp': 1, + 'no-irregular-whitespace': 1, + 'no-loss-of-precision': 1, + 'no-misleading-character-class': 1, + 'no-new-native-nonconstructor': 1, + 'no-obj-calls': 1, + 'no-promise-executor-return': 1, + 'no-prototype-builtins': 1, + 'no-self-assign': [1, { props: true }], + 'no-self-compare': 1, + 'no-setter-return': 1, + 'no-sparse-arrays': 1, + 'no-template-curly-in-string': 1, + 'no-this-before-super': 0, + 'no-unassigned-vars': 1, + 'no-undef': 0, + 'no-unexpected-multiline': 0, + 'no-unmodified-loop-condition': 1, + 'no-unreachable': 1, + 'no-unreachable-loop': 1, + 'no-unsafe-finally': 1, + 'no-unsafe-negation': [1, { enforceForOrderingRelations: true }], + 'no-unsafe-optional-chaining': [1, { disallowArithmeticOperators: true }], + 'no-unused-private-class-members': 0, // replaced by @typescript-eslint/no-unused-private-class-members + 'no-unused-vars': 0, // replaced by @typescript-eslint/no-unused-vars + 'no-use-before-define': 0, // replaced by @typescript-eslint/no-use-before-define + 'no-useless-backreference': 1, + 'require-atomic-updates': 1, + 'use-isnan': [1, { enforceForIndexOf: true }], + 'valid-typeof': [1, { requireStringLiterals: true }], + + // Suggestions + // https://eslint.org/docs/latest/rules/#suggestions + 'accessor-pairs': 1, + 'arrow-body-style': 0, + 'block-scoped-var': 1, + camelcase: 0, + 'capitalized-comments': 0, + 'class-methods-use-this': 0, // replaced by @typescript-eslint/class-methods-use-this + complexity: 0, + 'consistent-return': 0, // replaced by @typescript-eslint/consistent-return + 'consistent-this': 0, + curly: 0, + 'default-case': 1, + 'default-case-last': 1, + 'default-param-last': 0, // replaced by @typescript-eslint/default-param-last + 'dot-notation': 0, // replaced by @typescript-eslint/dot-notation + eqeqeq: [1, 'always', { null: 'ignore' }], + 'func-name-matching': 0, + 'func-names': 0, + 'func-style': 0, + 'grouped-accessor-pairs': [1, 'getBeforeSet'], + 'guard-for-in': 0, + 'id-denylist': 0, + 'id-length': 0, + 'id-match': 0, + 'init-declarations': 0, // replaced by @typescript-eslint/init-declarations + 'logical-assignment-operators': [1, 'always', { enforceForIfStatements: true }], + 'max-classes-per-file': 0, + 'max-depth': 0, + 'max-lines': 0, + 'max-lines-per-function': 0, + 'max-nested-callbacks': 0, + 'max-params': 0, // replaced by @typescript-eslint/max-params + 'max-statements': 0, + 'multiline-comment-style': 0, + 'new-cap': 0, + 'no-alert': 0, + 'no-array-constructor': 0, // replaced by @typescript-eslint/no-array-constructor + 'no-bitwise': 0, + 'no-caller': 1, + 'no-case-declarations': 1, + 'no-console': 1, + 'no-continue': 0, + 'no-delete-var': 1, + 'no-div-regex': 0, + 'no-else-return': [1, { allowElseIf: false }], + 'no-empty': [1, { allowEmptyCatch: true }], + 'no-empty-function': 0, // replaced by @typescript-eslint/no-empty-function + 'no-empty-static-block': 1, + 'no-eq-null': 0, + 'no-eval': 1, + 'no-extend-native': 1, + 'no-extra-bind': 1, + 'no-extra-boolean-cast': [1, { enforceForLogicalOperands: true }], + 'no-extra-label': 1, + 'no-global-assign': 1, + 'no-implicit-coercion': 0, + 'no-implicit-globals': 0, + 'no-implied-eval': 0, // replaced by @typescript-eslint/no-implied-eval + 'no-inline-comments': 0, + 'no-invalid-this': 0, // replaced by @typescript-eslint/no-invalid-this + 'no-iterator': 1, + 'no-label-var': 1, + 'no-labels': 1, + 'no-lone-blocks': 1, + 'no-lonely-if': 1, + 'no-loop-func': 0, // replaced by @typescript-eslint/no-loop-func + 'no-magic-numbers': 0, // replaced by @typescript-eslint/no-magic-numbers + 'no-multi-assign': 0, + 'no-multi-str': 1, + 'no-negated-condition': 0, + 'no-nested-ternary': 0, + 'no-new': 1, + 'no-new-func': 1, + 'no-new-wrappers': 1, + 'no-nonoctal-decimal-escape': 1, + 'no-object-constructor': 1, + 'no-octal': 1, + 'no-octal-escape': 1, + 'no-param-reassign': 0, + 'no-plusplus': 0, + 'no-proto': 1, + 'no-redeclare': 0, // replaced by @typescript-eslint/no-redeclare + 'no-regex-spaces': 1, + 'no-restricted-exports': 0, + 'no-restricted-globals': [ + 1, + { + name: 'Omit', + message: 'Use Omit from types instead.' + } + ], + 'no-restricted-imports': 0, // replaced by @typescript-eslint/no-restricted-imports + 'no-restricted-properties': 0, + 'no-restricted-syntax': 0, + 'no-return-assign': 0, + 'no-return-await': 0, // replaced by @typescript-eslint/return-await + 'no-script-url': 1, + 'no-sequences': [1, { allowInParentheses: false }], + 'no-shadow': 0, // replaced by @typescript-eslint/no-shadow + 'no-shadow-restricted-names': 1, + 'no-ternary': 0, + 'no-throw-literal': 0, // replaced by @typescript-eslint/only-throw-error + 'no-undef-init': 1, + 'no-undefined': 0, + 'no-underscore-dangle': 0, + 'no-unneeded-ternary': [1, { defaultAssignment: false }], + 'no-unused-expressions': 0, // replaced by @typescript-eslint/no-unused-expressions + 'no-unused-labels': 1, + 'no-useless-call': 1, + 'no-useless-catch': 1, + 'no-useless-computed-key': 1, + 'no-useless-concat': 1, + 'no-useless-constructor': 0, // replaced by @typescript-eslint/no-useless-constructor + 'no-useless-escape': 1, + 'no-useless-rename': 1, + 'no-useless-return': 1, + 'no-var': 1, + 'no-void': 1, + 'no-warning-comments': 0, + 'no-with': 1, + 'object-shorthand': [1, 'always', { avoidExplicitReturnArrows: true }], + 'one-var': [1, 'never'], + 'operator-assignment': 1, + 'prefer-arrow-callback': [1, { allowNamedFunctions: true }], + 'prefer-const': [1, { destructuring: 'all' }], + 'prefer-destructuring': 0, // replaced by @typescript-eslint/prefer-destructuring + 'prefer-exponentiation-operator': 1, + 'prefer-named-capture-group': 0, + 'prefer-numeric-literals': 1, + 'prefer-object-has-own': 1, + 'prefer-object-spread': 1, + 'prefer-promise-reject-errors': 0, // replaced by @typescript-eslint/prefer-promise-reject-errors + 'prefer-regex-literals': [1, { disallowRedundantWrapping: true }], + 'prefer-rest-params': 1, + 'prefer-spread': 1, + 'prefer-template': 1, + 'preserve-caught-error': 1, + radix: 1, + 'require-await': 0, // replaced by @typescript-eslint/require-await + 'require-unicode-regexp': 0, + 'require-yield': 1, + 'sort-imports': 0, + 'sort-keys': 0, + 'sort-vars': 0, + strict: 1, + 'symbol-description': 1, + 'vars-on-top': 0, + yoda: 0, + + // Layout & Formatting + // https://eslint.org/docs/latest/rules/#layout--formatting + 'unicode-bom': 1, + + // React Hooks + // https://github.com/facebook/react/tree/main/packages/eslint-plugin-react-hooks + // https://react.dev/reference/eslint-plugin-react-hooks + 'react-hooks/rules-of-hooks': 1, + 'react-hooks/exhaustive-deps': 1, + 'react-hooks/config': 1, + 'react-hooks/error-boundaries': 1, + 'react-hooks/gating': 1, + 'react-hooks/globals': 1, + 'react-hooks/immutability': 0, + 'react-hooks/incompatible-library': 1, + 'react-hooks/preserve-manual-memoization': 1, + 'react-hooks/purity': 1, + 'react-hooks/refs': 1, + 'react-hooks/set-state-in-effect': 1, + 'react-hooks/set-state-in-render': 1, + 'react-hooks/static-components': 1, + 'react-hooks/unsupported-syntax': 1, + 'react-hooks/use-memo': 1, + + // ESLint React + // https://eslint-react.xyz/docs/rules + /* +// copy all the rules from the rules table for easy pasting +copy( + Iterator.from( + document + // select all non-debug rule links + .querySelectorAll('tr a:not([href*="rules/debug"])') + ) + // map link to rule declaration + .map((a) => `'@eslint-react/${a.pathname.slice(a.pathname.lastIndexOf('/') + 1)}': 1,`) + .toArray() + .join('\n') +); + */ + '@eslint-react/error-boundaries': 1, + '@eslint-react/exhaustive-deps': 1, + '@eslint-react/globals': 1, + '@eslint-react/immutability': 1, + '@eslint-react/no-access-state-in-setstate': 1, + '@eslint-react/no-array-index-key': 0, + '@eslint-react/no-children-count': 1, + '@eslint-react/no-children-for-each': 1, + '@eslint-react/no-children-map': 1, + '@eslint-react/no-children-only': 1, + '@eslint-react/no-children-to-array': 1, + '@eslint-react/no-class-component': 1, + '@eslint-react/no-clone-element': 1, + '@eslint-react/no-component-will-mount': 1, + '@eslint-react/no-component-will-receive-props': 1, + '@eslint-react/no-component-will-update': 1, + '@eslint-react/no-context-provider': 1, + '@eslint-react/no-create-ref': 1, + '@eslint-react/no-direct-mutation-state': 1, + '@eslint-react/no-duplicate-key': 1, + '@eslint-react/no-forward-ref': 1, + '@eslint-react/no-implicit-children': 0, + '@eslint-react/no-implicit-key': 1, + '@eslint-react/no-implicit-ref': 0, + '@eslint-react/no-leaked-conditional-rendering': 1, + '@eslint-react/no-missing-component-display-name': 1, + '@eslint-react/no-missing-context-display-name': 1, + '@eslint-react/no-missing-key': 1, + '@eslint-react/no-misused-capture-owner-stack': 1, + '@eslint-react/no-nested-component-definitions': 1, + '@eslint-react/no-nested-lazy-component-declarations': 1, + '@eslint-react/no-set-state-in-component-did-mount': 1, + '@eslint-react/no-set-state-in-component-did-update': 1, + '@eslint-react/no-set-state-in-component-will-update': 1, + '@eslint-react/no-unnecessary-use-prefix': 1, + '@eslint-react/no-unsafe-component-will-mount': 1, + '@eslint-react/no-unsafe-component-will-receive-props': 1, + '@eslint-react/no-unsafe-component-will-update': 1, + '@eslint-react/no-unstable-context-value': 1, + '@eslint-react/no-unstable-default-props': 1, + '@eslint-react/no-unused-class-component-members': 1, + '@eslint-react/no-unused-props': 1, + '@eslint-react/no-unused-state': 1, + '@eslint-react/no-use-context': 1, + '@eslint-react/purity': 1, + '@eslint-react/refs': 1, + '@eslint-react/rules-of-hooks': 1, + '@eslint-react/set-state-in-effect': 0, + '@eslint-react/set-state-in-render': 1, + '@eslint-react/static-components': 1, + '@eslint-react/unsupported-syntax': 1, + '@eslint-react/use-memo': 1, + '@eslint-react/use-state': 1, + '@eslint-react/jsx-no-children-prop': 1, + '@eslint-react/jsx-no-children-prop-with-children': 1, + '@eslint-react/jsx-no-comment-textnodes': 1, + '@eslint-react/jsx-no-key-after-spread': 1, + '@eslint-react/jsx-no-leaked-dollar': 1, + '@eslint-react/jsx-no-leaked-semicolon': 1, + '@eslint-react/jsx-no-namespace': 1, + '@eslint-react/jsx-no-useless-fragment': [1, { allowExpressions: false }], + '@eslint-react/rsc-function-definition': 1, + '@eslint-react/dom-no-dangerously-set-innerhtml': 1, + '@eslint-react/dom-no-dangerously-set-innerhtml-with-children': 1, + '@eslint-react/dom-no-find-dom-node': 1, + '@eslint-react/dom-no-flush-sync': 0, + '@eslint-react/dom-no-hydrate': 1, + '@eslint-react/dom-no-missing-button-type': 1, + '@eslint-react/dom-no-missing-iframe-sandbox': 1, + '@eslint-react/dom-no-render': 1, + '@eslint-react/dom-no-render-return-value': 1, + '@eslint-react/dom-no-script-url': 1, + '@eslint-react/dom-no-string-style-prop': 1, + '@eslint-react/dom-no-unknown-property': 1, + '@eslint-react/dom-no-unsafe-iframe-sandbox': 1, + '@eslint-react/dom-no-unsafe-target-blank': 1, + '@eslint-react/dom-no-use-form-state': 1, + '@eslint-react/dom-no-void-elements-with-children': 1, + '@eslint-react/web-api-no-leaked-event-listener': 1, + '@eslint-react/web-api-no-leaked-fetch': 1, + '@eslint-react/web-api-no-leaked-intersection-observer': 1, + '@eslint-react/web-api-no-leaked-interval': 1, + '@eslint-react/web-api-no-leaked-resize-observer': 1, + '@eslint-react/web-api-no-leaked-timeout': 1, + '@eslint-react/naming-convention-context-name': 1, + '@eslint-react/naming-convention-id-name': 1, + '@eslint-react/naming-convention-ref-name': 1, + + // SonarJS rules + // https://github.com/SonarSource/SonarJS/blob/master/packages/analysis/src/jsts/rules/README.md#rules + /* +// copy all the rules from the rules table for easy pasting +copy( + Iterator.from( + document + // select rules table + .querySelector('.markdown-heading:has(> a[href="#rules"]) ~ markdown-accessiblity-table') + // select all rows with a rule + .querySelectorAll('tr:has(a)') + ) + // filter out deprecated rules + .filter((row) => row.lastElementChild.textContent === '') + // map row to rule declaration + .map((row) => `'sonarjs/${row.firstElementChild.textContent}': 1,`) + .toArray() + .join('\n') +); + */ + 'sonarjs/anchor-precedence': 1, + 'sonarjs/argument-type': 1, + 'sonarjs/arguments-order': 1, + 'sonarjs/arguments-usage': 1, + 'sonarjs/array-callback-without-return': 1, + 'sonarjs/array-constructor': 1, + 'sonarjs/arrow-function-convention': 0, + 'sonarjs/assertions-in-tests': 1, + 'sonarjs/aws-apigateway-public-api': 0, + 'sonarjs/aws-ec2-rds-dms-public': 0, + 'sonarjs/aws-ec2-unencrypted-ebs-volume': 0, + 'sonarjs/aws-efs-unencrypted': 0, + 'sonarjs/aws-iam-all-privileges': 0, + 'sonarjs/aws-iam-all-resources-accessible': 0, + 'sonarjs/aws-iam-privilege-escalation': 0, + 'sonarjs/aws-iam-public-access': 0, + 'sonarjs/aws-opensearchservice-domain': 0, + 'sonarjs/aws-rds-unencrypted-databases': 0, + 'sonarjs/aws-restricted-ip-admin-access': 0, + 'sonarjs/aws-s3-bucket-granted-access': 0, + 'sonarjs/aws-s3-bucket-insecure-http': 0, + 'sonarjs/aws-s3-bucket-public-access': 0, + 'sonarjs/aws-s3-bucket-versioning': 0, + 'sonarjs/aws-sagemaker-unencrypted-notebook': 0, + 'sonarjs/aws-sns-unencrypted-topics': 0, + 'sonarjs/aws-sqs-unencrypted-queue': 0, + 'sonarjs/bitwise-operators': 1, + 'sonarjs/block-scoped-var': 1, + 'sonarjs/bool-param-default': 1, + 'sonarjs/call-argument-line': 1, + 'sonarjs/chai-determinate-assertion': 1, + 'sonarjs/class-name': 1, + 'sonarjs/class-prototype': 1, + 'sonarjs/code-eval': 1, + 'sonarjs/cognitive-complexity': 0, + 'sonarjs/comma-or-logical-or-case': 1, + 'sonarjs/comment-regex': 1, + 'sonarjs/concise-regex': 1, + 'sonarjs/confidential-information-logging': 1, + 'sonarjs/constructor-for-side-effects': 1, + 'sonarjs/content-length': 1, + 'sonarjs/content-security-policy': 1, + 'sonarjs/cookie-no-httponly': 1, + 'sonarjs/cors': 1, + 'sonarjs/csrf': 1, + 'sonarjs/cyclomatic-complexity': 0, + 'sonarjs/declarations-in-global-scope': 0, + 'sonarjs/deprecation': 0, + 'sonarjs/destructuring-assignment-syntax': 1, + 'sonarjs/different-types-comparison': 1, + 'sonarjs/disabled-auto-escaping': 1, + 'sonarjs/disabled-resource-integrity': 1, + 'sonarjs/disabled-timeout': 1, + 'sonarjs/dompurify-unsafe-config': 1, + 'sonarjs/duplicates-in-character-class': 1, + 'sonarjs/dynamically-constructed-templates': 1, + 'sonarjs/elseif-without-else': 0, + 'sonarjs/empty-string-repetition': 1, + 'sonarjs/encryption-secure-mode': 1, + 'sonarjs/existing-groups': 1, + 'sonarjs/expression-complexity': 0, + 'sonarjs/file-header': 0, + 'sonarjs/file-name-differ-from-class': 1, + 'sonarjs/file-permissions': 1, + 'sonarjs/file-uploads': 1, + 'sonarjs/fixme-tag': 1, + 'sonarjs/for-in': 1, + 'sonarjs/for-loop-increment-sign': 1, + 'sonarjs/frame-ancestors': 1, + 'sonarjs/function-inside-loop': 1, + 'sonarjs/function-name': 0, + 'sonarjs/function-return-type': 0, + 'sonarjs/future-reserved-words': 1, + 'sonarjs/generator-without-yield': 1, + 'sonarjs/hardcoded-secret-signatures': 1, + 'sonarjs/hashing': 1, + 'sonarjs/hidden-files': 1, + 'sonarjs/in-operator-type-error': 1, + 'sonarjs/inconsistent-function-call': 1, + 'sonarjs/index-of-compare-to-positive-number': 1, + 'sonarjs/insecure-cookie': 1, + 'sonarjs/insecure-jwt-token': 1, + 'sonarjs/inverted-assertion-arguments': 1, + 'sonarjs/jsx-no-leaked-render': 1, + 'sonarjs/label-position': 1, + 'sonarjs/link-with-target-blank': 1, + 'sonarjs/max-lines': 0, + 'sonarjs/max-lines-per-function': 0, + 'sonarjs/max-switch-cases': 0, + 'sonarjs/max-union-size': 0, + 'sonarjs/misplaced-loop-counter': 1, + 'sonarjs/nested-control-flow': 0, + 'sonarjs/new-operator-misuse': 1, + 'sonarjs/no-all-duplicated-branches': 1, + 'sonarjs/no-alphabetical-sort': 1, + 'sonarjs/no-angular-bypass-sanitization': 1, + 'sonarjs/no-array-delete': 1, + 'sonarjs/no-associative-arrays': 1, + 'sonarjs/no-async-constructor': 1, + 'sonarjs/no-built-in-override': 1, + 'sonarjs/no-case-label-in-switch': 1, + 'sonarjs/no-clear-text-protocols': 1, + 'sonarjs/no-code-after-done': 1, + 'sonarjs/no-collapsible-if': 1, + 'sonarjs/no-collection-size-mischeck': 1, + 'sonarjs/no-commented-code': 1, + 'sonarjs/no-control-regex': 1, + 'sonarjs/no-dead-store': 1, + 'sonarjs/no-delete-var': 1, + 'sonarjs/no-duplicate-in-composite': 1, + 'sonarjs/no-duplicate-string': 0, + 'sonarjs/no-duplicated-branches': 1, + 'sonarjs/no-element-overwrite': 1, + 'sonarjs/no-empty-after-reluctant': 1, + 'sonarjs/no-empty-alternatives': 1, + 'sonarjs/no-empty-character-class': 1, + 'sonarjs/no-empty-collection': 1, + 'sonarjs/no-empty-group': 1, + 'sonarjs/no-empty-test-file': 1, + 'sonarjs/no-equals-in-for-termination': 1, + 'sonarjs/no-exclusive-tests': 1, + 'sonarjs/no-extra-arguments': 0, + 'sonarjs/no-fallthrough': 1, + 'sonarjs/no-for-in-iterable': 1, + 'sonarjs/no-function-declaration-in-block': 1, + 'sonarjs/no-global-this': 1, + 'sonarjs/no-globals-shadowing': 1, + 'sonarjs/no-gratuitous-expressions': 1, + 'sonarjs/no-hardcoded-ip': 1, + 'sonarjs/no-hardcoded-passwords': 1, + 'sonarjs/no-hardcoded-secrets': 1, + 'sonarjs/no-hook-setter-in-body': 1, + 'sonarjs/no-identical-conditions': 1, + 'sonarjs/no-identical-expressions': 1, + 'sonarjs/no-identical-functions': 1, + 'sonarjs/no-ignored-exceptions': 1, + 'sonarjs/no-ignored-return': 1, + 'sonarjs/no-implicit-dependencies': 0, + 'sonarjs/no-implicit-global': 1, + 'sonarjs/no-in-misuse': 1, + 'sonarjs/no-incomplete-assertions': 1, + 'sonarjs/no-inconsistent-returns': 0, + 'sonarjs/no-incorrect-string-concat': 1, + 'sonarjs/no-internal-api-use': 1, + 'sonarjs/no-intrusive-permissions': 1, + 'sonarjs/no-invalid-regexp': 1, + 'sonarjs/no-invariant-returns': 1, + 'sonarjs/no-inverted-boolean-check': 1, + 'sonarjs/no-ip-forward': 1, + 'sonarjs/no-labels': 1, + 'sonarjs/no-literal-call': 1, + 'sonarjs/no-mime-sniff': 1, + 'sonarjs/no-misleading-array-reverse': 1, + 'sonarjs/no-misleading-character-class': 1, + 'sonarjs/no-mixed-content': 1, + 'sonarjs/no-nested-assignment': 1, + 'sonarjs/no-nested-conditional': 0, + 'sonarjs/no-nested-functions': 0, + 'sonarjs/no-nested-incdec': 1, + 'sonarjs/no-nested-switch': 1, + 'sonarjs/no-nested-template-literals': 1, + 'sonarjs/no-os-command-from-path': 1, + 'sonarjs/no-parameter-reassignment': 1, + 'sonarjs/no-primitive-wrappers': 1, + 'sonarjs/no-redundant-assignments': 1, + 'sonarjs/no-redundant-boolean': 1, + 'sonarjs/no-redundant-jump': 1, + 'sonarjs/no-redundant-optional': 1, + 'sonarjs/no-reference-error': 0, + 'sonarjs/no-referrer-policy': 1, + 'sonarjs/no-regex-spaces': 1, + 'sonarjs/no-require-or-define': 1, + 'sonarjs/no-return-type-any': 1, + 'sonarjs/no-same-argument-assert': 1, + 'sonarjs/no-same-line-conditional': 1, + 'sonarjs/no-selector-parameter': 0, + 'sonarjs/no-session-cookies-on-static-assets': 1, + 'sonarjs/no-skipped-tests': 1, + 'sonarjs/no-small-switch': 1, + 'sonarjs/no-sonar-comments': 1, + 'sonarjs/no-table-as-layout': 1, + 'sonarjs/no-try-promise': 1, + 'sonarjs/no-undefined-argument': 1, + 'sonarjs/no-undefined-assignment': 0, + 'sonarjs/no-unenclosed-multiline-block': 1, + 'sonarjs/no-uniq-key': 1, + 'sonarjs/no-unthrown-error': 1, + 'sonarjs/no-unused-collection': 1, + 'sonarjs/no-unused-function-argument': 1, + 'sonarjs/no-unused-vars': 1, + 'sonarjs/no-use-of-empty-return-value': 1, + 'sonarjs/no-useless-catch': 1, + 'sonarjs/no-useless-increment': 1, + 'sonarjs/no-useless-intersection': 1, + 'sonarjs/no-useless-react-setstate': 1, + 'sonarjs/no-variable-usage-before-declaration': 1, + 'sonarjs/no-weak-cipher': 1, + 'sonarjs/no-weak-keys': 1, + 'sonarjs/no-wildcard-import': 0, + 'sonarjs/non-existent-operator': 1, + 'sonarjs/non-number-in-arithmetic-expression': 1, + 'sonarjs/null-dereference': 1, + 'sonarjs/object-alt-content': 1, + 'sonarjs/operation-returning-nan': 1, + 'sonarjs/post-message': 1, + 'sonarjs/prefer-default-last': 1, + 'sonarjs/prefer-immediate-return': 1, + 'sonarjs/prefer-object-literal': 1, + 'sonarjs/prefer-promise-shorthand': 1, + 'sonarjs/prefer-read-only-props': 0, + 'sonarjs/prefer-regexp-exec': 1, + 'sonarjs/prefer-single-boolean-return': 1, + 'sonarjs/prefer-type-guard': 1, + 'sonarjs/prefer-while': 1, + 'sonarjs/production-debug': 1, + 'sonarjs/pseudo-random': 0, + 'sonarjs/public-static-readonly': 1, + 'sonarjs/publicly-writable-directories': 1, + 'sonarjs/reduce-initial-value': 1, + 'sonarjs/redundant-type-aliases': 0, + 'sonarjs/regex-complexity': 1, + 'sonarjs/review-blockchain-mnemonic': 1, + 'sonarjs/session-regeneration': 1, + 'sonarjs/shorthand-property-grouping': 0, + 'sonarjs/single-char-in-character-classes': 1, + 'sonarjs/single-character-alternation': 1, + 'sonarjs/slow-regex': 1, + 'sonarjs/sql-queries': 1, + 'sonarjs/stable-tests': 1, + 'sonarjs/stateful-regex': 1, + 'sonarjs/strict-transport-security': 1, + 'sonarjs/strings-comparison': 1, + 'sonarjs/table-header': 1, + 'sonarjs/table-header-reference': 1, + 'sonarjs/test-check-exception': 1, + 'sonarjs/todo-tag': 0, + 'sonarjs/too-many-break-or-continue-in-loop': 0, + 'sonarjs/unicode-aware-regex': 1, + 'sonarjs/unused-import': 1, + 'sonarjs/unused-named-groups': 1, + 'sonarjs/unverified-certificate': 1, + 'sonarjs/unverified-hostname': 1, + 'sonarjs/updated-const-var': 1, + 'sonarjs/updated-loop-counter': 0, + 'sonarjs/use-type-alias': 1, + 'sonarjs/values-not-convertible-to-numbers': 1, + 'sonarjs/variable-name': 1, + 'sonarjs/void-use': 1, + 'sonarjs/weak-ssl': 1, + 'sonarjs/x-powered-by': 1, + 'sonarjs/xml-parser-xxe': 1, + + // @typescript-eslint/eslint-plugin rules + // https://typescript-eslint.io/rules/ + /* +// copy all the rules from the rules table for easy pasting +copy( + Iterator.from( + document + // select all rows with a rule + .querySelectorAll('tr:has(a)') + ) + // filter out deprecated rules + .filter((row) => row.lastElementChild.textContent === '') + // map row to rule declaration + .map((row) => `'${row.querySelector('a').textContent}': 1,`) + .toArray() + .join('\n') +); + */ + '@typescript-eslint/adjacent-overload-signatures': 1, + '@typescript-eslint/array-type': 1, + '@typescript-eslint/await-thenable': 1, + '@typescript-eslint/ban-ts-comment': [1, { 'ts-expect-error': false }], + '@typescript-eslint/ban-tslint-comment': 0, + '@typescript-eslint/class-literal-property-style': 0, + '@typescript-eslint/class-methods-use-this': 1, + '@typescript-eslint/consistent-generic-constructors': 1, + '@typescript-eslint/consistent-indexed-object-style': 1, + '@typescript-eslint/consistent-return': 0, + '@typescript-eslint/consistent-type-assertions': [ + 1, + { + arrayLiteralTypeAssertions: 'never', + objectLiteralTypeAssertions: 'never' + } + ], + '@typescript-eslint/consistent-type-definitions': 1, + '@typescript-eslint/consistent-type-exports': [ + 1, + { fixMixedExportsWithInlineTypeSpecifier: true } + ], + '@typescript-eslint/consistent-type-imports': [1, { fixStyle: 'inline-type-imports' }], + '@typescript-eslint/default-param-last': 0, + '@typescript-eslint/dot-notation': 1, + '@typescript-eslint/explicit-function-return-type': 0, + '@typescript-eslint/explicit-member-accessibility': 0, + '@typescript-eslint/explicit-module-boundary-types': 0, + '@typescript-eslint/init-declarations': 0, + '@typescript-eslint/max-params': 0, + '@typescript-eslint/member-ordering': 0, + '@typescript-eslint/method-signature-style': 1, + '@typescript-eslint/naming-convention': [ + 1, + { + selector: ['class', 'interface'], + format: ['PascalCase'] + } + ], + '@typescript-eslint/no-array-constructor': 1, + '@typescript-eslint/no-array-delete': 1, + '@typescript-eslint/no-base-to-string': 0, + '@typescript-eslint/no-confusing-non-null-assertion': 0, + '@typescript-eslint/no-confusing-void-expression': [ + 1, + { + ignoreArrowShorthand: true, + ignoreVoidReturningFunctions: true + } + ], + '@typescript-eslint/no-deprecated': 1, + '@typescript-eslint/no-dupe-class-members': 0, + '@typescript-eslint/no-duplicate-enum-values': 1, + '@typescript-eslint/no-duplicate-type-constituents': 1, + '@typescript-eslint/no-dynamic-delete': 0, + '@typescript-eslint/no-empty-function': 0, + '@typescript-eslint/no-empty-object-type': 1, + '@typescript-eslint/no-explicit-any': [1, { fixToUnknown: true }], + '@typescript-eslint/no-extra-non-null-assertion': 1, + '@typescript-eslint/no-extraneous-class': 1, + '@typescript-eslint/no-floating-promises': 0, + '@typescript-eslint/no-for-in-array': 1, + '@typescript-eslint/no-implied-eval': 1, + '@typescript-eslint/no-import-type-side-effects': 1, + '@typescript-eslint/no-inferrable-types': 1, + '@typescript-eslint/no-invalid-this': 0, + '@typescript-eslint/no-invalid-void-type': 1, + '@typescript-eslint/no-loop-func': 0, + '@typescript-eslint/no-magic-numbers': 0, + '@typescript-eslint/no-meaningless-void-operator': 1, + '@typescript-eslint/no-misused-new': 1, + '@typescript-eslint/no-misused-promises': 0, + '@typescript-eslint/no-misused-spread': 1, + '@typescript-eslint/no-mixed-enums': 1, + '@typescript-eslint/no-namespace': 1, + '@typescript-eslint/no-non-null-asserted-nullish-coalescing': 1, + '@typescript-eslint/no-non-null-asserted-optional-chain': 1, + '@typescript-eslint/no-non-null-assertion': 0, + '@typescript-eslint/no-redeclare': 1, + '@typescript-eslint/no-redundant-type-constituents': 1, + '@typescript-eslint/no-require-imports': 1, + '@typescript-eslint/no-restricted-imports': 0, + '@typescript-eslint/no-restricted-types': 0, + '@typescript-eslint/no-shadow': 0, + '@typescript-eslint/no-this-alias': 1, + '@typescript-eslint/no-unnecessary-boolean-literal-compare': 1, + '@typescript-eslint/no-unnecessary-condition': [ + 1, + { + allowConstantLoopConditions: 'only-allowed-literals', + checkTypePredicates: true + } + ], + '@typescript-eslint/no-unnecessary-parameter-property-assignment': 1, + '@typescript-eslint/no-unnecessary-qualifier': 0, + '@typescript-eslint/no-unnecessary-template-expression': 1, + '@typescript-eslint/no-unnecessary-type-arguments': 1, + '@typescript-eslint/no-unnecessary-type-assertion': 1, + '@typescript-eslint/no-unnecessary-type-constraint': 1, + '@typescript-eslint/no-unnecessary-type-conversion': 1, + '@typescript-eslint/no-unnecessary-type-parameters': 1, + '@typescript-eslint/no-unsafe-argument': 0, + '@typescript-eslint/no-unsafe-assignment': 0, + '@typescript-eslint/no-unsafe-call': 0, + '@typescript-eslint/no-unsafe-declaration-merging': 1, + '@typescript-eslint/no-unsafe-enum-comparison': 1, + '@typescript-eslint/no-unsafe-function-type': 1, + '@typescript-eslint/no-unsafe-member-access': 0, + '@typescript-eslint/no-unsafe-return': 0, + '@typescript-eslint/no-unsafe-type-assertion': 0, + '@typescript-eslint/no-unsafe-unary-minus': 1, + '@typescript-eslint/no-unused-expressions': [1, { enforceForJSX: true }], + '@typescript-eslint/no-unused-private-class-members': 1, + '@typescript-eslint/no-unused-vars': [ + 1, + { + enableAutofixRemoval: { imports: true }, + ignoreRestSiblings: true + } + ], + '@typescript-eslint/no-use-before-define': 0, + '@typescript-eslint/no-useless-constructor': 1, + '@typescript-eslint/no-useless-default-assignment': 1, + '@typescript-eslint/no-useless-empty-export': 1, + '@typescript-eslint/no-wrapper-object-types': 1, + '@typescript-eslint/non-nullable-type-assertion-style': 1, + '@typescript-eslint/only-throw-error': [ + 1, + { + allow: [ + { + from: 'package', + package: '@tanstack/router-core', + name: ['NotFoundError', 'Redirect'] + } + ] + } + ], + '@typescript-eslint/parameter-properties': 1, + '@typescript-eslint/prefer-as-const': 1, + '@typescript-eslint/prefer-destructuring': [ + 1, + { + VariableDeclarator: { + array: false, + object: true + }, + AssignmentExpression: { + array: false, + object: false + } + } + ], + '@typescript-eslint/prefer-enum-initializers': 1, + '@typescript-eslint/prefer-find': 1, + '@typescript-eslint/prefer-for-of': 1, + '@typescript-eslint/prefer-function-type': 1, + '@typescript-eslint/prefer-includes': 1, + '@typescript-eslint/prefer-literal-enum-member': 1, + '@typescript-eslint/prefer-namespace-keyword': 1, + '@typescript-eslint/prefer-nullish-coalescing': [ + 1, + { + ignoreConditionalTests: false, + ignorePrimitives: true + } + ], + '@typescript-eslint/prefer-optional-chain': 1, + '@typescript-eslint/prefer-promise-reject-errors': 1, + '@typescript-eslint/prefer-readonly': 1, + '@typescript-eslint/prefer-readonly-parameter-types': 0, + '@typescript-eslint/prefer-reduce-type-parameter': 1, + '@typescript-eslint/prefer-regexp-exec': 1, + '@typescript-eslint/prefer-return-this-type': 1, + '@typescript-eslint/prefer-string-starts-ends-with': 1, + '@typescript-eslint/promise-function-async': 0, + '@typescript-eslint/related-getter-setter-pairs': 0, + '@typescript-eslint/require-array-sort-compare': 1, + '@typescript-eslint/require-await': 1, + '@typescript-eslint/restrict-plus-operands': [ + 1, + { + allowAny: false, + allowBoolean: false, + allowNullish: false, + allowNumberAndString: false, + allowRegExp: false + } + ], + '@typescript-eslint/restrict-template-expressions': 0, + '@typescript-eslint/return-await': 1, + '@typescript-eslint/strict-boolean-expressions': 0, + '@typescript-eslint/strict-void-return': 0, + '@typescript-eslint/switch-exhaustiveness-check': 1, + '@typescript-eslint/triple-slash-reference': [ + 1, + { path: 'never', types: 'never', lib: 'never' } + ], + '@typescript-eslint/unbound-method': 0, // replaced by vitest/unbound-method + '@typescript-eslint/unified-signatures': 0, + '@typescript-eslint/use-unknown-in-catch-callback-variable': 1 + } + }, + + { + name: 'test', + + files: ['test/**/*'], + + plugins: { + vitest + }, + + rules: { + '@typescript-eslint/no-floating-promises': 1, + + '@eslint-react/component-hook-factories': 0, + '@eslint-react/no-create-ref': 0, + + // https://github.com/vitest-dev/eslint-plugin-vitest#rules + /* +// copy all the rules from the rules table for easy pasting +copy( + Iterator.from( + document + // select rules table + .querySelector('.markdown-heading:has(> a[href="#rules"]) ~ markdown-accessiblity-table') + // select all rows with a rule + .querySelectorAll('tr:has(a)') + ) + // filter out deprecated rules + .filter((row) => row.lastElementChild.textContent === '') + // map row to rule declaration + .map((row) => `'vitest/${row.firstElementChild.textContent}': 1,`) + .toArray() + .join('\n') +); + */ + 'vitest/consistent-each-for': 1, + 'vitest/consistent-test-filename': 0, + 'vitest/consistent-test-it': 1, + 'vitest/consistent-vitest-vi': 1, + 'vitest/expect-expect': 0, + 'vitest/hoisted-apis-on-top': 1, + 'vitest/max-expects': 0, + 'vitest/max-nested-describe': 0, + 'vitest/no-alias-methods': 1, + 'vitest/no-commented-out-tests': 1, + 'vitest/no-conditional-expect': 1, + 'vitest/no-conditional-in-test': 0, + 'vitest/no-conditional-tests': 1, + 'vitest/no-disabled-tests': 0, + 'vitest/no-duplicate-hooks': 1, + 'vitest/no-focused-tests': [1, { fixable: false }], + 'vitest/no-hooks': 0, + 'vitest/no-identical-title': 1, + 'vitest/no-import-node-test': 1, + 'vitest/no-importing-vitest-globals': 1, + 'vitest/no-interpolation-in-snapshots': 0, + 'vitest/no-large-snapshots': 0, + 'vitest/no-mocks-import': 1, + 'vitest/no-restricted-matchers': 0, + 'vitest/no-restricted-vi-methods': 0, + 'vitest/no-standalone-expect': [ + 1, + { + additionalTestBlockFunctions: [ + 'beforeAll', + 'beforeEach', + 'afterAll', + 'afterEach', + 'aroundAll', + 'aroundEach' + ] + } + ], + 'vitest/no-test-prefixes': 1, + 'vitest/no-test-return-statement': 1, + 'vitest/no-unneeded-async-expect-function': 1, + 'vitest/padding-around-after-all-blocks': 0, + 'vitest/padding-around-after-each-blocks': 0, + 'vitest/padding-around-all': 0, + 'vitest/padding-around-before-all-blocks': 0, + 'vitest/padding-around-before-each-blocks': 0, + 'vitest/padding-around-describe-blocks': 0, + 'vitest/padding-around-expect-groups': 0, + 'vitest/padding-around-test-blocks': 0, + 'vitest/prefer-called-exactly-once-with': 1, + 'vitest/prefer-called-once': 1, + 'vitest/prefer-called-times': 0, + 'vitest/prefer-called-with': 0, + 'vitest/prefer-comparison-matcher': 1, + 'vitest/prefer-describe-function-title': 0, + 'vitest/prefer-each': 1, + 'vitest/prefer-equality-matcher': 1, + 'vitest/prefer-expect-assertions': 0, + 'vitest/prefer-expect-resolves': 1, + 'vitest/prefer-expect-type-of': 1, + 'vitest/prefer-hooks-in-order': 1, + 'vitest/prefer-hooks-on-top': 1, + 'vitest/prefer-import-in-mock': 1, + 'vitest/prefer-importing-vitest-globals': 0, + 'vitest/prefer-lowercase-title': 0, + 'vitest/prefer-mock-promise-shorthand': 1, + 'vitest/prefer-mock-return-shorthand': 1, + 'vitest/prefer-snapshot-hint': 0, + 'vitest/prefer-spy-on': 1, + 'vitest/prefer-strict-boolean-matchers': 1, + 'vitest/prefer-strict-equal': 1, + 'vitest/prefer-to-be': 1, + 'vitest/prefer-to-be-falsy': 0, + 'vitest/prefer-to-be-object': 1, + 'vitest/prefer-to-be-truthy': 0, + 'vitest/prefer-to-contain': 1, + 'vitest/prefer-to-have-been-called-times': 1, + 'vitest/prefer-to-have-length': 1, + 'vitest/prefer-todo': 1, + 'vitest/prefer-vi-mocked': 1, + 'vitest/require-awaited-expect-poll': 1, + 'vitest/require-hook': 0, + 'vitest/require-local-test-context-for-concurrent-snapshots': 0, + 'vitest/require-mock-type-parameters': 0, + 'vitest/require-test-timeout': 0, + 'vitest/require-to-throw-message': 1, + 'vitest/require-top-level-describe': 0, + 'vitest/unbound-method': 0, + 'vitest/valid-describe-callback': 1, + 'vitest/valid-expect': [1, { alwaysAwait: true }], + 'vitest/valid-expect-in-promise': 1, + 'vitest/valid-title': 1, + 'vitest/warn-todo': 1 + } + }, + + { + name: 'tools', + + files: ['test/failOnConsole.ts'], + + rules: { + 'no-console': 0 + } + }, + + { + name: 'markdown', + files: ['**/*.md'], + plugins: { + markdown + }, + language: 'markdown/gfm', + rules: { + // `@eslint/markdown` rules + // https://github.com/eslint/markdown/blob/main/README.md#rules + /* +// copy all the rules from the rules table for easy pasting +copy( + Iterator.from( + document + // select rules table + .querySelector('.markdown-heading:has(> a[href="#rules"]) ~ markdown-accessiblity-table tbody') + // select all rule links + .querySelectorAll(':any-link') + ) + // map link to rule declaration + .map((link) => `'markdown/${link.textContent}': 1,`) + .toArray() + .join('\n') +); + */ + 'markdown/fenced-code-language': 1, + 'markdown/fenced-code-meta': 0, + 'markdown/heading-increment': 1, + 'markdown/no-bare-urls': 1, + 'markdown/no-duplicate-definitions': 1, + 'markdown/no-duplicate-headings': [1, { checkSiblingsOnly: true }], + 'markdown/no-empty-definitions': 1, + 'markdown/no-empty-images': 1, + 'markdown/no-empty-links': 1, + 'markdown/no-html': [1, { allowed: ['br', 'kbd'] }], + 'markdown/no-invalid-label-refs': 1, + 'markdown/no-missing-atx-heading-space': 1, + 'markdown/no-missing-label-refs': 1, + 'markdown/no-missing-link-fragments': 1, + 'markdown/no-multiple-h1': 1, + 'markdown/no-reference-like-urls': 1, + 'markdown/no-reversed-media-syntax': 1, + 'markdown/no-space-in-emphasis': 1, + 'markdown/no-unused-definitions': 1, + 'markdown/require-alt-text': 1, + 'markdown/table-column-count': 1 + } + } +]); diff --git a/index.html b/index.html index eefe6526e7..8e8135b360 100644 --- a/index.html +++ b/index.html @@ -2,6 +2,7 @@ + React Data Grid diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..4e8ac93794 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7399 @@ +{ + "name": "@grafana/react-data-grid", + "version": "7.0.0-beta.59", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@grafana/react-data-grid", + "version": "7.0.0-beta.59", + "license": "MIT", + "devDependencies": { + "@eslint-react/eslint-plugin": "^5.6.0", + "@eslint/markdown": "^8.0.1", + "@faker-js/faker": "^10.3.0", + "@tanstack/react-router": "^1.166.7", + "@tanstack/router-plugin": "^1.166.7", + "@tsdown/css": "^0.22.7", + "@types/node": "^26.0.0", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "@typescript/native": "npm:typescript@^7.0.2", + "@vitejs/plugin-react": "^6.0.3", + "@vitest/browser-playwright": "^4.1.5", + "@vitest/coverage-istanbul": "^4.1.5", + "@vitest/eslint-plugin": "^1.6.16", + "clsx": "^2.1.1", + "ecij": "^0.4.1", + "eslint": "^10.2.1", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-sonarjs": "^4.0.3", + "jspdf": "^4.2.0", + "jspdf-autotable": "^5.0.7", + "oxfmt": "0.61.0", + "playwright": "~1.61.0", + "react": "^19.2.7", + "react-dom": "^19.2.7", + "tsdown": "^0.22.7", + "typescript": "npm:@typescript/typescript6@^6.0.2", + "typescript-eslint": "^8.59.0", + "vite": "^8.1.0", + "vitest": "^4.1.5", + "vitest-browser-react": "^2.2.0" + }, + "peerDependencies": { + "react": "^19.2", + "react-dom": "^19.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@blazediff/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@blazediff/core/-/core-1.9.1.tgz", + "integrity": "sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint-react/ast": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@eslint-react/ast/-/ast-5.18.0.tgz", + "integrity": "sha512-WV7IrRiRlcJeY3UgfhI4kM8BGJCAMsmBImBeqR15Hu1gA7pT2lc7uDbv6Y963bmpJbVQN3krdbqEgXANnOjlaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "^8.65.0", + "@typescript-eslint/typescript-estree": "^8.65.0", + "@typescript-eslint/utils": "^8.65.0", + "string-ts": "^2.3.1" + }, + "engines": { + "node": ">=22.0.0" + }, + "peerDependencies": { + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/@eslint-react/core": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@eslint-react/core/-/core-5.18.0.tgz", + "integrity": "sha512-0XTnjY5gNKI6SnSqKdJVX3aRncz4Dzty9G2LYGJsaq01yNMbdTUY0FFadP91pBODjOVlr5PLH2LILMipnrbsTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "5.18.0", + "@eslint-react/eslint": "5.18.0", + "@eslint-react/shared": "5.18.0", + "@eslint-react/var": "5.18.0", + "@typescript-eslint/scope-manager": "^8.65.0", + "@typescript-eslint/types": "^8.65.0", + "@typescript-eslint/utils": "^8.65.0", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=22.0.0" + }, + "peerDependencies": { + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/@eslint-react/eslint": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@eslint-react/eslint/-/eslint-5.18.0.tgz", + "integrity": "sha512-ypEfKyEccb2hl2KVTzr2a7+U+QF66CiG8VakjnPwTmoXUq16XtDVkhBIJJzbVXv2knl5RZhU98/fAURziZAZVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.65.0" + }, + "engines": { + "node": ">=22.0.0" + }, + "peerDependencies": { + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/@eslint-react/eslint-plugin": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@eslint-react/eslint-plugin/-/eslint-plugin-5.18.0.tgz", + "integrity": "sha512-El0r5EKDyudriw5kn4SLbaIdjDg+x0X4lNjGgGOT3bRDl5c5Wup2ZvnBQD+XRLcVyQOkpYc3l4lxdvXpJ2J3Kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/shared": "5.18.0", + "eslint-plugin-react-dom": "5.18.0", + "eslint-plugin-react-jsx": "5.18.0", + "eslint-plugin-react-naming-convention": "5.18.0", + "eslint-plugin-react-rsc": "5.18.0", + "eslint-plugin-react-web-api": "5.18.0", + "eslint-plugin-react-x": "5.18.0" + }, + "engines": { + "node": ">=22.0.0" + }, + "peerDependencies": { + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/@eslint-react/jsx": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@eslint-react/jsx/-/jsx-5.18.0.tgz", + "integrity": "sha512-9XTmXLzWYV7QCUEQYdQjbW9zrJNNTEgkuNbv8ApngUvttbmWSUFSKmA3MJNojOyjmj0fttCLcItUcCM9ThLOAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "5.18.0", + "@eslint-react/eslint": "5.18.0", + "@eslint-react/shared": "5.18.0", + "@eslint-react/var": "5.18.0", + "@typescript-eslint/types": "^8.65.0", + "@typescript-eslint/utils": "^8.65.0", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=22.0.0" + }, + "peerDependencies": { + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/@eslint-react/shared": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@eslint-react/shared/-/shared-5.18.0.tgz", + "integrity": "sha512-EQnptEj1i3byDDLSF7rHPRNmg7OabMMh9LL2B756ou1raaox1YmoqJTvLQvQWZVs1jHuDyR4ByvVeDzJvnUByA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/eslint": "5.18.0", + "@typescript-eslint/utils": "^8.65.0", + "ts-pattern": "^5.9.0", + "zod": "^3.25.0 || ^4.0.0" + }, + "engines": { + "node": ">=22.0.0" + }, + "peerDependencies": { + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/@eslint-react/var": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@eslint-react/var/-/var-5.18.0.tgz", + "integrity": "sha512-klGm2vgw2209YeMdGhiLzP+e/SmbVmCO06+BteC25xTtbd56mUiYb234B0qFEyRbvOh5EpO383npJEzt3EPcGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "5.18.0", + "@eslint-react/eslint": "5.18.0", + "@typescript-eslint/scope-manager": "^8.65.0", + "@typescript-eslint/types": "^8.65.0", + "@typescript-eslint/utils": "^8.65.0", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=22.0.0" + }, + "peerDependencies": { + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/markdown": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-8.0.3.tgz", + "integrity": "sha512-rBTSSShrq7e4O+PWfeE4azH4/CWPNrC+VGxBXiW00o3vYVJnznsZiDayj3KC9JztIMVRZxZHn2nrDIUau/4j7A==", + "dev": true, + "license": "MIT", + "workspaces": [ + "examples/*" + ], + "dependencies": { + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "github-slugger": "^2.0.0", + "mdast-util-from-markdown": "^2.0.2", + "mdast-util-frontmatter": "^2.0.1", + "mdast-util-gfm": "^3.1.0", + "mdast-util-math": "^3.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "micromark-extension-gfm": "^3.0.0", + "micromark-extension-math": "^3.1.0", + "micromark-util-normalize-identifier": "^2.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@faker-js/faker": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-10.5.0.tgz", + "integrity": "sha512-bsxD8WLS5lIj7aaoCx1YJkktqYj5vlBUE6HWzu2Q51ksrGJ0H737ECCKlFU7Yf8Br45z9t99frBp/J7kzbMPAg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" + } + ], + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || ^23.5.0 || >=24.0.0", + "npm": ">=10" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", + "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@oxfmt/binding-android-arm-eabi": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.61.0.tgz", + "integrity": "sha512-BaS+1OVvg9sr+Xav0+KdWedQRcAzrdoEcwMZeqoc2F6ieC1s/t5eM35YQoRPQ7vAqkZ+p3tbQb1r9I9mrV5oGA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-android-arm64": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.61.0.tgz", + "integrity": "sha512-of8atAV0M1egGcVOMbgZCvc10sFOP3ayQBNQV5h5G3fNq8gACdEswfFk9bzGrdbM23rtg0Coxi7np7oPLcueNw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-darwin-arm64": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.61.0.tgz", + "integrity": "sha512-7l8+5ov4BGwtAcmpzvEik/TG3bciwyw/S3e6j5GKH7pcQqcgCVxD3AuJeP6upto+SOTBKQ4wrrdbMt0gq8fHSQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-darwin-x64": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.61.0.tgz", + "integrity": "sha512-Fnz4dDDXBb7udk+DmwelNjxbD6yptyxwCqwCH2ebo4RVLxVsRfFsn/AHJC49KIltPrVokamGv4SSOsiV50DTxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-freebsd-x64": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.61.0.tgz", + "integrity": "sha512-mddOebKNCP+AucmzfNsk3jgbr681qAUvgMqi865GW5gWLJ/AnzXbvjQRrny0e++NAN8aphav/aRSrfFxNsNjpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm-gnueabihf": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.61.0.tgz", + "integrity": "sha512-svx59iYL+DbaZGZUIoice4W0CjRXGExnbz7Re+awIb60rVxBS2KrU7Hnlx+nZYanLGLpjneUEgo/VFEKkSZAyQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm-musleabihf": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.61.0.tgz", + "integrity": "sha512-BYK9MPJPCf6d+fLKMTruThmEyCtHzQ1zLcsrTlUVkmnoXIaHAbfpeLYQwX1tkjs7W11dyzoi6HFvKcdnvX1zNg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm64-gnu": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.61.0.tgz", + "integrity": "sha512-QUaCNLq2/EC6G5ljOuFanl9Lgw6ZWp4co7rs4+KOMUzbGfA4Lq58FHRjjF9sVIG+93XSbo343MxFATrOU1qctA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm64-musl": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.61.0.tgz", + "integrity": "sha512-S6uvJ6MXnRXl+zTs0CARNDvkE+cymj0EVWEKKsyKnlLlqTyQJBjw5s4D2pSIOZc+S46cy4STefzcr/sm0VzVPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-ppc64-gnu": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.61.0.tgz", + "integrity": "sha512-6VDlRcytvZG6UlSIdAFKDLbppo9tvPxrWzle6vHldYFMeuDPQEfMKrkwezp7FaBq1wik9ra554ZZeRPsyIkFpg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-riscv64-gnu": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.61.0.tgz", + "integrity": "sha512-KkBTYbzExpbmn15XjKPLu2fRV2PVlq+KWt+brad5rwIa03vdYoaDRWiS7raHII/dCTR6Ro4UpYUCH4t6lif4WQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-riscv64-musl": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.61.0.tgz", + "integrity": "sha512-69tzIq7sJLVB9dxYYtvMzcSSsnZHSO+U2U19O2RqDqgj6+Q4O7HjSXdaszbcgqzhsUwzSH7z5kWvk8nmf6BHTg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-s390x-gnu": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.61.0.tgz", + "integrity": "sha512-Oqi/N0OvtOVXsPKAOOhKgGH3msRYF8BLJaNBbWiupRiKoKVyc8JRKPCfarkQJC+RgP9U8raUKLe+bNwd0HUMiA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-x64-gnu": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.61.0.tgz", + "integrity": "sha512-3TKwv/ed4uwJSemAA8P9XcoqETpjQI4waquF9UilhA9Mn/dhr1PdUEXWlL74mtc6ZNfmKPA9+NEJm01nRF8CVA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-x64-musl": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.61.0.tgz", + "integrity": "sha512-uFso4u4nLkVSlMCpgjyvWV60Gt7GvDQHnk1mmRxHIkZTMB0ljpUKwCD9FYGgN9H97x2wYl0UwEjgRZaPIuhEhw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-openharmony-arm64": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.61.0.tgz", + "integrity": "sha512-keGLkzeOvkMpNmPp4hffXWpfoSsY6e1K8++KXD4mSSfxdvM8q9QUDsYY689TB1k6Co832DZn1MnaaVx6cIBMWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-arm64-msvc": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.61.0.tgz", + "integrity": "sha512-VzsAISkFxmNhJ5LBDEL9VuH6tJsVJMtqYit2LyIUf/HLnsCe4Pg9SMOjjVQzGWt0bnpyfJ94CrqTqcpNZzK+ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-ia32-msvc": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.61.0.tgz", + "integrity": "sha512-xv4t7yzwJoYaLB6Zv28B3W+j7brEjsyv50rLTAQgmxJzddce9fAMCxed8dSAkbWES0zz2J29nYK5FaTuD2YBHg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-x64-msvc": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.61.0.tgz", + "integrity": "sha512-6EZXFkqOwxdDYjIn3TSNnPk3ST5E5GiYd4FiM6UF/mCL/LZSfr6D6UygTfW3R1PCQP2quCKpCEGRlij8E3VYbg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@quansync/fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-1.0.0.tgz", + "integrity": "sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", + "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", + "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", + "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", + "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", + "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", + "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", + "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tanstack/history": { + "version": "1.162.0", + "resolved": "https://registry.npmjs.org/@tanstack/history/-/history-1.162.0.tgz", + "integrity": "sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.19" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-router": { + "version": "1.170.18", + "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.170.18.tgz", + "integrity": "sha512-wpbGYZEp/fmz1q4bn7BD8VZ+/VZ7GBqSJv5V969pU+chP8y7dquWDmKTFMohvUegb9lg12m1uPVvD6kB2wORvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tanstack/history": "1.162.0", + "@tanstack/react-store": "^0.9.3", + "@tanstack/router-core": "1.171.15", + "isbot": "^5.1.22" + }, + "engines": { + "node": ">=20.19" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=18.0.0 || >=19.0.0", + "react-dom": ">=18.0.0 || >=19.0.0" + } + }, + "node_modules/@tanstack/react-store": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.9.3.tgz", + "integrity": "sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tanstack/store": "0.9.3", + "use-sync-external-store": "^1.6.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@tanstack/router-core": { + "version": "1.171.15", + "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.171.15.tgz", + "integrity": "sha512-IILCDcLaItMZQ2jEmCABHY1Nhjjn5XUvwpQp3e4Nmu+vfg0BgYFuu/QASz2SwE2ZNbVMrvt8X/wxa+Gg5aErxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tanstack/history": "1.162.0", + "cookie-es": "^3.0.0", + "seroval": "^1.5.4", + "seroval-plugins": "^1.5.4" + }, + "engines": { + "node": ">=20.19" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/router-generator": { + "version": "1.167.21", + "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.167.21.tgz", + "integrity": "sha512-m3oXZyienj8owialdyoZ0txHQrnEx/Ra+D9kWtar5fC2cWZr5Pvxl86VY2mX5RRLC5QLKLeRGT1x4HV95wHVDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5", + "@tanstack/router-core": "1.171.15", + "@tanstack/router-utils": "1.162.2", + "@tanstack/virtual-file-routes": "1.162.0", + "jiti": "^2.7.0", + "magic-string": "^0.30.21", + "prettier": "^3.5.0", + "zod": "^4.4.3" + }, + "engines": { + "node": ">=20.19" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/router-plugin": { + "version": "1.168.23", + "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.168.23.tgz", + "integrity": "sha512-0+PIcvnaAimFwjoEIeV3h7LKjzC8zNnp7pH2UamdKwQ9QlY99WU9V0Xl0zbM0i9hrUa/mKgWPDAzELmPUu5fMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "@tanstack/router-core": "1.171.15", + "@tanstack/router-generator": "1.167.21", + "@tanstack/router-utils": "1.162.2", + "chokidar": "^5.0.0", + "unplugin": "^3.0.0", + "zod": "^4.4.3" + }, + "engines": { + "node": ">=20.19" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "@rsbuild/core": ">=1.0.2 || ^2.0.0", + "@tanstack/react-router": "^1.170.18", + "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0", + "vite-plugin-solid": "^2.11.10 || ^3.0.0-0", + "webpack": ">=5.92.0" + }, + "peerDependenciesMeta": { + "@rsbuild/core": { + "optional": true + }, + "@tanstack/react-router": { + "optional": true + }, + "vite": { + "optional": true + }, + "vite-plugin-solid": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@tanstack/router-utils": { + "version": "1.162.2", + "resolved": "https://registry.npmjs.org/@tanstack/router-utils/-/router-utils-1.162.2.tgz", + "integrity": "sha512-hTWqJtqIFFdvuCl8WXNyrodp2L9zo2G37xKRrcVmVRWpAB2h+U1LuRAfS4tsFTiWOIoE/B+WDVFB8JpoEdw6jQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.28.5", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "ansis": "^4.1.0", + "babel-dead-code-elimination": "^1.0.12", + "diff": "^8.0.2", + "pathe": "^2.0.3", + "tinyglobby": "^0.2.15" + }, + "engines": { + "node": ">=20.19" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/store": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.9.3.tgz", + "integrity": "sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/virtual-file-routes": { + "version": "1.162.0", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-file-routes/-/virtual-file-routes-1.162.0.tgz", + "integrity": "sha512-uhOeFyxLcU41HzvrxsGpiWdcMbScY1EDgbZ5K7DVRMYInbLYWAC0EA/kx9wXAoSM8q82bUG2hRl8+EAjE6XAbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.19" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tsdown/css": { + "version": "0.22.7", + "resolved": "https://registry.npmjs.org/@tsdown/css/-/css-0.22.7.tgz", + "integrity": "sha512-kMTP/J6R0iXABCHr9JD0uaopTJ7Byh+z0XE4Sm4XYqPtbH/GZUCkupdAE7ItoZcp9AcgNqftAeEHN0qhOW50Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "postcss-load-config": "^6.0.1", + "rolldown": "~1.1.5" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "postcss": "^8.4.0", + "postcss-import": "^16.0.0", + "postcss-modules": "^6.0.0", + "sass": "*", + "sass-embedded": "*", + "tsdown": "0.22.7" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "postcss-import": { + "optional": true + }, + "postcss-modules": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/katex": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz", + "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "26.1.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.2.tgz", + "integrity": "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~8.3.0" + } + }, + "node_modules/@types/pako": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.4.tgz", + "integrity": "sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/raf": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz", + "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/react": { + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", + "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.65.0.tgz", + "integrity": "sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/type-utils": "8.65.0", + "@typescript-eslint/utils": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.65.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.65.0.tgz", + "integrity": "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz", + "integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.65.0", + "@typescript-eslint/types": "^8.65.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.65.0.tgz", + "integrity": "sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz", + "integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.65.0.tgz", + "integrity": "sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/utils": "8.65.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz", + "integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz", + "integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.65.0", + "@typescript-eslint/tsconfig-utils": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.65.0.tgz", + "integrity": "sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz", + "integrity": "sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript/native": { + "name": "typescript", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", + "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc" + }, + "engines": { + "node": ">=16.20.0" + }, + "optionalDependencies": { + "@typescript/typescript-aix-ppc64": "7.0.2", + "@typescript/typescript-darwin-arm64": "7.0.2", + "@typescript/typescript-darwin-x64": "7.0.2", + "@typescript/typescript-freebsd-arm64": "7.0.2", + "@typescript/typescript-freebsd-x64": "7.0.2", + "@typescript/typescript-linux-arm": "7.0.2", + "@typescript/typescript-linux-arm64": "7.0.2", + "@typescript/typescript-linux-loong64": "7.0.2", + "@typescript/typescript-linux-mips64el": "7.0.2", + "@typescript/typescript-linux-ppc64": "7.0.2", + "@typescript/typescript-linux-riscv64": "7.0.2", + "@typescript/typescript-linux-s390x": "7.0.2", + "@typescript/typescript-linux-x64": "7.0.2", + "@typescript/typescript-netbsd-arm64": "7.0.2", + "@typescript/typescript-netbsd-x64": "7.0.2", + "@typescript/typescript-openbsd-arm64": "7.0.2", + "@typescript/typescript-openbsd-x64": "7.0.2", + "@typescript/typescript-sunos-x64": "7.0.2", + "@typescript/typescript-win32-arm64": "7.0.2", + "@typescript/typescript-win32-x64": "7.0.2" + } + }, + "node_modules/@typescript/old": { + "name": "typescript", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@typescript/typescript-aix-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", + "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz", + "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz", + "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz", + "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz", + "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz", + "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz", + "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-loong64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz", + "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-mips64el": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz", + "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz", + "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-riscv64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz", + "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-s390x": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz", + "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz", + "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz", + "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz", + "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz", + "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz", + "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-sunos-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz", + "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz", + "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz", + "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.4.tgz", + "integrity": "sha512-XcCQz0TBpBgljhj0gMuuDj49i6Ytqh5q1osT/Gp5uAVJUCTWxyskk/l1jwYYiu2xcNHHipdMz40EGfM1VdamVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/@vitest/browser": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.10.tgz", + "integrity": "sha512-UDwuWGwXj646CBx/bQHOaJSX7np0I8JL/UKQYa1e4QrVHH8VdWtx8eaOuf8sy0ShwDgR6NjJAsp5eF6vjF6qng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@blazediff/core": "1.9.1", + "@vitest/mocker": "4.1.10", + "@vitest/utils": "4.1.10", + "magic-string": "^0.30.21", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.1.0", + "ws": "^8.19.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.1.10" + } + }, + "node_modules/@vitest/browser-playwright": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.1.10.tgz", + "integrity": "sha512-nMoXGEiRpT7m3W7NsbvrM2aKNwiNHZf+zEpUCvMteGjZFvfT96Q9fh7QyB98dvDWXiKvrLxA7bJ1mCOOv+JQPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/browser": "4.1.10", + "@vitest/mocker": "4.1.10", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "playwright": "*", + "vitest": "4.1.10" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": false + } + } + }, + "node_modules/@vitest/coverage-istanbul": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-4.1.10.tgz", + "integrity": "sha512-AyNJ5pQRFqCX7pwB9PSTmoVKPaZ4H5IEVJfJsT+q1DYkXvZMEFYgJlyk5sfStmt9rVYRyYYRRsuBeImCOc39ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@istanbuljs/schema": "^0.1.3", + "@jridgewell/gen-mapping": "^0.3.13", + "@jridgewell/trace-mapping": "0.3.31", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.2", + "obug": "^2.1.1", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.1.10" + } + }, + "node_modules/@vitest/eslint-plugin": { + "version": "1.6.23", + "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.6.23.tgz", + "integrity": "sha512-CbrXxQpIUMbeyylGlxaxTgnWYM44et4Nx58swl7+vrTyC9Ttx+hQoy8BGCregbbZ08K5qFhRHeoad1VvERUbkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "^8.58.0", + "@typescript-eslint/utils": "^8.58.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "*", + "eslint": ">=8.57.0", + "typescript": ">=5.0.0", + "vitest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@vitest/expect": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", + "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz", + "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.10", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", + "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz", + "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.10", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz", + "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.10", + "@vitest/utils": "4.1.10", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", + "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz", + "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.10", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@yuku-codegen/binding-darwin-arm64": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-darwin-arm64/-/binding-darwin-arm64-0.6.1.tgz", + "integrity": "sha512-LDJtpOKtcv9f3V0eDUwFmmy47t2VC+DAuN+gq80R1IA+fa0d408i6sHsVtt6n+g5rf8f86ySoPSAe94lHt6Ixw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-codegen/binding-darwin-x64": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-darwin-x64/-/binding-darwin-x64-0.6.1.tgz", + "integrity": "sha512-fBwpBOh33W7N87F94SVNExwm2KUV3ROhk51okr3Oy2ost1/JJuBWINVjcgwd2WPKZEFzUXgCzj/03UR/G+WIrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-codegen/binding-freebsd-x64": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-freebsd-x64/-/binding-freebsd-x64-0.6.1.tgz", + "integrity": "sha512-UpMkskQV3a5oPnJV+GFFupIqnLwSBD4ZsZAVUZuNVkrqct433FHKqTwuG+P5JhHZbmhf+++3Ie/V2sgduyXrAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@yuku-codegen/binding-linux-arm-gnu": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.6.1.tgz", + "integrity": "sha512-HICjDelfEDeD6TD8OEz/Dvt8KHxJiETR+paI/Fr7eVTQbjMfRrXJz8O1qV1qGH5SHZUGl2SAw2Rp+MLtXOjCrQ==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-codegen/binding-linux-arm-musl": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm-musl/-/binding-linux-arm-musl-0.6.1.tgz", + "integrity": "sha512-pUswnwa+WOmtH2ZGOWL05kFLMNY7/TnEAryfIv1yVFzKQnmSy9TKYi3oIOxGZL3w+cdUKCZ6Q+jaD0oI10ztzA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-codegen/binding-linux-arm64-gnu": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.6.1.tgz", + "integrity": "sha512-Zro0FOu9clLCmqCnUKzEWHAu30tss0iEfhs+KDXm9Dpm1FkIHAKu43tF6FQU2hsTA7a8xd93NGddzc2EOJFKUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-codegen/binding-linux-arm64-musl": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.6.1.tgz", + "integrity": "sha512-NZaT+mp9toqWuFEA4MYW5HMRxgIa8DCqnTTnM5SrrojZgm4QoMI/mJfifVet1ZHgl/Dly5m6H6GPpq43uXVj8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-codegen/binding-linux-x64-gnu": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.6.1.tgz", + "integrity": "sha512-M5macseSCBPvJ4yfKNyQpMc7nBQBtj39MNfMt0r+8UkTnR5qJE00JJx06puHgPxT5hnGxMAuAWZ+3a9H2ngqAw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-codegen/binding-linux-x64-musl": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-x64-musl/-/binding-linux-x64-musl-0.6.1.tgz", + "integrity": "sha512-liAyBZI5AbazZGeeNfWj0jCD/TE2L84hgVYh4KkjJA/N9bNzFQCDf4BvWP76nEO89r2tIGEUjbXdM4mM26riHg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-codegen/binding-win32-arm64": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-win32-arm64/-/binding-win32-arm64-0.6.1.tgz", + "integrity": "sha512-qItzfH3x6MYChPeGfvh22rHD92WLgXQRSuwvspRVSnLvpnubEfZd+9REPRQVT2l9fIuETDCEkDNRqkDROQTkgA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@yuku-codegen/binding-win32-x64": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-win32-x64/-/binding-win32-x64-0.6.1.tgz", + "integrity": "sha512-DFFkKROZ9ZAHmFMUFRtRTkosZds1KH8BOx5t3UpNULIjT3iuUmEx9V5pWR0xOi66sANY38Ap77nz1kOZraQxEg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@yuku-parser/binding-darwin-arm64": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.6.1.tgz", + "integrity": "sha512-jORysyRZg5zGDgVw15LGMsjZDh7jwjpUIJRBHgFt0ir15O5pEazfvuF2dnwvrJiTF0IT1EgHAVbTAYJWwQLCjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-parser/binding-darwin-x64": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-darwin-x64/-/binding-darwin-x64-0.6.1.tgz", + "integrity": "sha512-dTeYFkkFlbP/WCB2DtezXas3NApOPtFlXSdssB7wGtY9wpNp4HAkVo1KBwI5mcHK0e2joyUcqTSf44mFE+q7vg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-parser/binding-freebsd-x64": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.6.1.tgz", + "integrity": "sha512-GExDp3rebo28mt3EAjvKQs0ZC3gkznAErV0I9TUNDa9muuhvD35kft61Mpsc6+NWeE+BG+kUyKbm6iO5B6ZMMA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@yuku-parser/binding-linux-arm-gnu": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.6.1.tgz", + "integrity": "sha512-a9MjABj4J0VE3Z2oROGhmeddZZrhwwrnl4ZWZOuHUhD/smDtDiNtr0LpCbKB7rEYaQ29snopOPdZ/0T3YgLglQ==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-parser/binding-linux-arm-musl": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm-musl/-/binding-linux-arm-musl-0.6.1.tgz", + "integrity": "sha512-ctuvXJgDRKKlmJfHxT4RsTvcAcHEFNJHTCsGbtt4rluQpVDc+ezk9JvQ534ehoIfZ9T0eIHSBgqYAZ4xCatNmQ==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-parser/binding-linux-arm64-gnu": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.6.1.tgz", + "integrity": "sha512-vRtyoTtT0Ltowuh9LWOl/ZNU9h79J89ilOz5SEGspcw0jfhoUt19i07VNitll4jjfg5p2EN00q+MqX0pAobrFw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-parser/binding-linux-arm64-musl": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.6.1.tgz", + "integrity": "sha512-vCsc3GOe1ylmRyfo/WLjIhjiCmaTtJbWNF4ZtgjNegDjpsRsFuCcP9duXB41QcfnJK38repKVFqFh0LR3l48FA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-parser/binding-linux-x64-gnu": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.6.1.tgz", + "integrity": "sha512-gw3d81RdUHSYwjDW2IG6gEtm4VDoPP4ZOqpuC6Nc8+UBfos+4gTWOgzmuxIOVhkSV2fJCcUDpSJIlPzEU0FLZw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-parser/binding-linux-x64-musl": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.6.1.tgz", + "integrity": "sha512-nzU+Doq9UgZvYYvald36lZJ2Neeyheije6WE/YpoFt/oJiNmnjArRgr2CMtb/7gWBl80YSMwcHK4Ju0E+7wfWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-parser/binding-win32-arm64": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-win32-arm64/-/binding-win32-arm64-0.6.1.tgz", + "integrity": "sha512-r3tXFVDliWCPe7TL6DVxUkT4rkqnXyeFVSEDf+V9My6Gztq99/gIe3POQqFbshTRuSrpEYMGMbGxeFh+m+stxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@yuku-parser/binding-win32-x64": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-win32-x64/-/binding-win32-x64-0.6.1.tgz", + "integrity": "sha512-FqYMOqeCS2XTdn5yvaKlOhtSQ84mVO3aTXp6LGfMd9Zq8RsV4H8qLWv+sxJsgPCXfuBV64u8/f+CTr3uIwNLWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@yuku-toolchain/types": { + "version": "0.5.43", + "resolved": "https://registry.npmjs.org/@yuku-toolchain/types/-/types-0.5.43.tgz", + "integrity": "sha512-kSpvPntnXw5+lYjO71ffBEnQ5ycQ74KGIYknh0TS4xeyCuBkOqxyJumxZkMhLBBUCLjDAbx2+Icnr3Zh4ftjpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansis": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.3.1.tgz", + "integrity": "sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/babel-dead-code-elimination": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.12.tgz", + "integrity": "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.29", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", + "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/birecord": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/birecord/-/birecord-0.1.2.tgz", + "integrity": "sha512-5PAPTTmMpMEb+GuMb5DebfBkipRGyIW9+gtwEBSoDA9xkhHILm04+hZQ702pMksu3d8YAuGkmgTzQWcKqTPScA==", + "dev": true, + "license": "(MIT OR Apache-2.0)" + }, + "node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cac/-/cac-7.0.0.tgz", + "integrity": "sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/canvg": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.11.tgz", + "integrity": "sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@types/raf": "^3.4.0", + "core-js": "^3.8.3", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", + "rgbcolor": "^1.0.1", + "stackblur-canvas": "^2.0.0", + "svg-pathdata": "^6.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-3.1.1.tgz", + "integrity": "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", + "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-line-break": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", + "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "utrie": "^1.0.2" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dompurify": { + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.11.tgz", + "integrity": "sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==", + "dev": true, + "license": "(MPL-2.0 OR Apache-2.0)", + "optional": true, + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/dts-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dts-resolver/-/dts-resolver-3.0.0.tgz", + "integrity": "sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "oxc-resolver": ">=11.0.0" + }, + "peerDependenciesMeta": { + "oxc-resolver": { + "optional": true + } + } + }, + "node_modules/ecij": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/ecij/-/ecij-0.4.1.tgz", + "integrity": "sha512-s0Tf5YixZI06oLiB6aQ/t2t+Oeul4ixD0qu7Xi//umChQxRXJGPdCf16jUgATewtVn7I+7CbOqj63NpM5/PHcg==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.356", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.356.tgz", + "integrity": "sha512-9NgFd7m5t5MCJ5rUSjJITUXAH9mEGlrlofnMf4YEr+pz6JlP7cWmTAH+JFmbPnaSW8koVTkuW7pacORWAnA5Yw==", + "dev": true, + "license": "ISC" + }, + "node_modules/empathic": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.1.tgz", + "integrity": "sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.7.0.tgz", + "integrity": "sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.6.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-dom": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-dom/-/eslint-plugin-react-dom-5.18.0.tgz", + "integrity": "sha512-Yb4fYRI29zDjUqy8bf+iwJitIJ7JmYXVRZ5eXWGEcq29w3tVATsMSBAjLQPo/OC6JOxUaIdr0xyCUOEbbev45A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "5.18.0", + "@eslint-react/eslint": "5.18.0", + "@eslint-react/jsx": "5.18.0", + "@eslint-react/shared": "5.18.0", + "@typescript-eslint/types": "^8.65.0", + "@typescript-eslint/utils": "^8.65.0", + "compare-versions": "^6.1.1" + }, + "engines": { + "node": ">=22.0.0" + }, + "peerDependencies": { + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-react-jsx": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-jsx/-/eslint-plugin-react-jsx-5.18.0.tgz", + "integrity": "sha512-+0tz4Z6W2T9apI3Kq6T5w4CQSoAL7d2gmHkgCCoB1TAm7Ag4nZEPN97YCbi+LuckCrh+BQDbpUCA7AnoyLynEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "5.18.0", + "@eslint-react/core": "5.18.0", + "@eslint-react/eslint": "5.18.0", + "@eslint-react/jsx": "5.18.0", + "@eslint-react/shared": "5.18.0", + "@typescript-eslint/types": "^8.65.0", + "@typescript-eslint/utils": "^8.65.0" + }, + "engines": { + "node": ">=22.0.0" + }, + "peerDependencies": { + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/eslint-plugin-react-naming-convention": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-naming-convention/-/eslint-plugin-react-naming-convention-5.18.0.tgz", + "integrity": "sha512-Bw9u8u3i4f+NKuesWjBdLJ3FFAe8i6lVr6Ih6K50AFd+3iL6bt+1SlAaI13rv2JB0yXevT7zuMI4NapKwj4qmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "5.18.0", + "@eslint-react/core": "5.18.0", + "@eslint-react/eslint": "5.18.0", + "@eslint-react/shared": "5.18.0", + "@eslint-react/var": "5.18.0", + "@typescript-eslint/types": "^8.65.0", + "@typescript-eslint/utils": "^8.65.0", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=22.0.0" + }, + "peerDependencies": { + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/eslint-plugin-react-rsc": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-rsc/-/eslint-plugin-react-rsc-5.18.0.tgz", + "integrity": "sha512-Lsb5g8Hb8UjCUiXzKKd60sp7gDCEVjtb4yq7Z0WzKcZQsEsTo7MjbEYzvR1otkVHGN8kJe9DmYKbd+4BnNGEvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "5.18.0", + "@eslint-react/core": "5.18.0", + "@eslint-react/eslint": "5.18.0", + "@eslint-react/shared": "5.18.0", + "@eslint-react/var": "5.18.0", + "@typescript-eslint/types": "^8.65.0", + "@typescript-eslint/utils": "^8.65.0" + }, + "engines": { + "node": ">=22.0.0" + }, + "peerDependencies": { + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/eslint-plugin-react-web-api": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-web-api/-/eslint-plugin-react-web-api-5.18.0.tgz", + "integrity": "sha512-b3ozdXQVxd9+t/7JQcW0TETbX9XzhImFk+hJ/6WIwY9bkgp0fGShu5HX1dVUBOe/WBApYC2hjkq2olHrBz0d9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "5.18.0", + "@eslint-react/core": "5.18.0", + "@eslint-react/eslint": "5.18.0", + "@eslint-react/shared": "5.18.0", + "@eslint-react/var": "5.18.0", + "@typescript-eslint/types": "^8.65.0", + "@typescript-eslint/utils": "^8.65.0", + "birecord": "^0.1.2", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=22.0.0" + }, + "peerDependencies": { + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/eslint-plugin-react-x": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-x/-/eslint-plugin-react-x-5.18.0.tgz", + "integrity": "sha512-Qe1weZELW10yi524DfpsUGDmL9f3Xyife9ldm4kzdaP874O0jxluRgQF5p+Ov4TVb7rshN9xSZTDc77b0o9IZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "5.18.0", + "@eslint-react/core": "5.18.0", + "@eslint-react/eslint": "5.18.0", + "@eslint-react/jsx": "5.18.0", + "@eslint-react/shared": "5.18.0", + "@eslint-react/var": "5.18.0", + "@typescript-eslint/scope-manager": "^8.65.0", + "@typescript-eslint/type-utils": "^8.65.0", + "@typescript-eslint/types": "^8.65.0", + "@typescript-eslint/typescript-estree": "^8.65.0", + "@typescript-eslint/utils": "^8.65.0", + "compare-versions": "^6.1.1", + "string-ts": "^2.3.1", + "ts-api-utils": "^2.5.0", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=22.0.0" + }, + "peerDependencies": { + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/eslint-plugin-sonarjs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-4.2.0.tgz", + "integrity": "sha512-bqADfuNtTL7VK6RU29eoiFTtaaBKIpVPuX3bOl+rBpWSBa0zIBVZlqZNZQjfP6s4iXkAJokv5IsD8OsACkwApg==", + "dev": true, + "license": "LGPL-3.0-only", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "builtin-modules": "^3.3.0", + "bytes": "^3.1.2", + "functional-red-black-tree": "^1.0.1", + "globals": "^17.7.0", + "jsx-ast-utils-x": "^0.1.0", + "lodash.merge": "^4.6.2", + "minimatch": "^10.2.5", + "scslre": "^0.3.0", + "semver": "^7.8.5", + "ts-api-utils": "^2.5.0", + "typescript": ">=5 <6.1.0", + "yaml": "^2.9.0" + }, + "peerDependencies": { + "eslint": "^8.0.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-png": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/fast-png/-/fast-png-6.4.0.tgz", + "integrity": "sha512-kAqZq1TlgBjZcLr5mcN6NP5Rv4V2f22z00c3g8vRrwkcqjerx7BEhPbOnWCPqaHUl2XWQBJQvOT/FQhdMT7X/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/pako": "^2.0.3", + "iobuffer": "^5.3.2", + "pako": "^2.1.0" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "dev": true, + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-tsconfig": { + "version": "5.0.0-beta.5", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.5.tgz", + "integrity": "sha512-/6gFNr0N04nob252sTQxyFLi3eKFRqIg1I87YcqAMT1i6SQrSF6KujUEQrtrjMV0H/eejTCltLdDSTEMzHbnsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "engines": { + "node": ">=20.20.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "dev": true, + "license": "ISC" + }, + "node_modules/globals": { + "version": "17.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.7.0.tgz", + "integrity": "sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/hookable": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.1.tgz", + "integrity": "sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/html2canvas": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", + "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "css-line-break": "^2.1.0", + "text-segmentation": "^1.0.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-without-cache": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/import-without-cache/-/import-without-cache-0.4.0.tgz", + "integrity": "sha512-NkJQA7oZ4YHQhd2+H3BoRFKF3d/XNsiKpHZCQEMH9pDX27hQQLsTyOocyRgaIVtf8gHX3Nt3LPkR4e5EdtPAGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/iobuffer": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.4.0.tgz", + "integrity": "sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isbot": { + "version": "5.1.40", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.40.tgz", + "integrity": "sha512-yNeeynhhtIVRBk12tBV4eHNxwB42HzR4Q3Ea7vCOiJhImGaAIdIMrbJtacQlBizGLjUPw+akkFI5Dn9T70XoVQ==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=18" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jspdf": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-4.2.1.tgz", + "integrity": "sha512-YyAXyvnmjTbR4bHQRLzex3CuINCDlQnBqoSYyjJwTP2x9jDLuKDzy7aKUl0hgx3uhcl7xzg32agn5vlie6HIlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "fast-png": "^6.2.0", + "fflate": "^0.8.1" + }, + "optionalDependencies": { + "canvg": "^3.0.11", + "core-js": "^3.6.0", + "dompurify": "^3.3.1", + "html2canvas": "^1.0.0-rc.5" + } + }, + "node_modules/jspdf-autotable": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-5.0.8.tgz", + "integrity": "sha512-Hy05N86yBO7CXBrnSLOge7i1ZYpKH2DjQ94iybaP7vBhSInjvRBgDc99ngKzSbSO8Jc98ZCally8I6n0tj2RJQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "jspdf": "^2 || ^3 || ^4" + } + }, + "node_modules/jsx-ast-utils-x": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils-x/-/jsx-ast-utils-x-0.1.0.tgz", + "integrity": "sha512-eQQBjBnsVtGacsG9uJNB8qOr3yA8rga4wAaGG1qRcBzSIvfhERLrWxMAM1hp5fcS6Abo8M4+bUBTekYR0qTPQw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/katex": { + "version": "0.16.46", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.46.tgz", + "integrity": "sha512-WHy4Coo+bGZyH7NwJKHkS04YFsFcarWbAEOAC3EMndzdN6VSZqklLLIgfxzyaW9jDoeGYJX9SWbJPKpecox0Uw==", + "dev": true, + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", + "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-math": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-3.0.0.tgz", + "integrity": "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "longest-streak": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.1.0", + "unist-util-remove-position": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", + "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/katex": "^0.16.0", + "devlop": "^1.0.0", + "katex": "^0.16.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", + "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/obug": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", + "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/oxfmt": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.61.0.tgz", + "integrity": "sha512-DxdHBEMYpcEnHoUHjjOigUqV2TYKsvxLwUPXnVYBjgFdqrcQ/91OtwubtZ2PUodCs3sStI8R5Qw3fKNGK4e8wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinypool": "2.1.0" + }, + "bin": { + "oxfmt": "bin/oxfmt" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxfmt/binding-android-arm-eabi": "0.61.0", + "@oxfmt/binding-android-arm64": "0.61.0", + "@oxfmt/binding-darwin-arm64": "0.61.0", + "@oxfmt/binding-darwin-x64": "0.61.0", + "@oxfmt/binding-freebsd-x64": "0.61.0", + "@oxfmt/binding-linux-arm-gnueabihf": "0.61.0", + "@oxfmt/binding-linux-arm-musleabihf": "0.61.0", + "@oxfmt/binding-linux-arm64-gnu": "0.61.0", + "@oxfmt/binding-linux-arm64-musl": "0.61.0", + "@oxfmt/binding-linux-ppc64-gnu": "0.61.0", + "@oxfmt/binding-linux-riscv64-gnu": "0.61.0", + "@oxfmt/binding-linux-riscv64-musl": "0.61.0", + "@oxfmt/binding-linux-s390x-gnu": "0.61.0", + "@oxfmt/binding-linux-x64-gnu": "0.61.0", + "@oxfmt/binding-linux-x64-musl": "0.61.0", + "@oxfmt/binding-openharmony-arm64": "0.61.0", + "@oxfmt/binding-win32-arm64-msvc": "0.61.0", + "@oxfmt/binding-win32-ia32-msvc": "0.61.0", + "@oxfmt/binding-win32-x64-msvc": "0.61.0" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/playwright": { + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz", + "integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.61.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz", + "integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, + "node_modules/postcss": { + "version": "8.5.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.19.tgz", + "integrity": "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quansync": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz", + "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.7" + } + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/refa": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/refa/-/refa-0.12.1.tgz", + "integrity": "sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0" + }, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/regexp-ast-analysis": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regexp-ast-analysis/-/regexp-ast-analysis-0.7.1.tgz", + "integrity": "sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0", + "refa": "^0.12.1" + }, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/rgbcolor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", + "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==", + "dev": true, + "license": "MIT OR SEE LICENSE IN FEEL-FREE.md", + "optional": true, + "engines": { + "node": ">= 0.8.15" + } + }, + "node_modules/rolldown": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", + "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.139.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.1.5", + "@rolldown/binding-darwin-arm64": "1.1.5", + "@rolldown/binding-darwin-x64": "1.1.5", + "@rolldown/binding-freebsd-x64": "1.1.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", + "@rolldown/binding-linux-arm64-gnu": "1.1.5", + "@rolldown/binding-linux-arm64-musl": "1.1.5", + "@rolldown/binding-linux-ppc64-gnu": "1.1.5", + "@rolldown/binding-linux-s390x-gnu": "1.1.5", + "@rolldown/binding-linux-x64-gnu": "1.1.5", + "@rolldown/binding-linux-x64-musl": "1.1.5", + "@rolldown/binding-openharmony-arm64": "1.1.5", + "@rolldown/binding-wasm32-wasi": "1.1.5", + "@rolldown/binding-win32-arm64-msvc": "1.1.5", + "@rolldown/binding-win32-x64-msvc": "1.1.5" + } + }, + "node_modules/rolldown-plugin-dts": { + "version": "0.27.9", + "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.27.9.tgz", + "integrity": "sha512-d54yt65+ZF/Mk8H6P36As02PAMdaiWRSzVNtJRc1h7nCgUFjuRI4cN2DyTfJyfVpPH6pgy7/2D7YQH1/Rh75Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dts-resolver": "^3.0.0", + "get-tsconfig": "5.0.0-beta.5", + "obug": "^2.1.3", + "yuku-ast": "^0.1.7", + "yuku-codegen": "^0.6.1", + "yuku-parser": "^0.6.1" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@ts-macro/tsc": "^0.3.6", + "@typescript/native-preview": "*", + "rolldown": "^1.0.0", + "typescript": "^5.0.0 || ^6.0.0 || ~7.0.0", + "vue-tsc": "~3.2.0 || ~3.3.0" + }, + "peerDependenciesMeta": { + "@ts-macro/tsc": { + "optional": true + }, + "@typescript/native-preview": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/scslre": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/scslre/-/scslre-0.3.0.tgz", + "integrity": "sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0", + "refa": "^0.12.0", + "regexp-ast-analysis": "^0.7.0" + }, + "engines": { + "node": "^14.0.0 || >=16.0.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/seroval": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.5.4.tgz", + "integrity": "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/seroval-plugins": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.5.4.tgz", + "integrity": "sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "seroval": "^1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/stackblur-canvas": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz", + "integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.14" + } + }, + "node_modules/std-env": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", + "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-ts": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/string-ts/-/string-ts-2.3.1.tgz", + "integrity": "sha512-xSJq+BS52SaFFAVxuStmx6n5aYZU571uYUnUrPXkPFCfdHyZMMlbP2v2Wx5sNBnAVzq/2+0+mcBLBa3Xa5ubYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svg-pathdata": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", + "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/text-segmentation": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", + "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "utrie": "^1.0.2" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinypool": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-2.1.0.tgz", + "integrity": "sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.0.0 || >=22.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-pattern": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.9.0.tgz", + "integrity": "sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tsdown": { + "version": "0.22.7", + "resolved": "https://registry.npmjs.org/tsdown/-/tsdown-0.22.7.tgz", + "integrity": "sha512-4egbOzc9dxVv/QS+gDV75FIxDIjQQeOnXBlUuikyjmn0ozuc6FW11djJjEEo3vqkuJRygpnKHurnj+Iwftk4VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansis": "^4.3.1", + "cac": "^7.0.0", + "defu": "^6.1.7", + "empathic": "^2.0.1", + "hookable": "^6.1.1", + "import-without-cache": "^0.4.0", + "obug": "^2.1.3", + "picomatch": "^4.0.5", + "rolldown": "~1.1.5", + "rolldown-plugin-dts": "^0.27.8", + "semver": "^7.8.5", + "tinyexec": "^1.2.4", + "tinyglobby": "^0.2.17", + "tree-kill": "^1.2.2", + "unconfig-core": "^7.5.0" + }, + "bin": { + "tsdown": "dist/run.mjs" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@arethetypeswrong/core": "^0.18.1", + "@tsdown/css": "0.22.7", + "@tsdown/exe": "0.22.7", + "@vitejs/devtools": "*", + "publint": "^0.3.8", + "tsx": "*", + "typescript": "^5.0.0 || ^6.0.0 || ^7.0.0", + "unplugin-unused": "^0.5.0", + "unrun": "*" + }, + "peerDependenciesMeta": { + "@arethetypeswrong/core": { + "optional": true + }, + "@tsdown/css": { + "optional": true + }, + "@tsdown/exe": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "publint": { + "optional": true + }, + "tsx": { + "optional": true + }, + "typescript": { + "optional": true + }, + "unplugin-unused": { + "optional": true + }, + "unrun": { + "optional": true + } + } + }, + "node_modules/tsdown/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "name": "@typescript/typescript6", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript6/-/typescript6-6.0.2.tgz", + "integrity": "sha512-mbCddXd+jm7hfx7w2YU64/Av4/NqqeG3GoRZgxPcgoTxYjhrcfJRw9ULch71SS4G+Q3bOXFhRvPqjguN0Hyp5w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@typescript/old": "npm:typescript@^6" + }, + "bin": { + "tsc6": "bin/tsc6" + } + }, + "node_modules/typescript-eslint": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.65.0.tgz", + "integrity": "sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.65.0", + "@typescript-eslint/parser": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/utils": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/unconfig-core": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/unconfig-core/-/unconfig-core-7.5.0.tgz", + "integrity": "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@quansync/fs": "^1.0.0", + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/undici-types": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unplugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.0.0.tgz", + "integrity": "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/utrie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", + "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "base64-arraybuffer": "^1.0.2" + } + }, + "node_modules/vite": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz", + "integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.17", + "rolldown": "~1.1.5", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", + "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.10", + "@vitest/mocker": "4.1.10", + "@vitest/pretty-format": "4.1.10", + "@vitest/runner": "4.1.10", + "@vitest/snapshot": "4.1.10", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.10", + "@vitest/browser-preview": "4.1.10", + "@vitest/browser-webdriverio": "4.1.10", + "@vitest/coverage-istanbul": "4.1.10", + "@vitest/coverage-v8": "4.1.10", + "@vitest/ui": "4.1.10", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/vitest-browser-react": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vitest-browser-react/-/vitest-browser-react-2.2.0.tgz", + "integrity": "sha512-oY3KM6305kwJMa6nHo92vVtkOsih7mjEf12dLKuphaF+9ywWPEc+qanIBd394SZ6m5LadVEaG6dicvvizOzmjA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0", + "vitest": "^4.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yuku-ast": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/yuku-ast/-/yuku-ast-0.1.7.tgz", + "integrity": "sha512-2RiMEWv500TixY5rJy6OZd4fSy9WYZKWh6gGbIJ7y7vAGcuCugWOWwOLGaQcRZrXcPUfqtLtvpaJ3SdXtWlhKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "0.5.43" + }, + "funding": { + "url": "https://github.com/sponsors/arshad-yaseen" + } + }, + "node_modules/yuku-codegen": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/yuku-codegen/-/yuku-codegen-0.6.1.tgz", + "integrity": "sha512-6RJqqON2xYhMEp/sZv5oOSI3uOpWwRwzAi2fc/rMcRFjcqedAC5Fyp4AD9Vn2b8SB7hf9ESqVW+YwbDs/KvyKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "0.5.43" + }, + "optionalDependencies": { + "@yuku-codegen/binding-darwin-arm64": "0.6.1", + "@yuku-codegen/binding-darwin-x64": "0.6.1", + "@yuku-codegen/binding-freebsd-x64": "0.6.1", + "@yuku-codegen/binding-linux-arm-gnu": "0.6.1", + "@yuku-codegen/binding-linux-arm-musl": "0.6.1", + "@yuku-codegen/binding-linux-arm64-gnu": "0.6.1", + "@yuku-codegen/binding-linux-arm64-musl": "0.6.1", + "@yuku-codegen/binding-linux-x64-gnu": "0.6.1", + "@yuku-codegen/binding-linux-x64-musl": "0.6.1", + "@yuku-codegen/binding-win32-arm64": "0.6.1", + "@yuku-codegen/binding-win32-x64": "0.6.1" + } + }, + "node_modules/yuku-parser": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/yuku-parser/-/yuku-parser-0.6.1.tgz", + "integrity": "sha512-dPE3/+H2VBw9LhjoIVeW/axKidYGd+XzNtrwGGseZ0325cQFl0Dpwyh0R74XWe/WqQn4M8CR5YApsv2KF2zN1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "0.5.43" + }, + "optionalDependencies": { + "@yuku-parser/binding-darwin-arm64": "0.6.1", + "@yuku-parser/binding-darwin-x64": "0.6.1", + "@yuku-parser/binding-freebsd-x64": "0.6.1", + "@yuku-parser/binding-linux-arm-gnu": "0.6.1", + "@yuku-parser/binding-linux-arm-musl": "0.6.1", + "@yuku-parser/binding-linux-arm64-gnu": "0.6.1", + "@yuku-parser/binding-linux-arm64-musl": "0.6.1", + "@yuku-parser/binding-linux-x64-gnu": "0.6.1", + "@yuku-parser/binding-linux-x64-musl": "0.6.1", + "@yuku-parser/binding-win32-arm64": "0.6.1", + "@yuku-parser/binding-win32-x64": "0.6.1" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json index 65047a6ef9..3e6e5218be 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,29 @@ { - "name": "react-data-grid", - "version": "7.0.0-beta.56", - "license": "MIT", + "name": "@grafana/react-data-grid", + "version": "7.0.0-beta.59", "description": "Feature-rich and customizable data grid React component", "keywords": [ - "react", - "data grid" + "data grid", + "react" ], + "homepage": "https://github.com/grafana/react-data-grid#readme", + "bugs": "https://github.com/grafana/react-data-grid/issues", + "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/adazzle/react-data-grid.git" + "url": "git+https://github.com/grafana/react-data-grid.git" }, - "bugs": "https://github.com/adazzle/react-data-grid/issues", + "files": [ + "lib" + ], "type": "module", + "sideEffects": [ + "**/*.css" + ], + "main": "./lib/index.js", + "module": "./lib/index.js", + "browser": "./lib/index.js", + "types": "./lib/index.d.ts", "exports": { "./lib/styles.css": "./lib/styles.css", ".": { @@ -20,82 +31,66 @@ "default": "./lib/index.js" } }, - "browser": "./lib/index.js", - "main": "./lib/index.js", - "module": "./lib/index.js", - "types": "./lib/index.d.ts", - "files": [ - "lib" - ], - "sideEffects": [ - "**/*.css" - ], + "publishConfig": { + "access": "public" + }, "scripts": { "start": "vite serve --clearScreen false", "preview": "vite preview", "build:website": "vite build", - "build": "rolldown -c", - "test": "vitest run", - "test:watch": "vitest watch", - "format": "biome format --write", - "check": "biome check --error-on-warnings", - "biome:ci": "biome ci --error-on-warnings", - "eslint": "eslint --max-warnings 0 --cache --cache-location .cache/eslint --cache-strategy content", + "build": "tsdown", + "test": "vitest run --project browser --project node", + "test:watch": "vitest watch --project browser --project node", + "test:ci": "vitest run", + "test:ci:update": "vitest run --project visual --update", + "format": "oxfmt", + "format:check": "oxfmt --check", + "eslint": "eslint --max-warnings 0 --cache --cache-location .cache/eslint --cache-strategy content --flag unstable_native_nodejs_ts_config", "eslint:fix": "node --run eslint -- --fix", - "prettier:check": "prettier --check .", - "prettier:format": "prettier --write .", - "typecheck": "tsc --build", - "prepublishOnly": "npm install && node --run build", - "postpublish": "git push --follow-tags origin HEAD" - }, - "dependencies": { - "clsx": "^2.0.0" + "typecheck": "tsc --build" }, "devDependencies": { - "@babel/preset-typescript": "^7.27.1", - "@biomejs/biome": "2.0.0", - "@eslint/markdown": "^6.3.0", - "@faker-js/faker": "^9.6.0", - "@ianvs/prettier-plugin-sort-imports": "^4.4.2", - "@linaria/core": "^6.3.0", - "@tanstack/react-router": "^1.121.2", - "@tanstack/router-plugin": "^1.121.4", - "@types/node": "^24.0.0", - "@types/react": "^19.1.3", - "@types/react-dom": "^19.1.3", - "@typescript-eslint/eslint-plugin": "^8.33.1", - "@typescript-eslint/parser": "^8.33.1", - "@vitejs/plugin-react": "^4.5.2", - "@vitest/browser": "^3.2.3", - "@vitest/coverage-v8": "^3.2.3", - "@vitest/eslint-plugin": "^1.2.1", - "@wyw-in-js/rollup": "^0.7.0", - "@wyw-in-js/vite": "^0.7.0", - "browserslist": "^4.24.5", - "eslint": "^9.28.0", - "eslint-plugin-jest-dom": "^5.5.0", - "eslint-plugin-react": "^7.37.4", - "eslint-plugin-react-compiler": "^19.1.0-rc.2", - "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-react-hooks-extra": "^1.51.3", - "eslint-plugin-sonarjs": "^3.0.2", - "eslint-plugin-testing-library": "^7.5.0", - "jspdf": "^3.0.1", - "jspdf-autotable": "^5.0.2", - "playwright": "^1.53.0", - "postcss": "^8.5.2", - "prettier": "3.5.3", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "rolldown": "^1.0.0-beta.9", - "rolldown-plugin-dts": "^0.13.3", - "typescript": "~5.8.2", - "vite": "^6.3.5", - "vitest": "^3.2.3", - "vitest-browser-react": "^0.3.0" + "@eslint-react/eslint-plugin": "^5.6.0", + "@eslint/markdown": "^8.0.1", + "@faker-js/faker": "^10.3.0", + "@tanstack/react-router": "^1.166.7", + "@tanstack/router-plugin": "^1.166.7", + "@tsdown/css": "^0.22.7", + "@types/node": "^26.0.0", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "@typescript/native": "npm:typescript@^7.0.2", + "@vitejs/plugin-react": "^6.0.3", + "@vitest/browser-playwright": "^4.1.5", + "@vitest/coverage-istanbul": "^4.1.5", + "@vitest/eslint-plugin": "^1.6.16", + "clsx": "^2.1.1", + "ecij": "^0.4.1", + "eslint": "^10.2.1", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-sonarjs": "^4.0.3", + "jspdf": "^4.2.0", + "jspdf-autotable": "^5.0.7", + "oxfmt": "0.61.0", + "playwright": "~1.61.0", + "react": "^19.2.7", + "react-dom": "^19.2.7", + "tsdown": "^0.22.7", + "typescript": "npm:@typescript/typescript6@^6.0.2", + "typescript-eslint": "^8.59.0", + "vite": "^8.1.0", + "vitest": "^4.1.5", + "vitest-browser-react": "^2.2.0" }, "peerDependencies": { - "react": "^19.0", - "react-dom": "^19.0" + "react": "^19.2", + "react-dom": "^19.2" + }, + "devEngines": { + "runtime": { + "name": "node", + "version": "^26.0.0", + "onFail": "warn" + } } } diff --git a/rolldown.config.ts b/rolldown.config.ts deleted file mode 100644 index dca034dcff..0000000000 --- a/rolldown.config.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { isAbsolute } from 'node:path'; -import wyw from '@wyw-in-js/rollup'; -import { defineConfig } from 'rolldown'; -import { dts } from 'rolldown-plugin-dts'; - -import pkg from './package.json' with { type: 'json' }; - -export default defineConfig({ - input: './src/index.ts', - output: { - dir: 'lib', - cssEntryFileNames: 'styles.css', - sourcemap: true - }, - platform: 'browser', - external: (id) => !id.startsWith('.') && !isAbsolute(id), - plugins: [ - dts({ - tsconfig: './tsconfig.lib.json' - }), - wyw({ - exclude: ['**/*.d.ts'], - preprocessor: 'none', - classNameSlug(hash) { - // We add the package version as suffix to avoid style conflicts - // between multiple versions of RDG on the same page. - return `${hash}${pkg.version.replaceAll('.', '-')}`; - } - }) - ] -}); diff --git a/src/Cell.tsx b/src/Cell.tsx index a63e66a2a3..8f631cb607 100644 --- a/src/Cell.tsx +++ b/src/Cell.tsx @@ -1,5 +1,5 @@ import { memo, type MouseEvent } from 'react'; -import { css } from '@linaria/core'; +import { css } from 'ecij'; import { useRovingTabIndex } from './hooks'; import { createCellEvent, getCellClassname, getCellStyle, isCellEditableUtil } from './utils'; @@ -16,7 +16,7 @@ const cellDraggedOverClassname = `rdg-cell-dragged-over ${cellDraggedOver}`; function Cell({ column, colSpan, - isCellSelected, + isCellActive, isDraggedOver, row, rowIdx, @@ -30,25 +30,23 @@ function Cell({ onContextMenu, onCellContextMenu, onRowChange, - selectCell, + setActivePosition, style, ...props }: CellRendererProps) { - const { tabIndex, childTabIndex, onFocus } = useRovingTabIndex(isCellSelected); + const { tabIndex, childTabIndex, onFocus } = useRovingTabIndex(isCellActive); const { cellClass } = column; className = getCellClassname( column, - { - [cellDraggedOverClassname]: isDraggedOver - }, + isDraggedOver && cellDraggedOverClassname, typeof cellClass === 'function' ? cellClass(row) : cellClass, className ); const isEditable = isCellEditableUtil(column, row); - function selectCellWrapper(enableEditor?: boolean) { - selectCell({ rowIdx, idx: column.idx }, { enableEditor }); + function setActivePositionWrapper(enableEditor = false) { + setActivePosition({ rowIdx, idx: column.idx }, { enableEditor }); } function handleMouseEvent( @@ -58,7 +56,7 @@ function Cell({ let eventHandled = false; if (eventHandler) { const cellEvent = createCellEvent(event); - eventHandler({ rowIdx, row, column, selectCell: selectCellWrapper }, cellEvent); + eventHandler({ rowIdx, row, column, setActivePosition: setActivePositionWrapper }, cellEvent); eventHandled = cellEvent.isGridDefaultPrevented(); } return eventHandled; @@ -68,7 +66,7 @@ function Cell({ onMouseDown?.(event); if (!handleMouseEvent(event, onCellMouseDown)) { // select cell if the event is not prevented - selectCellWrapper(); + setActivePositionWrapper(); } } @@ -81,7 +79,7 @@ function Cell({ onDoubleClick?.(event); if (!handleMouseEvent(event, onCellDoubleClick)) { // go into edit mode if the event is not prevented - selectCellWrapper(true); + setActivePositionWrapper(true); } } @@ -91,7 +89,7 @@ function Cell({ } function handleRowChange(newRow: R) { - onRowChange(column, newRow); + onRowChange(column, rowIdx, newRow); } return ( @@ -99,7 +97,7 @@ function Cell({ role="gridcell" aria-colindex={column.idx + 1} // aria-colindex is 1-based aria-colspan={colSpan} - aria-selected={isCellSelected} + aria-selected={isCellActive} aria-readonly={!isEditable || undefined} tabIndex={tabIndex} className={className} diff --git a/src/Columns.tsx b/src/Columns.tsx index 9121359d4a..163b3280d7 100644 --- a/src/Columns.tsx +++ b/src/Columns.tsx @@ -1,16 +1,16 @@ -import { useHeaderRowSelection, useRowSelection } from './hooks/useRowSelection'; +import { useHeaderRowSelection, useRowSelection } from './hooks'; import type { Column, RenderCellProps, RenderGroupCellProps, RenderHeaderCellProps } from './types'; import { SelectCellFormatter } from './cellRenderers'; export const SELECT_COLUMN_KEY = 'rdg-select-column'; -function HeaderRenderer(props: RenderHeaderCellProps) { +function HeaderRenderer({ tabIndex }: RenderHeaderCellProps) { const { isIndeterminate, isRowSelected, onRowSelectionChange } = useHeaderRowSelection(); return ( { @@ -20,32 +20,32 @@ function HeaderRenderer(props: RenderHeaderCellProps) { ); } -function SelectFormatter(props: RenderCellProps) { +function SelectFormatter({ row, tabIndex }: RenderCellProps) { const { isRowSelectionDisabled, isRowSelected, onRowSelectionChange } = useRowSelection(); return ( { - onRowSelectionChange({ row: props.row, checked, isShiftClick }); + onRowSelectionChange({ row, checked, isShiftClick }); }} /> ); } -function SelectGroupFormatter(props: RenderGroupCellProps) { +function SelectGroupFormatter({ row, tabIndex }: RenderGroupCellProps) { const { isRowSelected, onRowSelectionChange } = useRowSelection(); return ( { - onRowSelectionChange({ row: props.row, checked, isShiftClick: false }); + onRowSelectionChange({ row, checked, isShiftClick: false }); }} /> ); diff --git a/src/DataGrid.tsx b/src/DataGrid.tsx index be31ed46ee..402f944916 100644 --- a/src/DataGrid.tsx +++ b/src/DataGrid.tsx @@ -1,42 +1,40 @@ -import { - useCallback, - useImperativeHandle, - useLayoutEffect, - useMemo, - useRef, - useState -} from 'react'; import type { Key, KeyboardEvent } from 'react'; +import { useCallback, useImperativeHandle, useMemo, useRef, useState } from 'react'; import { flushSync } from 'react-dom'; -import clsx from 'clsx'; import { + type ActivePosition, HeaderRowSelectionChangeContext, HeaderRowSelectionContext, + type HeaderRowSelectionContextValue, + type PartialPosition, RowSelectionChangeContext, + useActivePosition, useCalculatedColumns, useColumnWidths, useGridDimensions, useLatestFunc, + useScrollState, + useScrollToPosition, useViewportColumns, - useViewportRows, - type HeaderRowSelectionContextValue + useViewportRows } from './hooks'; import { - abs, assertIsValidKeyGetter, canExitGrid, + classnames, createCellEvent, + focusCell, getCellStyle, + getCellToScroll, getColSpan, getLeftRightKey, - getNextSelectedCellPosition, + getNextActivePosition, + isCellEditableUtil, isCtrlKeyHeldDown, isDefaultCellInput, - isSelectedCellEditable, renderMeasuringCells, - scrollIntoView, - sign + scrollIntoView } from './utils'; import type { CalculatedColumn, @@ -47,7 +45,6 @@ import type { CellMouseEventHandler, CellNavigationMode, CellPasteArgs, - CellSelectArgs, Column, ColumnOrColumnGroup, ColumnWidths, @@ -55,11 +52,12 @@ import type { FillEvent, Maybe, Position, + PositionChangeArgs, Renderers, RowsChangeData, - SelectCellOptions, SelectHeaderRowEvent, SelectRowEvent, + SetActivePositionOptions, SortColumn } from './types'; import { defaultRenderCell } from './Cell'; @@ -72,29 +70,18 @@ import EditCell from './EditCell'; import GroupedColumnHeaderRow from './GroupedColumnHeaderRow'; import HeaderRow from './HeaderRow'; import { defaultRenderRow } from './Row'; -import type { PartialPosition } from './ScrollToCell'; -import ScrollToCell from './ScrollToCell'; import { default as defaultRenderSortStatus } from './sortStatus'; import { cellDragHandleClassname, cellDragHandleFrozenClassname } from './style/cell'; import { - focusSinkClassname, - focusSinkHeaderAndSummaryClassname, rootClassname, + frozenColumnShadowEndClassname, + frozenColumnShadowEndTopClassname, + frozenColumnShadowStartClassname, + frozenColumnShadowStartTopClassname, viewportDraggingClassname } from './style/core'; -import { rowSelected, rowSelectedWithFrozenCell } from './style/row'; import SummaryRow from './SummaryRow'; -export interface SelectCellState extends Position { - readonly mode: 'SELECT'; -} - -interface EditCellState extends Position { - readonly mode: 'EDIT'; - readonly row: R; - readonly originalRow: R; -} - export type DefaultColumnOptions = Pick< Column, | 'renderCell' @@ -110,7 +97,7 @@ export type DefaultColumnOptions = Pick< export interface DataGridHandle { element: HTMLDivElement | null; scrollToCell: (position: PartialPosition) => void; - selectCell: (position: Position, options?: SelectCellOptions) => void; + setActivePosition: (position: Position, options?: SetActivePositionOptions) => void; } type SharedDivProps = Pick< @@ -123,6 +110,7 @@ type SharedDivProps = Pick< | 'aria-rowcount' | 'className' | 'style' + | 'onScroll' >; export interface DataGridProps extends SharedDivProps { @@ -150,7 +138,7 @@ export interface DataGridProps extends Sha * Height of each row in pixels * @default 35 */ - rowHeight?: Maybe) => number)>; + rowHeight?: Maybe) => number)>; /** * Height of the header row in pixels * @default 35 @@ -181,7 +169,6 @@ export interface DataGridProps extends Sha onSortColumnsChange?: Maybe<(sortColumns: SortColumn[]) => void>; /** Default options applied to all columns */ defaultColumnOptions?: Maybe, NoInfer>>; - onFill?: Maybe<(event: FillEvent>) => NoInfer>; /** * Event props @@ -206,14 +193,13 @@ export interface DataGridProps extends Sha onCellPaste?: Maybe< (args: CellPasteArgs, NoInfer>, event: CellClipboardEvent) => NoInfer >; - /** Function called whenever cell selection is changed */ - onSelectedCellChange?: Maybe<(args: CellSelectArgs, NoInfer>) => void>; - /** Callback triggered when the grid is scrolled */ - onScroll?: Maybe<(event: React.UIEvent) => void>; + /** Function called whenever the active position is changed */ + onActivePositionChange?: Maybe<(args: PositionChangeArgs, NoInfer>) => void>; /** Callback triggered when column is resized */ onColumnResize?: Maybe<(column: CalculatedColumn, width: number) => void>; /** Callback triggered when columns are reordered */ onColumnsReorder?: Maybe<(sourceColumnKey: string, targetColumnKey: string) => void>; + onFill?: Maybe<(event: FillEvent>) => NoInfer>; /** * Toggles and modes @@ -233,7 +219,7 @@ export interface DataGridProps extends Sha /** * Text direction of the grid ('ltr' or 'rtl') * @default 'ltr' - * */ + */ direction?: Maybe; 'data-testid'?: Maybe; 'data-cy'?: Maybe; @@ -275,7 +261,7 @@ export function DataGrid(props: DataGridPr onCellDoubleClick, onCellContextMenu, onCellKeyDown, - onSelectedCellChange, + onActivePositionChange, onScroll, onColumnResize, onColumnsReorder, @@ -317,22 +303,29 @@ export function DataGrid(props: DataGridPr const renderCheckbox = renderers?.renderCheckbox ?? defaultRenderers?.renderCheckbox ?? defaultRenderCheckbox; const noRowsFallback = renderers?.noRowsFallback ?? defaultRenderers?.noRowsFallback; - const enableVirtualization = rawEnableVirtualization ?? true; + const enableVirtualization = rawEnableVirtualization ?? typeof rawRowHeight !== 'string'; const direction = rawDirection ?? 'ltr'; + if (enableVirtualization && typeof rowHeight === 'string') { + throw new Error('`rowHeight` cannot be a string when `enableVirtualization` is true.'); + } + + /** + * ref + */ + const gridRef = useRef(null); + /** * states */ - const [scrollTop, setScrollTop] = useState(0); - const [scrollLeft, setScrollLeft] = useState(0); + const { scrollTop, scrollLeft } = useScrollState(gridRef); + const [gridWidth, gridHeight] = useGridDimensions(gridRef); const [columnWidthsInternal, setColumnWidthsInternal] = useState( (): ColumnWidths => columnWidthsRaw ?? new Map() ); - const [isColumnResizing, setColumnResizing] = useState(false); - const [isDragging, setDragging] = useState(false); + const [isColumnResizing, setIsColumnResizing] = useState(false); + const [isDragging, setIsDragging] = useState(false); const [draggedOverRowIdx, setDraggedOverRowIdx] = useState(undefined); - const [scrollToPosition, setScrollToPosition] = useState(null); - const [shouldFocusCell, setShouldFocusCell] = useState(false); const [previousRowIdx, setPreviousRowIdx] = useState(-1); const isColumnWidthsControlled = @@ -353,17 +346,18 @@ export function DataGrid(props: DataGridPr [columnWidths] ); - const [gridRef, gridWidth, gridHeight, horizontalScrollbarHeight] = useGridDimensions(); const { columns, colSpanColumns, - lastFrozenColumnIndex, + lastStartFrozenColumnIndex, + firstEndFrozenColumnIndex, headerRowsCount, colOverscanStartIdx, colOverscanEndIdx, templateColumns, layoutCssVars, - totalFrozenColumnWidth + totalStartFrozenColumnWidth, + totalEndFrozenColumnWidth } = useCalculatedColumns({ rawColumns, defaultColumnOptions, @@ -373,34 +367,59 @@ export function DataGrid(props: DataGridPr enableVirtualization }); + /** + * computed values + */ + const isTreeGrid = role === 'treegrid'; const topSummaryRowsCount = topSummaryRows?.length ?? 0; const bottomSummaryRowsCount = bottomSummaryRows?.length ?? 0; const summaryRowsCount = topSummaryRowsCount + bottomSummaryRowsCount; const headerAndTopSummaryRowsCount = headerRowsCount + topSummaryRowsCount; const groupedColumnHeaderRowsCount = headerRowsCount - 1; const minRowIdx = -headerAndTopSummaryRowsCount; - const mainHeaderRowIdx = minRowIdx + groupedColumnHeaderRowsCount; const maxRowIdx = rows.length + bottomSummaryRowsCount - 1; - - const [selectedPosition, setSelectedPosition] = useState( - (): SelectCellState | EditCellState => ({ idx: -1, rowIdx: minRowIdx - 1, mode: 'SELECT' }) - ); - - /** - * refs - */ - const focusSinkRef = useRef(null); - - /** - * computed values - */ - const isTreeGrid = role === 'treegrid'; + const mainHeaderRowIdx = minRowIdx + groupedColumnHeaderRowsCount; + const maxColIdx = columns.length - 1; const headerRowsHeight = headerRowsCount * headerRowHeight; const summaryRowsHeight = summaryRowsCount * summaryRowHeight; const clientHeight = gridHeight - headerRowsHeight - summaryRowsHeight; const isSelectable = selectedRows != null && onSelectedRowsChange != null; const { leftKey, rightKey } = getLeftRightKey(direction); const ariaRowCount = rawAriaRowCount ?? headerRowsCount + rows.length + summaryRowsCount; + const frozenStartShadowStyles: React.CSSProperties = { + gridColumnStart: lastStartFrozenColumnIndex + 2, + insetInlineStart: totalStartFrozenColumnWidth + }; + const frozenEndShadowStyles: React.CSSProperties = { + gridColumnStart: firstEndFrozenColumnIndex + 1, + gridColumnEnd: -1, + insetInlineEnd: totalEndFrozenColumnWidth + }; + + const { + activePosition, + setActivePosition, + setPositionToFocus, + activePositionIsInActiveBounds, + activePositionIsInViewport, + activePositionIsRow, + activePositionIsCellInViewport, + validatePosition, + getActiveColumn, + getActiveRow + } = useActivePosition({ + gridRef, + columns, + rows, + isTreeGrid, + maxColIdx, + minRowIdx, + maxRowIdx, + setDraggedOverRowIdx + }); + const { setScrollToPosition, scrollToPositionElement } = useScrollToPosition({ + gridRef + }); const defaultGridComponents = useMemo( () => ({ @@ -412,7 +431,7 @@ export function DataGrid(props: DataGridPr ); const headerSelectionValue = useMemo((): HeaderRowSelectionContextValue => { - // no rows to select = explicitely unchecked + // no rows to select = explicitly unchecked let hasSelectedRow = false; let hasUnselectedRow = false; @@ -444,18 +463,29 @@ export function DataGrid(props: DataGridPr findRowIdx } = useViewportRows({ rows, - rowHeight, clientHeight, scrollTop, - enableVirtualization + enableVirtualization, + ...(typeof rowHeight === 'string' + ? { + rowHeight, + gridRef, + gridHeight + } + : { rowHeight }) }); - const viewportColumns = useViewportColumns({ + const { + viewportColumns, + iterateOverViewportColumnsForRow, + iterateOverViewportColumnsForRowOutsideOfViewport + } = useViewportColumns({ columns, colSpanColumns, colOverscanStartIdx, colOverscanEndIdx, - lastFrozenColumnIndex, + lastStartFrozenColumnIndex, + firstEndFrozenColumnIndex, rowOverscanStartIdx, rowOverscanEndIdx, rows, @@ -472,16 +502,9 @@ export function DataGrid(props: DataGridPr columnWidths, onColumnWidthsChange, onColumnResize, - setColumnResizing + setIsColumnResizing ); - const minColIdx = isTreeGrid ? -1 : 0; - const maxColIdx = columns.length - 1; - const selectedCellIsWithinSelectionBounds = isCellWithinSelectionBounds(selectedPosition); - const selectedCellIsWithinViewportBounds = isCellWithinViewportBounds(selectedPosition); - const scrollHeight = - headerRowHeight + totalRowHeight + summaryRowsHeight + horizontalScrollbarHeight; - /** * The identity of the wrapper function is stable so it won't break memoization */ @@ -496,56 +519,38 @@ export function DataGrid(props: DataGridPr const selectHeaderRowLatest = useLatestFunc(selectHeaderRow); const selectRowLatest = useLatestFunc(selectRow); const handleFormatterRowChangeLatest = useLatestFunc(updateRow); - const selectCellLatest = useLatestFunc(selectCell); + const setPositionLatest = useLatestFunc(setPosition); const selectHeaderCellLatest = useLatestFunc(selectHeaderCell); /** - * callbacks + * Misc hooks */ - const focusCell = useCallback( - (shouldScroll = true) => { - const cell = getCellToScroll(gridRef.current!); - if (cell === null) return; - - if (shouldScroll) { - scrollIntoView(cell); - } - - cell.focus({ preventScroll: true }); - }, - [gridRef] + useImperativeHandle( + ref, + (): DataGridHandle => ({ + element: gridRef.current, + scrollToCell({ idx, rowIdx }) { + // frozen columns are always visible — scrolling to them is a no-op + const scrollToIdx = + idx != null && + idx > lastStartFrozenColumnIndex && + (firstEndFrozenColumnIndex === -1 || idx < firstEndFrozenColumnIndex) && + idx < columns.length + ? idx + : undefined; + const scrollToRowIdx = + rowIdx != null && validatePosition({ idx: 0, rowIdx }).isPositionInViewport + ? rowIdx + headerAndTopSummaryRowsCount + : undefined; + + if (scrollToIdx != null || scrollToRowIdx != null) { + setScrollToPosition({ idx: scrollToIdx, rowIdx: scrollToRowIdx }); + } + }, + setActivePosition: setPosition + }) ); - /** - * effects - */ - useLayoutEffect(() => { - if (shouldFocusCell) { - if (focusSinkRef.current !== null && selectedPosition.idx === -1) { - focusSinkRef.current.focus({ preventScroll: true }); - scrollIntoView(focusSinkRef.current); - } else { - focusCell(); - } - setShouldFocusCell(false); - } - }, [shouldFocusCell, focusCell, selectedPosition.idx]); - - useImperativeHandle(ref, () => ({ - element: gridRef.current, - scrollToCell({ idx, rowIdx }) { - const scrollToIdx = - idx !== undefined && idx > lastFrozenColumnIndex && idx < columns.length ? idx : undefined; - const scrollToRowIdx = - rowIdx !== undefined && isRowIdxWithinViewportBounds(rowIdx) ? rowIdx : undefined; - - if (scrollToIdx !== undefined || scrollToRowIdx !== undefined) { - setScrollToPosition({ idx: scrollToIdx, rowIdx: scrollToRowIdx }); - } - }, - selectCell - })); - /** * event handlers */ @@ -590,8 +595,10 @@ export function DataGrid(props: DataGridPr previousRowIdx !== rowIdx && previousRowIdx < rows.length ) { - const step = sign(rowIdx - previousRowIdx); - for (let i = previousRowIdx + step; i !== rowIdx; i += step) { + const [min, max] = + previousRowIdx < rowIdx ? [previousRowIdx, rowIdx] : [rowIdx, previousRowIdx]; + + for (let i = min + 1; i < max; i++) { const row = rows[i]; if (isRowSelectionDisabled?.(row) === true) continue; if (checked) { @@ -606,28 +613,31 @@ export function DataGrid(props: DataGridPr } function handleKeyDown(event: KeyboardEvent) { - const { idx, rowIdx, mode } = selectedPosition; + const { idx, rowIdx, mode } = activePosition; if (mode === 'EDIT') return; - if (onCellKeyDown && isRowIdxWithinViewportBounds(rowIdx)) { - const row = rows[rowIdx]; + if (onCellKeyDown && activePositionIsInViewport) { const cellEvent = createCellEvent(event); onCellKeyDown( { - mode: 'SELECT', - row, + mode: 'ACTIVE', + row: rows[rowIdx], column: columns[idx], rowIdx, - selectCell + setActivePosition: setPosition }, cellEvent ); if (cellEvent.isGridDefaultPrevented()) return; } - if (!(event.target instanceof Element)) return; - const isCellEvent = event.target.closest('.rdg-cell') !== null; - const isRowEvent = isTreeGrid && event.target === focusSinkRef.current; + const { target } = event; + + if (!(target instanceof Element)) return; + + const isCellEvent = target.closest('.rdg-cell') !== null; + const isRowEvent = isTreeGrid && target.role === 'row'; + if (!isCellEvent && !isRowEvent) return; switch (event.key) { @@ -648,16 +658,6 @@ export function DataGrid(props: DataGridPr } } - function handleScroll(event: React.UIEvent) { - const { scrollTop, scrollLeft } = event.currentTarget; - flushSync(() => { - setScrollTop(scrollTop); - // scrollLeft is nagative when direction is rtl - setScrollLeft(abs(scrollLeft)); - }); - onScroll?.(event); - } - function updateRow(column: CalculatedColumn, rowIdx: number, row: R) { if (typeof onRowsChange !== 'function') return; if (row === rows[rowIdx]) return; @@ -669,44 +669,51 @@ export function DataGrid(props: DataGridPr } function commitEditorChanges() { - if (selectedPosition.mode !== 'EDIT') return; - updateRow(columns[selectedPosition.idx], selectedPosition.rowIdx, selectedPosition.row); + if (activePosition.mode !== 'EDIT') return; + updateRow(getActiveColumn(), activePosition.rowIdx, activePosition.row); } function handleCellCopy(event: CellClipboardEvent) { - if (!selectedCellIsWithinViewportBounds) return; - const { idx, rowIdx } = selectedPosition; - onCellCopy?.({ row: rows[rowIdx], column: columns[idx] }, event); + if (!activePositionIsCellInViewport) return; + onCellCopy?.({ row: getActiveRow(), column: getActiveColumn() }, event); } function handleCellPaste(event: CellClipboardEvent) { - if (!onCellPaste || !onRowsChange || !isCellEditable(selectedPosition)) { + if ( + typeof onCellPaste !== 'function' || + typeof onRowsChange !== 'function' || + !isCellEditable(activePosition) + ) { return; } - const { idx, rowIdx } = selectedPosition; - const column = columns[idx]; - const updatedRow = onCellPaste({ row: rows[rowIdx], column }, event); - updateRow(column, rowIdx, updatedRow); + const column = getActiveColumn(); + const row = getActiveRow(); + const updatedRow = onCellPaste({ row, column }, event); + updateRow(column, activePosition.rowIdx, updatedRow); } function handleCellInput(event: KeyboardEvent) { - if (!selectedCellIsWithinViewportBounds) return; - const row = rows[selectedPosition.rowIdx]; + if (!activePositionIsCellInViewport) return; + const row = getActiveRow(); const { key, shiftKey } = event; // Select the row on Shift + Space if (isSelectable && shiftKey && key === ' ') { assertIsValidKeyGetter(rowKeyGetter); const rowKey = rowKeyGetter(row); - selectRow({ row, checked: !selectedRows.has(rowKey), isShiftClick: false }); + selectRow({ + row, + checked: !selectedRows.has(rowKey), + isShiftClick: false + }); // prevent scrolling event.preventDefault(); return; } - if (isCellEditable(selectedPosition) && isDefaultCellInput(event, onCellPaste != null)) { - setSelectedPosition(({ idx, rowIdx }) => ({ + if (isCellEditable(activePosition) && isDefaultCellInput(event, onCellPaste != null)) { + setActivePosition(({ idx, rowIdx }) => ({ idx, rowIdx, mode: 'EDIT', @@ -720,17 +727,17 @@ export function DataGrid(props: DataGridPr // This check is needed as double click on the resize handle triggers onPointerMove if (isColumnResizing) { onColumnWidthsChangeRaw?.(columnWidths); - setColumnResizing(false); + setIsColumnResizing(false); } } function handleDragHandlePointerDown(event: React.PointerEvent) { // keep the focus on the cell event.preventDefault(); - if (event.pointerType === 'mouse' && event.buttons !== 1) { + if (event.pointerType === 'mouse' && event.button !== 0) { return; } - setDragging(true); + setIsDragging(true); event.currentTarget.setPointerCapture(event.pointerId); } @@ -747,16 +754,16 @@ export function DataGrid(props: DataGridPr setDraggedOverRowIdx(overRowIdx); const ariaRowIndex = headerAndTopSummaryRowsCount + overRowIdx + 1; const el = gridEl.querySelector( - `:scope > [aria-rowindex="${ariaRowIndex}"] > [aria-colindex="${selectedPosition.idx + 1}"]` + `& > [aria-rowindex="${ariaRowIndex}"] > [aria-colindex="${activePosition.idx + 1}"]` ); scrollIntoView(el); } function handleDragHandleLostPointerCapture() { - setDragging(false); + setIsDragging(false); if (draggedOverRowIdx === undefined) return; - const { rowIdx } = selectedPosition; + const { rowIdx } = activePosition; const [startRowIndex, endRowIndex] = rowIdx < draggedOverRowIdx ? [rowIdx + 1, draggedOverRowIdx + 1] @@ -767,25 +774,29 @@ export function DataGrid(props: DataGridPr function handleDragHandleClick() { // keep the focus on the cell but do not scroll - focusCell(false); + focusCell(gridRef.current!, false); } function handleDragHandleDoubleClick(event: React.MouseEvent) { event.stopPropagation(); - updateRows(selectedPosition.rowIdx + 1, rows.length); + updateRows(activePosition.rowIdx + 1, rows.length); } function updateRows(startRowIdx: number, endRowIdx: number) { if (onRowsChange == null) return; - const { rowIdx, idx } = selectedPosition; - const column = columns[idx]; - const sourceRow = rows[rowIdx]; + const { idx } = activePosition; + const column = getActiveColumn(); + const sourceRow = getActiveRow(); const updatedRows = [...rows]; const indexes: number[] = []; for (let i = startRowIdx; i < endRowIdx; i++) { if (isCellEditable({ rowIdx: i, idx })) { - const updatedRow = onFill!({ columnKey: column.key, sourceRow, targetRow: rows[i] }); + const updatedRow = onFill!({ + columnKey: column.key, + sourceRow, + targetRow: rows[i] + }); if (updatedRow !== rows[i]) { updatedRows[i] = updatedRow; indexes.push(i); @@ -798,101 +809,93 @@ export function DataGrid(props: DataGridPr } } - /** - * utils - */ - function isColIdxWithinSelectionBounds(idx: number) { - return idx >= minColIdx && idx <= maxColIdx; - } - - function isRowIdxWithinViewportBounds(rowIdx: number) { - return rowIdx >= 0 && rowIdx < rows.length; - } - - function isCellWithinSelectionBounds({ idx, rowIdx }: Position): boolean { - return rowIdx >= minRowIdx && rowIdx <= maxRowIdx && isColIdxWithinSelectionBounds(idx); - } - - function isCellWithinEditBounds({ idx, rowIdx }: Position): boolean { - return isRowIdxWithinViewportBounds(rowIdx) && idx >= 0 && idx <= maxColIdx; - } - - function isCellWithinViewportBounds({ idx, rowIdx }: Position): boolean { - return isRowIdxWithinViewportBounds(rowIdx) && isColIdxWithinSelectionBounds(idx); - } - function isCellEditable(position: Position): boolean { return ( - isCellWithinEditBounds(position) && - isSelectedCellEditable({ columns, rows, selectedPosition: position }) + validatePosition(position).isCellInViewport && + isCellEditableUtil(columns[position.idx], rows[position.rowIdx]) ); } - function selectCell(position: Position, options?: SelectCellOptions): void { - if (!isCellWithinSelectionBounds(position)) return; + function setPosition(position: Position, options?: SetActivePositionOptions): void { + const { isPositionInActiveBounds } = validatePosition(position); + if (!isPositionInActiveBounds) return; commitEditorChanges(); - const samePosition = isSamePosition(selectedPosition, position); + const samePosition = isSamePosition(activePosition, position); if (options?.enableEditor && isCellEditable(position)) { const row = rows[position.rowIdx]; - setSelectedPosition({ ...position, mode: 'EDIT', row, originalRow: row }); + setActivePosition({ ...position, mode: 'EDIT', row, originalRow: row }); } else if (samePosition) { // Avoid re-renders if the selected cell state is the same scrollIntoView(getCellToScroll(gridRef.current!)); } else { - setShouldFocusCell(options?.shouldFocusCell === true); - setSelectedPosition({ ...position, mode: 'SELECT' }); + const newPosition: ActivePosition = { ...position, mode: 'ACTIVE' }; + setActivePosition(newPosition); + if (options?.shouldFocus) { + setPositionToFocus(newPosition); + } } - if (onSelectedCellChange && !samePosition) { - onSelectedCellChange({ + if (onActivePositionChange && !samePosition) { + onActivePositionChange({ rowIdx: position.rowIdx, - row: isRowIdxWithinViewportBounds(position.rowIdx) ? rows[position.rowIdx] : undefined, + row: rows[position.rowIdx], column: columns[position.idx] }); } } function selectHeaderCell({ idx, rowIdx }: Position): void { - selectCell({ rowIdx: minRowIdx + rowIdx - 1, idx }); + setPosition({ rowIdx: minRowIdx + rowIdx - 1, idx }); } function getNextPosition(key: string, ctrlKey: boolean, shiftKey: boolean): Position { - const { idx, rowIdx } = selectedPosition; - const isRowSelected = selectedCellIsWithinSelectionBounds && idx === -1; + const { idx, rowIdx } = activePosition; switch (key) { - case 'ArrowUp': - return { idx, rowIdx: rowIdx - 1 }; + case 'ArrowUp': { + const nextRowIdx = rowIdx - 1; + return { + // avoid selecting header rows + idx: idx === -1 && nextRowIdx < -topSummaryRowsCount ? 0 : idx, + rowIdx: nextRowIdx + }; + } case 'ArrowDown': return { idx, rowIdx: rowIdx + 1 }; - case leftKey: - return { idx: idx - 1, rowIdx }; + case leftKey: { + const nextIdx = idx - 1; + return { + // avoid selecting header rows + idx: rowIdx < -topSummaryRowsCount && nextIdx < 0 ? 0 : nextIdx, + rowIdx + }; + } case rightKey: return { idx: idx + 1, rowIdx }; case 'Tab': return { idx: idx + (shiftKey ? -1 : 1), rowIdx }; case 'Home': - // If row is selected then move focus to the first row - if (isRowSelected) return { idx, rowIdx: minRowIdx }; - return { idx: 0, rowIdx: ctrlKey ? minRowIdx : rowIdx }; + // If row is selected then move focus to the first header row's cell. + if (activePositionIsRow || ctrlKey) return { idx: 0, rowIdx: minRowIdx }; + return { idx: 0, rowIdx }; case 'End': // If row is selected then move focus to the last row. - if (isRowSelected) return { idx, rowIdx: maxRowIdx }; + if (activePositionIsRow) return { idx, rowIdx: maxRowIdx }; return { idx: maxColIdx, rowIdx: ctrlKey ? maxRowIdx : rowIdx }; case 'PageUp': { - if (selectedPosition.rowIdx === minRowIdx) return selectedPosition; + if (rowIdx === minRowIdx) return activePosition; const nextRowY = getRowTop(rowIdx) + getRowHeight(rowIdx) - clientHeight; return { idx, rowIdx: nextRowY > 0 ? findRowIdx(nextRowY) : 0 }; } case 'PageDown': { - if (selectedPosition.rowIdx >= rows.length) return selectedPosition; + if (rowIdx >= rows.length) return activePosition; const nextRowY = getRowTop(rowIdx) + clientHeight; return { idx, rowIdx: nextRowY < totalRowHeight ? findRowIdx(nextRowY) : rows.length - 1 }; } default: - return selectedPosition; + return activePosition; } } @@ -906,7 +909,7 @@ export function DataGrid(props: DataGridPr maxColIdx, minRowIdx, maxRowIdx, - selectedPosition + activePosition }) ) { commitEditorChanges(); @@ -922,9 +925,9 @@ export function DataGrid(props: DataGridPr const ctrlKey = isCtrlKeyHeldDown(event); const nextPosition = getNextPosition(key, ctrlKey, shiftKey); - if (isSamePosition(selectedPosition, nextPosition)) return; + if (isSamePosition(activePosition, nextPosition)) return; - const nextSelectedCellPosition = getNextSelectedCellPosition({ + const nextActivePosition = getNextActivePosition({ moveUp: key === 'ArrowUp', moveNext: key === rightKey || (key === 'Tab' && !shiftKey), columns, @@ -935,46 +938,43 @@ export function DataGrid(props: DataGridPr minRowIdx, mainHeaderRowIdx, maxRowIdx, - lastFrozenColumnIndex, + lastStartFrozenColumnIndex, + firstEndFrozenColumnIndex, cellNavigationMode, - currentPosition: selectedPosition, + activePosition, nextPosition, - isCellWithinBounds: isCellWithinSelectionBounds + nextPositionIsCellInActiveBounds: validatePosition(nextPosition).isCellInActiveBounds }); - selectCell(nextSelectedCellPosition, { shouldFocusCell: true }); + setPosition(nextActivePosition, { shouldFocus: true }); } function getDraggedOverCellIdx(currentRowIdx: number): number | undefined { if (draggedOverRowIdx === undefined) return; - const { rowIdx } = selectedPosition; + const { rowIdx } = activePosition; const isDraggedOver = rowIdx < draggedOverRowIdx ? rowIdx < currentRowIdx && currentRowIdx <= draggedOverRowIdx : rowIdx > currentRowIdx && currentRowIdx >= draggedOverRowIdx; - return isDraggedOver ? selectedPosition.idx : undefined; + return isDraggedOver ? activePosition.idx : undefined; } function getDragHandle() { - if ( - onFill == null || - selectedPosition.mode === 'EDIT' || - !isCellWithinViewportBounds(selectedPosition) - ) { + if (onFill == null || activePosition.mode !== 'ACTIVE' || !activePositionIsCellInViewport) { return; } - const { idx, rowIdx } = selectedPosition; - const column = columns[idx]; + const { rowIdx } = activePosition; + const column = getActiveColumn(); if (column.renderEditCell == null || column.editable === false) { return; } const isLastRow = rowIdx === maxRowIdx; const columnWidth = getColumnWidth(column); - const colSpan = column.colSpan?.({ type: 'ROW', row: rows[rowIdx] }) ?? 1; + const colSpan = column.colSpan?.({ type: 'ROW', row: getActiveRow() }) ?? 1; const { insetInlineStart, ...style } = getCellStyle(column, colSpan); const marginEnd = 'calc(var(--rdg-drag-handle-size) * -0.5 + 1px)'; const isLastColumn = column.idx + colSpan - 1 === maxColIdx; @@ -991,7 +991,11 @@ export function DataGrid(props: DataGridPr return (