diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 5815934..938d82c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -7,12 +7,7 @@ on: jobs: unit: runs-on: ubuntu-latest - strategy: - matrix: - node-version: - - 20 - - 22 - name: Node.js ${{ matrix.node-version }} / unit + name: unit steps: - name: Checkout the repository uses: actions/checkout@v6 @@ -20,10 +15,10 @@ jobs: uses: pnpm/action-setup@v6 with: version: 10 - - name: Install Node.js ${{ matrix.node-version }} + - name: Install Node.js uses: actions/setup-node@v6 with: - node-version: ${{ matrix.node-version }} + node-version: 22 cache: 'pnpm' - name: Install dependencies run: pnpm install @@ -42,7 +37,7 @@ jobs: - name: Install Node.js uses: actions/setup-node@v6 with: - node-version: 20 + node-version: 22 cache: 'pnpm' - name: Install dependencies run: pnpm install diff --git a/.nano-staged.json b/.nano-staged.json index 772e7f5..f07fa96 100644 --- a/.nano-staged.json +++ b/.nano-staged.json @@ -1,3 +1,3 @@ { - "*.{c,m,}{js,ts}{x,}": "eslint --flag v10_config_lookup_from_file --fix" + "*.{c,m,}{js,ts}{x,}": "oxlint --fix" } diff --git a/.tool-versions b/.tool-versions index c6ba495..bdf275d 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ pnpm 10.11.0 -nodejs 22.4.1 +nodejs 22.18.0 diff --git a/README.md b/README.md index a138d11..525c47d 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ Scripts and configs for TrigenSoftware's projects. | [`@trigen/project-files`](packages/project-files#readme) | [![NPM version][project-files-npm]][project-files-npm-url] | [![Dependencies status][project-files-deps]][project-files-deps-url] | | [`@trigen/browserslist-config`](packages/browserslist-config#readme) | [![NPM version][browserslist-config-npm]][browserslist-config-npm-url] | | | [`@trigen/eslint-config`](packages/eslint-config#readme) | [![NPM version][eslint-config-npm]][eslint-config-npm-url] | [![Dependencies status][eslint-config-deps]][eslint-config-deps-url] | +| [`@trigen/oxlint-config`](packages/oxlint-config#readme) | [![NPM version][oxlint-config-npm]][oxlint-config-npm-url] | [![Dependencies status][oxlint-config-deps]][oxlint-config-deps-url] | | [`@trigen/stylelint-config`](packages/stylelint-config#readme) | [![NPM version][stylelint-config-npm]][stylelint-config-npm-url] | [![Dependencies status][stylelint-config-deps]][stylelint-config-deps-url] | | [`@trigen/lint-package-json`](packages/lint-package-json#readme) | [![NPM version][lint-package-json-npm]][lint-package-json-npm-url] | [![Dependencies status][lint-package-json-deps]][lint-package-json-deps-url] | | [`@trigen/npm-package-json-lint-config`](packages/npm-package-json-lint-config#readme) | [![NPM version][npm-package-json-lint-config-npm]][npm-package-json-lint-config-npm-url] | [![Dependencies status][npm-package-json-lint-config-deps]][npm-package-json-lint-config-deps-url] | @@ -52,6 +53,14 @@ Scripts and configs for TrigenSoftware's projects. [eslint-config-deps]: https://img.shields.io/librariesio/release/npm/@trigen/eslint-config [eslint-config-deps-url]: https://libraries.io/npm/@trigen%2Feslint-config + + +[oxlint-config-npm]: https://img.shields.io/npm/v/%40trigen/oxlint-config.svg +[oxlint-config-npm-url]: https://www.npmjs.com/package/@trigen/oxlint-config + +[oxlint-config-deps]: https://img.shields.io/librariesio/release/npm/@trigen/oxlint-config +[oxlint-config-deps-url]: https://libraries.io/npm/@trigen%2Foxlint-config + [stylelint-config-npm]: https://img.shields.io/npm/v/%40trigen/stylelint-config.svg diff --git a/eslint.config.js b/eslint.config.js deleted file mode 100644 index bea459d..0000000 --- a/eslint.config.js +++ /dev/null @@ -1,16 +0,0 @@ -import { globalIgnores } from 'eslint/config' -import baseConfig from '@trigen/eslint-config' -import testConfig from '@trigen/eslint-config/test' -import env from '@trigen/eslint-config/env' - -export default [ - globalIgnores(['**/package/']), - ...baseConfig, - ...testConfig, - env.node, - { - rules: { - 'no-console': 'off' - } - } -] diff --git a/oxlint.config.ts b/oxlint.config.ts new file mode 100644 index 0000000..6189d2f --- /dev/null +++ b/oxlint.config.ts @@ -0,0 +1,16 @@ +import baseConfig from '@trigen/oxlint-config' +import testConfig from '@trigen/oxlint-config/test' + +export default { + ignorePatterns: ['**/package/'], + extends: [ + baseConfig, + testConfig + ], + env: { + node: true + }, + rules: { + 'eslint/no-console': 'off' + } +} diff --git a/package.json b/package.json index 0df1335..1cd42a2 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "scripts": { "clear": "del './packages/*/package' ./coverage ./node_modules/.cache", "lint:package-json": "lint-package-json --monorepo", - "lint": "eslint --flag v10_config_lookup_from_file", + "lint": "oxlint", "test:unit": "vitest run", "test:unit:watch": "vitest watch", "test": "run -p lint test:unit", @@ -31,17 +31,17 @@ "@commitlint/config-conventional": "^20.0.0", "@commitlint/config-pnpm-scopes": "^20.0.0", "@commitlint/cz-commitlint": "^20.0.0", - "@trigen/eslint-config": "workspace:*", "@trigen/lint-package-json": "workspace:*", + "@trigen/oxlint-config": "workspace:*", "@trigen/project-files": "workspace:*", "@trigen/scripts": "workspace:*", "clean-publish": "^5.0.0", "commitizen": "^4.3.1", "del-cli": "^7.0.0", - "eslint": "9.31.0", "inquirer": "^9.3.7", "nano-staged": "^1.0.0", "npm-package-json-lint": "^9.0.0", + "oxlint": "^1.67.0", "simple-git-hooks": "^2.7.0", "vite": "^7.0.0", "vitest": "^4.0.0" diff --git a/packages/browserslist-config/eslint.config.mjs b/packages/browserslist-config/eslint.config.mjs deleted file mode 100644 index 52af74f..0000000 --- a/packages/browserslist-config/eslint.config.mjs +++ /dev/null @@ -1,12 +0,0 @@ -import moduleConfig from '@trigen/eslint-config/module' -import rootConfig from '../../eslint.config.js' - -export default [ - ...rootConfig, - ...moduleConfig, - { - rules: { - 'import/no-default-export': 'off' - } - } -] diff --git a/packages/browserslist-config/oxlint.config.ts b/packages/browserslist-config/oxlint.config.ts new file mode 100644 index 0000000..3b87428 --- /dev/null +++ b/packages/browserslist-config/oxlint.config.ts @@ -0,0 +1,13 @@ +import moduleConfig from '@trigen/oxlint-config/module' +import rootConfig from '../../oxlint.config.ts' + +export default { + ...rootConfig, + extends: [ + rootConfig, + moduleConfig + ], + rules: { + 'import/no-default-export': 'off' + } +} diff --git a/packages/eslint-config/eslint.config.js b/packages/eslint-config/eslint.config.js deleted file mode 100644 index 83b2960..0000000 --- a/packages/eslint-config/eslint.config.js +++ /dev/null @@ -1,16 +0,0 @@ -import { globalIgnores } from 'eslint/config' -import moduleConfig from '@trigen/eslint-config/module' -import rootConfig from '../../eslint.config.js' - -export default [ - globalIgnores(['**/*.d.ts']), - ...rootConfig, - ...moduleConfig, - { - rules: { - 'no-magic-numbers': 'off', - 'import/no-default-export': 'off', - 'import/no-anonymous-default-export': 'off' - } - } -] diff --git a/packages/eslint-config/oxlint.config.ts b/packages/eslint-config/oxlint.config.ts new file mode 100644 index 0000000..abfc250 --- /dev/null +++ b/packages/eslint-config/oxlint.config.ts @@ -0,0 +1,16 @@ +import moduleConfig from '@trigen/oxlint-config/module' +import rootConfig from '../../oxlint.config.ts' + +export default { + ...rootConfig, + ignorePatterns: ['**/*.d.ts'], + extends: [ + rootConfig, + moduleConfig + ], + rules: { + 'eslint/no-magic-numbers': 'off', + 'import/no-default-export': 'off', + 'import/no-anonymous-default-export': 'off' + } +} diff --git a/packages/lint-package-json/eslint.config.js b/packages/lint-package-json/eslint.config.js deleted file mode 100644 index 8b05ab5..0000000 --- a/packages/lint-package-json/eslint.config.js +++ /dev/null @@ -1,4 +0,0 @@ -import moduleConfig from '@trigen/eslint-config/module' -import rootConfig from '../../eslint.config.js' - -export default [...rootConfig, ...moduleConfig] diff --git a/packages/lint-package-json/oxlint.config.ts b/packages/lint-package-json/oxlint.config.ts new file mode 100644 index 0000000..4bc4a90 --- /dev/null +++ b/packages/lint-package-json/oxlint.config.ts @@ -0,0 +1,10 @@ +import moduleConfig from '@trigen/oxlint-config/module' +import rootConfig from '../../oxlint.config.ts' + +export default { + ...rootConfig, + extends: [ + rootConfig, + moduleConfig + ] +} diff --git a/packages/npm-package-json-lint-config/eslint.config.mjs b/packages/npm-package-json-lint-config/eslint.config.mjs deleted file mode 100644 index 52af74f..0000000 --- a/packages/npm-package-json-lint-config/eslint.config.mjs +++ /dev/null @@ -1,12 +0,0 @@ -import moduleConfig from '@trigen/eslint-config/module' -import rootConfig from '../../eslint.config.js' - -export default [ - ...rootConfig, - ...moduleConfig, - { - rules: { - 'import/no-default-export': 'off' - } - } -] diff --git a/packages/npm-package-json-lint-config/oxlint.config.ts b/packages/npm-package-json-lint-config/oxlint.config.ts new file mode 100644 index 0000000..3b87428 --- /dev/null +++ b/packages/npm-package-json-lint-config/oxlint.config.ts @@ -0,0 +1,13 @@ +import moduleConfig from '@trigen/oxlint-config/module' +import rootConfig from '../../oxlint.config.ts' + +export default { + ...rootConfig, + extends: [ + rootConfig, + moduleConfig + ], + rules: { + 'import/no-default-export': 'off' + } +} diff --git a/packages/oxlint-config/README.md b/packages/oxlint-config/README.md new file mode 100644 index 0000000..5d1e15d --- /dev/null +++ b/packages/oxlint-config/README.md @@ -0,0 +1,81 @@ +# @trigen/oxlint-config + +[![NPM version][npm]][npm-url] +[![Node version][node]][node-url] +[![Dependencies status][deps]][deps-url] +[![Install size][size]][size-url] +[![Build status][build]][build-url] + +[npm]: https://img.shields.io/npm/v/%40trigen/oxlint-config.svg +[npm-url]: https://npmjs.com/package/@trigen/oxlint-config + +[node]: https://img.shields.io/node/v/%40trigen/oxlint-config.svg +[node-url]: https://nodejs.org + +[deps]: https://img.shields.io/librariesio/release/npm/@trigen/oxlint-config +[deps-url]: https://libraries.io/npm/@trigen%2Foxlint-config + +[size]: https://packagephobia.com/badge?p=@trigen/oxlint-config +[size-url]: https://packagephobia.com/result?p=@trigen/oxlint-config + +[build]: https://img.shields.io/github/actions/workflow/status/TrigenSoftware/scripts/tests.yml?branch=main +[build-url]: https://github.com/TrigenSoftware/scripts/actions + +Trigen's Oxlint config. + +## Install + +```bash +pnpm add -D oxlint @trigen/oxlint-config +# or +yarn add -D oxlint @trigen/oxlint-config +# or +npm i -D oxlint @trigen/oxlint-config +``` + +## Configure + +Create `oxlint.config.ts` with next content: + +```ts +import baseConfig from '@trigen/oxlint-config' + +export default baseConfig +``` + +### Additional configs + +There are additional configs for specific language features: + +| Config | Description | +|--------|-------------| +| @trigen/oxlint-config/commonjs | Rules for CommonJS modules. | +| @trigen/oxlint-config/module | Rules for ES modules. | +| @trigen/oxlint-config/bundler | Rules for ES modules with bundler's module resolution. | +| @trigen/oxlint-config/test | Rules for test files. | +| @trigen/oxlint-config/react | Rules for React code. | +| @trigen/oxlint-config/storybook | Rules for Storybook stories. | +| @trigen/oxlint-config/typescript | Rules for TypeScript code. | +| @trigen/oxlint-config/typescript-type-checked | Rules for TypeScript code with type checking. | + +Example: + +```ts +import baseConfig from '@trigen/oxlint-config' +import bundlerConfig from '@trigen/oxlint-config/bundler' +import reactConfig from '@trigen/oxlint-config/react' +import typescriptConfig from '@trigen/oxlint-config/typescript-type-checked' +import testConfig from '@trigen/oxlint-config/test' +import storybookConfig from '@trigen/oxlint-config/storybook' + +export default { + extends: [ + baseConfig, + bundlerConfig, + reactConfig, + typescriptConfig, + testConfig, + storybookConfig + ] +} +``` diff --git a/packages/oxlint-config/oxlint.config.ts b/packages/oxlint-config/oxlint.config.ts new file mode 100644 index 0000000..eaa48c7 --- /dev/null +++ b/packages/oxlint-config/oxlint.config.ts @@ -0,0 +1,15 @@ +import moduleConfig from '@trigen/oxlint-config/module' +import rootConfig from '../../oxlint.config.ts' + +export default { + ...rootConfig, + extends: [ + rootConfig, + moduleConfig + ], + rules: { + 'eslint/no-magic-numbers': 'off', + 'import/no-default-export': 'off', + 'import/no-anonymous-default-export': 'off' + } +} diff --git a/packages/oxlint-config/package.json b/packages/oxlint-config/package.json new file mode 100644 index 0000000..299b48d --- /dev/null +++ b/packages/oxlint-config/package.json @@ -0,0 +1,49 @@ +{ + "name": "@trigen/oxlint-config", + "type": "module", + "version": "8.4.0", + "description": "Trigen's Oxlint config.", + "author": "dangreen", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TrigenSoftware/scripts.git", + "directory": "packages/oxlint-config" + }, + "bugs": { + "url": "https://github.com/TrigenSoftware/scripts/issues" + }, + "keywords": [ + "oxlint", + "oxlint-config" + ], + "engines": { + "node": ">=20" + }, + "exports": { + ".": "./src/index.js", + "./plugin": "./src/plugin/index.js", + "./*": "./src/*.js" + }, + "publishConfig": { + "access": "public", + "directory": "package", + "linkDirectory": false + }, + "scripts": { + "prepublishOnly": "del ./package && clean-publish", + "postpublish": "del ./package" + }, + "peerDependencies": { + "oxlint": ">=1.0.0", + "oxlint-tsgolint": ">=0.23.0" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + } + }, + "dependencies": { + "@stylistic/eslint-plugin": "^5.5.0" + } +} diff --git a/packages/oxlint-config/src/bundler.js b/packages/oxlint-config/src/bundler.js new file mode 100644 index 0000000..9a8ce59 --- /dev/null +++ b/packages/oxlint-config/src/bundler.js @@ -0,0 +1,27 @@ +/** + * Bundler override + */ + +import { + commonjsFiles, + not +} from './subconfigs/files.js' + +export default { + overrides: [ + { + files: not(commonjsFiles), + plugins: ['import'], + rules: { + 'import/unambiguous': 'error', + 'import/no-commonjs': [ + 'error', + { + allowRequire: false, + allowPrimitiveModules: false + } + ] + } + } + ] +} diff --git a/packages/oxlint-config/src/commonjs.js b/packages/oxlint-config/src/commonjs.js new file mode 100644 index 0000000..54ea2c0 --- /dev/null +++ b/packages/oxlint-config/src/commonjs.js @@ -0,0 +1,13 @@ +/** + * CommonJS override + */ + +import moduleConfig from './module.js' +import { moduleFiles } from './subconfigs/files.js' + +export default { + overrides: moduleConfig.overrides.map(override => ({ + ...override, + files: moduleFiles + })) +} diff --git a/packages/oxlint-config/src/index.js b/packages/oxlint-config/src/index.js new file mode 100644 index 0000000..d2e7d46 --- /dev/null +++ b/packages/oxlint-config/src/index.js @@ -0,0 +1,19 @@ +/** + * Combine all basic configs + */ + +import basicConfig from './subconfigs/basic.js' +import importConfig from './subconfigs/import.js' +import baseStylisticConfig from './subconfigs/base.stylistic.js' +import jsdocConfig from './subconfigs/jsdoc.js' +import configsConfig from './subconfigs/configs.js' + +export default { + extends: [ + basicConfig, + importConfig, + baseStylisticConfig, + jsdocConfig, + configsConfig + ] +} diff --git a/packages/oxlint-config/src/module.js b/packages/oxlint-config/src/module.js new file mode 100644 index 0000000..1de333a --- /dev/null +++ b/packages/oxlint-config/src/module.js @@ -0,0 +1,22 @@ +/** + * ESM override + */ + +import bundlerConfig from './bundler.js' +import { + commonjsFiles, + not +} from './subconfigs/files.js' + +export default { + overrides: [ + ...bundlerConfig.overrides, + { + files: not(commonjsFiles), + plugins: ['import'], + rules: { + 'import/extensions': ['error', 'ignorePackages'] + } + } + ] +} diff --git a/packages/oxlint-config/src/plugin/import-order.js b/packages/oxlint-config/src/plugin/import-order.js new file mode 100644 index 0000000..080f4df --- /dev/null +++ b/packages/oxlint-config/src/plugin/import-order.js @@ -0,0 +1,357 @@ +import { builtinModules } from 'node:module' + +const builtinModuleNames = new Set( + builtinModules.flatMap(moduleName => [ + moduleName, + moduleName.replace(/^node:/, '') + ]) +) +const defaultGroups = [ + 'builtin', + 'external', + 'internal', + 'parent', + 'sibling', + 'index' +] +const defaultOptions = { + 'groups': defaultGroups, + 'pathGroups': [], + 'newlines-between': 'ignore', + 'typeImports': 'none' +} + +function isBuiltin(source) { + return source.startsWith('node:') + || builtinModuleNames.has(source.split('/')[0]) +} + +function isExternal(source) { + return !source.startsWith('.') + && !source.startsWith('/') + && !source.startsWith('~') + && !source.startsWith('#') + && !source.startsWith('@/') +} + +function isIndex(source) { + return source === '.' + || source === './' + || source === './index' + || source.startsWith('./index.') +} + +function getGroup(source) { + if (isBuiltin(source)) { + return 'builtin' + } + + if (isExternal(source)) { + return 'external' + } + + if (source.startsWith('../')) { + return 'parent' + } + + if (isIndex(source)) { + return 'index' + } + + if (source.startsWith('./')) { + return 'sibling' + } + + return 'internal' +} + +function matchesPathGroup(source, pattern) { + if (pattern === '~/**') { + return source.startsWith('~/') + } + + if (pattern === '#*/**') { + return /^#[^/]+\/.+/.test(source) + } + + if (pattern === '@/**') { + return source.startsWith('@/') || source === '@' + } + + return false +} + +function getPathGroup(source, pathGroups) { + return pathGroups.find(({ pattern }) => matchesPathGroup(source, pattern)) +} + +function isTypeImport(node) { + return node.importKind === 'type' + || ( + node.specifiers.length > 0 + && node.specifiers.every(specifier => specifier.importKind === 'type') + ) +} + +function getTypeRank(node, options) { + if (options.typeImports === 'first') { + return isTypeImport(node) ? 0 : 1 + } + + if (options.typeImports === 'last') { + return isTypeImport(node) ? 1 : 0 + } + + return 0 +} + +function getImportKind(node) { + return isTypeImport(node) ? 'type' : 'value' +} + +function getRank(node, options) { + const source = node.source.value + const pathGroup = getPathGroup(source, options.pathGroups) + const group = pathGroup?.group ?? getGroup(source) + const groupIndex = options.groups.indexOf(group) + const positionRank = pathGroup?.position === 'before' + ? 0 + : pathGroup?.position === 'after' + ? 2 + : 1 + + return { + group, + groupIndex: groupIndex === -1 ? Number.POSITIVE_INFINITY : groupIndex, + positionRank, + importKind: getImportKind(node), + typeRank: getTypeRank(node, options) + } +} + +function compareRanks(left, right) { + return left.groupIndex - right.groupIndex + || left.positionRank - right.positionRank + || left.typeRank - right.typeRank +} + +function getLinebreak(text) { + return text.includes('\r\n') ? '\r\n' : '\n' +} + +function getMessage(left, right) { + if ( + left.groupIndex === right.groupIndex + && left.positionRank === right.positionRank + && left.typeRank !== right.typeRank + ) { + return `Expected ${right.importKind} import to come before ${left.importKind} import.` + } + + return `Expected ${right.group} import to come before ${left.group} import.` +} + +function getOptions(context) { + return { + ...defaultOptions, + ...context.options[0], + groups: context.options[0]?.groups ?? defaultGroups, + pathGroups: context.options[0]?.pathGroups ?? [] + } +} + +function getImportItems(imports, options) { + return imports.map((node, index) => ({ + index, + node, + rank: getRank(node, options) + })) +} + +function compareImportItems(left, right) { + return compareRanks(left.rank, right.rank) + || left.index - right.index +} + +function getFirstUnorderedPair(items) { + for (let index = 1; index < items.length; index++) { + const previousItem = items[index - 1] + const item = items[index] + + if (compareRanks(previousItem.rank, item.rank) > 0) { + return [ + previousItem, + item + ] + } + } + + return null +} + +function hasInvalidNewlines(items, options) { + if (options['newlines-between'] === 'ignore') { + return false + } + + return items.some((item, index) => { + if (index === 0) { + return false + } + + const previousItem = items[index - 1] + const hasEmptyLine = item.node.loc.start.line - previousItem.node.loc.end.line > 1 + + return options['newlines-between'] === 'never' + ? hasEmptyLine + : !hasEmptyLine + }) +} + +function hasInnerComments(sourceCode, items) { + const firstNode = items[0].node + const lastNode = items.at(-1).node + + return sourceCode.getAllComments().some(comment => comment.range[0] > firstNode.range[0] + && comment.range[1] < lastNode.range[1]) +} + +function hasSideEffectImports(items) { + return items.some(({ node }) => node.specifiers.length === 0) +} + +function canFix(sourceCode, items) { + return !hasSideEffectImports(items) + && !hasInnerComments(sourceCode, items) +} + +function getFixedImportText(sourceCode, items, options) { + const linebreak = getLinebreak(sourceCode.text) + const separator = options['newlines-between'] === 'always' + ? `${linebreak}${linebreak}` + : linebreak + + return [...items] + .sort(compareImportItems) + .map(({ node }) => sourceCode.getText(node)) + .join(separator) +} + +function getImportBlockRange(items) { + return [ + items[0].node.range[0], + items.at(-1).node.range[1] + ] +} + +export default { + meta: { + type: 'layout', + fixable: 'code', + docs: { + description: 'Enforce import order by configured groups.' + }, + schema: [ + { + type: 'object', + properties: { + 'groups': { + type: 'array', + items: { + type: 'string' + } + }, + 'pathGroups': { + type: 'array', + items: { + type: 'object', + properties: { + pattern: { + type: 'string' + }, + group: { + type: 'string' + }, + position: { + enum: [ + 'before', + 'after' + ] + } + }, + required: ['pattern', 'group'], + additionalProperties: true + } + }, + 'newlines-between': { + enum: [ + 'ignore', + 'always', + 'never' + ] + }, + 'typeImports': { + enum: [ + 'first', + 'last', + 'none' + ] + } + }, + additionalProperties: true + } + ] + }, + create(context) { + const options = getOptions(context) + const imports = [] + + return { + ImportDeclaration(node) { + const source = node.source.value + + if (typeof source !== 'string') { + return + } + + imports.push(node) + }, + 'Program:exit'(node) { + if (imports.length < 2) { + return + } + + const sourceCode = context.sourceCode + const items = getImportItems(imports, options) + const unorderedPair = getFirstUnorderedPair(items) + const invalidNewlines = hasInvalidNewlines(items, options) + + if (!unorderedPair && !invalidNewlines) { + return + } + + const fix = canFix(sourceCode, items) + ? fixer => fixer.replaceTextRange( + getImportBlockRange(items), + getFixedImportText(sourceCode, items, options) + ) + : null + const [ + previousItem, + item + ] = unorderedPair ?? [ + items[0], + items[1] + ] + + context.report({ + node, + message: unorderedPair + ? getMessage(previousItem.rank, item.rank) + : 'Import declarations have invalid empty lines.', + fix + }) + } + } + } +} diff --git a/packages/oxlint-config/src/plugin/index.js b/packages/oxlint-config/src/plugin/index.js new file mode 100644 index 0000000..8561120 --- /dev/null +++ b/packages/oxlint-config/src/plugin/index.js @@ -0,0 +1,16 @@ +import importOrderRule from './import-order.js' +import memberOrderingRule from './member-ordering.js' +import namedImportOrderRule from './named-import-order.js' +import namingConventionRule from './naming-convention.js' + +export default { + meta: { + name: '@trigen/oxlint-config/plugin' + }, + rules: { + 'import-order': importOrderRule, + 'member-ordering': memberOrderingRule, + 'named-import-order': namedImportOrderRule, + 'naming-convention': namingConventionRule + } +} diff --git a/packages/oxlint-config/src/plugin/member-ordering.js b/packages/oxlint-config/src/plugin/member-ordering.js new file mode 100644 index 0000000..21270fb --- /dev/null +++ b/packages/oxlint-config/src/plugin/member-ordering.js @@ -0,0 +1,191 @@ +const defaultOrder = [ + 'public-static-method', + 'protected-static-method', + 'private-static-method', + 'public-static-field', + 'protected-static-field', + 'private-static-field', + 'public-decorated-field', + 'protected-decorated-field', + 'private-decorated-field', + 'public-instance-field', + 'protected-instance-field', + 'private-instance-field', + 'public-abstract-field', + 'protected-abstract-field', + 'signature', + 'public-constructor', + 'protected-constructor', + 'private-constructor', + 'instance-method' +] + +function getDefaultOptions(context) { + return context.options[0]?.default ?? {} +} + +function getMemberTypes(context) { + return getDefaultOptions(context).memberTypes ?? defaultOrder +} + +function getAccessibility(member) { + return member.accessibility ?? 'public' +} + +function hasDecorators(member) { + return (member.decorators?.length ?? 0) > 0 +} + +function isAbstract(member) { + return member.abstract === true +} + +function isSignature(member) { + return member.type.includes('Signature') +} + +function isMethod(member) { + return member.type === 'MethodDefinition' + || member.type === 'TSAbstractMethodDefinition' +} + +function isField(member) { + return member.type === 'PropertyDefinition' + || member.type === 'AccessorProperty' + || member.type === 'TSAbstractPropertyDefinition' +} + +function getMemberType(member) { + const accessibility = getAccessibility(member) + + if (isSignature(member)) { + return 'signature' + } + + if (member.kind === 'constructor') { + return `${accessibility}-constructor` + } + + if (isMethod(member)) { + if (member.static) { + return `${accessibility}-static-method` + } + + return 'instance-method' + } + + if (isField(member)) { + if (isAbstract(member)) { + return `${accessibility}-abstract-field` + } + + if (hasDecorators(member)) { + return `${accessibility}-decorated-field` + } + + if (member.static) { + return `${accessibility}-static-field` + } + + return `${accessibility}-instance-field` + } + + return null +} + +function getRank(memberType, memberTypes) { + const rank = memberTypes.indexOf(memberType) + + return rank === -1 ? Number.POSITIVE_INFINITY : rank +} + +function getMemberName(member) { + if (member.kind === 'constructor') { + return 'constructor' + } + + const key = member.key + + if (!key) { + return member.type + } + + if (key.type === 'Identifier' || key.type === 'PrivateIdentifier') { + return key.name + } + + if ( + key.type === 'Literal' + || key.type === 'StringLiteral' + || key.type === 'NumericLiteral' + ) { + return String(key.value) + } + + return member.type +} + +export default { + meta: { + type: 'suggestion', + docs: { + description: 'Enforce configured class member ordering.' + }, + schema: [ + { + type: 'object', + properties: { + default: { + type: 'object', + properties: { + order: { + enum: ['as-written'] + }, + memberTypes: { + type: 'array', + items: { + type: 'string' + } + } + }, + additionalProperties: true + } + }, + additionalProperties: true + } + ] + }, + create(context) { + const memberTypes = getMemberTypes(context) + + return { + ClassBody(node) { + let previousMember = null + + for (const member of node.body) { + const memberType = getMemberType(member) + + if (memberType === null) { + continue + } + + const rank = getRank(memberType, memberTypes) + + if (previousMember && previousMember.rank > rank) { + context.report({ + node: member, + message: `Member "${getMemberName(member)}" should be declared before "${getMemberName(previousMember.node)}".` + }) + + return + } + + previousMember = { + node: member, + rank + } + } + } + } + } +} diff --git a/packages/oxlint-config/src/plugin/named-import-order.js b/packages/oxlint-config/src/plugin/named-import-order.js new file mode 100644 index 0000000..8fc5745 --- /dev/null +++ b/packages/oxlint-config/src/plugin/named-import-order.js @@ -0,0 +1,229 @@ +const defaultOptions = { + typeImports: 'none', + patterns: [] +} + +function getOptions(context) { + return { + ...defaultOptions, + ...context.options[0], + patterns: context.options[0]?.patterns ?? [] + } +} + +function getName(specifier) { + const imported = specifier.imported ?? specifier.local + + if (imported.type === 'Identifier') { + return imported.name + } + + return String(imported.value) +} + +function isTypeSpecifier(node, specifier) { + return node.importKind === 'type' + || specifier.importKind === 'type' +} + +function getTypeRank(node, specifier, options) { + if (options.typeImports === 'first') { + return isTypeSpecifier(node, specifier) ? 0 : 1 + } + + if (options.typeImports === 'last') { + return isTypeSpecifier(node, specifier) ? 1 : 0 + } + + return 0 +} + +function getPatternRank(name, patterns) { + const rank = patterns.findIndex(pattern => new RegExp(pattern).test(name)) + + return rank === -1 ? Number.POSITIVE_INFINITY : rank +} + +function getRank(node, specifier, options) { + const name = getName(specifier) + + return { + name, + typeRank: getTypeRank(node, specifier, options), + patternRank: getPatternRank(name, options.patterns) + } +} + +function compareRanks(left, right) { + return left.typeRank - right.typeRank + || left.patternRank - right.patternRank +} + +function getItems(node, options) { + return node.specifiers + .filter(specifier => specifier.type === 'ImportSpecifier') + .map((specifier, index) => ({ + index, + specifier, + rank: getRank(node, specifier, options) + })) +} + +function compareItems(left, right) { + return compareRanks(left.rank, right.rank) + || left.index - right.index +} + +function getFirstUnorderedPair(items) { + for (let index = 1; index < items.length; index++) { + const previousItem = items[index - 1] + const item = items[index] + + if (compareItems(previousItem, item) > 0) { + return [ + previousItem, + item + ] + } + } + + return null +} + +function getLinebreak(text) { + return text.includes('\r\n') ? '\r\n' : '\n' +} + +function getLineIndent(text, index) { + const lineStart = text.lastIndexOf('\n', index - 1) + 1 + const indentMatch = /^[ \t]*/.exec(text.slice(lineStart, index)) + + return indentMatch[0] +} + +function getBracesRange(node, items, sourceCode) { + const text = sourceCode.text + const firstSpecifier = items[0].specifier + const lastSpecifier = items.at(-1).specifier + const openingBrace = text.lastIndexOf('{', firstSpecifier.range[0]) + const closingBrace = text.indexOf('}', lastSpecifier.range[1]) + const searchEnd = node.source?.range?.[0] ?? node.range[1] + + if ( + openingBrace < node.range[0] + || closingBrace === -1 + || closingBrace > searchEnd + ) { + return null + } + + return [ + openingBrace + 1, + closingBrace + ] +} + +function hasInnerComments(sourceCode, range) { + return sourceCode.getAllComments().some(comment => comment.range[0] > range[0] + && comment.range[1] < range[1]) +} + +function getFixedText(node, items, options, sourceCode, range) { + const text = sourceCode.text + const content = text.slice(range[0], range[1]) + const sortedSpecifiers = [...items] + .sort(compareItems) + .map(({ specifier }) => sourceCode.getText(specifier)) + + if (!content.includes('\n')) { + return ` ${sortedSpecifiers.join(', ')} ` + } + + const linebreak = getLinebreak(text) + const firstSpecifier = items[0].specifier + const indent = getLineIndent(text, firstSpecifier.range[0]) + const closingIndent = getLineIndent(text, node.range[0]) + + return `${linebreak}${indent}${sortedSpecifiers.join(`,${linebreak}${indent}`)}${linebreak}${closingIndent}` +} + +function getMessage(left, right) { + if (left.rank.typeRank !== right.rank.typeRank) { + return `Expected ${right.rank.name} to come before ${left.rank.name} because of import kind.` + } + + if (left.rank.patternRank !== right.rank.patternRank) { + return `Expected ${right.rank.name} to come before ${left.rank.name} because of naming pattern.` + } + + return `Expected ${right.rank.name} to come before ${left.rank.name}.` +} + +export default { + meta: { + type: 'layout', + fixable: 'code', + docs: { + description: 'Enforce named import specifier order.' + }, + schema: [ + { + type: 'object', + properties: { + typeImports: { + enum: [ + 'first', + 'last', + 'none' + ] + }, + patterns: { + type: 'array', + items: { + type: 'string' + } + } + }, + additionalProperties: true + } + ] + }, + create(context) { + const options = getOptions(context) + + return { + ImportDeclaration(node) { + const items = getItems(node, options) + + if (items.length < 2) { + return + } + + const unorderedPair = getFirstUnorderedPair(items) + + if (!unorderedPair) { + return + } + + const sourceCode = context.sourceCode + const range = getBracesRange(node, items, sourceCode) + const fix = range && !hasInnerComments(sourceCode, range) + ? fixer => fixer.replaceTextRange( + range, + getFixedText(node, items, options, sourceCode, range) + ) + : null + const [ + previousItem, + item + ] = unorderedPair + + context.report({ + node: item.specifier, + message: getMessage(previousItem, item), + fix + }) + } + } + } +} diff --git a/packages/oxlint-config/src/plugin/naming-convention.js b/packages/oxlint-config/src/plugin/naming-convention.js new file mode 100644 index 0000000..3a0510c --- /dev/null +++ b/packages/oxlint-config/src/plugin/naming-convention.js @@ -0,0 +1,300 @@ +const formatPatterns = { + camelCase: /^[a-z][a-zA-Z0-9]*$/, + PascalCase: /^[A-Z][a-zA-Z0-9]*$/, + UPPER_CASE: /^[A-Z][A-Z0-9_]*$/ +} + +function toArray(value) { + return Array.isArray(value) ? value : [value] +} + +function getSelectorOptions(options, selector, modifiers = []) { + return options + .filter((option) => { + const selectors = toArray(option.selector) + const optionModifiers = option.modifiers ?? [] + + return ( + selectors.includes(selector) + || selectors.includes('default') + ) + && optionModifiers.every(modifier => modifiers.includes(modifier)) + }) + .sort((left, right) => { + const leftSelectors = toArray(left.selector) + const rightSelectors = toArray(right.selector) + const leftScore = leftSelectors.includes(selector) ? 1 : 0 + const rightScore = rightSelectors.includes(selector) ? 1 : 0 + + return leftScore - rightScore + || (left.modifiers?.length ?? 0) - (right.modifiers?.length ?? 0) + }) + .at(-1) +} + +function getNormalizedName(name, option) { + if (option.leadingUnderscore === 'allow') { + return name.replace(/^_+/, '') + } + + return name +} + +function matchesFormat(name, format) { + return formatPatterns[format]?.test(name) ?? true +} + +function getExpectedFormats(format) { + return format.join(', ') +} + +function isValidName(name, option) { + if (option?.format === null) { + return true + } + + if (!option?.format) { + return true + } + + const normalizedName = getNormalizedName(name, option) + + return normalizedName === '' + || option.format.some(format => matchesFormat(normalizedName, format)) +} + +function getKeyName(key) { + if (!key) { + return null + } + + if (key.type === 'Identifier' || key.type === 'PrivateIdentifier') { + return key.name + } + + if ( + key.type === 'Literal' + || key.type === 'StringLiteral' + || key.type === 'NumericLiteral' + ) { + return String(key.value) + } + + return null +} + +function isIdentifierName(name) { + return /^[A-Za-z_$][\w$]*$/.test(name) +} + +function requiresQuotes(node) { + if (node.computed) { + return false + } + + const name = getKeyName(node.key) + + return name !== null && !isIdentifierName(name) +} + +function getPropertyModifiers(node) { + const modifiers = [] + + if (node.static) { + modifiers.push('static') + } + + if (requiresQuotes(node)) { + modifiers.push('requiresQuotes') + } + + return modifiers +} + +function getIdentifierNames(pattern) { + if (!pattern) { + return [] + } + + if (pattern.type === 'Identifier') { + return [ + { + name: pattern.name, + node: pattern + } + ] + } + + if (pattern.type === 'RestElement') { + return getIdentifierNames(pattern.argument) + } + + if (pattern.type === 'AssignmentPattern') { + return getIdentifierNames(pattern.left) + } + + if (pattern.type === 'ArrayPattern') { + return pattern.elements.flatMap(getIdentifierNames) + } + + if (pattern.type === 'ObjectPattern') { + return pattern.properties.flatMap(property => ( + property.type === 'Property' + ? getIdentifierNames(property.value) + : getIdentifierNames(property.argument) + )) + } + + return [] +} + +function getParameterNode(parameter) { + return parameter.type === 'TSParameterProperty' + ? parameter.parameter + : parameter +} + +export default { + meta: { + type: 'suggestion', + docs: { + description: 'Enforce configured naming conventions.' + }, + schema: { + type: 'array', + items: { + type: 'object', + properties: { + selector: { + anyOf: [ + { + type: 'string' + }, + { + type: 'array', + items: { + type: 'string' + } + } + ] + }, + format: { + anyOf: [ + { + type: 'array', + items: { + type: 'string' + } + }, + { + type: 'null' + } + ] + }, + leadingUnderscore: { + type: 'string' + }, + modifiers: { + type: 'array', + items: { + type: 'string' + } + } + }, + required: ['selector'], + additionalProperties: true + } + } + }, + create(context) { + const options = context.options + + function check(name, node, selector, modifiers = []) { + const option = getSelectorOptions(options, selector, modifiers) + + if (!option || isValidName(name, option)) { + return + } + + context.report({ + node, + message: `Name "${name}" must match one of these formats: ${getExpectedFormats(option.format)}.` + }) + } + + function checkPattern(pattern, selector) { + for (const item of getIdentifierNames(pattern)) { + check(item.name, item.node, selector) + } + } + + function checkProperty(node, selector) { + const name = getKeyName(node.key) + + if (name === null) { + return + } + + check(name, node.key, selector, getPropertyModifiers(node)) + } + + return { + VariableDeclarator(node) { + checkPattern(node.id, 'variable') + }, + FunctionDeclaration(node) { + if (node.id) { + check(node.id.name, node.id, 'function') + } + + for (const parameter of node.params) { + checkPattern(getParameterNode(parameter), 'parameter') + } + }, + FunctionExpression(node) { + if (node.id) { + check(node.id.name, node.id, 'function') + } + + for (const parameter of node.params) { + checkPattern(getParameterNode(parameter), 'parameter') + } + }, + ArrowFunctionExpression(node) { + for (const parameter of node.params) { + checkPattern(getParameterNode(parameter), 'parameter') + } + }, + ClassDeclaration(node) { + if (node.id) { + check(node.id.name, node.id, 'typeLike') + } + }, + TSTypeAliasDeclaration(node) { + check(node.id.name, node.id, 'typeLike') + }, + TSInterfaceDeclaration(node) { + check(node.id.name, node.id, 'interface') + }, + TSEnumDeclaration(node) { + check(node.id.name, node.id, 'typeLike') + }, + TSEnumMember(node) { + const name = getKeyName(node.id) + + if (name !== null) { + check(name, node.id, 'enumMember') + } + }, + PropertyDefinition(node) { + checkProperty(node, 'classProperty') + }, + MethodDefinition(node) { + checkProperty(node, 'classProperty') + }, + Property(node) { + checkProperty(node, 'objectLiteralProperty') + } + } + } +} diff --git a/packages/oxlint-config/src/react.js b/packages/oxlint-config/src/react.js new file mode 100644 index 0000000..24dc1a9 --- /dev/null +++ b/packages/oxlint-config/src/react.js @@ -0,0 +1,13 @@ +/** + * React override + */ + +import reactConfig from './subconfigs/react.js' +import reactStylisticConfig from './subconfigs/react.stylistic.js' + +export default { + extends: [ + reactConfig, + reactStylisticConfig + ] +} diff --git a/packages/oxlint-config/src/storybook.js b/packages/oxlint-config/src/storybook.js new file mode 100644 index 0000000..8df3d56 --- /dev/null +++ b/packages/oxlint-config/src/storybook.js @@ -0,0 +1,26 @@ +/** + * Storybook override + */ + +import { storiesFiles } from './subconfigs/files.js' + +export default { + overrides: [ + { + files: storiesFiles, + rules: { + 'eslint/max-classes-per-file': 'off', + 'eslint/no-magic-numbers': 'off', + 'eslint/max-nested-callbacks': 'off', + 'react/no-array-index-key': 'off', + 'import/no-default-export': 'off', + 'typescript/no-unsafe-return': 'off', + 'typescript/no-unsafe-assignment': 'off', + 'typescript/no-unsafe-member-access': 'off', + 'typescript/no-unsafe-call': 'off', + 'typescript/no-unsafe-argument': 'off', + 'typescript/no-explicit-any': 'off' + } + } + ] +} diff --git a/packages/oxlint-config/src/subconfigs/base.stylistic.js b/packages/oxlint-config/src/subconfigs/base.stylistic.js new file mode 100644 index 0000000..6899f84 --- /dev/null +++ b/packages/oxlint-config/src/subconfigs/base.stylistic.js @@ -0,0 +1,232 @@ +/** + * Base stylistic config + */ + +export default { + jsPlugins: [ + { + name: 'stylistic-js', + specifier: '@stylistic/eslint-plugin' + } + ], + rules: { + // Possible Errors + 'stylistic-js/no-extra-parens': [ + 'error', + 'all', + { + nestedBinaryExpressions: false, + ignoreJSX: 'multi-line', + ignoredNodes: ['ArrowFunctionExpression[body.type=ConditionalExpression]'], + enforceForSequenceExpressions: false + } + ], + + // Best Practices + 'stylistic-js/dot-location': ['error', 'property'], + 'stylistic-js/no-multi-spaces': 'error', + + // Stylistic Issues + 'stylistic-js/array-bracket-newline': [ + 'error', + 'consistent' + ], + 'stylistic-js/array-bracket-spacing': ['error', 'never'], + 'stylistic-js/array-element-newline': [ + 'error', + { + consistent: true, + multiline: true + } + ], + 'stylistic-js/arrow-parens': [ + 'error', + 'as-needed', + { + requireForBlockBody: true + } + ], + 'stylistic-js/arrow-spacing': 'error', + 'stylistic-js/block-spacing': 'error', + 'stylistic-js/brace-style': ['error', '1tbs'], + 'stylistic-js/comma-dangle': ['error', 'never'], + 'stylistic-js/comma-spacing': 'error', + 'stylistic-js/comma-style': 'error', + 'stylistic-js/computed-property-spacing': 'error', + 'stylistic-js/curly-newline': [ + 'error', + { + minElements: 1 + } + ], + 'stylistic-js/eol-last': 'error', + 'stylistic-js/function-call-argument-newline': ['error', 'consistent'], + 'stylistic-js/function-call-spacing': 'error', + 'stylistic-js/function-paren-newline': ['error', 'consistent'], + 'stylistic-js/generator-star-spacing': ['error', 'after'], + 'stylistic-js/implicit-arrow-linebreak': ['error', 'beside'], + 'stylistic-js/indent': [ + 'error', + 2, + { + ignoredNodes: ['TSTypeParameterInstantiation', 'TSIntersectionType'], + SwitchCase: 1 + } + ], + 'stylistic-js/indent-binary-ops': 'off', + 'stylistic-js/jsx-quotes': ['error', 'prefer-single'], + 'stylistic-js/key-spacing': [ + 'error', + { + mode: 'strict' + } + ], + 'stylistic-js/keyword-spacing': 'error', + 'stylistic-js/linebreak-style': 'error', + 'stylistic-js/lines-between-class-members': [ + 'error', + 'always', + { + exceptAfterSingleLine: true + } + ], + 'stylistic-js/max-statements-per-line': 'error', + 'stylistic-js/multiline-ternary': ['error', 'always-multiline'], + 'stylistic-js/new-parens': 'error', + 'stylistic-js/no-confusing-arrow': [ + 'error', + { + allowParens: true + } + ], + 'stylistic-js/no-extra-semi': 'error', + 'stylistic-js/no-floating-decimal': 'error', + 'stylistic-js/no-mixed-spaces-and-tabs': 'error', + 'stylistic-js/no-multiple-empty-lines': [ + 'error', + { + max: 1 + } + ], + 'stylistic-js/no-tabs': 'error', + 'stylistic-js/no-trailing-spaces': 'error', + 'stylistic-js/no-whitespace-before-property': 'error', + 'stylistic-js/object-curly-newline': [ + 'error', + { + ObjectExpression: { + minProperties: 1 + }, + ObjectPattern: { + multiline: true + }, + ImportDeclaration: { + multiline: true + }, + ExportDeclaration: { + multiline: true + } + } + ], + 'stylistic-js/object-curly-spacing': ['error', 'always'], + 'stylistic-js/object-property-newline': [ + 'error', + { + allowAllPropertiesOnSameLine: false + } + ], + 'stylistic-js/one-var-declaration-per-line': ['error', 'initializations'], + 'stylistic-js/operator-linebreak': [ + 'error', + 'before', + { + overrides: { + '=': 'after' + } + } + ], + 'stylistic-js/padded-blocks': ['error', 'never'], + 'stylistic-js/padding-line-between-statements': [ + 'error', + { + blankLine: 'always', + prev: 'import', + next: '*' + }, + { + blankLine: 'never', + prev: 'import', + next: 'import' + }, + { + blankLine: 'always', + prev: '*', + next: 'block-like' + }, + { + blankLine: 'always', + prev: 'block-like', + next: '*' + }, + { + blankLine: 'always', + prev: '*', + next: ['const', 'let'] + }, + { + blankLine: 'always', + prev: ['const', 'let'], + next: '*' + }, + { + blankLine: 'never', + prev: ['const', 'let'], + next: ['const', 'let'] + }, + { + blankLine: 'always', + prev: ['cjs-import'], + next: '*' + }, + { + blankLine: 'never', + prev: ['cjs-import'], + next: ['cjs-import'] + } + ], + 'stylistic-js/quote-props': ['error', 'consistent-as-needed'], + 'stylistic-js/quotes': [ + 'error', + 'single', + { + avoidEscape: true, + allowTemplateLiterals: 'always' + } + ], + 'stylistic-js/rest-spread-spacing': ['error', 'never'], + 'stylistic-js/semi': ['error', 'never'], + 'stylistic-js/semi-spacing': 'error', + 'stylistic-js/space-before-blocks': 'error', + 'stylistic-js/space-before-function-paren': [ + 'error', + { + anonymous: 'always', + named: 'never', + asyncArrow: 'always' + } + ], + 'stylistic-js/space-in-parens': 'error', + 'stylistic-js/space-infix-ops': [ + 'error', + { + int32Hint: true + } + ], + 'stylistic-js/space-unary-ops': 'error', + 'stylistic-js/spaced-comment': 'error', + 'stylistic-js/switch-colon-spacing': 'error', + 'stylistic-js/template-curly-spacing': 'error', + 'stylistic-js/template-tag-spacing': 'error', + 'stylistic-js/yield-star-spacing': ['error', 'after'] + } +} diff --git a/packages/oxlint-config/src/subconfigs/basic.js b/packages/oxlint-config/src/subconfigs/basic.js new file mode 100644 index 0000000..606cc10 --- /dev/null +++ b/packages/oxlint-config/src/subconfigs/basic.js @@ -0,0 +1,242 @@ +/** + * Basic config + */ + +export default { + rules: { + 'eslint/constructor-super': 'error', + 'eslint/for-direction': 'error', + 'eslint/getter-return': 'error', + 'eslint/no-async-promise-executor': 'error', + 'eslint/no-case-declarations': 'error', + 'eslint/no-class-assign': 'error', + 'eslint/no-compare-neg-zero': 'error', + 'eslint/no-cond-assign': 'error', + 'eslint/no-const-assign': 'error', + 'eslint/no-constant-binary-expression': 'error', + 'eslint/no-constant-condition': 'error', + 'eslint/no-control-regex': 'error', + 'eslint/no-debugger': 'warn', + 'eslint/no-delete-var': 'error', + 'eslint/no-dupe-class-members': 'error', + 'eslint/no-dupe-else-if': 'error', + 'eslint/no-dupe-keys': 'error', + 'eslint/no-duplicate-case': 'error', + 'eslint/no-empty': [ + 'error', + { + allowEmptyCatch: true + } + ], + 'eslint/no-empty-character-class': 'error', + 'eslint/no-empty-pattern': 'error', + 'eslint/no-empty-static-block': 'error', + 'eslint/no-ex-assign': 'error', + 'eslint/no-extra-boolean-cast': 'error', + 'eslint/no-fallthrough': 'error', + 'eslint/no-func-assign': 'error', + 'eslint/no-global-assign': 'error', + 'eslint/no-import-assign': 'error', + 'eslint/no-invalid-regexp': 'error', + 'eslint/no-irregular-whitespace': 'error', + 'eslint/no-loss-of-precision': 'error', + 'eslint/no-misleading-character-class': 'error', + 'eslint/no-new-native-nonconstructor': 'error', + 'eslint/no-nonoctal-decimal-escape': 'error', + 'eslint/no-obj-calls': 'error', + 'eslint/no-prototype-builtins': 'error', + 'eslint/no-redeclare': 'error', + 'eslint/no-regex-spaces': 'error', + 'eslint/no-self-assign': 'error', + 'eslint/no-setter-return': 'error', + 'eslint/no-shadow-restricted-names': 'error', + 'eslint/no-sparse-arrays': 'error', + 'eslint/no-this-before-super': 'error', + 'eslint/no-unassigned-vars': 'error', + 'eslint/no-undef': 'error', + 'eslint/no-unexpected-multiline': 'error', + 'eslint/no-unreachable': 'error', + 'eslint/no-unsafe-finally': 'error', + 'eslint/no-unsafe-negation': 'error', + 'eslint/no-unsafe-optional-chaining': 'error', + 'eslint/no-unused-labels': 'error', + 'eslint/no-unused-private-class-members': 'error', + 'eslint/no-unused-vars': [ + 'error', + { + ignoreRestSiblings: true, + argsIgnorePattern: '^_' + } + ], + 'eslint/no-useless-assignment': 'error', + 'eslint/no-useless-backreference': 'error', + 'eslint/no-useless-catch': 'error', + 'eslint/no-useless-escape': 'error', + 'eslint/no-with': 'error', + 'eslint/require-yield': 'error', + 'eslint/use-isnan': 'error', + 'eslint/valid-typeof': [ + 'error', + { + requireStringLiterals: true + } + ], + 'eslint/no-console': [ + 'warn', + { + allow: [ + 'warn', + 'error', + 'info' + ] + } + ], + 'eslint/no-template-curly-in-string': 'error', + 'eslint/array-callback-return': 'error', + 'eslint/block-scoped-var': 'error', + 'eslint/curly': 'error', + 'eslint/default-case-last': 'error', + 'eslint/eqeqeq': 'error', + 'eslint/grouped-accessor-pairs': ['error', 'getBeforeSet'], + 'eslint/max-classes-per-file': 'error', + 'eslint/no-alert': 'warn', + 'eslint/no-caller': 'error', + 'eslint/no-constructor-return': 'error', + 'eslint/no-else-return': 'error', + 'eslint/no-empty-function': 'warn', + 'eslint/no-eq-null': 'error', + 'eslint/no-eval': 'error', + 'eslint/no-extend-native': 'error', + 'eslint/no-extra-bind': 'error', + 'eslint/no-extra-label': 'error', + 'eslint/no-implicit-coercion': 'error', + 'eslint/no-implicit-globals': 'error', + 'eslint/no-implied-eval': 'error', + 'eslint/no-iterator': 'error', + 'eslint/no-labels': 'error', + 'eslint/no-lone-blocks': 'error', + 'eslint/no-loop-func': 'error', + 'eslint/no-magic-numbers': [ + 'error', + { + ignore: [ + -1, + 0, + 0.5, + 1, + 2, + 100 + ], + ignoreArrayIndexes: true, + ignoreClassFieldInitialValues: true, + ignoreDefaultValues: true, + ignoreEnums: true, + ignoreNumericLiteralTypes: true, + ignoreReadonlyClassProperties: true, + ignoreTypeIndexes: true, + detectObjects: false + } + ], + 'eslint/no-multi-str': 'error', + 'eslint/no-new': 'error', + 'eslint/no-new-func': 'error', + 'eslint/no-new-wrappers': 'error', + 'eslint/no-object-constructor': 'error', + 'eslint/no-param-reassign': [ + 'error', + { + props: false + } + ], + 'eslint/no-promise-executor-return': 'off', + 'eslint/no-proto': 'error', + 'eslint/no-return-assign': 'error', + 'eslint/no-script-url': 'error', + 'eslint/no-self-compare': 'error', + 'eslint/no-sequences': 'error', + 'eslint/no-throw-literal': 'error', + 'eslint/no-unmodified-loop-condition': 'error', + 'eslint/no-unused-expressions': 'error', + 'eslint/no-useless-call': 'error', + 'eslint/no-useless-concat': 'error', + 'eslint/no-useless-return': 'error', + 'eslint/no-void': 'error', + 'eslint/prefer-promise-reject-errors': 'error', + 'eslint/prefer-regex-literals': 'error', + 'eslint/preserve-caught-error': 'error', + 'eslint/radix': 'off', + 'eslint/require-await': 'error', + 'eslint/yoda': [ + 'error', + 'never', + { + exceptRange: true + } + ], + 'eslint/no-label-var': 'error', + 'eslint/no-restricted-globals': ['error', 'event'], + 'eslint/no-use-before-define': [ + 'error', + { + functions: false + } + ], + 'eslint/arrow-body-style': ['error', 'as-needed'], + 'eslint/logical-assignment-operators': [ + 'error', + 'always', + { + enforceForIfStatements: true + } + ], + 'eslint/no-duplicate-imports': 'off', + 'eslint/no-useless-computed-key': 'error', + 'eslint/no-useless-constructor': 'error', + 'eslint/no-useless-rename': 'error', + 'eslint/no-var': 'error', + 'eslint/object-shorthand': ['error', 'always'], + 'eslint/prefer-arrow-callback': [ + 'error', + { + allowNamedFunctions: true + } + ], + 'eslint/prefer-const': [ + 'error', + { + destructuring: 'all', + ignoreReadBeforeAssign: false + } + ], + 'eslint/prefer-destructuring': 'off', + 'eslint/prefer-numeric-literals': 'error', + 'eslint/prefer-object-has-own': 'error', + 'eslint/prefer-rest-params': 'error', + 'eslint/prefer-spread': 'error', + 'eslint/prefer-template': 'error', + 'eslint/symbol-description': 'error', + 'eslint/func-names': 'error', + 'eslint/func-style': [ + 'error', + 'declaration', + { + allowArrowFunctions: true + } + ], + 'eslint/max-nested-callbacks': ['error', 4], + 'eslint/max-params': ['error', 6], + 'eslint/new-cap': [ + 'error', + { + capIsNew: false + } + ], + 'eslint/no-array-constructor': 'error', + 'eslint/no-lonely-if': 'error', + 'eslint/no-multi-assign': 'error', + 'eslint/no-unneeded-ternary': 'error', + 'eslint/operator-assignment': ['error', 'always'], + 'eslint/prefer-object-spread': 'error', + 'eslint/unicode-bom': 'error' + } +} diff --git a/packages/oxlint-config/src/subconfigs/configs.js b/packages/oxlint-config/src/subconfigs/configs.js new file mode 100644 index 0000000..acebb61 --- /dev/null +++ b/packages/oxlint-config/src/subconfigs/configs.js @@ -0,0 +1,17 @@ +/** + * Configs config + */ + +import { configFiles } from './files.js' + +export default { + overrides: [ + { + files: configFiles, + rules: { + 'import/no-default-export': 'off', + 'import/no-anonymous-default-export': 'off' + } + } + ] +} diff --git a/packages/oxlint-config/src/subconfigs/files.js b/packages/oxlint-config/src/subconfigs/files.js new file mode 100644 index 0000000..d1e93d2 --- /dev/null +++ b/packages/oxlint-config/src/subconfigs/files.js @@ -0,0 +1,23 @@ +export const configFiles = ['**/*.config.{c,m,}{js,ts}', '**/.*rc.{c,m,}{js,ts}'] + +export const commonjsFiles = ['**/*.c{js,ts}'] + +export const tsFiles = ['**/*.{c,m,}ts{x,}'] + +export const dtsFiles = ['**/*.d.{c,m,}ts'] + +export const moduleFiles = ['**/*.m{js,ts}'] + +export const testFiles = ['**/*.{spec,mock}.{js,ts}{x,}'] + +export const storiesFiles = ['**/*.stories.{js,ts}{x,}', '.storybook/**/*'] + +export const jsxFiles = ['**/*.{js,ts}x'] + +export const hooksFiles = ['**/hooks/*.{js,ts}{x,}'] + +export const reactFiles = [...jsxFiles, ...hooksFiles] + +export function not(files) { + return files.map(file => `!${file}`) +} diff --git a/packages/oxlint-config/src/subconfigs/import.js b/packages/oxlint-config/src/subconfigs/import.js new file mode 100644 index 0000000..1c3d69f --- /dev/null +++ b/packages/oxlint-config/src/subconfigs/import.js @@ -0,0 +1,88 @@ +/** + * Import config + */ + +export default { + plugins: ['import'], + jsPlugins: [ + { + name: 'trigen', + specifier: '@trigen/oxlint-config/plugin' + } + ], + rules: { + 'import/no-absolute-path': 'error', + 'import/no-dynamic-require': 'error', + 'import/no-webpack-loader-syntax': 'error', + 'import/no-self-import': 'error', + 'import/no-cycle': [ + 'error', + { + ignoreExternal: true + } + ], + 'import/export': 'error', + 'import/no-mutable-exports': 'error', + 'import/no-amd': 'error', + 'import/first': 'error', + 'import/no-duplicates': 'error', + 'import/newline-after-import': 'error', + 'import/no-default-export': 'error', + 'import/no-named-default': 'error', + 'import/no-anonymous-default-export': [ + 'error', + { + allowArray: true, + allowArrowFunction: false, + allowAnonymousClass: false, + allowAnonymousFunction: false, + allowCallExpression: false, + allowLiteral: false, + allowObject: true + } + ], + 'trigen/import-order': [ + 'error', + { + 'groups': [ + 'builtin', + 'external', + 'internal', + 'parent', + 'sibling', + 'index' + ], + 'pathGroups': [ + { + pattern: '~/**', + group: 'external', + position: 'after' + }, + { + pattern: '#*/**', + group: 'external', + position: 'after' + }, + { + pattern: '@/**', + group: 'external', + position: 'after' + } + ], + 'newlines-between': 'never', + 'typeImports': 'first' + } + ], + 'trigen/named-import-order': [ + 'error', + { + typeImports: 'first', + patterns: [ + '^[A-Z][A-Z0-9_]*$', + '^[A-Z][a-zA-Z0-9]*$', + '^[a-z][a-zA-Z0-9]*$' + ] + } + ] + } +} diff --git a/packages/oxlint-config/src/subconfigs/jsdoc.js b/packages/oxlint-config/src/subconfigs/jsdoc.js new file mode 100644 index 0000000..6939c03 --- /dev/null +++ b/packages/oxlint-config/src/subconfigs/jsdoc.js @@ -0,0 +1,41 @@ +/** + * JSDoc config + */ + +import { tsFiles } from './files.js' + +export default { + plugins: ['jsdoc'], + rules: { + // Recommended + 'jsdoc/check-access': 'warn', + 'jsdoc/check-property-names': 'warn', + 'jsdoc/check-tag-names': 'warn', + 'jsdoc/empty-tags': 'warn', + 'jsdoc/implements-on-classes': 'warn', + 'jsdoc/no-defaults': 'warn', + 'jsdoc/require-param': 'warn', + 'jsdoc/require-param-description': 'off', + 'jsdoc/require-param-name': 'warn', + 'jsdoc/require-param-type': 'off', + 'jsdoc/require-property': 'warn', + 'jsdoc/require-property-description': 'warn', + 'jsdoc/require-property-name': 'warn', + 'jsdoc/require-property-type': 'warn', + 'jsdoc/require-returns': 'warn', + 'jsdoc/require-returns-description': 'warn', + 'jsdoc/require-returns-type': 'off', + 'jsdoc/require-throws-type': 'warn', + 'jsdoc/require-yields': 'warn', + 'jsdoc/require-yields-type': 'warn' + }, + overrides: [ + { + files: tsFiles, + rules: { + 'jsdoc/require-param': 'off', + 'jsdoc/require-yields-type': 'off' + } + } + ] +} diff --git a/packages/oxlint-config/src/subconfigs/react.js b/packages/oxlint-config/src/subconfigs/react.js new file mode 100644 index 0000000..0e32ea6 --- /dev/null +++ b/packages/oxlint-config/src/subconfigs/react.js @@ -0,0 +1,76 @@ +/** + * ReactJS config + */ + +import { + jsxFiles, + reactFiles +} from './files.js' + +export default { + overrides: [ + { + files: jsxFiles, + rules: { + 'jsdoc/require-param': 'off', + 'jsdoc/require-returns': 'off' + } + }, + { + files: reactFiles, + plugins: ['react'], + rules: { + // React + 'react/no-array-index-key': 'warn', + 'react/no-children-prop': 'error', + 'react/no-danger': 'warn', + 'react/no-danger-with-children': 'error', + 'react/no-did-mount-set-state': 'error', + 'react/no-did-update-set-state': 'error', + 'react/no-direct-mutation-state': 'error', + 'react/no-find-dom-node': 'error', + 'react/no-is-mounted': 'error', + 'react/no-multi-comp': [ + 'error', + { + ignoreStateless: true + } + ], + 'react/no-redundant-should-component-update': 'error', + 'react/no-render-return-value': 'error', + 'react/no-string-refs': 'error', + 'react/no-this-in-sfc': 'error', + 'react/no-unescaped-entities': 'error', + 'react/no-unknown-property': 'error', + 'react/no-unsafe': 'error', + 'react/no-will-update-set-state': 'error', + 'react/prefer-es6-class': 'error', + 'react/react-in-jsx-scope': 'off', + 'react/require-render-return': 'error', + 'react/self-closing-comp': 'error', + 'react/style-prop-object': 'error', + 'react/void-dom-elements-no-children': 'error', + + // Hooks + 'react/rules-of-hooks': 'error', + 'react/exhaustive-deps': 'warn', + + // JSX + 'react/jsx-boolean-value': 'error', + 'react/jsx-fragments': 'error', + 'react/jsx-key': 'error', + 'react/jsx-no-comment-textnodes': 'error', + 'react/jsx-no-duplicate-props': 'error', + 'react/jsx-no-script-url': 'error', + 'react/jsx-no-target-blank': [ + 'error', + { + enforceDynamicLinks: 'always' + } + ], + 'react/jsx-no-undef': 'error', + 'react/jsx-no-useless-fragment': 'error' + } + } + ] +} diff --git a/packages/oxlint-config/src/subconfigs/react.stylistic.js b/packages/oxlint-config/src/subconfigs/react.stylistic.js new file mode 100644 index 0000000..ec0bcf3 --- /dev/null +++ b/packages/oxlint-config/src/subconfigs/react.stylistic.js @@ -0,0 +1,66 @@ +/** + * React stylistic config + */ + +import { reactFiles } from './files.js' + +export default { + overrides: [ + { + files: reactFiles, + plugins: ['react'], + jsPlugins: [ + { + name: 'stylistic-js', + specifier: '@stylistic/eslint-plugin' + } + ], + rules: { + 'stylistic-js/jsx-child-element-spacing': 'error', + 'stylistic-js/jsx-closing-bracket-location': 'error', + 'stylistic-js/jsx-closing-tag-location': 'error', + 'react/jsx-curly-brace-presence': ['error', 'never'], + 'stylistic-js/jsx-curly-newline': 'error', + 'stylistic-js/jsx-curly-spacing': 'error', + 'stylistic-js/jsx-equals-spacing': 'error', + 'stylistic-js/jsx-first-prop-new-line': ['error', 'multiline'], + 'stylistic-js/jsx-function-call-newline': ['error', 'always'], + 'stylistic-js/jsx-indent-props': ['error', 2], + 'stylistic-js/jsx-max-props-per-line': [ + 'error', + { + maximum: 1 + } + ], + 'stylistic-js/jsx-one-expression-per-line': [ + 'error', + { + allow: 'literal' + } + ], + 'react/jsx-pascal-case': 'error', + 'stylistic-js/jsx-self-closing-comp': 'error', + 'stylistic-js/jsx-tag-spacing': [ + 'error', + { + closingSlash: 'never', + beforeSelfClosing: 'never', + afterOpening: 'never' + } + ], + 'stylistic-js/jsx-wrap-multilines': [ + 'error', + { + declaration: 'parens-new-line', + assignment: 'parens-new-line', + return: 'parens-new-line', + arrow: 'parens-new-line', + condition: 'parens-new-line', + logical: 'parens-new-line', + prop: 'parens-new-line' + } + ] + } + } + ] +} diff --git a/packages/oxlint-config/src/subconfigs/typescript-type-checked.js b/packages/oxlint-config/src/subconfigs/typescript-type-checked.js new file mode 100644 index 0000000..bfc5be5 --- /dev/null +++ b/packages/oxlint-config/src/subconfigs/typescript-type-checked.js @@ -0,0 +1,71 @@ +/** + * TypeScript type checked config + */ + +import typescriptConfig from './typescript.js' +import { tsFiles } from './files.js' + +export default { + extends: [typescriptConfig], + overrides: [ + { + files: tsFiles, + plugins: ['typescript'], + rules: { + // Recommended type checked + 'typescript/no-array-delete': 'error', + 'typescript/no-base-to-string': 'error', + 'typescript/no-duplicate-type-constituents': 'error', + 'typescript/no-floating-promises': 'error', + 'typescript/no-for-in-array': 'error', + 'eslint/no-implied-eval': 'off', + 'typescript/no-implied-eval': 'error', + 'typescript/no-misused-promises': 'error', + 'typescript/no-redundant-type-constituents': 'error', + 'typescript/no-unnecessary-type-assertion': 'error', + 'typescript/no-unsafe-argument': 'error', + 'typescript/no-unsafe-assignment': 'error', + 'typescript/no-unsafe-call': 'error', + 'typescript/no-unsafe-enum-comparison': 'error', + 'typescript/no-unsafe-member-access': 'error', + 'typescript/no-unsafe-return': 'error', + 'typescript/no-unsafe-unary-minus': 'error', + 'eslint/no-throw-literal': 'off', + 'typescript/only-throw-error': 'error', + 'eslint/prefer-promise-reject-errors': 'off', + 'typescript/prefer-promise-reject-errors': 'error', + 'eslint/require-await': 'off', + 'typescript/require-await': 'error', + 'typescript/restrict-plus-operands': 'error', + 'typescript/restrict-template-expressions': 'error', + 'typescript/unbound-method': [ + 'off', + { + ignoreStatic: true + } + ], + + // Rules + 'typescript/no-deprecated': 'error', + 'typescript/no-misused-spread': 'error', + 'typescript/no-mixed-enums': 'error', + 'typescript/no-unnecessary-boolean-literal-compare': 'error', + 'typescript/no-unnecessary-qualifier': 'error', + 'typescript/no-unnecessary-template-expression': 'error', + 'typescript/no-unnecessary-type-arguments': 'error', + 'typescript/consistent-type-imports': 'error', + 'eslint/dot-notation': 'off', + 'typescript/dot-notation': 'error', + 'typescript/prefer-includes': 'error', + 'typescript/prefer-nullish-coalescing': 'off', + 'typescript/prefer-optional-chain': 'error', + 'typescript/prefer-readonly': 'error', + 'typescript/prefer-readonly-parameter-types': 'off', + 'typescript/prefer-reduce-type-parameter': 'error', + 'typescript/prefer-return-this-type': 'error', + 'typescript/prefer-string-starts-ends-with': 'error', + 'typescript/switch-exhaustiveness-check': 'error' + } + } + ] +} diff --git a/packages/oxlint-config/src/subconfigs/typescript.js b/packages/oxlint-config/src/subconfigs/typescript.js new file mode 100644 index 0000000..11d3dcd --- /dev/null +++ b/packages/oxlint-config/src/subconfigs/typescript.js @@ -0,0 +1,175 @@ +/** + * TypeScript config + */ + +import { + dtsFiles, + tsFiles +} from './files.js' + +export default { + overrides: [ + { + files: tsFiles, + plugins: ['typescript'], + jsPlugins: [ + { + name: 'trigen', + specifier: '@trigen/oxlint-config/plugin' + } + ], + rules: { + // Recommended + 'typescript/ban-ts-comment': [ + 'error', + { + 'ts-expect-error': 'allow-with-description', + 'ts-ignore': true, + 'ts-nocheck': 'allow-with-description', + 'ts-check': false + } + ], + 'typescript/no-duplicate-enum-values': 'error', + 'typescript/no-empty-object-type': [ + 'error', + { + allowInterfaces: 'with-single-extends' + } + ], + 'typescript/no-explicit-any': 'error', + 'typescript/no-extra-non-null-assertion': 'error', + 'typescript/no-misused-new': 'error', + 'typescript/no-namespace': [ + 'error', + { + allowDeclarations: true, + allowDefinitionFiles: true + } + ], + 'typescript/no-non-null-asserted-optional-chain': 'error', + 'typescript/no-require-imports': 'error', + 'typescript/no-this-alias': [ + 'error', + { + allowDestructuring: true, + allowedNames: ['self'] + } + ], + 'typescript/no-unnecessary-type-constraint': 'error', + 'typescript/no-unsafe-declaration-merging': 'error', + 'typescript/no-unsafe-function-type': 'error', + 'typescript/no-wrapper-object-types': 'error', + 'typescript/prefer-as-const': 'error', + 'typescript/prefer-namespace-keyword': 'off', + 'typescript/triple-slash-reference': 'error', + + // Rules + 'typescript/array-type': 'error', + 'typescript/await-thenable': 'off', + 'typescript/consistent-type-definitions': 'error', + 'typescript/consistent-type-exports': [ + 'error', + { + fixMixedExportsWithInlineTypeSpecifier: true + } + ], + 'typescript/explicit-module-boundary-types': 'off', + 'typescript/no-dynamic-delete': 'error', + 'typescript/no-extraneous-class': 'error', + 'typescript/no-invalid-void-type': 'error', + 'typescript/prefer-for-of': 'error', + 'typescript/prefer-function-type': 'error', + 'typescript/unified-signatures': 'error', + 'trigen/member-ordering': [ + 'error', + { + default: { + order: 'as-written', + memberTypes: [ + 'public-static-method', + 'protected-static-method', + 'private-static-method', + 'public-static-field', + 'protected-static-field', + 'private-static-field', + 'public-decorated-field', + 'protected-decorated-field', + 'private-decorated-field', + 'public-instance-field', + 'protected-instance-field', + 'private-instance-field', + 'public-abstract-field', + 'protected-abstract-field', + 'signature', + 'public-constructor', + 'protected-constructor', + 'private-constructor', + 'instance-method' + ] + } + } + ], + 'trigen/naming-convention': [ + 'error', + { + selector: 'default', + format: [ + 'camelCase', + 'PascalCase', + 'UPPER_CASE' + ] + }, + { + selector: 'variable', + format: [ + 'camelCase', + 'UPPER_CASE', + 'PascalCase' + ] + }, + { + selector: 'function', + format: ['camelCase', 'PascalCase'] + }, + { + selector: 'parameter', + format: ['camelCase', 'PascalCase'], + leadingUnderscore: 'allow' + }, + { + selector: 'typeLike', + format: ['PascalCase'] + }, + { + selector: 'interface', + format: ['PascalCase'] + }, + { + selector: 'enumMember', + format: ['PascalCase'] + }, + { + selector: 'classProperty', + format: [ + 'camelCase', + 'UPPER_CASE', + 'PascalCase' + ], + modifiers: ['static'] + }, + { + selector: ['objectLiteralProperty', 'objectLiteralMethod'], + format: null, + modifiers: ['requiresQuotes'] + } + ] + } + }, + { + files: dtsFiles, + rules: { + 'import/unambiguous': 'off' + } + } + ] +} diff --git a/packages/oxlint-config/src/subconfigs/typescript.stylistic.js b/packages/oxlint-config/src/subconfigs/typescript.stylistic.js new file mode 100644 index 0000000..8283347 --- /dev/null +++ b/packages/oxlint-config/src/subconfigs/typescript.stylistic.js @@ -0,0 +1,37 @@ +/** + * TypeScript stylistic config + */ + +import { tsFiles } from './files.js' + +export default { + overrides: [ + { + files: tsFiles, + jsPlugins: [ + { + name: 'stylistic-js', + specifier: '@stylistic/eslint-plugin' + } + ], + rules: { + 'stylistic-js/member-delimiter-style': [ + 'error', + { + multiline: { + delimiter: 'none', + requireLast: true + }, + singleline: { + delimiter: 'comma', + requireLast: false + } + } + ], + 'stylistic-js/type-annotation-spacing': 'error', + 'stylistic-js/type-generic-spacing': 'error', + 'stylistic-js/type-named-tuple-spacing': 'error' + } + } + ] +} diff --git a/packages/oxlint-config/src/test.js b/packages/oxlint-config/src/test.js new file mode 100644 index 0000000..eb773b4 --- /dev/null +++ b/packages/oxlint-config/src/test.js @@ -0,0 +1,35 @@ +/** + * Test override + */ + +import { testFiles } from './subconfigs/files.js' + +export default { + overrides: [ + { + files: testFiles, + env: { + vitest: true + }, + rules: { + 'eslint/max-classes-per-file': 'off', + 'eslint/no-magic-numbers': 'off', + 'eslint/max-nested-callbacks': 'off', + 'typescript/no-unsafe-return': 'off', + 'typescript/no-unsafe-assignment': 'off', + 'typescript/no-unsafe-member-access': 'off', + 'typescript/no-unsafe-call': 'off', + 'typescript/no-unsafe-argument': 'off', + 'typescript/no-explicit-any': 'off', + 'typescript/no-floating-promises': 'off', + 'trigen/import-order': 'off', + 'eslint/prefer-destructuring': 'off', + 'eslint/no-loop-func': 'off', + 'typescript/no-misused-promises': 'off' + + // Unsupported by Oxlint + // 'eslint/camelcase': 'off', + } + } + ] +} diff --git a/packages/oxlint-config/src/typescript-type-checked.js b/packages/oxlint-config/src/typescript-type-checked.js new file mode 100644 index 0000000..c1fae0f --- /dev/null +++ b/packages/oxlint-config/src/typescript-type-checked.js @@ -0,0 +1,13 @@ +/** + * TypeScript type checked override + */ + +import typescriptTypeCheckedConfig from './subconfigs/typescript-type-checked.js' +import typescriptStylisticConfig from './subconfigs/typescript.stylistic.js' + +export default { + extends: [ + typescriptTypeCheckedConfig, + typescriptStylisticConfig + ] +} diff --git a/packages/oxlint-config/src/typescript.js b/packages/oxlint-config/src/typescript.js new file mode 100644 index 0000000..987057f --- /dev/null +++ b/packages/oxlint-config/src/typescript.js @@ -0,0 +1,13 @@ +/** + * TypeScript override + */ + +import typescriptConfig from './subconfigs/typescript.js' +import typescriptStylisticConfig from './subconfigs/typescript.stylistic.js' + +export default { + extends: [ + typescriptConfig, + typescriptStylisticConfig + ] +} diff --git a/packages/project-files/eslint.config.js b/packages/project-files/eslint.config.js deleted file mode 100644 index 49bc9c1..0000000 --- a/packages/project-files/eslint.config.js +++ /dev/null @@ -1,9 +0,0 @@ -import moduleConfig from '@trigen/eslint-config/module' -import testConfig from '@trigen/eslint-config/test' -import rootConfig from '../../eslint.config.js' - -export default [ - ...rootConfig, - ...moduleConfig, - ...testConfig -] diff --git a/packages/project-files/oxlint.config.ts b/packages/project-files/oxlint.config.ts new file mode 100644 index 0000000..cd2391d --- /dev/null +++ b/packages/project-files/oxlint.config.ts @@ -0,0 +1,12 @@ +import moduleConfig from '@trigen/oxlint-config/module' +import testConfig from '@trigen/oxlint-config/test' +import rootConfig from '../../oxlint.config.ts' + +export default { + ...rootConfig, + extends: [ + rootConfig, + moduleConfig, + testConfig + ] +} diff --git a/packages/scripts/eslint.config.js b/packages/scripts/eslint.config.js deleted file mode 100644 index 74a26df..0000000 --- a/packages/scripts/eslint.config.js +++ /dev/null @@ -1,9 +0,0 @@ -import moduleConfig from '@trigen/eslint-config/module' -import testConfig from '@trigen/eslint-config/test' -import rootConfig from '../../eslint.config.js' - -export default [ - ...rootConfig, - ...testConfig, - ...moduleConfig -] diff --git a/packages/scripts/oxlint.config.ts b/packages/scripts/oxlint.config.ts new file mode 100644 index 0000000..cd2391d --- /dev/null +++ b/packages/scripts/oxlint.config.ts @@ -0,0 +1,12 @@ +import moduleConfig from '@trigen/oxlint-config/module' +import testConfig from '@trigen/oxlint-config/test' +import rootConfig from '../../oxlint.config.ts' + +export default { + ...rootConfig, + extends: [ + rootConfig, + moduleConfig, + testConfig + ] +} diff --git a/packages/scripts/src/utils/run.js b/packages/scripts/src/utils/run.js index b7ea454..6544916 100644 --- a/packages/scripts/src/utils/run.js +++ b/packages/scripts/src/utils/run.js @@ -36,7 +36,7 @@ export async function run(pm, scripts, pkg, concurrency) { } } - finalExitCode = finalExitCode || await task.exitCode + finalExitCode ||= await task.exitCode } return finalExitCode diff --git a/packages/stylelint-config/eslint.config.js b/packages/stylelint-config/eslint.config.js deleted file mode 100644 index dd9a6c2..0000000 --- a/packages/stylelint-config/eslint.config.js +++ /dev/null @@ -1,14 +0,0 @@ -import moduleConfig from '@trigen/eslint-config/module' -import rootConfig from '../../eslint.config.js' - -export default [ - ...rootConfig, - ...moduleConfig, - { - rules: { - 'no-magic-numbers': 'off', - 'import/no-default-export': 'off', - 'import/no-anonymous-default-export': 'off' - } - } -] diff --git a/packages/stylelint-config/oxlint.config.ts b/packages/stylelint-config/oxlint.config.ts new file mode 100644 index 0000000..eaa48c7 --- /dev/null +++ b/packages/stylelint-config/oxlint.config.ts @@ -0,0 +1,15 @@ +import moduleConfig from '@trigen/oxlint-config/module' +import rootConfig from '../../oxlint.config.ts' + +export default { + ...rootConfig, + extends: [ + rootConfig, + moduleConfig + ], + rules: { + 'eslint/no-magic-numbers': 'off', + 'import/no-default-export': 'off', + 'import/no-anonymous-default-export': 'off' + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8afc71f..a84562e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,12 +20,12 @@ importers: '@commitlint/cz-commitlint': specifier: ^20.0.0 version: 20.1.0(@types/node@22.16.0)(commitizen@4.3.1(@types/node@22.16.0))(inquirer@9.3.8(@types/node@22.16.0)) - '@trigen/eslint-config': - specifier: workspace:* - version: link:packages/eslint-config '@trigen/lint-package-json': specifier: workspace:* version: link:packages/lint-package-json + '@trigen/oxlint-config': + specifier: workspace:* + version: link:packages/oxlint-config '@trigen/project-files': specifier: workspace:* version: link:packages/project-files @@ -41,9 +41,6 @@ importers: del-cli: specifier: ^7.0.0 version: 7.0.0 - eslint: - specifier: 9.31.0 - version: 9.31.0(jiti@2.4.2) inquirer: specifier: ^9.3.7 version: 9.3.8(@types/node@22.16.0) @@ -53,6 +50,9 @@ importers: npm-package-json-lint: specifier: ^9.0.0 version: 9.0.0 + oxlint: + specifier: ^1.67.0 + version: 1.68.0 simple-git-hooks: specifier: ^2.7.0 version: 2.13.1 @@ -73,40 +73,40 @@ importers: version: 9.39.1 '@stylistic/eslint-plugin': specifier: ^5.5.0 - version: 5.5.0(eslint@9.31.0(jiti@2.4.2)) + version: 5.5.0 '@typescript-eslint/eslint-plugin': specifier: ^8.0.0 - version: 8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.31.0(jiti@2.4.2)))(eslint@9.31.0(jiti@2.4.2)) + version: 8.46.4(@typescript-eslint/parser@8.46.4) '@typescript-eslint/parser': specifier: ^8.0.0 - version: 8.46.4(eslint@9.31.0(jiti@2.4.2)) + version: 8.46.4 eslint-plugin-import: specifier: ^2.30.0 - version: 2.32.0(@typescript-eslint/parser@8.46.4(eslint@9.31.0(jiti@2.4.2)))(eslint@9.31.0(jiti@2.4.2)) + version: 2.32.0(@typescript-eslint/parser@8.46.4) eslint-plugin-jest: specifier: ^29.0.1 - version: 29.1.0(@typescript-eslint/eslint-plugin@8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.31.0(jiti@2.4.2)))(eslint@9.31.0(jiti@2.4.2)))(eslint@9.31.0(jiti@2.4.2)) + version: 29.1.0(@typescript-eslint/eslint-plugin@8.46.4(@typescript-eslint/parser@8.46.4)) eslint-plugin-jest-dom: specifier: ^5.4.0 - version: 5.5.0(eslint@9.31.0(jiti@2.4.2)) + version: 5.5.0 eslint-plugin-jsdoc: specifier: ^61.2.1 - version: 61.2.1(eslint@9.31.0(jiti@2.4.2)) + version: 61.7.1 eslint-plugin-react: specifier: ^7.35.0 - version: 7.37.5(eslint@9.31.0(jiti@2.4.2)) + version: 7.37.5 eslint-plugin-react-hooks: specifier: ^7.0.1 - version: 7.0.1(eslint@9.31.0(jiti@2.4.2)) + version: 7.0.1 eslint-plugin-testing-library: specifier: ^7.5.3 - version: 7.13.4(eslint@9.31.0(jiti@2.4.2)) + version: 7.13.4 globals: specifier: ^17.0.0 version: 17.4.0 typescript-eslint: specifier: ^8.35.1 - version: 8.46.4(eslint@9.31.0(jiti@2.4.2)) + version: 8.46.4 publishDirectory: package packages/lint-package-json: @@ -129,6 +129,13 @@ importers: version: 8.0.1(npm-package-json-lint@9.0.0) publishDirectory: package + packages/oxlint-config: + dependencies: + '@stylistic/eslint-plugin': + specifier: ^5.5.0 + version: 5.5.0 + publishDirectory: package + packages/project-files: dependencies: '@octokit/rest': @@ -192,10 +199,6 @@ importers: packages: - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - '@babel/code-frame@7.22.13': resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} @@ -414,8 +417,8 @@ packages: '@dual-bundle/import-meta-resolve@4.2.1': resolution: {integrity: sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==} - '@es-joy/jsdoccomment@0.76.0': - resolution: {integrity: sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w==} + '@es-joy/jsdoccomment@0.78.0': + resolution: {integrity: sha512-rQkU5u8hNAq2NVRzHnIUUvR6arbO0b6AOlvpTNS48CkiKSn/xtNfOzBK23JE4SiW89DgvU7GtxLVgV4Vn2HBAw==} engines: {node: '>=20.11.0'} '@es-joy/resolve.exports@1.2.0': @@ -588,62 +591,14 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.0': - resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/config-helpers@0.3.0': - resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.15.1': - resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/js@9.31.0': - resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.39.1': resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/plugin-kit@0.3.3': - resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@gwhitney/detect-indent@7.0.1': resolution: {integrity: sha512-7bQW+gkKa2kKZPeJf6+c6gFK9ARxQfn+FKy9ScTBppyKRWH2KzsmweXUoklqeEiHiNVWaeP5csIdsNq6w7QhzA==} engines: {node: '>=12.20'} - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} - - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} - engines: {node: '>=18.18.0'} - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - - '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} - '@inquirer/external-editor@1.0.3': resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} engines: {node: '>=18'} @@ -746,6 +701,120 @@ packages: '@octokit/types@16.0.0': resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} + '@oxlint/binding-android-arm-eabi@1.68.0': + resolution: {integrity: sha512-wEdsIspexXLLMCPAEOcCuFLMt6aE3AzTuA/nQKLPRnoJ+EQTturmGheDkhHuuVHx0GbutjQ3JKmEn+Gz6Ag28Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.68.0': + resolution: {integrity: sha512-6aZRNNXQTsYtgaus8HTb9nuCcsrQTlKXGnktwvwW0n/SooRWNxNb3925grDkC63aEYZuCIyOVLV16IdYIoC2aQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.68.0': + resolution: {integrity: sha512-lVTbsE3kO4bLpZELgjRZuAJc8kP98wb83yMXWH8gaPaFZ+cM2IDeZto4ByoUAYj0Mxv2rvw+A1ssZequSepVSg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.68.0': + resolution: {integrity: sha512-nCmw2XrmQskjBUh/sfP5yKs93V68LijQgjd1cuuZ/q4SCARngLYs60/qqyzuMsg8QQ9KArDI98hxs/RDGE4KRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.68.0': + resolution: {integrity: sha512-TI4ovQJliYE9V6e06cEv+qEI9uj7Ao65fmif4er4HD+aouyYyh0P31q2jh3KtqsOHHcQqv2PZ61TjJFLpBDGWQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.68.0': + resolution: {integrity: sha512-LcNnEi9g71Cmry5ZpLbKT+oVv+/zYG3hYVAbBBB5X85nOQZSk8l92CnDkxJMcxUg0NCnMCOFZuaVDlMyv4tYJw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.68.0': + resolution: {integrity: sha512-OovHahL3FX4UaK+hgSf11llUx2vszqjSdQQ61Ck9InOEI/ptZoC4XSQJurITqItVvd53JSlmkLMeaNjM1PoQew==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.68.0': + resolution: {integrity: sha512-YbzTglnHLzzi9zv5or8Ztz5fykAoZE8W9iM42/bOrF4HBSB6rJTqdLQWuoP76EHQw9DuKl76K1QmFlG29sPJXQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-arm64-musl@1.68.0': + resolution: {integrity: sha512-qVKtCZNic+OoNnOr/hCQAu22HSQzflI7Fsq/Blzkw02SnLuv163k3kfmrVpZjSBlUHgsRKj6WgQiw30d3SX02Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-ppc64-gnu@1.68.0': + resolution: {integrity: sha512-zExyZ8ZOUuAyQ0y9jpTcyjKUz62YY9JhKPyVxzvjTpXzZ3ujdqiVwfPWDdnA1SsIOrxdtxHn7KErDHLWskFjXg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxlint/binding-linux-riscv64-gnu@1.68.0': + resolution: {integrity: sha512-6C4MPuwewyDavA7sxM14wzgRi5GGL68HPIxRCdVyS75U4MDbpFVYzKO9WNR6KLKTMPq2pcz3THwo1sK2uiqngw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-riscv64-musl@1.68.0': + resolution: {integrity: sha512-bnZooVeHAcvA+dH0EDLgx+7HY/DRi6e0hFszg3P+OBatuUjV6EvfIyNIzWOusmqAVh4L6r21GGTZtiKE4iqM4Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-s390x-gnu@1.68.0': + resolution: {integrity: sha512-dIqnZnJSmHCMOUpUcWQOiV14o3DDPVx1DSsMaSzvdhNjC1tB1iEPZbdiMSCIEYbkgbsYznHXWqFdKL8WUB3F8g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxlint/binding-linux-x64-gnu@1.68.0': + resolution: {integrity: sha512-zc9lEnfV/HreDTY6gdMlZe+irkwHSxQ4/B1pS9GyK7RVaA5LxhoZY/w6/o2vIwLLEYiXQ5ujGxOM1ZazeFAAIA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-linux-x64-musl@1.68.0': + resolution: {integrity: sha512-Dl5QEX0TCo/40Cdh1o1JdPS//+YiWqjC+Hrrya5OQmStZZr4svAFtdlqcpCrU9yq2Mo3vRVyO9B3h0dzD8s36Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-openharmony-arm64@1.68.0': + resolution: {integrity: sha512-/qy6dOvi4S3/LeXq0l5BT5pRKPYA7oj3uKwJOAZOr5HRLL+HK6jdBynvWuXIA2wwfE01RzNYmbBdM7vwYx00sA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.68.0': + resolution: {integrity: sha512-fHNtVqPHSYE7UFDSLVFUjxQjnSVXxseNJmRW+XuP4pXXDwePdPda43NL7/BBCFTxHjycOc44JNDaOPtFDNui9A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.68.0': + resolution: {integrity: sha512-NnKXr4Wgo4nps3erhrE0f8shBvBPZMHg72nDsvX0JyrRvsNiP3f1JNvbCKh+A6VFvpF7ZoJxu904P3cKMhvZnA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.68.0': + resolution: {integrity: sha512-zg5pA+84AlU6XHJ3ruiRxziO71QTrz8nLsk6u01JGS5+tL9/bnlakFiklFrcy4R1/V7ktWtaNitN3JZWmKnf6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@pnpm/constants@7.1.1': resolution: {integrity: sha512-31pZqMtjwV+Vaq7MaPrT1EoDFSYwye3dp6BiHIGRJmVThCQwySRKM7hCvqqI94epNkqFAAYoWrNynWoRYosGdw==} engines: {node: '>=16.14'} @@ -920,9 +989,6 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@ -1074,6 +1140,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + ajv-errors@1.0.1: resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} peerDependencies: @@ -1451,9 +1522,6 @@ packages: dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -1620,8 +1688,8 @@ packages: jest: optional: true - eslint-plugin-jsdoc@61.2.1: - resolution: {integrity: sha512-Htacti3dbkNm4rlp/Bk9lqhv+gi6US9jyN22yaJ42G6wbteiTbNLChQwi25jr/BN+NOzDWhZHvCDdrhX0F8dXQ==} + eslint-plugin-jsdoc@61.7.1: + resolution: {integrity: sha512-36DpldF95MlTX//n3/naULFVt8d1cV4jmSkx7ZKrE9ikkKHAgMLesuWp1SmwpVwAs5ndIM6abKd6PeOYZUgdWg==} engines: {node: '>=20.11.0'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -1644,10 +1712,6 @@ packages: peerDependencies: eslint: ^8.57.0 || ^9.0.0 - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1656,27 +1720,21 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.31.0: - resolution: {integrity: sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} espree@10.4.0: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} @@ -1714,9 +1772,6 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} @@ -1743,10 +1798,6 @@ packages: file-entry-cache@10.1.4: resolution: {integrity: sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==} - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -1761,10 +1812,6 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - find-up@7.0.0: resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} engines: {node: '>=18'} @@ -1773,10 +1820,6 @@ packages: resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} engines: {node: '>= 8'} - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - flat-cache@6.1.18: resolution: {integrity: sha512-JUPnFgHMuAVmLmoH9/zoZ6RHOt5n9NlUw/sDXsTbROJ2SFoS2DS4s+swAV6UTeTbGH/CAsZIE6M8TaG/3jVxgQ==} @@ -1848,10 +1891,6 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me @@ -1876,10 +1915,6 @@ packages: resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} engines: {node: '>=6'} - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - globals@17.4.0: resolution: {integrity: sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==} engines: {node: '>=18'} @@ -2246,8 +2281,8 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsdoc-type-pratt-parser@6.10.0: - resolution: {integrity: sha512-+LexoTRyYui5iOhJGn13N9ZazL23nAHGkXsa1p/C8yeq79WRfLBag6ZZ0FQG2aRoc9yfo59JT9EYCQonOkHKkQ==} + jsdoc-type-pratt-parser@7.0.0: + resolution: {integrity: sha512-c7YbokssPOSHmqTbSAmTtnVgAVa/7lumWNYqomgd5KOMyPrRve2anx6lonfOsXEQacqF9FKVUj7bLg4vRSvdYA==} engines: {node: '>=20.0.0'} jsesc@3.1.0: @@ -2255,9 +2290,6 @@ packages: engines: {node: '>=6'} hasBin: true - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -2267,9 +2299,6 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -2293,9 +2322,6 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - keyv@5.5.4: resolution: {integrity: sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==} @@ -2309,10 +2335,6 @@ packages: known-css-properties@0.37.0: resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -2324,10 +2346,6 @@ packages: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - locate-path@7.2.0: resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2521,8 +2539,8 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-deep-merge@2.0.0: - resolution: {integrity: sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==} + object-deep-merge@2.0.1: + resolution: {integrity: sha512-aKttDKcU3pyZqKcCkDhsMn70WmZFG2JGDQLP9EcLyTSIFQRCPWLAmBZRLJnrVUrhPG1jETEEbfdgbNtJf1LyMg==} object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} @@ -2559,10 +2577,6 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} @@ -2575,14 +2589,23 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + oxlint@1.68.0: + resolution: {integrity: sha512-dXcbq+xsmLrMy6T8d0euf3IYUfLmjHIE11pOxiUSi5LHkFZaYPv568R6sEjcavVpUxoaQe66UBuK4HEi74NxpA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.22.1' + vite-plus: '*' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + vite-plus: + optional: true + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - p-limit@4.0.0: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2595,10 +2618,6 @@ packages: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - p-locate@6.0.0: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2712,10 +2731,6 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - presentable-error@0.0.1: resolution: {integrity: sha512-E6rsNU1QNJgB3sjj7OANinGncFKuK+164sLXw1/CqBjj/EkXSoSdHCtWQGBNlREIGLnL7IEUEGa08YFVUbrhVg==} engines: {node: '>=16'} @@ -2961,9 +2976,6 @@ packages: spdx-license-ids@3.0.21: resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} - spdx-license-ids@3.0.22: - resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} - split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -3151,10 +3163,6 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - type-fest@0.18.1: resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} engines: {node: '>=10'} @@ -3391,10 +3399,6 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - yocto-queue@1.2.1: resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} @@ -3414,8 +3418,6 @@ packages: snapshots: - '@aashutoshrathi/word-wrap@1.2.6': {} - '@babel/code-frame@7.22.13': dependencies: '@babel/highlight': 7.22.13 @@ -3737,13 +3739,13 @@ snapshots: '@dual-bundle/import-meta-resolve@4.2.1': {} - '@es-joy/jsdoccomment@0.76.0': + '@es-joy/jsdoccomment@0.78.0': dependencies: '@types/estree': 1.0.8 '@typescript-eslint/types': 8.46.4 comment-parser: 1.4.1 - esquery: 1.6.0 - jsdoc-type-pratt-parser: 6.10.0 + esquery: 1.7.0 + jsdoc-type-pratt-parser: 7.0.0 '@es-joy/resolve.exports@1.2.0': {} @@ -3822,72 +3824,20 @@ snapshots: '@esbuild/win32-x64@0.25.5': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.31.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.7.0': dependencies: - eslint: 9.31.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.0(eslint@9.31.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.9.0': dependencies: - eslint: 9.31.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.21.0': - dependencies: - '@eslint/object-schema': 2.1.6 - debug: 4.4.1 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@eslint/config-helpers@0.3.0': {} - - '@eslint/core@0.15.1': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/eslintrc@3.3.1': - dependencies: - ajv: 6.12.6 - debug: 4.4.1 - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@9.31.0': {} - '@eslint/js@9.39.1': {} - '@eslint/object-schema@2.1.6': {} - - '@eslint/plugin-kit@0.3.3': - dependencies: - '@eslint/core': 0.15.1 - levn: 0.4.1 - '@gwhitney/detect-indent@7.0.1': {} - '@humanfs/core@0.19.1': {} - - '@humanfs/node@0.16.6': - dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/retry@0.3.1': {} - - '@humanwhocodes/retry@0.4.3': {} - '@inquirer/external-editor@1.0.3(@types/node@22.16.0)': dependencies: chardet: 2.1.1 @@ -3998,6 +3948,63 @@ snapshots: dependencies: '@octokit/openapi-types': 27.0.0 + '@oxlint/binding-android-arm-eabi@1.68.0': + optional: true + + '@oxlint/binding-android-arm64@1.68.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.68.0': + optional: true + + '@oxlint/binding-darwin-x64@1.68.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.68.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.68.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.68.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.68.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.68.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.68.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.68.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.68.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.68.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.68.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.68.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.68.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.68.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.68.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.68.0': + optional: true + '@pnpm/constants@7.1.1': {} '@pnpm/error@5.0.3': @@ -4116,11 +4123,10 @@ snapshots: '@standard-schema/spec@1.0.0': {} - '@stylistic/eslint-plugin@5.5.0(eslint@9.31.0(jiti@2.4.2))': + '@stylistic/eslint-plugin@5.5.0': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.31.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.9.0 '@typescript-eslint/types': 8.46.4 - eslint: 9.31.0(jiti@2.4.2) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -4149,8 +4155,6 @@ snapshots: '@types/estree@1.0.8': {} - '@types/json-schema@7.0.15': {} - '@types/json5@0.0.29': {} '@types/minimist@1.2.2': {} @@ -4161,15 +4165,14 @@ snapshots: '@types/normalize-package-data@2.4.1': {} - '@typescript-eslint/eslint-plugin@8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.31.0(jiti@2.4.2)))(eslint@9.31.0(jiti@2.4.2))': + '@typescript-eslint/eslint-plugin@8.46.4(@typescript-eslint/parser@8.46.4)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.46.4(eslint@9.31.0(jiti@2.4.2)) + '@typescript-eslint/parser': 8.46.4 '@typescript-eslint/scope-manager': 8.46.4 - '@typescript-eslint/type-utils': 8.46.4(eslint@9.31.0(jiti@2.4.2)) - '@typescript-eslint/utils': 8.46.4(eslint@9.31.0(jiti@2.4.2)) + '@typescript-eslint/type-utils': 8.46.4 + '@typescript-eslint/utils': 8.46.4 '@typescript-eslint/visitor-keys': 8.46.4 - eslint: 9.31.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -4177,14 +4180,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.4(eslint@9.31.0(jiti@2.4.2))': + '@typescript-eslint/parser@8.46.4': dependencies: '@typescript-eslint/scope-manager': 8.46.4 '@typescript-eslint/types': 8.46.4 '@typescript-eslint/typescript-estree': 8.46.4 '@typescript-eslint/visitor-keys': 8.46.4 debug: 4.3.4 - eslint: 9.31.0(jiti@2.4.2) transitivePeerDependencies: - supports-color @@ -4218,13 +4220,12 @@ snapshots: '@typescript-eslint/tsconfig-utils@8.46.4': {} - '@typescript-eslint/type-utils@8.46.4(eslint@9.31.0(jiti@2.4.2))': + '@typescript-eslint/type-utils@8.46.4': dependencies: '@typescript-eslint/types': 8.46.4 '@typescript-eslint/typescript-estree': 8.46.4 - '@typescript-eslint/utils': 8.46.4(eslint@9.31.0(jiti@2.4.2)) + '@typescript-eslint/utils': 8.46.4 debug: 4.4.3 - eslint: 9.31.0(jiti@2.4.2) ts-api-utils: 2.1.0 transitivePeerDependencies: - supports-color @@ -4263,23 +4264,21 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.35.1(eslint@9.31.0(jiti@2.4.2))': + '@typescript-eslint/utils@8.35.1': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0 '@typescript-eslint/scope-manager': 8.35.1 '@typescript-eslint/types': 8.35.1 '@typescript-eslint/typescript-estree': 8.35.1 - eslint: 9.31.0(jiti@2.4.2) transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.4(eslint@9.31.0(jiti@2.4.2))': + '@typescript-eslint/utils@8.46.4': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.31.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.9.0 '@typescript-eslint/scope-manager': 8.46.4 '@typescript-eslint/types': 8.46.4 '@typescript-eslint/typescript-estree': 8.46.4 - eslint: 9.31.0(jiti@2.4.2) transitivePeerDependencies: - supports-color @@ -4341,8 +4340,14 @@ snapshots: dependencies: acorn: 8.15.0 + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + acorn@8.15.0: {} + acorn@8.16.0: {} + ajv-errors@1.0.1(ajv@6.12.6): dependencies: ajv: 6.12.6 @@ -4746,8 +4751,6 @@ snapshots: dedent@0.7.0: {} - deep-is@0.1.4: {} - defaults@1.0.4: dependencies: clone: 1.0.4 @@ -4957,17 +4960,16 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.4(eslint@9.31.0(jiti@2.4.2)))(eslint-import-resolver-node@0.3.9)(eslint@9.31.0(jiti@2.4.2)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.4)(eslint-import-resolver-node@0.3.9): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.46.4(eslint@9.31.0(jiti@2.4.2)) - eslint: 9.31.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.46.4 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.4(eslint@9.31.0(jiti@2.4.2)))(eslint@9.31.0(jiti@2.4.2)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.4): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -4976,9 +4978,8 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.31.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.4(eslint@9.31.0(jiti@2.4.2)))(eslint-import-resolver-node@0.3.9)(eslint@9.31.0(jiti@2.4.2)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.4)(eslint-import-resolver-node@0.3.9) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -4990,41 +4991,38 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.46.4(eslint@9.31.0(jiti@2.4.2)) + '@typescript-eslint/parser': 8.46.4 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest-dom@5.5.0(eslint@9.31.0(jiti@2.4.2)): + eslint-plugin-jest-dom@5.5.0: dependencies: '@babel/runtime': 7.22.15 - eslint: 9.31.0(jiti@2.4.2) requireindex: 1.2.0 - eslint-plugin-jest@29.1.0(@typescript-eslint/eslint-plugin@8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.31.0(jiti@2.4.2)))(eslint@9.31.0(jiti@2.4.2)))(eslint@9.31.0(jiti@2.4.2)): + eslint-plugin-jest@29.1.0(@typescript-eslint/eslint-plugin@8.46.4(@typescript-eslint/parser@8.46.4)): dependencies: - '@typescript-eslint/utils': 8.35.1(eslint@9.31.0(jiti@2.4.2)) - eslint: 9.31.0(jiti@2.4.2) + '@typescript-eslint/utils': 8.35.1 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.31.0(jiti@2.4.2)))(eslint@9.31.0(jiti@2.4.2)) + '@typescript-eslint/eslint-plugin': 8.46.4(@typescript-eslint/parser@8.46.4) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jsdoc@61.2.1(eslint@9.31.0(jiti@2.4.2)): + eslint-plugin-jsdoc@61.7.1: dependencies: - '@es-joy/jsdoccomment': 0.76.0 + '@es-joy/jsdoccomment': 0.78.0 '@es-joy/resolve.exports': 1.2.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint: 9.31.0(jiti@2.4.2) - espree: 10.4.0 - esquery: 1.6.0 + espree: 11.2.0 + esquery: 1.7.0 html-entities: 2.6.0 - object-deep-merge: 2.0.0 + object-deep-merge: 2.0.1 parse-imports-exports: 0.2.4 semver: 7.7.3 spdx-expression-parse: 4.0.0 @@ -5032,18 +5030,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@7.0.1(eslint@9.31.0(jiti@2.4.2)): + eslint-plugin-react-hooks@7.0.1: dependencies: '@babel/core': 7.28.5 '@babel/parser': 7.28.5 - eslint: 9.31.0(jiti@2.4.2) hermes-parser: 0.25.1 zod: 4.1.12 zod-validation-error: 4.0.2(zod@4.1.12) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@9.31.0(jiti@2.4.2)): + eslint-plugin-react@7.37.5: dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -5051,7 +5048,6 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.31.0(jiti@2.4.2) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -5065,65 +5061,19 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-testing-library@7.13.4(eslint@9.31.0(jiti@2.4.2)): + eslint-plugin-testing-library@7.13.4: dependencies: '@typescript-eslint/scope-manager': 8.35.1 - '@typescript-eslint/utils': 8.35.1(eslint@9.31.0(jiti@2.4.2)) - eslint: 9.31.0(jiti@2.4.2) + '@typescript-eslint/utils': 8.35.1 transitivePeerDependencies: - supports-color - typescript - eslint-scope@8.4.0: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@4.2.1: {} - eslint@9.31.0(jiti@2.4.2): - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2)) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.0 - '@eslint/core': 0.15.1 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.31.0 - '@eslint/plugin-kit': 0.3.3 - '@humanfs/node': 0.16.6 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.1 - escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - optionalDependencies: - jiti: 2.4.2 - transitivePeerDependencies: - - supports-color + eslint-visitor-keys@5.0.1: {} espree@10.4.0: dependencies: @@ -5131,11 +5081,13 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 - esquery@1.6.0: + espree@11.2.0: dependencies: - estraverse: 5.3.0 + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 5.0.1 - esrecurse@4.3.0: + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -5173,8 +5125,6 @@ snapshots: fast-json-stable-stringify@2.1.0: {} - fast-levenshtein@2.0.6: {} - fast-uri@3.0.6: {} fastest-levenshtein@1.0.16: {} @@ -5195,10 +5145,6 @@ snapshots: dependencies: flat-cache: 6.1.18 - file-entry-cache@8.0.0: - dependencies: - flat-cache: 4.0.1 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -5215,11 +5161,6 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - find-up@7.0.0: dependencies: locate-path: 7.2.0 @@ -5233,11 +5174,6 @@ snapshots: micromatch: 4.0.8 resolve-dir: 1.0.1 - flat-cache@4.0.1: - dependencies: - flatted: 3.3.3 - keyv: 4.5.4 - flat-cache@6.1.18: dependencies: cacheable: 2.1.1 @@ -5326,10 +5262,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -5367,8 +5299,6 @@ snapshots: kind-of: 6.0.3 which: 1.3.1 - globals@14.0.0: {} - globals@17.4.0: {} globalthis@1.0.4: @@ -5716,20 +5646,16 @@ snapshots: dependencies: argparse: 2.0.1 - jsdoc-type-pratt-parser@6.10.0: {} + jsdoc-type-pratt-parser@7.0.0: {} jsesc@3.1.0: {} - json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: {} json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} - json-stable-stringify-without-jsonify@1.0.1: {} - json5@1.0.2: dependencies: minimist: 1.2.8 @@ -5753,10 +5679,6 @@ snapshots: object.assign: 4.1.7 object.values: 1.2.1 - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - keyv@5.5.4: dependencies: '@keyv/serialize': 1.1.1 @@ -5767,11 +5689,6 @@ snapshots: known-css-properties@0.37.0: {} - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -5780,10 +5697,6 @@ snapshots: dependencies: p-locate: 4.1.0 - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - locate-path@7.2.0: dependencies: p-locate: 6.0.0 @@ -5962,7 +5875,7 @@ snapshots: object-assign@4.1.1: {} - object-deep-merge@2.0.0: {} + object-deep-merge@2.0.1: {} object-inspect@1.13.4: {} @@ -6012,15 +5925,6 @@ snapshots: dependencies: mimic-fn: 2.1.0 - optionator@0.9.3: - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - ora@5.4.1: dependencies: bl: 4.1.0 @@ -6041,14 +5945,32 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + oxlint@1.68.0: + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.68.0 + '@oxlint/binding-android-arm64': 1.68.0 + '@oxlint/binding-darwin-arm64': 1.68.0 + '@oxlint/binding-darwin-x64': 1.68.0 + '@oxlint/binding-freebsd-x64': 1.68.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.68.0 + '@oxlint/binding-linux-arm-musleabihf': 1.68.0 + '@oxlint/binding-linux-arm64-gnu': 1.68.0 + '@oxlint/binding-linux-arm64-musl': 1.68.0 + '@oxlint/binding-linux-ppc64-gnu': 1.68.0 + '@oxlint/binding-linux-riscv64-gnu': 1.68.0 + '@oxlint/binding-linux-riscv64-musl': 1.68.0 + '@oxlint/binding-linux-s390x-gnu': 1.68.0 + '@oxlint/binding-linux-x64-gnu': 1.68.0 + '@oxlint/binding-linux-x64-musl': 1.68.0 + '@oxlint/binding-openharmony-arm64': 1.68.0 + '@oxlint/binding-win32-arm64-msvc': 1.68.0 + '@oxlint/binding-win32-ia32-msvc': 1.68.0 + '@oxlint/binding-win32-x64-msvc': 1.68.0 + p-limit@2.3.0: dependencies: p-try: 2.2.0 - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - p-limit@4.0.0: dependencies: yocto-queue: 1.2.1 @@ -6061,10 +5983,6 @@ snapshots: dependencies: p-limit: 2.3.0 - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - p-locate@6.0.0: dependencies: p-limit: 4.0.0 @@ -6149,8 +6067,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - prelude-ls@1.2.1: {} - presentable-error@0.0.1: {} prop-types@15.8.1: @@ -6428,12 +6344,10 @@ snapshots: spdx-expression-parse@4.0.0: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.22 + spdx-license-ids: 3.0.21 spdx-license-ids@3.0.21: {} - spdx-license-ids@3.0.22: {} - split2@4.2.0: {} stackback@0.0.2: {} @@ -6670,10 +6584,6 @@ snapshots: tslib@2.8.1: {} - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - type-fest@0.18.1: {} type-fest@0.21.3: {} @@ -6717,13 +6627,12 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.46.4(eslint@9.31.0(jiti@2.4.2)): + typescript-eslint@8.46.4: dependencies: - '@typescript-eslint/eslint-plugin': 8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.31.0(jiti@2.4.2)))(eslint@9.31.0(jiti@2.4.2)) - '@typescript-eslint/parser': 8.46.4(eslint@9.31.0(jiti@2.4.2)) + '@typescript-eslint/eslint-plugin': 8.46.4(@typescript-eslint/parser@8.46.4) + '@typescript-eslint/parser': 8.46.4 '@typescript-eslint/typescript-estree': 8.46.4 - '@typescript-eslint/utils': 8.46.4(eslint@9.31.0(jiti@2.4.2)) - eslint: 9.31.0(jiti@2.4.2) + '@typescript-eslint/utils': 8.46.4 transitivePeerDependencies: - supports-color @@ -6918,8 +6827,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yocto-queue@0.1.0: {} - yocto-queue@1.2.1: {} yoctocolors-cjs@2.1.2: {}