diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e08a75c3ff..9604b7df12 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -26,11 +26,8 @@ updates: quality: patterns: - 'eslint' - - 'eslint-*' - '@eslint/*' - '@eslint-react/*' - - 'typescript-eslint' - - '@vitest/eslint-plugin' - 'oxfmt' - 'oxlint' - 'oxlint-*' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8a6fe2cb1a..5ad37218d9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,16 +20,15 @@ jobs: - name: Install dependencies run: npm ci - - name: Typecheck - run: node --run typecheck - - - name: ESLint - run: node --run eslint + - name: Lint + run: | + node --run lint + node --run lint:md - - name: Oxfmt + - name: Format run: node --run format:check - - name: Bundle + - name: Build lib run: node --run build - name: Build website diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index d9c733956a..df7403efd0 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -30,16 +30,15 @@ jobs: - name: Install dependencies run: npm ci - - name: Typecheck - run: node --run typecheck - - - name: ESLint - run: node --run eslint + - name: Lint + run: | + node --run lint + node --run lint:md - - name: Oxfmt + - name: Format run: node --run format:check - - name: Bundle + - name: Build lib run: node --run build - name: Build website diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000000..1af97163ac --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,592 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + + "plugins": ["eslint", "react", "typescript", "vitest"], + + "jsPlugins": ["@eslint-react/eslint-plugin"], + + "options": { + "denyWarnings": true, + "reportUnusedDisableDirectives": "warn", + "respectEslintDisableDirectives": false, + "typeAware": true, + "typeCheck": true + }, + + "env": { + "builtin": true + }, + + "ignorePatterns": [ + ".cache", + ".claude", + ".nitro", + ".output", + ".tanstack", + "coverage", + "dist", + "lib", + "website/routeTree.gen.ts" + ], + + // https://oxc.rs/docs/guide/usage/linter/rules.html + /* +// copy all the rules from the rules table for easy pasting +const groups = new Set(['eslint', 'oxc', 'react', 'typescript', 'vitest']); +copy( + Iterator.from(document.querySelectorAll('tbody tr')) + .map((row) => [ + row.children[1].textContent, + row.querySelector(':any-link').textContent + ]) + .filter(([group]) => groups.has(group)) + .map(([group, rule]) => `"${group}/${rule}": "warn",`) + .toArray() + .sort() + .join('\n') +); + */ + "rules": { + "eslint/accessor-pairs": "warn", + "eslint/array-callback-return": ["warn", { "checkForEach": true }], + "eslint/arrow-body-style": "off", + "eslint/block-scoped-var": "warn", + "eslint/capitalized-comments": "off", + "eslint/class-methods-use-this": "warn", + "eslint/complexity": "off", + "eslint/constructor-super": "off", + "eslint/curly": "off", + "eslint/default-case": "warn", + "eslint/default-case-last": "warn", + "eslint/default-param-last": "off", + "eslint/eqeqeq": ["warn", "always", { "null": "ignore" }], + "eslint/for-direction": "warn", + "eslint/func-name-matching": "off", + "eslint/func-names": "off", + "eslint/func-style": "off", + "eslint/getter-return": "warn", + "eslint/grouped-accessor-pairs": ["warn", "getBeforeSet"], + "eslint/guard-for-in": "off", + "eslint/id-denylist": "off", + "eslint/id-length": "off", + "eslint/id-match": "off", + "eslint/init-declarations": "off", + "eslint/logical-assignment-operators": ["warn", "always", { "enforceForIfStatements": true }], + "eslint/max-classes-per-file": "off", + "eslint/max-depth": "off", + "eslint/max-lines": "off", + "eslint/max-lines-per-function": "off", + "eslint/max-nested-callbacks": "off", + "eslint/max-params": "off", + "eslint/max-statements": "off", + "eslint/new-cap": "off", + "eslint/no-alert": "off", + "eslint/no-array-constructor": "warn", + "eslint/no-async-promise-executor": "warn", + "eslint/no-await-in-loop": "off", + "eslint/no-bitwise": "off", + "eslint/no-caller": "warn", + "eslint/no-case-declarations": "warn", + "eslint/no-class-assign": "off", + "eslint/no-compare-neg-zero": "warn", + "eslint/no-cond-assign": "warn", + "eslint/no-console": "warn", + "eslint/no-const-assign": "off", + "eslint/no-constant-binary-expression": "warn", + "eslint/no-constant-condition": "warn", + "eslint/no-constructor-return": "warn", + "eslint/no-continue": "off", + "eslint/no-control-regex": "warn", + "eslint/no-debugger": "warn", + "eslint/no-delete-var": "warn", + "eslint/no-div-regex": "off", + "eslint/no-dupe-class-members": "off", + "eslint/no-dupe-else-if": "warn", + "eslint/no-dupe-keys": "warn", + "eslint/no-duplicate-case": "warn", + "eslint/no-duplicate-imports": "off", + "eslint/no-else-return": ["warn", { "allowElseIf": false }], + "eslint/no-empty": ["warn", { "allowEmptyCatch": true }], + "eslint/no-empty-character-class": "warn", + "eslint/no-empty-function": "off", + "eslint/no-empty-pattern": "warn", + "eslint/no-empty-static-block": "warn", + "eslint/no-eq-null": "off", + "eslint/no-eval": "warn", + "eslint/no-ex-assign": "warn", + "eslint/no-extend-native": "warn", + "eslint/no-extra-bind": "warn", + "eslint/no-extra-boolean-cast": ["warn", { "enforceForLogicalOperands": true }], + "eslint/no-extra-label": "warn", + "eslint/no-fallthrough": ["warn", { "reportUnusedFallthroughComment": true }], + "eslint/no-func-assign": "warn", + "eslint/no-global-assign": "warn", + "eslint/no-implicit-coercion": "off", + "eslint/no-implicit-globals": "off", + "eslint/no-implied-eval": "off", + "eslint/no-import-assign": "warn", + "eslint/no-inline-comments": "off", + "eslint/no-inner-declarations": "off", + "eslint/no-invalid-regexp": "warn", + "eslint/no-irregular-whitespace": "warn", + "eslint/no-iterator": "warn", + "eslint/no-label-var": "warn", + "eslint/no-labels": "warn", + "eslint/no-lone-blocks": "warn", + "eslint/no-lonely-if": "warn", + "eslint/no-loop-func": "off", + "eslint/no-loss-of-precision": "warn", + "eslint/no-magic-numbers": "off", + "eslint/no-misleading-character-class": "warn", + "eslint/no-multi-assign": "off", + "eslint/no-multi-str": "warn", + "eslint/no-negated-condition": "off", + "eslint/no-nested-ternary": "off", + "eslint/no-new": "warn", + "eslint/no-new-func": "warn", + "eslint/no-new-native-nonconstructor": "warn", + "eslint/no-new-wrappers": "warn", + "eslint/no-nonoctal-decimal-escape": "warn", + "eslint/no-obj-calls": "warn", + "eslint/no-object-constructor": "warn", + "eslint/no-param-reassign": "off", + "eslint/no-plusplus": "off", + "eslint/no-promise-executor-return": "warn", + "eslint/no-proto": "warn", + "eslint/no-prototype-builtins": "warn", + "eslint/no-redeclare": "warn", + "eslint/no-regex-spaces": "warn", + "eslint/no-restricted-exports": "off", + "eslint/no-restricted-globals": [ + "warn", + { "name": "Omit", "message": "Use Omit from types instead." } + ], + "eslint/no-restricted-imports": "off", + "eslint/no-restricted-properties": "off", + "eslint/no-return-assign": "off", + "eslint/no-script-url": "warn", + "eslint/no-self-assign": "warn", + "eslint/no-self-compare": "warn", + "eslint/no-sequences": ["warn", { "allowInParentheses": false }], + "eslint/no-setter-return": "warn", + "eslint/no-shadow": "off", + "eslint/no-shadow-restricted-names": "warn", + "eslint/no-sparse-arrays": "warn", + "eslint/no-template-curly-in-string": "warn", + "eslint/no-ternary": "off", + "eslint/no-this-before-super": "off", + "eslint/no-throw-literal": "off", + "eslint/no-unassigned-vars": "warn", + "eslint/no-undef": "off", + "eslint/no-undefined": "off", + "eslint/no-underscore-dangle": "off", + "eslint/no-unexpected-multiline": "off", + "eslint/no-unmodified-loop-condition": "warn", + "eslint/no-unneeded-ternary": ["warn", { "defaultAssignment": false }], + "eslint/no-unreachable": "warn", + "eslint/no-unreachable-loop": "warn", + "eslint/no-unsafe-finally": "warn", + "eslint/no-unsafe-negation": ["warn", { "enforceForOrderingRelations": true }], + "eslint/no-unsafe-optional-chaining": ["warn", { "disallowArithmeticOperators": true }], + "eslint/no-unused-expressions": ["warn", { "enforceForJSX": true }], + "eslint/no-unused-labels": "warn", + "eslint/no-unused-private-class-members": "off", + "eslint/no-unused-vars": [ + "warn", + { "fix": { "imports": "safe-fix" }, "ignoreRestSiblings": true } + ], + "eslint/no-use-before-define": "off", + "eslint/no-useless-assignment": "warn", + "eslint/no-useless-backreference": "warn", + "eslint/no-useless-call": "warn", + "eslint/no-useless-catch": "warn", + "eslint/no-useless-computed-key": "warn", + "eslint/no-useless-concat": "warn", + "eslint/no-useless-constructor": "warn", + "eslint/no-useless-escape": "warn", + "eslint/no-useless-rename": "warn", + "eslint/no-useless-return": "warn", + "eslint/no-var": "warn", + "eslint/no-void": "warn", + "eslint/no-warning-comments": "off", + "eslint/no-with": "warn", + "eslint/object-shorthand": ["warn", "always", { "avoidExplicitReturnArrows": true }], + "eslint/one-var": ["warn", "never"], + "eslint/operator-assignment": "warn", + "eslint/prefer-arrow-callback": "warn", + "eslint/prefer-const": ["warn", { "destructuring": "all" }], + "eslint/prefer-destructuring": "off", + "eslint/prefer-exponentiation-operator": "warn", + "eslint/prefer-named-capture-group": "off", + "eslint/prefer-numeric-literals": "warn", + "eslint/prefer-object-has-own": "warn", + "eslint/prefer-object-spread": "warn", + "eslint/prefer-promise-reject-errors": "off", + "eslint/prefer-regex-literals": ["warn", { "disallowRedundantWrapping": true }], + "eslint/prefer-rest-params": "warn", + "eslint/prefer-spread": "warn", + "eslint/prefer-template": "warn", + "eslint/preserve-caught-error": "warn", + "eslint/radix": "warn", + "eslint/require-await": "off", + "eslint/require-unicode-regexp": "off", + "eslint/require-yield": "warn", + "eslint/sort-imports": "off", + "eslint/sort-keys": "off", + "eslint/sort-vars": "off", + "eslint/symbol-description": "warn", + "eslint/unicode-bom": "warn", + "eslint/use-isnan": ["warn", { "enforceForIndexOf": true }], + "eslint/valid-typeof": ["warn", { "requireStringLiterals": true }], + "eslint/vars-on-top": "off", + "eslint/yoda": "off", + "react/exhaustive-deps": "warn", + "react/rules-of-hooks": "warn", + "typescript/adjacent-overload-signatures": "warn", + "typescript/array-type": "warn", + "typescript/await-thenable": "warn", + "typescript/ban-ts-comment": ["warn", { "ts-expect-error": false }], + "typescript/ban-tslint-comment": "off", + "typescript/ban-types": "off", + "typescript/class-literal-property-style": "off", + "typescript/consistent-generic-constructors": "warn", + "typescript/consistent-indexed-object-style": "warn", + "typescript/consistent-return": "off", + "typescript/consistent-type-assertions": [ + "warn", + { + "arrayLiteralTypeAssertions": "never", + "objectLiteralTypeAssertions": "never" + } + ], + "typescript/consistent-type-definitions": "warn", + "typescript/consistent-type-exports": [ + "warn", + { "fixMixedExportsWithInlineTypeSpecifier": true } + ], + "typescript/consistent-type-imports": ["warn", { "fixStyle": "inline-type-imports" }], + "typescript/dot-notation": "warn", + "typescript/explicit-function-return-type": "off", + "typescript/explicit-member-accessibility": "off", + "typescript/explicit-module-boundary-types": "off", + "typescript/method-signature-style": "warn", + "typescript/no-array-delete": "warn", + "typescript/no-base-to-string": "off", + "typescript/no-confusing-non-null-assertion": "off", + "typescript/no-confusing-void-expression": ["warn", { "ignoreArrowShorthand": true }], + "typescript/no-deprecated": "warn", + "typescript/no-duplicate-enum-values": "warn", + "typescript/no-duplicate-type-constituents": "warn", + "typescript/no-dynamic-delete": "off", + "typescript/no-empty-interface": "off", + "typescript/no-empty-object-type": "warn", + "typescript/no-explicit-any": ["warn", { "fixToUnknown": true }], + "typescript/no-extra-non-null-assertion": "warn", + "typescript/no-extraneous-class": "warn", + "typescript/no-floating-promises": "off", + "typescript/no-for-in-array": "warn", + "typescript/no-implied-eval": "warn", + "typescript/no-import-type-side-effects": "warn", + "typescript/no-inferrable-types": "warn", + "typescript/no-invalid-void-type": "warn", + "typescript/no-meaningless-void-operator": "warn", + "typescript/no-misused-new": "warn", + "typescript/no-misused-promises": "off", + "typescript/no-misused-spread": "warn", + "typescript/no-mixed-enums": "warn", + "typescript/no-namespace": "warn", + "typescript/no-non-null-asserted-nullish-coalescing": "warn", + "typescript/no-non-null-asserted-optional-chain": "warn", + "typescript/no-non-null-assertion": "off", + "typescript/no-redundant-type-constituents": "warn", + "typescript/no-require-imports": "warn", + "typescript/no-restricted-types": "off", + "typescript/no-this-alias": "warn", + "typescript/no-unnecessary-boolean-literal-compare": "warn", + "typescript/no-unnecessary-condition": [ + "warn", + { + "allowConstantLoopConditions": "only-allowed-literals", + "checkTypePredicates": true + } + ], + "typescript/no-unnecessary-parameter-property-assignment": "warn", + "typescript/no-unnecessary-qualifier": "off", + "typescript/no-unnecessary-template-expression": "warn", + "typescript/no-unnecessary-type-arguments": "warn", + "typescript/no-unnecessary-type-assertion": "warn", + "typescript/no-unnecessary-type-constraint": "warn", + "typescript/no-unnecessary-type-conversion": "warn", + "typescript/no-unnecessary-type-parameters": "warn", + "typescript/no-unsafe-argument": "off", + "typescript/no-unsafe-assignment": "off", + "typescript/no-unsafe-call": "off", + "typescript/no-unsafe-declaration-merging": "warn", + "typescript/no-unsafe-enum-comparison": "warn", + "typescript/no-unsafe-function-type": "warn", + "typescript/no-unsafe-member-access": "off", + "typescript/no-unsafe-return": "off", + "typescript/no-unsafe-type-assertion": "off", + "typescript/no-unsafe-unary-minus": "warn", + "typescript/no-useless-default-assignment": "warn", + "typescript/no-useless-empty-export": "warn", + "typescript/no-var-requires": "off", + "typescript/no-wrapper-object-types": "warn", + "typescript/non-nullable-type-assertion-style": "warn", + "typescript/only-throw-error": [ + "warn", + { + "allow": [ + { + "from": "package", + "package": "@tanstack/router-core", + "name": ["NotFoundError", "Redirect"] + } + ] + } + ], + "typescript/parameter-properties": "warn", + "typescript/prefer-as-const": "warn", + "typescript/prefer-enum-initializers": "warn", + "typescript/prefer-find": "warn", + "typescript/prefer-for-of": "warn", + "typescript/prefer-function-type": "warn", + "typescript/prefer-includes": "warn", + "typescript/prefer-literal-enum-member": "warn", + "typescript/prefer-namespace-keyword": "warn", + "typescript/prefer-nullish-coalescing": [ + "warn", + { + "ignoreConditionalTests": false, + "ignorePrimitives": true + } + ], + "typescript/prefer-optional-chain": "warn", + "typescript/prefer-promise-reject-errors": "warn", + "typescript/prefer-readonly": "warn", + "typescript/prefer-readonly-parameter-types": "off", + "typescript/prefer-reduce-type-parameter": "warn", + "typescript/prefer-regexp-exec": "warn", + "typescript/prefer-return-this-type": "warn", + "typescript/prefer-string-starts-ends-with": "warn", + "typescript/prefer-ts-expect-error": "warn", + "typescript/promise-function-async": "off", + "typescript/related-getter-setter-pairs": "off", + "typescript/require-array-sort-compare": "warn", + "typescript/require-await": "warn", + "typescript/restrict-plus-operands": [ + "warn", + { + "allowAny": false, + "allowBoolean": false, + "allowNullish": false, + "allowNumberAndString": false, + "allowRegExp": false + } + ], + "typescript/restrict-template-expressions": "off", + "typescript/return-await": "warn", + "typescript/strict-boolean-expressions": "off", + "typescript/strict-void-return": "off", + "typescript/switch-exhaustiveness-check": "warn", + "typescript/triple-slash-reference": ["warn", { "lib": "never", "types": "never" }], + "typescript/unbound-method": "off", + "typescript/unified-signatures": "off", + "typescript/use-unknown-in-catch-callback-variable": "warn", + "@eslint-react/error-boundaries": "warn", + "@eslint-react/exhaustive-deps": "warn", + "@eslint-react/globals": "warn", + "@eslint-react/immutability": "off", + "@eslint-react/no-access-state-in-setstate": "warn", + "@eslint-react/no-array-index-key": "off", + "@eslint-react/no-children-count": "warn", + "@eslint-react/no-children-for-each": "warn", + "@eslint-react/no-children-map": "warn", + "@eslint-react/no-children-only": "warn", + "@eslint-react/no-children-to-array": "warn", + "@eslint-react/no-class-component": "warn", + "@eslint-react/no-clone-element": "warn", + "@eslint-react/no-component-will-mount": "warn", + "@eslint-react/no-component-will-receive-props": "warn", + "@eslint-react/no-component-will-update": "warn", + "@eslint-react/no-context-provider": "warn", + "@eslint-react/no-create-ref": "warn", + "@eslint-react/no-direct-mutation-state": "warn", + "@eslint-react/no-duplicate-key": "warn", + "@eslint-react/no-forward-ref": "warn", + "@eslint-react/no-implicit-children": "off", + "@eslint-react/no-implicit-key": "off", + "@eslint-react/no-implicit-ref": "off", + "@eslint-react/no-leaked-conditional-rendering": "off", + "@eslint-react/no-missing-component-display-name": "warn", + "@eslint-react/no-missing-context-display-name": "warn", + "@eslint-react/no-missing-key": "warn", + "@eslint-react/no-misused-capture-owner-stack": "warn", + "@eslint-react/no-nested-component-definitions": "warn", + "@eslint-react/no-nested-lazy-component-declarations": "warn", + "@eslint-react/no-set-state-in-component-did-mount": "warn", + "@eslint-react/no-set-state-in-component-did-update": "warn", + "@eslint-react/no-set-state-in-component-will-update": "warn", + "@eslint-react/no-unnecessary-use-prefix": "warn", + "@eslint-react/no-unsafe-component-will-mount": "warn", + "@eslint-react/no-unsafe-component-will-receive-props": "warn", + "@eslint-react/no-unsafe-component-will-update": "warn", + "@eslint-react/no-unstable-context-value": "warn", + "@eslint-react/no-unstable-default-props": "warn", + "@eslint-react/no-unused-class-component-members": "warn", + "@eslint-react/no-unused-props": "off", + "@eslint-react/no-unused-state": "warn", + "@eslint-react/no-use-context": "warn", + "@eslint-react/purity": "warn", + "@eslint-react/refs": "warn", + "@eslint-react/rules-of-hooks": "warn", + "@eslint-react/set-state-in-effect": "off", + "@eslint-react/set-state-in-render": "warn", + "@eslint-react/static-components": "warn", + "@eslint-react/unsupported-syntax": "warn", + "@eslint-react/use-memo": "warn", + "@eslint-react/use-state": "warn", + "@eslint-react/jsx-no-children-prop": "warn", + "@eslint-react/jsx-no-children-prop-with-children": "warn", + "@eslint-react/jsx-no-comment-textnodes": "warn", + "@eslint-react/jsx-no-key-after-spread": "warn", + "@eslint-react/jsx-no-leaked-dollar": "warn", + "@eslint-react/jsx-no-leaked-semicolon": "warn", + "@eslint-react/jsx-no-namespace": "warn", + "@eslint-react/jsx-no-useless-fragment": [ + "warn", + { + "allowExpressions": false + } + ], + "@eslint-react/rsc-function-definition": "warn", + "@eslint-react/dom-no-dangerously-set-innerhtml": "warn", + "@eslint-react/dom-no-dangerously-set-innerhtml-with-children": "warn", + "@eslint-react/dom-no-find-dom-node": "warn", + "@eslint-react/dom-no-flush-sync": "off", + "@eslint-react/dom-no-hydrate": "warn", + "@eslint-react/dom-no-missing-button-type": "warn", + "@eslint-react/dom-no-missing-iframe-sandbox": "warn", + "@eslint-react/dom-no-render": "warn", + "@eslint-react/dom-no-render-return-value": "warn", + "@eslint-react/dom-no-script-url": "warn", + "@eslint-react/dom-no-string-style-prop": "warn", + "@eslint-react/dom-no-unknown-property": "warn", + "@eslint-react/dom-no-unsafe-iframe-sandbox": "warn", + "@eslint-react/dom-no-unsafe-target-blank": "warn", + "@eslint-react/dom-no-use-form-state": "warn", + "@eslint-react/dom-no-void-elements-with-children": "warn", + "@eslint-react/web-api-no-leaked-event-listener": "warn", + "@eslint-react/web-api-no-leaked-fetch": "warn", + "@eslint-react/web-api-no-leaked-intersection-observer": "warn", + "@eslint-react/web-api-no-leaked-interval": "warn", + "@eslint-react/web-api-no-leaked-resize-observer": "warn", + "@eslint-react/web-api-no-leaked-timeout": "warn", + "@eslint-react/naming-convention-context-name": "warn", + "@eslint-react/naming-convention-id-name": "warn", + "@eslint-react/naming-convention-ref-name": "warn" + }, + + "overrides": [ + { + "files": ["test/**/*"], + + "rules": { + "vitest/consistent-each-for": "warn", + "vitest/consistent-test-filename": "off", + "vitest/consistent-test-it": "warn", + "vitest/consistent-vitest-vi": "warn", + "vitest/expect-expect": "off", + "vitest/hoisted-apis-on-top": "warn", + "vitest/max-expects": "off", + "vitest/max-nested-describe": "off", + "vitest/no-alias-methods": "warn", + "vitest/no-commented-out-tests": "warn", + "vitest/no-conditional-expect": "warn", + "vitest/no-conditional-in-test": "off", + "vitest/no-conditional-tests": "warn", + "vitest/no-disabled-tests": "off", + "vitest/no-duplicate-hooks": "warn", + "vitest/no-focused-tests": "warn", + "vitest/no-hooks": "off", + "vitest/no-identical-title": "warn", + "vitest/no-import-node-test": "warn", + "vitest/no-importing-vitest-globals": "warn", + "vitest/no-interpolation-in-snapshots": "off", + "vitest/no-large-snapshots": "off", + "vitest/no-mocks-import": "warn", + "vitest/no-restricted-matchers": "off", + "vitest/no-restricted-vi-methods": "off", + "vitest/no-standalone-expect": [ + "warn", + { + "additionalTestBlockFunctions": [ + "beforeAll", + "beforeEach", + "afterAll", + "afterEach", + "aroundAll", + "aroundEach" + ] + } + ], + "vitest/no-test-prefixes": "warn", + "vitest/no-test-return-statement": "warn", + "vitest/no-unneeded-async-expect-function": "warn", + "vitest/padding-around-after-all-blocks": "off", + "vitest/padding-around-test-blocks": "off", + "vitest/prefer-called-exactly-once-with": "warn", + "vitest/prefer-called-once": "warn", + "vitest/prefer-called-times": "off", + "vitest/prefer-called-with": "off", + "vitest/prefer-comparison-matcher": "warn", + "vitest/prefer-describe-function-title": "off", + "vitest/prefer-each": "warn", + "vitest/prefer-equality-matcher": "warn", + "vitest/prefer-expect-assertions": "off", + "vitest/prefer-expect-resolves": "warn", + "vitest/prefer-expect-type-of": "warn", + "vitest/prefer-hooks-in-order": "warn", + "vitest/prefer-hooks-on-top": "warn", + "vitest/prefer-import-in-mock": "warn", + "vitest/prefer-importing-vitest-globals": "off", + "vitest/prefer-lowercase-title": "off", + "vitest/prefer-mock-promise-shorthand": "warn", + "vitest/prefer-mock-return-shorthand": "warn", + "vitest/prefer-snapshot-hint": "off", + "vitest/prefer-spy-on": "warn", + "vitest/prefer-strict-boolean-matchers": "warn", + "vitest/prefer-strict-equal": "warn", + "vitest/prefer-to-be": "warn", + "vitest/prefer-to-be-falsy": "off", + "vitest/prefer-to-be-object": "warn", + "vitest/prefer-to-be-truthy": "off", + "vitest/prefer-to-contain": "warn", + "vitest/prefer-to-have-been-called-times": "warn", + "vitest/prefer-to-have-length": "warn", + "vitest/prefer-todo": "warn", + "vitest/require-awaited-expect-poll": "warn", + "vitest/require-hook": "off", + "vitest/require-local-test-context-for-concurrent-snapshots": "off", + "vitest/require-mock-type-parameters": "off", + "vitest/require-test-timeout": "off", + "vitest/require-to-throw-message": "warn", + "vitest/require-top-level-describe": "off", + "vitest/valid-describe-callback": "warn", + "vitest/valid-expect": "warn", + "vitest/valid-expect-in-promise": "warn", + "vitest/valid-title": "warn", + "vitest/warn-todo": "warn", + "typescript/no-floating-promises": "warn" + } + }, + + { + "files": ["test/failOnConsole.ts"], + + "rules": { + "eslint/no-console": "off" + } + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 4a59117848..ef152ac97d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,10 +7,13 @@ }, "editor.defaultFormatter": "oxc.oxc-vscode", "js/ts.experimental.useTsgo": true, - "eslint.options": { - "flags": ["unstable_native_nodejs_ts_config"] - }, + // ESLint is only used for markdown; JS/TS is linted by the oxc extension + "eslint.validate": ["markdown"], "eslint.problems.shortenToSingleLine": true, + "oxc.path.tsgolint": "node_modules/.bin/tsgolint.cmd", + "terminal.integrated.env.windows": { + "OXLINT_TSGOLINT_PATH": "node_modules/.bin/tsgolint.cmd" + }, "files.readonlyInclude": { "**/routeTree.gen.ts": true }, diff --git a/AGENTS.md b/AGENTS.md index 008aa423b8..ac8c5d6180 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -5,9 +5,9 @@ ```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 lint # oxlint +node --run lint:md # eslint --max-warnings 0 (markdown only) +node --run lint:fix # oxlint --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 @@ -59,4 +59,4 @@ website/ # demo site (Vite + TanStack Router) ## Validation -Run before submitting changes: `node --run typecheck`, `node --run eslint`, `node --run format`, `node --run test`. +Run before submitting changes: `node --run lint`, `node --run format`, `node --run test`. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000000..43c994c2d3 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/README.md b/README.md index 7ad7807480..9e967be8df 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ import 'react-data-grid/lib/styles.css'; `react-data-grid` is published as ECMAScript modules for evergreen browsers, bundlers, and server-side rendering. -> **Important**
+> **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 diff --git a/eslint.config.ts b/eslint.config.ts index 2e47a7ffae..a5b113dc3a 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -1,13 +1,19 @@ -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']), + globalIgnores([ + '.cache', + '.claude', + '.nitro', + '.output', + '.tanstack', + 'coverage', + 'dist', + 'lib', + // linted by oxlint + '**/*.{js,ts,tsx}' + ]), { linterOptions: { @@ -15,1003 +21,6 @@ export default defineConfig([ } }, - { - 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'], @@ -1047,7 +56,7 @@ copy( 'markdown/no-empty-definitions': 1, 'markdown/no-empty-images': 1, 'markdown/no-empty-links': 1, - 'markdown/no-html': [1, { allowed: ['br', 'kbd'] }], + 'markdown/no-html': [1, { allowed: ['kbd'] }], 'markdown/no-invalid-label-refs': 1, 'markdown/no-missing-atx-heading-space': 1, 'markdown/no-missing-label-refs': 1, diff --git a/package-lock.json b/package-lock.json index 91a94bd49a..46d41eb045 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,21 +22,19 @@ "@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.64.0", - "playwright": "~1.62.1", + "oxfmt": "^0.65.0", + "oxlint": "^1.80.0", + "oxlint-tsgolint": "^7.0.2001", + "playwright": "^1.62.1", "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" @@ -47,13 +45,13 @@ } }, "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==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -62,9 +60,9 @@ } }, "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==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", "engines": { @@ -72,21 +70,21 @@ } }, "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==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "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", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -103,14 +101,14 @@ } }, "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==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -120,14 +118,14 @@ } }, "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==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -137,9 +135,9 @@ } }, "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==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", "engines": { @@ -147,29 +145,29 @@ } }, "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==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "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==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -179,9 +177,9 @@ } }, "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==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", "engines": { @@ -189,9 +187,9 @@ } }, "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==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", "engines": { @@ -199,9 +197,9 @@ } }, "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==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "engines": { @@ -209,27 +207,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "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==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -249,33 +247,33 @@ } }, "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==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "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==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "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", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { @@ -283,14 +281,14 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -726,9 +724,9 @@ } }, "node_modules/@oxfmt/binding-android-arm-eabi": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.64.0.tgz", - "integrity": "sha512-o6uzh/jTOQeAY5TdkAeXdqv7MBRcPxiRA08zrcBtkKj5cSu/FMu0Hl7Q6Fi1KCKyCWZ6lJVjBzdsJvsKltUsGQ==", + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.65.0.tgz", + "integrity": "sha512-M10Gs1SSpTNI6ahGx3M/OlIdUF4hkaP6OgUb+MS79t/Pgflk3r1nW5gPFqsZGUAXg0H1AfANT9AvLdBSTIhZKg==", "cpu": [ "arm" ], @@ -743,9 +741,9 @@ } }, "node_modules/@oxfmt/binding-android-arm64": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.64.0.tgz", - "integrity": "sha512-jRGSUeeP7p3Gynw2YaCVtjBIA6ZxY6bEB/ES5i54OhqmRTyuVg7ZgstEtzgq6GOAJd+2QZ5pvf+bFfmW5Mp9cw==", + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.65.0.tgz", + "integrity": "sha512-6DXH5sftNlaHpWJG50hFMF+Qxtq5D2TmahvcDPxWNcGIf8qrC9Y0YgHYcYZ2hlWzaccKXh/f3GcssH8vtkl4JA==", "cpu": [ "arm64" ], @@ -760,9 +758,9 @@ } }, "node_modules/@oxfmt/binding-darwin-arm64": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.64.0.tgz", - "integrity": "sha512-JINwtU2lW7nOFSqi+H2qplipNUqah9Gc1jgGmB82kTD4UnZrZIVxCJ9qEmFiKfjNq27gYLFhrUb0to86aCwMjw==", + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.65.0.tgz", + "integrity": "sha512-K9m7lr53pcOLETNsC88sWes/GWHUGjZyHx95UhYcSXy0r30haLdeXlSufSenEAtoLaW753WN8/l4M7GYcRt6cg==", "cpu": [ "arm64" ], @@ -777,9 +775,9 @@ } }, "node_modules/@oxfmt/binding-darwin-x64": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.64.0.tgz", - "integrity": "sha512-gCmuswrgrOSajV4HCRFkVCGIruPq8bjYuPYgSE2WQB3mD6XrdyZ3JMSRZCkQ8zCxOyGWriBo6QoZ5nmMHQ1BfA==", + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.65.0.tgz", + "integrity": "sha512-sTNwIx1gre3MyiHOPLu7IGW4UyMScYL4DTmJT01p4vzB0En+OJUQz6KuH8t0PpsClRSaMuY3b0QmtoPItfO8Lg==", "cpu": [ "x64" ], @@ -794,9 +792,9 @@ } }, "node_modules/@oxfmt/binding-freebsd-x64": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.64.0.tgz", - "integrity": "sha512-Ab8g7a38pT0MMImjh7anRSTve6buWBIlcXIFBYa5xl4s6UxEgKSc2xOOhbGtLwvXnEi2PsEDGoJh3oUU7xkehQ==", + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.65.0.tgz", + "integrity": "sha512-lYZMVIiIpnjGu5hJb2jxA8NYQ/e0OTGuaiAf4dqlGPNnPmUTu23FZRMltmjro/KkQm1uE4NT4n5yJ2zWmKcpfA==", "cpu": [ "x64" ], @@ -811,9 +809,9 @@ } }, "node_modules/@oxfmt/binding-linux-arm-gnueabihf": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.64.0.tgz", - "integrity": "sha512-BgvS3CoQ+Xy2deoZqEN8JVKabcCZi2RxA3yant8G9OAv9KuPJ9TCjHkqigzdHUVwErZxEP5d2bzLIEyKYyBDLg==", + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.65.0.tgz", + "integrity": "sha512-gIdXFAt/bURnjxuoedDEWdZ0PEWEmdDcm8qdpoFYYvW3QMk/5D4vUaH4mlMeRpeTdST4izUgHVO6RawQ4QulJw==", "cpu": [ "arm" ], @@ -828,9 +826,9 @@ } }, "node_modules/@oxfmt/binding-linux-arm-musleabihf": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.64.0.tgz", - "integrity": "sha512-QXpNxwoMj0YvnceCNZadNSden3bIcnvjn/sDp/rwZhRoZoZYGpHvtPyhGsdJz9uvT9GkaMW7SsLddurU56dt8w==", + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.65.0.tgz", + "integrity": "sha512-jJVyADto7gA2AaX5qAjAexrxx9PJQaKWOe8PICE7yKMbjBRyOHcmj9TtVJ+MZYDUQ3hodU0AcoTj0jFQ1W4C6Q==", "cpu": [ "arm" ], @@ -845,9 +843,9 @@ } }, "node_modules/@oxfmt/binding-linux-arm64-gnu": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.64.0.tgz", - "integrity": "sha512-BBgH3I1ppDsI5pZ4Pdhw0ceYxwVCfbU/bZEBCeZ6caRS9x0ZabErxubP7riGUn11PXZBhe8DYdjkDKP1FlVQ5w==", + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.65.0.tgz", + "integrity": "sha512-p3RFkB+u7u+8up99b/NEcI1hdpLDiGgJYNwDorB60n7eH+eKposAKuMBxx+NqB3b+sJP4CZmYDh9G7X62tUsKg==", "cpu": [ "arm64" ], @@ -865,9 +863,9 @@ } }, "node_modules/@oxfmt/binding-linux-arm64-musl": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.64.0.tgz", - "integrity": "sha512-v19HSjC/BGXdt26qEvKZtwAHgGmQ2Agcap2kQP+KIqoRZqivVzYth3ui2dJA1i+6/fjpjga85lIOaJJjQ/bOOw==", + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.65.0.tgz", + "integrity": "sha512-5Prb0uFzJHr+OUD/qS/TmU526wD+PaHDsm3KoRiUXbMIDpTSErjeQYkK3OQeshAvD/PuLa9WGEi9WPajjdOZJg==", "cpu": [ "arm64" ], @@ -885,9 +883,9 @@ } }, "node_modules/@oxfmt/binding-linux-ppc64-gnu": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.64.0.tgz", - "integrity": "sha512-PElLnOo4xFTBZrxPhgTIj0eHqZXwEBQoNWtb7facUV170T0B0FRET0iNbb3LUeLWTybkUW+vsdyv4ihOdyXGyw==", + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.65.0.tgz", + "integrity": "sha512-S8svxTp81obnF3admN9yd+u2rOYXtyzThLGBTg1PY6TPtGcC09BaaXLQD+TBSMa7yvqhCDZ8DFri+S/yG60qCg==", "cpu": [ "ppc64" ], @@ -905,9 +903,9 @@ } }, "node_modules/@oxfmt/binding-linux-riscv64-gnu": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.64.0.tgz", - "integrity": "sha512-Qzsg15n4F5CH+MorcRW4MkAEMiLzXmeG+DiDSbP/bBTqCmWOH3K9DHryNrve+JHlV0txS+B6Z9P5Xz+cmWeL+g==", + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.65.0.tgz", + "integrity": "sha512-WtXBr75G/h2qOHy8SiGtC1R6aS3jt4mE52v1D8AtwMXIgoOmSNP9lKvbSaTRoL0e5wsMPoi6T72QWDYPu+S+nA==", "cpu": [ "riscv64" ], @@ -925,9 +923,440 @@ } }, "node_modules/@oxfmt/binding-linux-riscv64-musl": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.64.0.tgz", - "integrity": "sha512-/GZ358wnQ/Ez4UVnCcZIi56JkY0sOdZ+B108pqXKqZz3jLS59F4KEAB1Qv3fRlObrFEk+3L2vUQ/xoPx+3vjXw==", + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.65.0.tgz", + "integrity": "sha512-YwSLVvpaz4o/nv/miiPEBJz+eJ+VmbgNIrao6RccK9ce+L5EA8wP+ZD0uFeq6wKOza6zoWv/dR0sj6lip6R3EA==", + "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.65.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.65.0.tgz", + "integrity": "sha512-XQTPqgvyrgkKcFq+Tp2eK6JS7sqqJ+nRmy2Fav4j3I+i4dJoPJm7YwEdoeSDX9xkqj9jZ/lWfF3bXUWztIrn6A==", + "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.65.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.65.0.tgz", + "integrity": "sha512-cjZlx6S/VkeCNWCbwZriTnLnZeTcV3DEyeRGSw/2wwLP9viq+C0bJ4bC1k/ZLkFxDcB1lUgSasPkYGP1bdraOg==", + "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.65.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.65.0.tgz", + "integrity": "sha512-2azCjxdLtK4zCcIOU1dlXlU0xxfbPi6EjwWx7Ac7teWPidIIDOcIhudup83xNCKYhtqeVd/gaVDOxbUq4syXWA==", + "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.65.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.65.0.tgz", + "integrity": "sha512-KXQ7xi1e/voP0IQaw6fG6XY4Z5+Llf1XmRSZS1t7pVFCecFJ0iXaboKmVwjFtp5MLlT5iWQrJ2U1C3GJdZ2u+Q==", + "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.65.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.65.0.tgz", + "integrity": "sha512-2FbbjG5jEqLSLKVJwBap84uJfpn5Y5A53KEO0aUNr+zeiRB9nyPUIFMcSbZVMFLitfBytFWRNngozXYjb6Rsbw==", + "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.65.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.65.0.tgz", + "integrity": "sha512-LJ+ZacAPSjegDOnSLyA1TMWAhdDrsK4el3REdr1oL2UtVBCMhO2II/Sb3cEW6mF2MfLhl8hDNCSvc7KSbgk3LQ==", + "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.65.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.65.0.tgz", + "integrity": "sha512-higu9cWEO6XXFzATD1jf0mCK34rNfN2H9JrJie7QB1IhleVpTh0QlLH9Ip2C1H/Nd5n0v5pvRtC+5R0uE4HpVg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint-tsgolint/darwin-arm64": { + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-7.0.2001.tgz", + "integrity": "sha512-CUJEdbSZ54+Xy9OXqOhWLTKZKV0BBiV7C2i/ygyVmXtkUNXx5YCzN8DpSSshTAKktoL7S+tnQ/ftFG/i7X896w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxlint-tsgolint/darwin-x64": { + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-x64/-/darwin-x64-7.0.2001.tgz", + "integrity": "sha512-pXfBb5BqONCcgrXQNUZWXgiYmRSWJzd97S8i41VVOh6ut0tyo+cJ5FKFpczDHxiVNfj/3e7c9B4MtztNdpIVCw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxlint-tsgolint/linux-arm64": { + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-arm64/-/linux-arm64-7.0.2001.tgz", + "integrity": "sha512-roP7zujb/QDPzDwEKsFFpzNHHy91/Y7oX9vQXk78ekyZtcQj1QXDIMH33gjDdHBfRl4K9pZ36xhRgrP4Zr+R8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxlint-tsgolint/linux-x64": { + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-x64/-/linux-x64-7.0.2001.tgz", + "integrity": "sha512-UDezNqdECVmngu2TPnjaS1YoAmcTaBoI5lV9vk3VahBxoi+I5r9k3iJTT7qZoYWOXTD/7T7bNcwRgrocR6BscQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxlint-tsgolint/win32-arm64": { + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-arm64/-/win32-arm64-7.0.2001.tgz", + "integrity": "sha512-uJZhqB6pdXLuN+AD1F5082byyQti/NPmJA77GtcFlmT2HzRelqbNls3SaIqxpjdFgvSBF9g0yOKGBkGFg7kX8Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@oxlint-tsgolint/win32-x64": { + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-x64/-/win32-x64-7.0.2001.tgz", + "integrity": "sha512-FkDRm8hx9OwzGQqyWG1tO5QrTLRApff9DzSgpz9QZau37BR8d1VYKOxMLGf6shPZntJFoTwIIJYT68VndYDCog==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.80.0.tgz", + "integrity": "sha512-RM3Plj+biQpxa5d1GOOX6ciDlcUROmm4OZ/pLTpitkQt2mJv4jhtY4cbgaetOm5UKWZe05/TGQ6o1Vl8EOHkrA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.80.0.tgz", + "integrity": "sha512-YlO5JEf0Yr2bUUlu8O8daVcUxtcGGbcSmyV7E7nSbJbfAdxTE0PFPwgnIlw7wXJaTYjb+qs5hI5q3jxUkI7cAw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.80.0.tgz", + "integrity": "sha512-BULDOyO3AhsmdWfQeIUCykDt3dd7XZBGLhp1eIh56skRv01O+cNjNPwXMIbeW1x4+pxcln5if72wcRgViVo7PA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.80.0.tgz", + "integrity": "sha512-YJ4JzLw7N5TDSQFlA0hAQGHvnDZgyypm1yunObVWcWiF9KM7eGCJKYKLgTC2Fi/57OdnBhbj4OkzPGdFQJ6HyA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.80.0.tgz", + "integrity": "sha512-AYUIk5QnL0s8oWAYsREZwkRYy1SupJTXALo93J1TgzHywxQtdM99FecRMQ87MXEdPQ0j1TmEpeeq3fGNkpvMqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.80.0.tgz", + "integrity": "sha512-9hBZVANupQ89W9dXyE0n8doCyaW5pDyGn3y6XlIMPZ+rIKuyqkr3SNUXmVJIhuvUq0NBU3RBiSXXE69l4XI6KA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.80.0.tgz", + "integrity": "sha512-SvS2uKqzY+pbfuvAHzH4338R6Zwo805GAwrIMVvK1KxoOWCIjZUdfzTCvilD7z6JK91v011+zYMryabhDo2AsQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.80.0.tgz", + "integrity": "sha512-tCLadyqRVL3pQTRPNg7cjXKvcvS4fbyXeQHhKk5BTJ1oftQln5/yIIWbu/Xom/DX41zv2P9QGt6+D/TtQVtY3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.80.0.tgz", + "integrity": "sha512-XfpCNRlOPcLlJl4Bn/FUhjqlR6BVavEykERBf/MV7YA9VZDa5g5znVqYhyviMafcxS9Pe/i/kPvHNO0U6svEHQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.80.0.tgz", + "integrity": "sha512-3I4yMwcFG9NeO8ioY6JBBuKsIm5GL/x7MATt1S4tVWaxPu5HcJ+XnLUbcVBTxG8q2Wu56HSj+NmXQiVYb1lp6A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.80.0.tgz", + "integrity": "sha512-E1wAKymkpe1/E8helzBKdm81OBOF+ezxRyXRMEuik3ZpWDER5CPOKZwF66RsdwW98uwZv8UTFremUQtC1CzdJA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.80.0.tgz", + "integrity": "sha512-+gLRGD4sIo3+VA++iham5UxD9tKSoJ/VOrROCEXIcknrYtQg6iIQgvjN0cpiRF7N6UYC7pJbvHJlDnMge5LRpQ==", "cpu": [ "riscv64" ], @@ -944,10 +1373,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-linux-s390x-gnu": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.64.0.tgz", - "integrity": "sha512-/C9We3DXegowfLXtVCYHeNiU9azwCDr5cQkEtCVlc74vyn+lLQSPApJ1CZmxAduqeq/Oi3gQ+IVptyhCaTMtkQ==", + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.80.0.tgz", + "integrity": "sha512-aR0PrzHj9leW3NmzBAAP4EzdoBNoJcs9sjnIQPIwyRnBGYrRbXUIpEB5Q39AqK3PLY5JK5uEhDQDiUa1QSAstw==", "cpu": [ "s390x" ], @@ -964,10 +1393,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-linux-x64-gnu": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.64.0.tgz", - "integrity": "sha512-91KM2CeRWscIEHlj1NsW2WSnzGeq1Ehq+39bfDowTdkn+fcvK/x4Y1RcyqT7glyBjZio0ldkeCG6Usj3v7ASog==", + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.80.0.tgz", + "integrity": "sha512-vSVh5cSo3Xxs6ghBCcFJlpbkbENzDog1qXtoXLa/HC3aCrR4XO76GZbXmQoCPHnu99nQpdCeC3H9tdNICfDh7A==", "cpu": [ "x64" ], @@ -984,10 +1413,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-linux-x64-musl": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.64.0.tgz", - "integrity": "sha512-gw7uEk9I+7zoT1EYLra1eWArIzNcz8e3jkv+Noo2+o2T7wPvsNSQbfoa4DSfZlvn1i6mJ05RiZ4/omaXPDNhQg==", + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.80.0.tgz", + "integrity": "sha512-FfzBXpNQ8u7/ZI/p8bl73MeZ508Ax3hxWp3SiJpEFiC+BB9XcXy5FAZHTLKDPSzrUpxQZSZJAVdDmuJp/+HDBQ==", "cpu": [ "x64" ], @@ -1004,10 +1433,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-openharmony-arm64": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.64.0.tgz", - "integrity": "sha512-HYHFf616FHSPSO07c09mjmXBfQ73wIVM3m0txOiooa5XZkGoxFd6B14PVj0LB0DXIqJ6wAO/dDR/NX/5UUaqnw==", + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.80.0.tgz", + "integrity": "sha512-zMzbkumtmprCgRwoYNzcB3iC39fXdJIMLMU33KdCjEGLlJGOEt1+LwQ4LF8ndLzAEKVz4BR0y3V6Xrkk3Nm3yA==", "cpu": [ "arm64" ], @@ -1021,10 +1450,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-win32-arm64-msvc": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.64.0.tgz", - "integrity": "sha512-uQjFp081IZSWD6VAofX2iO2z01awAdHmfC+NrieWIPKrT2hZKQDyq/U18M7ifC0sm0Wz8aHY/p6+FDYIzs/CrQ==", + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.80.0.tgz", + "integrity": "sha512-ib6iRcrXsk4t1fm3iKcwksyWh1ZkZXC/2mEzakl0ai2+6HZunf1WWMZ/xP9EJAvw9g9K4UVTC3NF/+G2qLrbTQ==", "cpu": [ "arm64" ], @@ -1038,10 +1467,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-win32-ia32-msvc": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.64.0.tgz", - "integrity": "sha512-lNM6byTAQ881jugzFu8juJTbNRgsUTlswMA6pJmwi1XDvmIqnnb49lcUAs5gz94fCJLrVN+/X3s3jOKqx23WIQ==", + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.80.0.tgz", + "integrity": "sha512-xhRWBMpLxZvgKAH6+DJZmpP+W8Y8UdQOSU1JfxSWNXsaBaRGW77j+1hCuNHlzj7OH4SPN8fYd1q0o2qrDtoVyw==", "cpu": [ "ia32" ], @@ -1055,10 +1484,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-win32-x64-msvc": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.64.0.tgz", - "integrity": "sha512-BtmbtL/QjMtF1a6C3CqoDluH2IfB6fJt62E+B9RFfUPtFk4Iz9PFS6+y/SzzOvSxc7aUk2Kphwg7Dh8lMbwu6g==", + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.80.0.tgz", + "integrity": "sha512-yAnO7lwBYQnz2pcfBPIGQQZWIX5zd5R/1aAKIF3oE+TVj7IhoHcROjOkz3sRDngzqhfPKfFaXqug5j5rE5dn6Q==", "cpu": [ "x64" ], @@ -1764,70 +2193,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.67.0.tgz", - "integrity": "sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.67.0", - "@typescript-eslint/type-utils": "8.67.0", - "@typescript-eslint/utils": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.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.67.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.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.67.0.tgz", - "integrity": "sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.67.0", - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/typescript-estree": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.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.67.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.67.0.tgz", @@ -1953,9 +2318,9 @@ } }, "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==", + "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": { @@ -2513,37 +2878,6 @@ "vitest": "4.1.11" } }, - "node_modules/@vitest/eslint-plugin": { - "version": "1.6.27", - "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.6.27.tgz", - "integrity": "sha512-X1RCAfwbatG4GFbJ/1PIHP9MSZMt0JJThqbYID+vS4L783k6QGlLPe421wQE8dHXuGCcenVLsydiM4qzsYWxhg==", - "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.11", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.11.tgz", @@ -3131,9 +3465,9 @@ } }, "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==", + "version": "2.11.17", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.17.tgz", + "integrity": "sha512-KAUDn1OSS0fmPlGO+NOUMRcOQ/b/shUBH3OgkG73mPgdf+JD/BQ6fHboGxNOxnUmlwcq+lLq3dTkayRPuSfXwg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -3151,22 +3485,22 @@ "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==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "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==", + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", "dev": true, "funding": [ { @@ -3184,11 +3518,11 @@ ], "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" + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" }, "bin": { "browserslist": "cli.js" @@ -3197,29 +3531,6 @@ "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", @@ -3231,9 +3542,9 @@ } }, "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==", + "version": "1.0.30001809", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", + "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", "dev": true, "funding": [ { @@ -3537,9 +3848,9 @@ "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==", + "version": "1.5.412", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.412.tgz", + "integrity": "sha512-z4rMe3esBzlzovKHj4gxJnsCGZRK5l4baUvm+gCGJBPE+gsyUMKsuU9tnEUtI1dOebXz1ytAPGjvXhmQ7rIPwA==", "dev": true, "license": "ISC" }, @@ -3665,26 +3976,6 @@ "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.6", "resolved": "https://registry.npmjs.org/eslint-plugin-react-jsx/-/eslint-plugin-react-jsx-5.18.6.tgz", @@ -3811,44 +4102,6 @@ "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", @@ -4133,13 +4386,6 @@ "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", @@ -4173,19 +4419,6 @@ "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", @@ -4196,23 +4429,6 @@ "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", @@ -4453,16 +4669,6 @@ "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", @@ -4806,13 +5012,6 @@ "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", @@ -4873,9 +5072,9 @@ } }, "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==", + "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": { @@ -5849,11 +6048,14 @@ "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==", + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/obug": { "version": "2.1.4", @@ -5888,9 +6090,9 @@ } }, "node_modules/oxfmt": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.64.0.tgz", - "integrity": "sha512-XZ4GFBN/PLbXKq+0zrgpQfPKYuJlUuj+nzZJY7UpIbFMNyefNLCdN9EwViycNqnYcv0wrn0jXcQLlqJp8RCKBg==", + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.65.0.tgz", + "integrity": "sha512-SgS5VgnP42T0zl3zWD+xoH8FCqg1SAFnSRoOT/qeoa6gxcYIqrDMOmcXIg/EWSN92Du4ogB4riuKhKd6Y4CGhw==", "dev": true, "license": "MIT", "dependencies": { @@ -5906,25 +6108,25 @@ "url": "https://github.com/sponsors/Boshen" }, "optionalDependencies": { - "@oxfmt/binding-android-arm-eabi": "0.64.0", - "@oxfmt/binding-android-arm64": "0.64.0", - "@oxfmt/binding-darwin-arm64": "0.64.0", - "@oxfmt/binding-darwin-x64": "0.64.0", - "@oxfmt/binding-freebsd-x64": "0.64.0", - "@oxfmt/binding-linux-arm-gnueabihf": "0.64.0", - "@oxfmt/binding-linux-arm-musleabihf": "0.64.0", - "@oxfmt/binding-linux-arm64-gnu": "0.64.0", - "@oxfmt/binding-linux-arm64-musl": "0.64.0", - "@oxfmt/binding-linux-ppc64-gnu": "0.64.0", - "@oxfmt/binding-linux-riscv64-gnu": "0.64.0", - "@oxfmt/binding-linux-riscv64-musl": "0.64.0", - "@oxfmt/binding-linux-s390x-gnu": "0.64.0", - "@oxfmt/binding-linux-x64-gnu": "0.64.0", - "@oxfmt/binding-linux-x64-musl": "0.64.0", - "@oxfmt/binding-openharmony-arm64": "0.64.0", - "@oxfmt/binding-win32-arm64-msvc": "0.64.0", - "@oxfmt/binding-win32-ia32-msvc": "0.64.0", - "@oxfmt/binding-win32-x64-msvc": "0.64.0" + "@oxfmt/binding-android-arm-eabi": "0.65.0", + "@oxfmt/binding-android-arm64": "0.65.0", + "@oxfmt/binding-darwin-arm64": "0.65.0", + "@oxfmt/binding-darwin-x64": "0.65.0", + "@oxfmt/binding-freebsd-x64": "0.65.0", + "@oxfmt/binding-linux-arm-gnueabihf": "0.65.0", + "@oxfmt/binding-linux-arm-musleabihf": "0.65.0", + "@oxfmt/binding-linux-arm64-gnu": "0.65.0", + "@oxfmt/binding-linux-arm64-musl": "0.65.0", + "@oxfmt/binding-linux-ppc64-gnu": "0.65.0", + "@oxfmt/binding-linux-riscv64-gnu": "0.65.0", + "@oxfmt/binding-linux-riscv64-musl": "0.65.0", + "@oxfmt/binding-linux-s390x-gnu": "0.65.0", + "@oxfmt/binding-linux-x64-gnu": "0.65.0", + "@oxfmt/binding-linux-x64-musl": "0.65.0", + "@oxfmt/binding-openharmony-arm64": "0.65.0", + "@oxfmt/binding-win32-arm64-msvc": "0.65.0", + "@oxfmt/binding-win32-ia32-msvc": "0.65.0", + "@oxfmt/binding-win32-x64-msvc": "0.65.0" }, "peerDependencies": { "svelte": "^5.0.0", @@ -5939,6 +6141,73 @@ } } }, + "node_modules/oxlint": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.80.0.tgz", + "integrity": "sha512-5nTiSps4qdbCWLbxzuO00alHkEO2exR9YMN/ig6QXWrLsYSG0KaObOAM+l6oU2LcKPWoSAGYbkZIGEu1ViiWKA==", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.80.0", + "@oxlint/binding-android-arm64": "1.80.0", + "@oxlint/binding-darwin-arm64": "1.80.0", + "@oxlint/binding-darwin-x64": "1.80.0", + "@oxlint/binding-freebsd-x64": "1.80.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.80.0", + "@oxlint/binding-linux-arm-musleabihf": "1.80.0", + "@oxlint/binding-linux-arm64-gnu": "1.80.0", + "@oxlint/binding-linux-arm64-musl": "1.80.0", + "@oxlint/binding-linux-ppc64-gnu": "1.80.0", + "@oxlint/binding-linux-riscv64-gnu": "1.80.0", + "@oxlint/binding-linux-riscv64-musl": "1.80.0", + "@oxlint/binding-linux-s390x-gnu": "1.80.0", + "@oxlint/binding-linux-x64-gnu": "1.80.0", + "@oxlint/binding-linux-x64-musl": "1.80.0", + "@oxlint/binding-openharmony-arm64": "1.80.0", + "@oxlint/binding-win32-arm64-msvc": "1.80.0", + "@oxlint/binding-win32-ia32-msvc": "1.80.0", + "@oxlint/binding-win32-x64-msvc": "1.80.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=7.0.2001", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/oxlint-tsgolint": { + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-7.0.2001.tgz", + "integrity": "sha512-KjK/XLcXr1DSyonKhsuFqJRiuKqcyG9j3LJ8nkOsrLzGvodBPqzHOKauy10asLMDI0sUpvb+1sxlzff3udZvfg==", + "dev": true, + "license": "MIT", + "bin": { + "tsgolint": "bin/tsgolint.js" + }, + "optionalDependencies": { + "@oxlint-tsgolint/darwin-arm64": "7.0.2001", + "@oxlint-tsgolint/darwin-x64": "7.0.2001", + "@oxlint-tsgolint/linux-arm64": "7.0.2001", + "@oxlint-tsgolint/linux-x64": "7.0.2001", + "@oxlint-tsgolint/win32-arm64": "7.0.2001", + "@oxlint-tsgolint/win32-x64": "7.0.2001" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -6263,19 +6532,6 @@ "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", @@ -6284,20 +6540,6 @@ "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", @@ -6402,21 +6644,6 @@ "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", @@ -6784,30 +7011,6 @@ "tsc6": "bin/tsc6" } }, - "node_modules/typescript-eslint": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.67.0.tgz", - "integrity": "sha512-S2udFs8tCKEKffuJ4TB1idGUZiXdCPGi3IPBGWXarbLQ5UPXORV8QEVzJ4gCRduURMb5EkpNCdjbk0eDIuI8Yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.67.0", - "@typescript-eslint/parser": "8.67.0", - "@typescript-eslint/typescript-estree": "8.67.0", - "@typescript-eslint/utils": "8.67.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", @@ -6919,9 +7122,9 @@ } }, "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==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", + "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", "dev": true, "funding": [ { @@ -7265,22 +7468,6 @@ "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", @@ -7363,19 +7550,6 @@ "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", diff --git a/package.json b/package.json index 125e46c7f9..94f69f61c5 100644 --- a/package.json +++ b/package.json @@ -43,8 +43,9 @@ "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", + "lint": "oxlint", + "lint:md": "eslint --max-warnings 0", + "lint:fix": "oxlint --fix && eslint --fix", "typecheck": "tsc --build" }, "devDependencies": { @@ -61,21 +62,19 @@ "@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.64.0", - "playwright": "~1.62.1", + "oxfmt": "^0.65.0", + "oxlint": "^1.80.0", + "oxlint-tsgolint": "^7.0.2001", + "playwright": "^1.62.1", "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" diff --git a/src/Columns.tsx b/src/Columns.tsx index 163b3280d7..e7fc2ca8cf 100644 --- a/src/Columns.tsx +++ b/src/Columns.tsx @@ -51,7 +51,7 @@ function SelectGroupFormatter({ row, tabIndex }: RenderGroupCellProps) ); } -// eslint-disable-next-line @typescript-eslint/no-explicit-any +// oxlint-disable-next-line typescript/no-explicit-any export const SelectColumn: Column = { key: SELECT_COLUMN_KEY, name: '', diff --git a/src/DataGrid.tsx b/src/DataGrid.tsx index 877bee1e66..15d64d1653 100644 --- a/src/DataGrid.tsx +++ b/src/DataGrid.tsx @@ -507,6 +507,7 @@ export function DataGrid(props: DataGridPr const selectHeaderRowLatest = useLatestFunc(selectHeaderRow); const selectRowLatest = useLatestFunc(selectRow); const handleFormatterRowChangeLatest = useLatestFunc(updateRow); + // oxlint-disable-next-line react/immutability const setPositionLatest = useLatestFunc(setPosition); const selectHeaderCellLatest = useLatestFunc(selectHeaderCell); diff --git a/src/DataGridDefaultRenderersContext.ts b/src/DataGridDefaultRenderersContext.ts index 06aca65cd6..ea493e84e6 100644 --- a/src/DataGridDefaultRenderersContext.ts +++ b/src/DataGridDefaultRenderersContext.ts @@ -2,7 +2,7 @@ import { createContext, use } from 'react'; import type { Maybe, Renderers } from './types'; -// eslint-disable-next-line @typescript-eslint/no-explicit-any +// oxlint-disable-next-line typescript/no-explicit-any export const DataGridDefaultRenderersContext = createContext>>(undefined); DataGridDefaultRenderersContext.displayName = 'DataGridDefaultRenderersContext'; diff --git a/src/GroupRow.tsx b/src/GroupRow.tsx index 967e139f11..cb92d1cf9c 100644 --- a/src/GroupRow.tsx +++ b/src/GroupRow.tsx @@ -82,7 +82,7 @@ function GroupedRow({ .map(([column, isCellActive], index) => { // Select is always the first column if (index === 0 && column.key === SELECT_COLUMN_KEY) { - // eslint-disable-next-line @eslint-react/immutability + // oxlint-disable-next-line react/immutability idx += 1; } @@ -93,9 +93,7 @@ function GroupedRow({ groupKey={row.groupKey} childRows={row.childRows} isExpanded={row.isExpanded} - // eslint-disable-next-line @eslint-react/immutability isCellActive={isCellActive} - // eslint-disable-next-line @eslint-react/immutability column={column} row={row} groupColumnIndex={idx} diff --git a/src/globals.d.ts b/src/globals.d.ts index b8e33ced84..eca7d89088 100644 --- a/src/globals.d.ts +++ b/src/globals.d.ts @@ -1,6 +1,6 @@ declare module 'react' { - // eslint-disable-next-line @typescript-eslint/consistent-indexed-object-style interface CSSProperties { + // oxlint-disable-next-line typescript/consistent-indexed-object-style [key: `--${string}`]: string | number | undefined; } } diff --git a/src/hooks/useGridDimensions.ts b/src/hooks/useGridDimensions.ts index b1d1da173e..7a384898f0 100644 --- a/src/hooks/useGridDimensions.ts +++ b/src/hooks/useGridDimensions.ts @@ -13,7 +13,7 @@ const subscribers = new Map, () => void>(); // don't break in Node.js (SSR), jsdom, and environments that don't support ResizeObserver const resizeObserver = - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + // oxlint-disable-next-line typescript/no-unnecessary-condition globalThis.ResizeObserver == null ? null : new ResizeObserver(resizeObserverCallback); function resizeObserverCallback(entries: ResizeObserverEntry[]) { diff --git a/src/hooks/useLatestFunc.ts b/src/hooks/useLatestFunc.ts index 634694f3bb..1397202a01 100644 --- a/src/hooks/useLatestFunc.ts +++ b/src/hooks/useLatestFunc.ts @@ -3,7 +3,7 @@ import { useCallback, useLayoutEffect, useRef } from 'react'; import type { Maybe } from '../types'; // https://reactjs.org/docs/hooks-faq.html#what-can-i-do-if-my-effect-dependencies-change-too-often -// eslint-disable-next-line @typescript-eslint/no-explicit-any +// oxlint-disable-next-line typescript/no-explicit-any export function useLatestFunc any>>(fn: T): T { const ref = useRef(fn); diff --git a/src/hooks/useRowSelection.ts b/src/hooks/useRowSelection.ts index ea6c019697..64f02778bc 100644 --- a/src/hooks/useRowSelection.ts +++ b/src/hooks/useRowSelection.ts @@ -11,7 +11,7 @@ export const RowSelectionContext = createContext) => void) | undefined >(undefined); RowSelectionChangeContext.displayName = 'RowSelectionChangeContext'; diff --git a/src/utils/keyboardUtils.ts b/src/utils/keyboardUtils.ts index 056051293c..28e64872cf 100644 --- a/src/utils/keyboardUtils.ts +++ b/src/utils/keyboardUtils.ts @@ -62,7 +62,7 @@ export function isDefaultCellInput( event: React.KeyboardEvent, isUserHandlingPaste: boolean ): boolean { - // eslint-disable-next-line @typescript-eslint/no-deprecated + // oxlint-disable-next-line typescript/no-deprecated if (isCtrlKeyHeldDown(event) && (event.keyCode !== vKey || isUserHandlingPaste)) return false; return !nonInputKeys.has(event.key); } diff --git a/test/browser/column/grouping.test.ts b/test/browser/column/grouping.test.ts index e86b552666..f19cb45150 100644 --- a/test/browser/column/grouping.test.ts +++ b/test/browser/column/grouping.test.ts @@ -241,10 +241,10 @@ test('grouping', async () => { await expect.element(cell).toHaveTextContent(item.text); await expect.element(cell).toHaveAttribute('aria-colindex', item.colIndex); if (item.colSpan == null) { - // eslint-disable-next-line vitest/no-conditional-expect + // oxlint-disable-next-line vitest/no-conditional-expect await expect.element(cell).not.toHaveAttribute('aria-colspan'); } else { - // eslint-disable-next-line vitest/no-conditional-expect + // oxlint-disable-next-line vitest/no-conditional-expect await expect.element(cell).toHaveAttribute('aria-colspan', item.colSpan); } await expect.element(cell).toHaveAttribute('aria-rowspan', item.rowSpan); diff --git a/test/browser/rowSelection.test.tsx b/test/browser/rowSelection.test.tsx index 8d45f3c312..8f5d885071 100644 --- a/test/browser/rowSelection.test.tsx +++ b/test/browser/rowSelection.test.tsx @@ -202,7 +202,6 @@ test('extra keys are preserved when updating the selectedRows Set', async () => function onSelectedRowsChange(selectedRows: Set) { setSelectedRows(selectedRows); - // eslint-disable-next-line @eslint-react/immutability set = selectedRows; } @@ -212,7 +211,6 @@ test('extra keys are preserved when updating the selectedRows Set', async () => columns={columns} rows={defaultRows} selectedRows={selectedRows} - // eslint-disable-next-line @eslint-react/immutability onSelectedRowsChange={onSelectedRowsChange} /> ); diff --git a/test/browser/scrollToCell.test.tsx b/test/browser/scrollToCell.test.tsx index f983e7d92e..5e02ac7ceb 100644 --- a/test/browser/scrollToCell.test.tsx +++ b/test/browser/scrollToCell.test.tsx @@ -118,6 +118,7 @@ function validateCellVisibility(name: string, isVisible: boolean) { const cell = page.getCell({ name }); if (isVisible) { + // oxlint-disable-next-line vitest/no-conditional-expect return expect.element(cell).toBeVisible(); } diff --git a/website/renderers/renderCoordinates.ts b/website/renderers/renderCoordinates.ts index 3761a3a710..577a1417b5 100644 --- a/website/renderers/renderCoordinates.ts +++ b/website/renderers/renderCoordinates.ts @@ -1,6 +1,6 @@ import type { RenderCellProps } from '../../src'; -// eslint-disable-next-line @typescript-eslint/no-explicit-any +// oxlint-disable-next-line typescript/no-explicit-any export function renderCoordinates(props: RenderCellProps) { return `${props.column.key}×${props.row}`; }