From 600d4ab919500e591514f71d4f7cfcd9a3e23085 Mon Sep 17 00:00:00 2001 From: Shahmir Ejaz Date: Mon, 20 Apr 2026 13:05:50 +0100 Subject: [PATCH 01/14] add eslint config --- .eslintrc.cjs | 38 +++++++++++++++++++++++++ .prettierignore | 60 ++++++++++++++++++++++++++++++++++++++- CONTRIBUTING.md | 7 ++++- package.json | 3 ++ scripts/lint/run-lint.cjs | 1 + yarn.lock | 60 +++++++++++++++++++++++++++++++++++++-- 6 files changed, 165 insertions(+), 4 deletions(-) create mode 100644 .eslintrc.cjs diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 00000000000..42fc9e3db1f --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,38 @@ +// Editor-only ESLint config for VS Code. Provides live `import/order` diagnostics +// until oxlint's jsPlugins ship LSP support. CLI authority is .oxlintrc.json. +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 2022, + sourceType: 'module', + ecmaFeatures: { jsx: true }, + }, + plugins: ['import'], + settings: { + 'import/resolver': { + node: { extensions: ['.js', '.jsx', '.ts', '.tsx'] }, + }, + }, + rules: { + 'import/order': [ + 'error', + { + alphabetize: { caseInsensitive: true, order: 'asc' }, + groups: [ + 'builtin', + 'external', + 'parent', + 'sibling', + 'index', + 'type', + ], + 'newlines-between': 'always', + pathGroups: [ + { group: 'parent', pattern: '@/**/*', position: 'before' }, + ], + pathGroupsExcludedImportTypes: ['builtin'], + }, + ], + }, +}; diff --git a/.prettierignore b/.prettierignore index 05b6b60f0e4..0a9ec62ea03 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1,60 @@ -packages/*/CHANGELOG.md +# Vendors +node_modules +**/node_modules/** +.yarn +**/.yarn/** +yarn.lock + +# Artifacts +dist +build +website +**/cjs +**/es +**/dist +**/vue2 +**/vue3 +coverage +**/CHANGELOG.md + +# Caches +.cache +.parcel-cache +.expo +.next +**/.nuxt +**/.nuxt/** + +# Non-formattable source files +## Symlinked packages in examples (already formatted from their real location) +examples/js/e-commerce-umd/public/packages +## Polyfills for examples, retrieved from polyfill.io examples/**/polyfills.js +## React-Native TypeScript wasn't supporting the mix of react 18 and 17 +examples/react/react-native +## Next.js examples have their own tsconfig and are type-checked during their build +examples/react/next +examples/react/next-routing +examples/react/next-app-router +## Excluded from global typescript config +**/next-env.d.ts +specs/src/env.d.ts +## templates that don't get installed +packages/create-instantsearch-app/src/templates +packages/create-instantsearch-app/src/templates/** +## test fixtures for codemods +packages/instantsearch-codemods/__testfixtures__ +packages/instantsearch-codemods/__testfixtures__/** +## legacy ESLint configs kept for reference/migration only +**/.eslintrc +**/.eslintrc.js +**/.eslintrc.cjs +**/eslint.config.js + +# Playwright artifacts and test files (Playwright has its own tsconfig) +**/playwright-report/** +**/test-results/** +tests/e2e/playwright/** + +## Rollup configs use import attributes syntax not yet supported by the parser +**/rollup.config.mjs diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9a67ab81953..cbc0d93ffcc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -404,12 +404,17 @@ JavaScript and TypeScript files are formatted with [Prettier](https://github.com Useful lint commands: -- `yarn lint` runs the full repo lint flow. +- `yarn lint` runs the full repo lint flow (Prettier format check + Oxlint). +- `yarn format` rewrites files with Prettier; `yarn format:check` only reports violations. - `yarn lint:ox ` lints only the paths you pass. - `yarn lint:changed` lints files changed since the branch point with `origin/master`. - `yarn lint:staged` lints staged JavaScript, TypeScript, and Vue files. - `yarn lint:fix` applies Oxlint auto-fixes where available. +The root `.eslintrc.cjs` is editor-only: it powers the VS Code ESLint extension for +`import/order` diagnostics while oxlint's JS-plugin support in editors is still in +preview. The authoritative lint configuration for CI and the CLI is `.oxlintrc.json`. + ## Release ### Main version diff --git a/package.json b/package.json index 5edf92367cb..b6e716fd3c6 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,8 @@ "doctoc": "doctoc --no-title --maxlevel 3 README.md CONTRIBUTING.md packages/*/README.md packages/create-instantsearch-app/docs", "website:storybook": "lerna run storybook:build", "website:examples": "lerna run website:examples", + "format": "prettier --write .", + "format:check": "prettier --check .", "lint": "node ./scripts/lint/run-lint.cjs", "lint:changed": "node ./scripts/lint/run-oxlint.cjs --changed", "lint:fix": "node ./scripts/lint/run-oxlint.cjs --fix", @@ -81,6 +83,7 @@ "@types/react-test-renderer": "19.0.0", "@types/storybook__addon-actions": "3.4.2", "@types/storybook__addon-knobs": "^5.0.0", + "@typescript-eslint/parser": "4.31.2", "@vue/vue2-jest": "27", "@vue/vue3-jest": "27", "@wdio/cli": "5.16.9", diff --git a/scripts/lint/run-lint.cjs b/scripts/lint/run-lint.cjs index afd086341d1..3f1464b22b2 100644 --- a/scripts/lint/run-lint.cjs +++ b/scripts/lint/run-lint.cjs @@ -6,6 +6,7 @@ const path = require('path'); const repoRoot = path.resolve(__dirname, '..', '..'); const commands = [ + ['yarn', ['format:check']], [process.execPath, [path.join(repoRoot, 'scripts/lint/run-oxlint.cjs')]], ['yarn', ['workspace', 'example-react-instantsearch-next-example', 'lint']], [ diff --git a/yarn.lock b/yarn.lock index fb76fd4bdc7..74b7bf0cc6c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7367,6 +7367,16 @@ natural-compare "^1.4.0" ts-api-utils "^2.1.0" +"@typescript-eslint/parser@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.31.2.tgz#54aa75986e3302d91eff2bbbaa6ecfa8084e9c34" + integrity sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw== + dependencies: + "@typescript-eslint/scope-manager" "4.31.2" + "@typescript-eslint/types" "4.31.2" + "@typescript-eslint/typescript-estree" "4.31.2" + debug "^4.3.1" + "@typescript-eslint/parser@8.46.2": version "8.46.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.46.2.tgz#dd938d45d581ac8ffa9d8a418a50282b306f7ebf" @@ -7387,6 +7397,14 @@ "@typescript-eslint/types" "^8.46.2" debug "^4.3.4" +"@typescript-eslint/scope-manager@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz#1d528cb3ed3bcd88019c20a57c18b897b073923a" + integrity sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w== + dependencies: + "@typescript-eslint/types" "4.31.2" + "@typescript-eslint/visitor-keys" "4.31.2" + "@typescript-eslint/scope-manager@8.46.2": version "8.46.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz#7d37df2493c404450589acb3b5d0c69cc0670a88" @@ -7411,11 +7429,29 @@ debug "^4.3.4" ts-api-utils "^2.1.0" +"@typescript-eslint/types@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.31.2.tgz#2aea7177d6d744521a168ed4668eddbd912dfadf" + integrity sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w== + "@typescript-eslint/types@8.46.2", "@typescript-eslint/types@^8.46.2": version "8.46.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.46.2.tgz#2bad7348511b31e6e42579820e62b73145635763" integrity sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ== +"@typescript-eslint/typescript-estree@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz#abfd50594d8056b37e7428df3b2d185ef2d0060c" + integrity sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA== + dependencies: + "@typescript-eslint/types" "4.31.2" + "@typescript-eslint/visitor-keys" "4.31.2" + debug "^4.3.1" + globby "^11.0.3" + is-glob "^4.0.1" + semver "^7.3.5" + tsutils "^3.21.0" + "@typescript-eslint/typescript-estree@8.46.2": version "8.46.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz#ab547a27e4222bb6a3281cb7e98705272e2c7d08" @@ -7442,6 +7478,14 @@ "@typescript-eslint/types" "8.46.2" "@typescript-eslint/typescript-estree" "8.46.2" +"@typescript-eslint/visitor-keys@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz#7d5b4a4705db7fe59ecffb273c1d082760f635cc" + integrity sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug== + dependencies: + "@typescript-eslint/types" "4.31.2" + eslint-visitor-keys "^2.0.0" + "@typescript-eslint/visitor-keys@8.46.2": version "8.46.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz#803fa298948c39acf810af21bdce6f8babfa9738" @@ -14597,6 +14641,11 @@ eslint-visitor-keys@^1.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" @@ -16616,7 +16665,7 @@ globby@^10.0.1: merge2 "^1.2.3" slash "^3.0.0" -globby@^11.0.1, globby@^11.0.2, globby@^11.0.4, globby@^11.1.0: +globby@^11.0.1, globby@^11.0.2, globby@^11.0.3, globby@^11.0.4, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -30893,7 +30942,7 @@ tsconfig@^7.0.0: strip-bom "^3.0.0" strip-json-comments "^2.0.0" -tslib@^1.10.0, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -30903,6 +30952,13 @@ tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3 resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" From 21fcf8d416640a929a030eea13abd25e1bc1680d Mon Sep 17 00:00:00 2001 From: Shahmir Ejaz Date: Mon, 20 Apr 2026 13:48:13 +0100 Subject: [PATCH 02/14] update formatting ci --- .circleci/config.yml | 5 ++- .eslintrc.cjs | 3 +- .prettierignore | 8 ++++ CONTRIBUTING.md | 4 +- package.json | 1 + scripts/lint/run-lint.cjs | 81 +++++++++++++++++++++++++++++---------- yarn.lock | 7 ++++ 7 files changed, 85 insertions(+), 24 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d8d281b1e28..911f8ddd29d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -221,7 +221,10 @@ jobs: - *restore_yarn_cache - *run_yarn_install - run: - name: Lint & Code styles + name: Format check + command: yarn run format:check + - run: + name: Lint command: yarn run lint - run: name: Type Checking diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 42fc9e3db1f..08707044335 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -8,13 +8,14 @@ module.exports = { sourceType: 'module', ecmaFeatures: { jsx: true }, }, - plugins: ['import'], + plugins: ['import', 'prettier'], settings: { 'import/resolver': { node: { extensions: ['.js', '.jsx', '.ts', '.tsx'] }, }, }, rules: { + 'prettier/prettier': 'error', 'import/order': [ 'error', { diff --git a/.prettierignore b/.prettierignore index 0a9ec62ea03..601435affd0 100644 --- a/.prettierignore +++ b/.prettierignore @@ -58,3 +58,11 @@ tests/e2e/playwright/** ## Rollup configs use import attributes syntax not yet supported by the parser **/rollup.config.mjs + +## Handlebars partials aren't supported by Prettier +packages/algoliasearch-helper/documentation-src/partials/**/*.hbs + +## Generated CSS output from instantsearch.css SCSS build +packages/instantsearch.css/components/** +packages/instantsearch.css/themes/** +specs/public/themes/** diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cbc0d93ffcc..9e23ff74725 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -404,8 +404,8 @@ JavaScript and TypeScript files are formatted with [Prettier](https://github.com Useful lint commands: -- `yarn lint` runs the full repo lint flow (Prettier format check + Oxlint). -- `yarn format` rewrites files with Prettier; `yarn format:check` only reports violations. +- `yarn lint` runs Oxlint across the repo and workspace examples. +- `yarn format` rewrites files with Prettier; `yarn format:check` only reports violations. CI runs it separately from `yarn lint`. - `yarn lint:ox ` lints only the paths you pass. - `yarn lint:changed` lints files changed since the branch point with `origin/master`. - `yarn lint:staged` lints staged JavaScript, TypeScript, and Vue files. diff --git a/package.json b/package.json index b6e716fd3c6..dd588d9dd7f 100644 --- a/package.json +++ b/package.json @@ -103,6 +103,7 @@ "enzyme": "3.11.0", "eslint": "6.8.0", "eslint-plugin-import": "2.24.2", + "eslint-plugin-prettier": "3.4.0", "jest": "27.4.7", "jest-diff": "27.4.6", "jest-environment-jsdom": "27.1.0", diff --git a/scripts/lint/run-lint.cjs b/scripts/lint/run-lint.cjs index 3f1464b22b2..b1de8d56130 100644 --- a/scripts/lint/run-lint.cjs +++ b/scripts/lint/run-lint.cjs @@ -1,32 +1,73 @@ #!/usr/bin/env node -const { spawnSync } = require('child_process'); +const { spawn } = require('child_process'); const path = require('path'); const repoRoot = path.resolve(__dirname, '..', '..'); const commands = [ - ['yarn', ['format:check']], - [process.execPath, [path.join(repoRoot, 'scripts/lint/run-oxlint.cjs')]], - ['yarn', ['workspace', 'example-react-instantsearch-next-example', 'lint']], - [ - 'yarn', - ['workspace', 'example-react-instantsearch-next-routing-example', 'lint'], - ], - [ - 'yarn', - ['workspace', 'example-react-instantsearch-next-app-dir-example', 'lint'], - ], - ['yarn', ['workspace', 'instantsearch.css', 'lint']], + { + label: 'oxlint', + command: process.execPath, + args: [path.join(repoRoot, 'scripts/lint/run-oxlint.cjs')], + }, + { + label: 'next-example', + command: 'yarn', + args: ['workspace', 'example-react-instantsearch-next-example', 'lint'], + }, + { + label: 'next-routing-example', + command: 'yarn', + args: [ + 'workspace', + 'example-react-instantsearch-next-routing-example', + 'lint', + ], + }, + { + label: 'next-app-dir-example', + command: 'yarn', + args: [ + 'workspace', + 'example-react-instantsearch-next-app-dir-example', + 'lint', + ], + }, + { + label: 'instantsearch.css', + command: 'yarn', + args: ['workspace', 'instantsearch.css', 'lint'], + }, ]; -for (const [command, args] of commands) { - const result = spawnSync(command, args, { - cwd: repoRoot, - stdio: 'inherit', +function run({ label, command, args }) { + return new Promise((resolve) => { + const chunks = []; + const child = spawn(command, args, { + cwd: repoRoot, + env: { ...process.env, FORCE_COLOR: process.env.FORCE_COLOR ?? '1' }, + }); + + const collect = (data) => chunks.push(data); + child.stdout.on('data', collect); + child.stderr.on('data', collect); + + child.on('close', (code) => { + resolve({ label, code: code ?? 1, output: Buffer.concat(chunks) }); + }); }); +} - if (result.status !== 0) { - process.exit(result.status || 1); +(async () => { + const results = await Promise.all(commands.map(run)); + + for (const { label, code, output } of results) { + const status = code === 0 ? 'ok' : `failed (${code})`; + process.stdout.write(`\n──── ${label}: ${status} ────\n`); + process.stdout.write(output); } -} + + const failed = results.find((result) => result.code !== 0); + process.exit(failed ? failed.code : 0); +})(); diff --git a/yarn.lock b/yarn.lock index 74b7bf0cc6c..136dcdf6ee3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14570,6 +14570,13 @@ eslint-plugin-jsx-a11y@^6.10.0: safe-regex-test "^1.0.3" string.prototype.includes "^2.0.1" +eslint-plugin-prettier@3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz#cdbad3bf1dbd2b177e9825737fe63b476a08f0c7" + integrity sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw== + dependencies: + prettier-linter-helpers "^1.0.0" + eslint-plugin-react-hooks@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz#66e258db58ece50723ef20cc159f8aa908219169" From ba59f56a6d9fec7a6bb8217ced6990a0a53f8981 Mon Sep 17 00:00:00 2001 From: Shahmir Ejaz Date: Mon, 20 Apr 2026 13:51:23 +0100 Subject: [PATCH 03/14] reset script --- scripts/lint/run-lint.cjs | 80 ++++++++++----------------------------- 1 file changed, 19 insertions(+), 61 deletions(-) diff --git a/scripts/lint/run-lint.cjs b/scripts/lint/run-lint.cjs index b1de8d56130..afd086341d1 100644 --- a/scripts/lint/run-lint.cjs +++ b/scripts/lint/run-lint.cjs @@ -1,73 +1,31 @@ #!/usr/bin/env node -const { spawn } = require('child_process'); +const { spawnSync } = require('child_process'); const path = require('path'); const repoRoot = path.resolve(__dirname, '..', '..'); const commands = [ - { - label: 'oxlint', - command: process.execPath, - args: [path.join(repoRoot, 'scripts/lint/run-oxlint.cjs')], - }, - { - label: 'next-example', - command: 'yarn', - args: ['workspace', 'example-react-instantsearch-next-example', 'lint'], - }, - { - label: 'next-routing-example', - command: 'yarn', - args: [ - 'workspace', - 'example-react-instantsearch-next-routing-example', - 'lint', - ], - }, - { - label: 'next-app-dir-example', - command: 'yarn', - args: [ - 'workspace', - 'example-react-instantsearch-next-app-dir-example', - 'lint', - ], - }, - { - label: 'instantsearch.css', - command: 'yarn', - args: ['workspace', 'instantsearch.css', 'lint'], - }, + [process.execPath, [path.join(repoRoot, 'scripts/lint/run-oxlint.cjs')]], + ['yarn', ['workspace', 'example-react-instantsearch-next-example', 'lint']], + [ + 'yarn', + ['workspace', 'example-react-instantsearch-next-routing-example', 'lint'], + ], + [ + 'yarn', + ['workspace', 'example-react-instantsearch-next-app-dir-example', 'lint'], + ], + ['yarn', ['workspace', 'instantsearch.css', 'lint']], ]; -function run({ label, command, args }) { - return new Promise((resolve) => { - const chunks = []; - const child = spawn(command, args, { - cwd: repoRoot, - env: { ...process.env, FORCE_COLOR: process.env.FORCE_COLOR ?? '1' }, - }); - - const collect = (data) => chunks.push(data); - child.stdout.on('data', collect); - child.stderr.on('data', collect); - - child.on('close', (code) => { - resolve({ label, code: code ?? 1, output: Buffer.concat(chunks) }); - }); +for (const [command, args] of commands) { + const result = spawnSync(command, args, { + cwd: repoRoot, + stdio: 'inherit', }); -} -(async () => { - const results = await Promise.all(commands.map(run)); - - for (const { label, code, output } of results) { - const status = code === 0 ? 'ok' : `failed (${code})`; - process.stdout.write(`\n──── ${label}: ${status} ────\n`); - process.stdout.write(output); + if (result.status !== 0) { + process.exit(result.status || 1); } - - const failed = results.find((result) => result.code !== 0); - process.exit(failed ? failed.code : 0); -})(); +} From ea2302dbc9ad38f4b79a1af6e3ed4c1690341fd0 Mon Sep 17 00:00:00 2001 From: Shahmir Ejaz Date: Mon, 20 Apr 2026 13:12:43 +0100 Subject: [PATCH 04/14] format code --- .claude/rules/e2e.md | 34 ++++++- .claude/skills/port-widget/agents/openai.yaml | 6 +- .codacy.yml | 2 +- .github/prompts/docs-automation.md | 31 +++--- .github/workflows/docs-automation.yml | 4 +- .github/workflows/pkg-pr-new.yml | 18 +--- .oxlintrc.json | 85 ++++------------- CONTRIBUTING.md | 4 +- examples/.oxlintrc.json | 11 +-- examples/js/e-commerce-umd/tsconfig.json | 7 +- examples/js/showcase/index.html | 12 +-- examples/js/showcase/src/App.tsx | 48 +++++----- .../src/components/ColorModeSwitcher.tsx | 21 ++-- .../src/components/SegmentedControl.tsx | 23 +++-- .../src/components/WidgetSwitcher.tsx | 54 +++++++---- .../src/components/widgets/DynamicWidgets.tsx | 46 +++++---- .../components/widgets/SearchBoxPoweredBy.tsx | 6 +- .../components/widgets/WidgetAirportHits.tsx | 18 ++-- .../components/widgets/WidgetAutocomplete.tsx | 28 ++++-- .../components/widgets/WidgetBreadcrumb.tsx | 12 +-- .../widgets/WidgetClearRefinements.tsx | 4 +- .../components/widgets/WidgetConfigure.tsx | 10 +- .../widgets/WidgetCurrentRefinements.tsx | 4 +- .../components/widgets/WidgetGeoSearch.tsx | 38 ++++---- .../widgets/WidgetHierarchicalMenu.tsx | 16 ++-- .../src/components/widgets/WidgetHits.tsx | 22 +++-- .../components/widgets/WidgetHitsPerPage.tsx | 12 +-- .../components/widgets/WidgetInfiniteHits.tsx | 22 +++-- .../src/components/widgets/WidgetMenu.tsx | 10 +- .../components/widgets/WidgetMenuSelect.tsx | 12 ++- .../components/widgets/WidgetNumericMenu.tsx | 22 +++-- .../components/widgets/WidgetPagination.tsx | 6 +- .../src/components/widgets/WidgetPanel.tsx | 10 +- .../components/widgets/WidgetPoweredBy.tsx | 4 +- .../components/widgets/WidgetRangeInput.tsx | 12 ++- .../components/widgets/WidgetRangeSlider.tsx | 30 +++--- .../components/widgets/WidgetRatingMenu.tsx | 8 +- .../widgets/WidgetRefinementList.tsx | 10 +- .../components/widgets/WidgetRelevantSort.tsx | 12 +-- .../components/widgets/WidgetSearchBox.tsx | 10 +- .../src/components/widgets/WidgetSortBy.tsx | 17 ++-- .../src/components/widgets/WidgetStats.tsx | 9 +- .../widgets/WidgetToggleRefinement.tsx | 10 +- .../components/widgets/WidgetVoiceSearch.tsx | 4 +- examples/js/showcase/src/context/flavor.ts | 8 +- examples/js/showcase/src/context/search.ts | 10 +- .../js/showcase/src/hooks/useColorMode.ts | 27 +++--- examples/js/showcase/src/hooks/useWidget.ts | 10 +- examples/js/showcase/src/main.tsx | 10 +- examples/js/showcase/src/style.css | 28 ++++-- .../js/showcase/src/views/GeoSearchView.tsx | 49 ++++++---- .../showcase/src/views/InstantSearchView.tsx | 95 +++++++++++-------- examples/vue/.oxlintrc.json | 4 +- examples/vue/ssr/public/index.html | 8 +- packages/algolia-experiences/README.md | 4 +- packages/algoliasearch-helper/.oxlintrc.json | 4 +- .../documentation-src/partials/types.hbs | 2 +- .../create-instantsearch-app/.oxlintrc.json | 4 +- .../docs/custom-templates.md | 24 ++--- .../.oxlintrc.json | 4 +- .../__tests__/RelatedProducts.test.tsx | 4 +- .../__tests__/TrendingFacets.test.tsx | 4 +- .../src/components/chat/ChatGreeting.tsx | 33 ++++--- .../src/components/chat/ChatInlineLayout.tsx | 14 +-- .../src/components/chat/ChatMessages.tsx | 8 +- .../chat/__tests__/ChatMessages.test.tsx | 16 +++- .../src/components/chat/types.ts | 6 +- .../src/components/chat/_chat-messages.scss | 6 +- .../components/chat/_chat-overlay-layout.scss | 3 +- .../chat/_chat-sidepanel-layout.scss | 18 ++-- .../components/chat/_chat-suggestions.scss | 1 - .../src/components/filter-suggestions.scss | 5 +- .../instantsearch.css/src/themes/algolia.scss | 6 +- .../src/themes/satellite.scss | 3 +- .../src/__tests__/common-connectors.test.tsx | 17 +++- .../src/components/SearchBox/SearchBox.tsx | 15 ++- .../chat/__tests__/connectChat-test.ts | 1 - .../src/connectors/chat/connectChat.ts | 3 +- .../trending-facets/connectTrendingFacets.ts | 4 +- .../src/lib/routers/history.ts | 13 +-- .../src/widgets/chat/chat.tsx | 4 +- .../__tests__/trending-facets.test.tsx | 6 +- .../trending-facets/trending-facets.tsx | 29 +++--- .../tsconfig.declaration.json | 6 +- .../react-instantsearch/src/ui/SearchBox.tsx | 5 +- .../src/widgets/TrendingFacets.tsx | 6 +- .../widgets/chat/tools/SearchIndexTool.tsx | 5 +- packages/vue-instantsearch/.oxlintrc.json | 4 +- scripts/.oxlintrc.json | 4 +- scripts/lint/run-oxlint.cjs | 12 ++- specs/src/pages/widgets/looking-similar.md | 4 +- specs/src/pages/widgets/related-products.md | 4 +- specs/src/pages/widgets/trending-items.md | 4 +- tests/common/.oxlintrc.json | 4 +- tests/common/connectors/chat/options.ts | 4 +- tests/common/widgets/chat/options.tsx | 14 +-- tests/common/widgets/chat/templates.tsx | 9 +- tests/e2e/CONTRIBUTING.md | 4 +- tests/e2e/tsconfig.json | 7 +- tsconfig.declaration.json | 2 +- 100 files changed, 724 insertions(+), 668 deletions(-) diff --git a/.claude/rules/e2e.md b/.claude/rules/e2e.md index c910337673c..f4497313c3f 100644 --- a/.claude/rules/e2e.md +++ b/.claude/rules/e2e.md @@ -3,7 +3,7 @@ ## Test Locations and Frameworks | Location | Framework | Purpose | -|----------|-----------|---------| +| --- | --- | --- | | `tests/e2e/playwright/` | Playwright | Main e2e suite for all InstantSearch flavors | | `tests/e2e/` (wdio files) | WebdriverIO | IE11 tests only (via Sauce Labs) | | `packages/react-instantsearch-nextjs/__tests__/e2e/` | Playwright | App Router Next.js e2e tests | @@ -14,6 +14,7 @@ ### Main E2E Suite (Playwright) **Prerequisites:** Examples must be built first: + ```bash yarn website:examples ``` @@ -86,49 +87,60 @@ test.describe('feature name', () => { The `helpers` fixture provides these methods: **RefinementList:** + - `clickRefinementListItem(label)` - Click a refinement list item - `getSelectedRefinementListItem()` - Get the selected item's text **SearchBox:** + - `setSearchBoxValue(value)` - Set the search input value - `getSearchBoxValue()` - Get the current search value **Hits:** + - `getHitsTitles()` - Get all hit titles as an array **HierarchicalMenu:** + - `clickHierarchicalMenuItem(label)` - Click a menu item - `getSelectedHierarchicalMenuItems()` - Get selected items **RangeSlider:** + - `dragRangeSliderLowerBoundTo(value)` - Drag lower handle - `dragRangeSliderUpperBoundTo(value)` - Drag upper handle - `getRangeSliderLowerBoundValue()` - Get lower bound value - `getRangeSliderUpperBoundValue()` - Get upper bound value **Pagination:** + - `clickPage(n)` - Navigate to page n - `clickNextPage()` - Go to next page - `clickPreviousPage()` - Go to previous page - `getCurrentPage()` - Get current page number **ToggleRefinement:** + - `clickToggleRefinement()` - Toggle the refinement - `getToggleRefinementStatus()` - Get checked status **RatingMenu:** + - `clickRatingMenuItem(label)` - Click rating (e.g., "4 & up") - `getSelectedRatingMenuItem()` - Get selected rating label **SortBy:** + - `setSortByValue(label)` - Select sort option by label - `getSortByValue()` - Get current sort value **HitsPerPage:** + - `setHitsPerPage(label)` - Select hits per page - `getHitsPerPage()` - Get current value **ClearRefinements:** + - `clickClearRefinements()` - Click clear button ### Best Practices @@ -156,6 +168,7 @@ The main e2e suite tests multiple InstantSearch flavors: Tests run against example apps in `website/examples/{flavor}/e-commerce/`. To run a single flavor: + ```bash E2E_FLAVOR=react yarn test:e2e ``` @@ -163,6 +176,7 @@ E2E_FLAVOR=react yarn test:e2e ## IE11 Considerations IE11 tests are kept in WebdriverIO because Playwright doesn't support IE11. These tests: + - Only run `js` and `js-umd` flavors - Require Sauce Labs for remote IE11 browser - Use the same test specs in `tests/e2e/specs/` and helpers in `tests/e2e/helpers/` @@ -188,6 +202,7 @@ PWDEBUG=1 yarn workspace @instantsearch/e2e-tests test:playwright ### View Test Reports After running tests, open the HTML report: + ```bash npx playwright show-report tests/e2e/playwright/playwright-report ``` @@ -203,15 +218,20 @@ npx playwright show-report tests/e2e/playwright/playwright-report ### Port conflicts on macOS On macOS, port 5000 is used by AirPlay Receiver (ControlCenter). The tests use port 3456 instead. If you need to change the port, update: + - `tests/e2e/playwright/playwright.config.ts` (both `baseURL` and `webServer.command/url`) ### SPA routing not working The e-commerce examples use History API routing (e.g., `/search/Appliances/`). The `website/serve.json` file configures rewrites for these routes. If you add new SPA routes, update this file: + ```json { "rewrites": [ - { "source": "/examples/js/e-commerce/search/**", "destination": "/examples/js/e-commerce/index.html" } + { + "source": "/examples/js/e-commerce/search/**", + "destination": "/examples/js/e-commerce/index.html" + } ] } ``` @@ -225,18 +245,21 @@ Tests have 1 retry locally and 2 retries in CI to handle occasional flakiness. ### Multiple elements matched If you see "strict mode violation" errors about multiple elements: + - SearchBox selectors are scoped to the header to avoid matching RefinementList search inputs - Use more specific selectors when targeting widgets that may appear multiple times ### Different HTML structures across flavors The JS and React examples have different HTML structures: + - **JS examples**: Use `id="header"` and `data-widget="searchbox"` attributes - **React examples**: Use `className="header"` (class instead of id) and render SearchBox directly inside header The fixtures account for this with combined selectors like: + ```typescript -'#header .ais-SearchBox [type=search], .header > .ais-SearchBox [type=search], [data-widget="searchbox"] .ais-SearchBox [type=search]' +'#header .ais-SearchBox [type=search], .header > .ais-SearchBox [type=search], [data-widget="searchbox"] .ais-SearchBox [type=search]'; ``` If you add new selectors, ensure they work across all flavors. @@ -254,6 +277,7 @@ When migrating tests from WebDriverIO to Playwright, be aware of these differenc - **WebDriverIO**: `$('.ais-Hits-item')` returns first match, clicking works on container elements - **Playwright**: `page.locator('.ais-Hits-item').first()` - clicking on container may not hit child link elements. Use `.locator('a')` to target links explicitly: + ```typescript // WebDriverIO const link = await $('.ais-Hits-item'); @@ -289,10 +313,10 @@ This gives the browser enough time to process JavaScript events like popstate ha ## CI Integration Tests run in CircleCI: + - **e2e tests playwright** - Main suite with Chromium + Firefox - **e2e tests ie11** - IE11 via Sauce Labs - **e2e tests router nextjs** - Pages Router Next.js tests - **e2e tests app router nextjs** - App Router Next.js tests -JUnit reports are stored for test results visualization. -Playwright HTML reports are stored as artifacts. +JUnit reports are stored for test results visualization. Playwright HTML reports are stored as artifacts. diff --git a/.claude/skills/port-widget/agents/openai.yaml b/.claude/skills/port-widget/agents/openai.yaml index a931cd472c2..1a1a427401c 100644 --- a/.claude/skills/port-widget/agents/openai.yaml +++ b/.claude/skills/port-widget/agents/openai.yaml @@ -1,7 +1,7 @@ interface: - display_name: "Port InstantSearch Widget" - short_description: "Port widgets across InstantSearch flavors" - default_prompt: "Use $port-widget to port a widget or connector-driven feature across the InstantSearch JavaScript, React, and Vue packages in this repo." + display_name: 'Port InstantSearch Widget' + short_description: 'Port widgets across InstantSearch flavors' + default_prompt: 'Use $port-widget to port a widget or connector-driven feature across the InstantSearch JavaScript, React, and Vue packages in this repo.' policy: allow_implicit_invocation: true diff --git a/.codacy.yml b/.codacy.yml index c919908001a..51f4583acc1 100644 --- a/.codacy.yml +++ b/.codacy.yml @@ -5,4 +5,4 @@ engines: semgrep: exclude_paths: - - "**/rollup.config.mjs" + - '**/rollup.config.mjs' diff --git a/.github/prompts/docs-automation.md b/.github/prompts/docs-automation.md index 7068bf96b3f..78acd655afa 100644 --- a/.github/prompts/docs-automation.md +++ b/.github/prompts/docs-automation.md @@ -1,49 +1,54 @@ You are updating documentation for InstantSearch. -IMPORTANT: This is a non-interactive automated workflow. Do not ask for user input or clarification. -If you cannot access a file, skip it and work with what you have. -If there are no documentable changes, report that finding and exit successfully. +IMPORTANT: This is a non-interactive automated workflow. Do not ask for user input or clarification. If you cannot access a file, skip it and work with what you have. If there are no documentable changes, report that finding and exit successfully. BE EFFICIENT: You have limited turns. Read multiple files in parallel when possible. Don't over-explore. ## Repository Layout You are running from the root directory where: + - instantsearch/ contains the InstantSearch source code and changelogs - docs-new/ contains the documentation repository to update ## Task 1. Read the changelogs to understand what changed in the latest release: + - instantsearch/packages/instantsearch.js/CHANGELOG.md - instantsearch/packages/react-instantsearch/CHANGELOG.md - instantsearch/packages/react-instantsearch-core/CHANGELOG.md - instantsearch/packages/vue-instantsearch/CHANGELOG.md (low priority - only update Vue docs if this changelog shows explicit feature additions) 2. Find and read ONE existing doc as a format reference: - - Use Glob to find InstantSearch widget docs: docs-new/**/instantsearch/**/*.mdx + + - Use Glob to find InstantSearch widget docs: docs-new/**/instantsearch/**/\*.mdx - Read just ONE example file to understand the format (don't read many) 3. Update documentation for any new features, modified components, or breaking changes. 4. After making changes, run link check to catch broken links: - - cd docs-new && npm run check:links - Fix any broken links you introduced, but don't spend time on pre-existing issues. -5. REQUIRED: Write a summary file at CHANGES_SUMMARY.md with this exact format: - --- + - cd docs-new && npm run check:links Fix any broken links you introduced, but don't spend time on pre-existing issues. + +5. ## REQUIRED: Write a summary file at CHANGES_SUMMARY.md with this exact format: + First line: A short title describing the main change (e.g., 'Add useFrequentlyBoughtTogether hook documentation') Blank line, then a markdown list of what was changed: + - Added docs for X widget/hook - Updated Y component with new Z prop - Fixed broken links in W page - --- + + *** + If no changes were made, write 'No documentation changes needed' as the title. ## Flavor Mapping Each package has its own documentation flavor: + - instantsearch.js → .js.mdx files - react-instantsearch → .react.mdx files - vue-instantsearch → .vue.mdx files @@ -57,12 +62,8 @@ Each package has its own documentation flavor: - Match the existing documentation format and style exactly - Only modify documentation files in docs-new/ - Don't add placeholder content - only document what actually exists -- CROSS-FLAVOR CONSISTENCY: When updating a widget/hook that exists in multiple flavors (JS, React, Vue), - check if the same prop/feature exists in the other flavors and update ALL relevant docs. - Many features are shared via instantsearch-ui-components. Read the source for each flavor to verify. +- CROSS-FLAVOR CONSISTENCY: When updating a widget/hook that exists in multiple flavors (JS, React, Vue), check if the same prop/feature exists in the other flavors and update ALL relevant docs. Many features are shared via instantsearch-ui-components. Read the source for each flavor to verify. ## Source Code Reference -The InstantSearch source is at instantsearch/ for reference. -Read source files to understand APIs, types, and implementation. -Example: instantsearch/packages/instantsearch.js/src/widgets/ +The InstantSearch source is at instantsearch/ for reference. Read source files to understand APIs, types, and implementation. Example: instantsearch/packages/instantsearch.js/src/widgets/ diff --git a/.github/workflows/docs-automation.yml b/.github/workflows/docs-automation.yml index 647314dc167..2bdf97f8088 100644 --- a/.github/workflows/docs-automation.yml +++ b/.github/workflows/docs-automation.yml @@ -31,8 +31,8 @@ jobs: runs-on: ubuntu-latest # Only run on release commits (chore: release) or manual triggers if: >- - github.event_name == 'workflow_dispatch' || - (startsWith(github.event.head_commit.message, 'chore:') && contains(github.event.head_commit.message, 'release')) + github.event_name == 'workflow_dispatch' || (startsWith(github.event.head_commit.message, 'chore:') && contains(github.event.head_commit.message, 'release')) + steps: - name: Checkout instantsearch diff --git a/.github/workflows/pkg-pr-new.yml b/.github/workflows/pkg-pr-new.yml index 96db8241284..af19cba4aa1 100644 --- a/.github/workflows/pkg-pr-new.yml +++ b/.github/workflows/pkg-pr-new.yml @@ -30,19 +30,5 @@ jobs: - name: Publish preview packages run: > - npx pkg-pr-new publish - --compact - --template './examples/js/getting-started' - --template './examples/react/getting-started' - --template './examples/react/next-app-router' - --template './examples/react/next-routing' - --template './examples/vue/getting-started' - './packages/algoliasearch-helper' - './packages/instantsearch.js' - './packages/react-instantsearch' - './packages/react-instantsearch-core' - './packages/react-instantsearch-nextjs' - './packages/react-instantsearch-router-nextjs' - './packages/vue-instantsearch' - './packages/instantsearch.css' - './packages/instantsearch-ui-components' + npx pkg-pr-new publish --compact --template './examples/js/getting-started' --template './examples/react/getting-started' --template './examples/react/next-app-router' --template './examples/react/next-routing' --template './examples/vue/getting-started' './packages/algoliasearch-helper' './packages/instantsearch.js' './packages/react-instantsearch' './packages/react-instantsearch-core' './packages/react-instantsearch-nextjs' './packages/react-instantsearch-router-nextjs' './packages/vue-instantsearch' './packages/instantsearch.css' './packages/instantsearch-ui-components' + diff --git a/.oxlintrc.json b/.oxlintrc.json index 0623cfcfe98..8eef8697bc8 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -119,14 +119,7 @@ "caseInsensitive": true, "order": "asc" }, - "groups": [ - "builtin", - "external", - "parent", - "sibling", - "index", - "type" - ], + "groups": ["builtin", "external", "parent", "sibling", "index", "type"], "newlines-between": "always", "pathGroups": [ { @@ -135,9 +128,7 @@ "position": "before" } ], - "pathGroupsExcludedImportTypes": [ - "builtin" - ] + "pathGroupsExcludedImportTypes": ["builtin"] } ], "react-hooks/exhaustive-deps": [ @@ -157,24 +148,15 @@ "no-restricted-imports": [ "error", { - "paths": [ - "instantsearch.js/es" - ], - "patterns": [ - "instantsearch.js/cjs/*" - ] + "paths": ["instantsearch.js/es"], + "patterns": ["instantsearch.js/cjs/*"] } ], "instantsearch/no-default-props-assignment": "error" }, "overrides": [ { - "files": [ - "**/*.js", - "**/*.cjs", - "**/*.mjs", - "**/*.d.ts" - ], + "files": ["**/*.js", "**/*.cjs", "**/*.mjs", "**/*.d.ts"], "rules": { "@typescript-eslint/consistent-type-imports": "off", "@typescript-eslint/no-floating-promises": "off", @@ -186,9 +168,7 @@ } }, { - "files": [ - "packages/**/*" - ], + "files": ["packages/**/*"], "rules": { "instantsearch/no-async-functions": "error", "instantsearch/no-for-in": "error", @@ -200,20 +180,14 @@ } }, { - "files": [ - "packages/vue-instantsearch/**/*", - "examples/vue/**/*" - ], + "files": ["packages/vue-instantsearch/**/*", "examples/vue/**/*"], "rules": { "react-hooks/exhaustive-deps": "off", "react-hooks/rules-of-hooks": "off" } }, { - "files": [ - "packages/**/*.test.*", - "packages/**/__tests__/**" - ], + "files": ["packages/**/*.test.*", "packages/**/__tests__/**"], "rules": { "instantsearch/no-async-functions": "off", "instantsearch/no-for-in": "off", @@ -231,10 +205,7 @@ "packages/instantsearch.js/src/**/*.tsx" ], "rules": { - "import/extensions": [ - "error", - "never" - ] + "import/extensions": ["error", "never"] } }, { @@ -243,26 +214,17 @@ "packages/react-instantsearch-*/src/**/*" ], "rules": { - "import/extensions": [ - "error", - "never" - ] + "import/extensions": ["error", "never"] } }, { - "files": [ - "packages/*/test/module/**/*.cjs" - ], + "files": ["packages/*/test/module/**/*.cjs"], "rules": { "import/extensions": "off" } }, { - "files": [ - "**/__tests__/**/*", - "**/*.spec.*", - "**/*.test.*" - ], + "files": ["**/__tests__/**/*", "**/*.spec.*", "**/*.test.*"], "rules": { "import/extensions": "off", "new-cap": "off", @@ -270,19 +232,13 @@ } }, { - "files": [ - "**/*.cjs" - ], + "files": ["**/*.cjs"], "rules": { "import/no-commonjs": "off" } }, { - "files": [ - "scripts/**/*", - "**/*.config.js", - "**/*.conf.js" - ], + "files": ["scripts/**/*", "**/*.config.js", "**/*.conf.js"], "rules": { "import/no-commonjs": "off", "no-console": "off" @@ -309,9 +265,7 @@ } }, { - "files": [ - "tests/e2e/**/*" - ], + "files": ["tests/e2e/**/*"], "rules": { "@typescript-eslint/no-floating-promises": "error", "import/no-commonjs": "off", @@ -349,19 +303,14 @@ } }, { - "files": [ - "**/.storybook/**/*", - "**/stories/**/*" - ], + "files": ["**/.storybook/**/*", "**/stories/**/*"], "rules": { "new-cap": "off", "no-console": "off" } }, { - "files": [ - "packages/instantsearch.js/src/**/*" - ], + "files": ["packages/instantsearch.js/src/**/*"], "rules": { "no-restricted-globals": [ "error", diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9e23ff74725..b37e3352f9b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -411,9 +411,7 @@ Useful lint commands: - `yarn lint:staged` lints staged JavaScript, TypeScript, and Vue files. - `yarn lint:fix` applies Oxlint auto-fixes where available. -The root `.eslintrc.cjs` is editor-only: it powers the VS Code ESLint extension for -`import/order` diagnostics while oxlint's JS-plugin support in editors is still in -preview. The authoritative lint configuration for CI and the CLI is `.oxlintrc.json`. +The root `.eslintrc.cjs` is editor-only: it powers the VS Code ESLint extension for `import/order` diagnostics while oxlint's JS-plugin support in editors is still in preview. The authoritative lint configuration for CI and the CLI is `.oxlintrc.json`. ## Release diff --git a/examples/.oxlintrc.json b/examples/.oxlintrc.json index 4e0674381ff..19e07084c14 100644 --- a/examples/.oxlintrc.json +++ b/examples/.oxlintrc.json @@ -1,13 +1,6 @@ { - "extends": [ - "../.oxlintrc.json" - ], - "ignorePatterns": [ - "dist", - "build", - ".next", - ".nuxt" - ], + "extends": ["../.oxlintrc.json"], + "ignorePatterns": ["dist", "build", ".next", ".nuxt"], "rules": { "@typescript-eslint/consistent-type-imports": "off", "import/named": "off", diff --git a/examples/js/e-commerce-umd/tsconfig.json b/examples/js/e-commerce-umd/tsconfig.json index caa5c7af18b..dd130c51948 100644 --- a/examples/js/e-commerce-umd/tsconfig.json +++ b/examples/js/e-commerce-umd/tsconfig.json @@ -5,10 +5,7 @@ "downlevelIteration": true, "esModuleInterop": true, "strict": true, - "noImplicitAny": true, + "noImplicitAny": true }, - "include": [ - "src", - "src/global.d.ts" - ] + "include": ["src", "src/global.d.ts"] } diff --git a/examples/js/showcase/index.html b/examples/js/showcase/index.html index d0b7b20c8d3..41b746df90a 100644 --- a/examples/js/showcase/index.html +++ b/examples/js/showcase/index.html @@ -11,14 +11,14 @@
diff --git a/examples/js/showcase/src/App.tsx b/examples/js/showcase/src/App.tsx index c6799c8fb06..e36bc5711e1 100644 --- a/examples/js/showcase/src/App.tsx +++ b/examples/js/showcase/src/App.tsx @@ -1,22 +1,22 @@ -import { Search, MapPin } from "lucide-preact"; -import { useState } from "preact/hooks"; +import { Search, MapPin } from 'lucide-preact'; +import { useState } from 'preact/hooks'; -import { ColorModeSwitcher } from "./components/ColorModeSwitcher"; -import { FlavorContext, type Flavor } from "./context/flavor"; -import { GeoSearchView } from "./views/GeoSearchView"; -import { InstantSearchView } from "./views/InstantSearchView"; +import { ColorModeSwitcher } from './components/ColorModeSwitcher'; +import { FlavorContext, type Flavor } from './context/flavor'; +import { GeoSearchView } from './views/GeoSearchView'; +import { InstantSearchView } from './views/InstantSearchView'; -import type { LucideIcon } from "lucide-preact"; -import type { ComponentType } from "preact"; +import type { LucideIcon } from 'lucide-preact'; +import type { ComponentType } from 'preact'; -const VALID_FLAVORS: Flavor[] = ["js", "react", "vue"]; +const VALID_FLAVORS: Flavor[] = ['js', 'react', 'vue']; function getFlavorFromURL(): Flavor { - const param = new URLSearchParams(window.location.search).get("flavor"); + const param = new URLSearchParams(window.location.search).get('flavor'); if (param && VALID_FLAVORS.includes(param as Flavor)) { return param as Flavor; } - return "js"; + return 'js'; } interface Experience { @@ -28,14 +28,14 @@ interface Experience { const experiences: Experience[] = [ { - title: "InstantSearch", - description: "Full search interface", + title: 'InstantSearch', + description: 'Full search interface', icon: Search, view: InstantSearchView, }, { - title: "GeoSearch", - description: "Search through locations", + title: 'GeoSearch', + description: 'Search through locations', icon: MapPin, view: GeoSearchView, }, @@ -56,8 +56,8 @@ export function App() { type="button" class={`group flex cursor-pointer flex-col items-center gap-1.5 rounded-xl border px-5 py-4 text-center transition-all ${ currentIndex === index - ? "border-neutral-200 bg-white shadow-xs dark:border-neutral-700 dark:bg-neutral-800" - : "border-transparent bg-neutral-50 hover:border-neutral-200 hover:bg-white hover:shadow-xs dark:bg-neutral-800/40 dark:hover:border-neutral-700 dark:hover:bg-neutral-800" + ? 'border-neutral-200 bg-white shadow-xs dark:border-neutral-700 dark:bg-neutral-800' + : 'border-transparent bg-neutral-50 hover:border-neutral-200 hover:bg-white hover:shadow-xs dark:bg-neutral-800/40 dark:hover:border-neutral-700 dark:hover:bg-neutral-800' }`} onClick={() => setCurrentIndex(index)} > @@ -65,16 +65,16 @@ export function App() { size={20} class={`transition-[color] ${ currentIndex === index - ? "text-blue-500 dark:text-blue-400" - : "text-neutral-400 group-hover:text-neutral-500 dark:text-neutral-500 dark:group-hover:text-neutral-400" + ? 'text-blue-500 dark:text-blue-400' + : 'text-neutral-400 group-hover:text-neutral-500 dark:text-neutral-500 dark:group-hover:text-neutral-400' }`} />
{experience.title} @@ -82,8 +82,8 @@ export function App() { {experience.description} @@ -96,7 +96,7 @@ export function App() {
{experiences.map((experience, index) => ( -
+
))} diff --git a/examples/js/showcase/src/components/ColorModeSwitcher.tsx b/examples/js/showcase/src/components/ColorModeSwitcher.tsx index 285c7dd2fc7..06e85ca80a2 100644 --- a/examples/js/showcase/src/components/ColorModeSwitcher.tsx +++ b/examples/js/showcase/src/components/ColorModeSwitcher.tsx @@ -1,17 +1,24 @@ -import { Monitor, Sun, Moon } from "lucide-preact"; +import { Monitor, Sun, Moon } from 'lucide-preact'; -import { useColorMode, type ColorMode } from "../hooks/useColorMode"; +import { useColorMode, type ColorMode } from '../hooks/useColorMode'; -import { SegmentedControl, type SegmentedOption } from "./SegmentedControl"; +import { SegmentedControl, type SegmentedOption } from './SegmentedControl'; const options: SegmentedOption[] = [ - { value: "system", label: "System", icon: }, - { value: "light", label: "Light", icon: }, - { value: "dark", label: "Dark", icon: }, + { value: 'system', label: 'System', icon: }, + { value: 'light', label: 'Light', icon: }, + { value: 'dark', label: 'Dark', icon: }, ]; export function ColorModeSwitcher() { const { mode, setMode } = useColorMode(); - return ; + return ( + + ); } diff --git a/examples/js/showcase/src/components/SegmentedControl.tsx b/examples/js/showcase/src/components/SegmentedControl.tsx index 2bd74f906aa..7364a668e14 100644 --- a/examples/js/showcase/src/components/SegmentedControl.tsx +++ b/examples/js/showcase/src/components/SegmentedControl.tsx @@ -1,4 +1,4 @@ -import type { ComponentChildren } from "preact"; +import type { ComponentChildren } from 'preact'; export interface SegmentedOption { value: T; @@ -13,19 +13,30 @@ interface Props { class?: string; } -export function SegmentedControl({ options, value, onChange, class: className }: Props) { +export function SegmentedControl({ + options, + value, + onChange, + class: className, +}: Props) { return ( -
+
{options.map((option, index) => ( - ${sendChatMessageFeedback ? 'true' : 'false'} - ${JSON.stringify(feedbackState)} + ${ + sendChatMessageFeedback ? 'true' : 'false' + } + ${JSON.stringify( + feedbackState + )} `; renderOptions.widgetParams.container diff --git a/packages/instantsearch.js/src/components/SearchBox/SearchBox.tsx b/packages/instantsearch.js/src/components/SearchBox/SearchBox.tsx index 98ffe4fd2a1..e2139b06f56 100644 --- a/packages/instantsearch.js/src/components/SearchBox/SearchBox.tsx +++ b/packages/instantsearch.js/src/components/SearchBox/SearchBox.tsx @@ -12,14 +12,13 @@ import type { } from '../../widgets/search-box/search-box'; import type { ComponentProps } from 'preact'; -export type SearchBoxComponentCSSClasses = - ComponentCSSClasses< - Omit - > & { - aiModeButton?: string; - aiModeIcon?: string; - aiModeLabel?: string; - }; +export type SearchBoxComponentCSSClasses = ComponentCSSClasses< + Omit +> & { + aiModeButton?: string; + aiModeIcon?: string; + aiModeLabel?: string; +}; export type SearchBoxComponentTemplates = Required< Omit diff --git a/packages/instantsearch.js/src/connectors/chat/__tests__/connectChat-test.ts b/packages/instantsearch.js/src/connectors/chat/__tests__/connectChat-test.ts index 38b73e1d119..79d5e451eb5 100644 --- a/packages/instantsearch.js/src/connectors/chat/__tests__/connectChat-test.ts +++ b/packages/instantsearch.js/src/connectors/chat/__tests__/connectChat-test.ts @@ -536,5 +536,4 @@ data: [DONE]`, ); }); }); - }); diff --git a/packages/instantsearch.js/src/connectors/chat/connectChat.ts b/packages/instantsearch.js/src/connectors/chat/connectChat.ts index 711a0376db2..7485b389856 100644 --- a/packages/instantsearch.js/src/connectors/chat/connectChat.ts +++ b/packages/instantsearch.js/src/connectors/chat/connectChat.ts @@ -521,8 +521,7 @@ export default (function connectChat( render(); }; - const feedback = - 'feedback' in options ? options.feedback : undefined; + const feedback = 'feedback' in options ? options.feedback : undefined; if (agentId && feedback) { const [appId, apiKey] = getAppIdAndApiKey( initOptions.instantSearchInstance.client diff --git a/packages/instantsearch.js/src/connectors/trending-facets/connectTrendingFacets.ts b/packages/instantsearch.js/src/connectors/trending-facets/connectTrendingFacets.ts index c3086784a2f..7662ad35ba5 100644 --- a/packages/instantsearch.js/src/connectors/trending-facets/connectTrendingFacets.ts +++ b/packages/instantsearch.js/src/connectors/trending-facets/connectTrendingFacets.ts @@ -107,9 +107,7 @@ export default (function connectTrendingFacets< } = widgetParams || {}; if (!facetName) { - throw new Error( - withUsage('The `facetName` option is required.') - ); + throw new Error(withUsage('The `facetName` option is required.')); } return { diff --git a/packages/instantsearch.js/src/lib/routers/history.ts b/packages/instantsearch.js/src/lib/routers/history.ts index 4c7f34baefa..f26980d6060 100644 --- a/packages/instantsearch.js/src/lib/routers/history.ts +++ b/packages/instantsearch.js/src/lib/routers/history.ts @@ -345,12 +345,13 @@ export default function historyRouter({ return safelyRunOnBrowser( ({ window: browserWindow }) => browserWindow.location, { - fallback: () => { - throw new Error( - 'You need to provide `getLocation` to the `history` router in environments where `window` does not exist.' - ); - }, - }); + fallback: () => { + throw new Error( + 'You need to provide `getLocation` to the `history` router in environments where `window` does not exist.' + ); + }, + } + ); }, start, dispose, diff --git a/packages/instantsearch.js/src/widgets/chat/chat.tsx b/packages/instantsearch.js/src/widgets/chat/chat.tsx index c83d2987353..b141edeee58 100644 --- a/packages/instantsearch.js/src/widgets/chat/chat.tsx +++ b/packages/instantsearch.js/src/widgets/chat/chat.tsx @@ -320,9 +320,7 @@ type ChatWrapperProps = { | ((props: ChatMessageLoaderProps) => JSX.Element) | undefined; errorComponent: ((props: ChatMessageErrorProps) => JSX.Element) | undefined; - emptyComponent: - | ((props: ChatEmptyProps) => JSX.Element) - | undefined; + emptyComponent: ((props: ChatEmptyProps) => JSX.Element) | undefined; actionsComponent: | ((props: { actions: ChatMessageActionProps[] }) => JSX.Element) | undefined; diff --git a/packages/instantsearch.js/src/widgets/trending-facets/__tests__/trending-facets.test.tsx b/packages/instantsearch.js/src/widgets/trending-facets/__tests__/trending-facets.test.tsx index 2271b62e610..22eb4bc2cb2 100644 --- a/packages/instantsearch.js/src/widgets/trending-facets/__tests__/trending-facets.test.tsx +++ b/packages/instantsearch.js/src/widgets/trending-facets/__tests__/trending-facets.test.tsx @@ -96,9 +96,9 @@ describe('trendingFacets', () => { expect(container.querySelector('.ais-TrendingFacets')).toHaveClass( 'ROOT' ); - expect( - container.querySelector('.ais-TrendingFacets-title') - ).toHaveClass('TITLE'); + expect(container.querySelector('.ais-TrendingFacets-title')).toHaveClass( + 'TITLE' + ); expect( container.querySelector('.ais-TrendingFacets-container') ).toHaveClass('CONTAINER'); diff --git a/packages/instantsearch.js/src/widgets/trending-facets/trending-facets.tsx b/packages/instantsearch.js/src/widgets/trending-facets/trending-facets.tsx index b079cdb30cf..b2c795f90a0 100644 --- a/packages/instantsearch.js/src/widgets/trending-facets/trending-facets.tsx +++ b/packages/instantsearch.js/src/widgets/trending-facets/trending-facets.tsx @@ -86,19 +86,18 @@ function createRenderer({ : undefined ) as TrendingFacetsUiProps['headerComponent']; - const itemComponent: TrendingFacetsUiProps['itemComponent'] = - templates.item - ? ({ item }) => { - return ( - - ); - } - : undefined; + const itemComponent: TrendingFacetsUiProps['itemComponent'] = templates.item + ? ({ item }) => { + return ( + + ); + } + : undefined; const emptyComponent = ( templates.empty @@ -140,9 +139,7 @@ export type TrendingFacetsTemplates = Partial<{ */ header: Template< Pick< - Parameters< - NonNullable - >[0], + Parameters>[0], 'items' > & { cssClasses: TrendingFacetsClassNames } >; diff --git a/packages/react-instantsearch-router-nextjs/tsconfig.declaration.json b/packages/react-instantsearch-router-nextjs/tsconfig.declaration.json index 4ec760cf569..79d5d0a0a12 100644 --- a/packages/react-instantsearch-router-nextjs/tsconfig.declaration.json +++ b/packages/react-instantsearch-router-nextjs/tsconfig.declaration.json @@ -1,9 +1,5 @@ { "extends": "../../tsconfig.declaration", "include": ["src/**/*"], - "exclude": [ - "**/__tests__/e2e/**/*", - "**/src/**/*.test.ts", - "**/dist/**/*" - ] + "exclude": ["**/__tests__/e2e/**/*", "**/src/**/*.test.ts", "**/dist/**/*"] } diff --git a/packages/react-instantsearch/src/ui/SearchBox.tsx b/packages/react-instantsearch/src/ui/SearchBox.tsx index f65b80a7cdc..096a2ebd1c4 100644 --- a/packages/react-instantsearch/src/ui/SearchBox.tsx +++ b/packages/react-instantsearch/src/ui/SearchBox.tsx @@ -277,10 +277,7 @@ export function SearchBox({ {onAiModeClick && ( @@ -1493,18 +1493,18 @@ export function createOptionsTests( await openChat(act); - expect( - document.querySelector('.custom-status')!.textContent - ).toBe('ready'); + expect(document.querySelector('.custom-status')!.textContent).toBe( + 'ready' + ); await act(async () => { chat._state.status = 'submitted'; await wait(0); }); - expect( - document.querySelector('.custom-status')!.textContent - ).toBe('submitted'); + expect(document.querySelector('.custom-status')!.textContent).toBe( + 'submitted' + ); }); test('renders with inline layout component', async () => { diff --git a/tests/common/widgets/chat/templates.tsx b/tests/common/widgets/chat/templates.tsx index 8ec01122f89..c82a3596be1 100644 --- a/tests/common/widgets/chat/templates.tsx +++ b/tests/common/widgets/chat/templates.tsx @@ -278,8 +278,7 @@ export function createTemplatesTests( javascript: { ...createDefaultWidgetParams(chat), templates: { - empty: - '
Custom empty
', + empty: '
Custom empty
', }, }, react: { @@ -321,8 +320,7 @@ export function createTemplatesTests( javascript: { ...createDefaultWidgetParams(chat), templates: { - empty: - '
Custom empty
', + empty: '
Custom empty
', }, }, react: { @@ -357,8 +355,7 @@ export function createTemplatesTests( javascript: { ...createDefaultWidgetParams(chat), templates: { - empty: - '
Custom empty
', + empty: '
Custom empty
', }, }, react: { diff --git a/tests/e2e/CONTRIBUTING.md b/tests/e2e/CONTRIBUTING.md index 72151c4d76e..07be1ac7050 100644 --- a/tests/e2e/CONTRIBUTING.md +++ b/tests/e2e/CONTRIBUTING.md @@ -29,9 +29,7 @@ E2E_BROWSER="internet explorer" yarn test:e2e:saucelabs # Possible values: chrome, firefox, internet explorer ``` -> [!NOTE] -> To run tests locally with Sauce Labs, make sure examples are built with `yarn website:examples` and set the appropriate Sauce Labs environment variables: `SAUCE_USERNAME` and `SAUCE_ACCESS_KEY`. -> Additionally, the latest version of the Sauce Connect v4 tunnel (4.9.2) [doesn't support macOS](https://docs.saucelabs.com/secure-connections/sauce-connect/installation/#downloading-sauce-connect-proxy). You can pin it to the previous version by setting the `SAUCE_CONNECT_VERSION=4.9.1` variable. +> [!NOTE] To run tests locally with Sauce Labs, make sure examples are built with `yarn website:examples` and set the appropriate Sauce Labs environment variables: `SAUCE_USERNAME` and `SAUCE_ACCESS_KEY`. Additionally, the latest version of the Sauce Connect v4 tunnel (4.9.2) [doesn't support macOS](https://docs.saucelabs.com/secure-connections/sauce-connect/installation/#downloading-sauce-connect-proxy). You can pin it to the previous version by setting the `SAUCE_CONNECT_VERSION=4.9.1` variable. You can also run the tests with [WebdriverIO](https://webdriver.io) options. For example, to run a specific test in watch mode: diff --git a/tests/e2e/tsconfig.json b/tests/e2e/tsconfig.json index ea4444e5a81..24dfdf23343 100644 --- a/tests/e2e/tsconfig.json +++ b/tests/e2e/tsconfig.json @@ -15,10 +15,5 @@ "checkJs": true }, "exclude": ["node_modules", "playwright"], - "include": [ - "./*.ts", - "./*.js", - "./specs/**/*.ts", - "./helpers/**/*.ts" - ] + "include": ["./*.ts", "./*.js", "./specs/**/*.ts", "./helpers/**/*.ts"] } diff --git a/tsconfig.declaration.json b/tsconfig.declaration.json index 7fedc49e193..512061bc804 100644 --- a/tsconfig.declaration.json +++ b/tsconfig.declaration.json @@ -5,5 +5,5 @@ "emitDeclarationOnly": true, "noEmit": false }, - "exclude": ["**/__tests__/**/*", "**/dist/**/*"], + "exclude": ["**/__tests__/**/*", "**/dist/**/*"] } From 875f1eb23bf9f7d35da7d93a24c2c47e7c188353 Mon Sep 17 00:00:00 2001 From: Shahmir Ejaz Date: Mon, 20 Apr 2026 18:19:18 +0100 Subject: [PATCH 05/14] fix codacy --- .../js/showcase/src/components/widgets/WidgetGeoSearch.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/js/showcase/src/components/widgets/WidgetGeoSearch.tsx b/examples/js/showcase/src/components/widgets/WidgetGeoSearch.tsx index 2d975f4155d..1263a8db6f7 100644 --- a/examples/js/showcase/src/components/widgets/WidgetGeoSearch.tsx +++ b/examples/js/showcase/src/components/widgets/WidgetGeoSearch.tsx @@ -9,7 +9,8 @@ const GOOGLE_MAPS_API_KEY = import.meta.env.VITE_GOOGLE_MAPS_API_KEY ?? 'AIzaSyBawL8VbstJDdU5397SUX7pEt9DslAwWgQ'; -type GoogleRef = typeof window['google']; +// eslint-disable-next-line prettier/prettier +type GoogleRef = (typeof window)['google']; const COLOR_SCHEME_MAP: Record = { From baeb3e7bf0b65fd79532575cc5f883d4141d56ef Mon Sep 17 00:00:00 2001 From: Shahmir Ejaz Date: Tue, 21 Apr 2026 13:00:18 +0100 Subject: [PATCH 06/14] fix lint --- .circleci/config.yml | 8 ++- .eslintrc.cjs | 3 +- .oxlintrc.json | 3 +- .../components/widgets/WidgetGeoSearch.tsx | 2 +- .../middlewares/createInsightsMiddleware.ts | 4 +- .../index.cjs | 52 +++++++++++++++++++ .../package.json | 8 +++ scripts/lint/instantsearch-oxlint-plugin.mjs | 30 +++++++++++ 8 files changed, 104 insertions(+), 6 deletions(-) create mode 100644 scripts/eslint-plugin-instantsearch-editor/index.cjs create mode 100644 scripts/eslint-plugin-instantsearch-editor/package.json diff --git a/.circleci/config.yml b/.circleci/config.yml index 911f8ddd29d..3b577f30c4b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -222,7 +222,13 @@ jobs: - *run_yarn_install - run: name: Format check - command: yarn run format:check + command: | + yarn run format:check && exit 0 + echo "" + echo "=== Formatting violations (showing intended prettier output as diff) ===" + yarn prettier --write . > /dev/null + git --no-pager diff --color + exit 1 - run: name: Lint command: yarn run lint diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 08707044335..4ba6e7ae0d0 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -8,7 +8,7 @@ module.exports = { sourceType: 'module', ecmaFeatures: { jsx: true }, }, - plugins: ['import', 'prettier'], + plugins: ['import', 'prettier', 'instantsearch-editor'], settings: { 'import/resolver': { node: { extensions: ['.js', '.jsx', '.ts', '.tsx'] }, @@ -16,6 +16,7 @@ module.exports = { }, rules: { 'prettier/prettier': 'error', + 'instantsearch-editor/prefer-prettier-ignore-comment': 'error', 'import/order': [ 'error', { diff --git a/.oxlintrc.json b/.oxlintrc.json index 8eef8697bc8..47fb37ac0f4 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -152,7 +152,8 @@ "patterns": ["instantsearch.js/cjs/*"] } ], - "instantsearch/no-default-props-assignment": "error" + "instantsearch/no-default-props-assignment": "error", + "instantsearch/prefer-prettier-ignore-comment": "error" }, "overrides": [ { diff --git a/examples/js/showcase/src/components/widgets/WidgetGeoSearch.tsx b/examples/js/showcase/src/components/widgets/WidgetGeoSearch.tsx index 1263a8db6f7..650e8a61996 100644 --- a/examples/js/showcase/src/components/widgets/WidgetGeoSearch.tsx +++ b/examples/js/showcase/src/components/widgets/WidgetGeoSearch.tsx @@ -9,7 +9,7 @@ const GOOGLE_MAPS_API_KEY = import.meta.env.VITE_GOOGLE_MAPS_API_KEY ?? 'AIzaSyBawL8VbstJDdU5397SUX7pEt9DslAwWgQ'; -// eslint-disable-next-line prettier/prettier +// prettier-ignore type GoogleRef = (typeof window)['google']; const COLOR_SCHEME_MAP: Record = diff --git a/packages/instantsearch.js/src/middlewares/createInsightsMiddleware.ts b/packages/instantsearch.js/src/middlewares/createInsightsMiddleware.ts index 3d7b64ef2e2..9c6a8895955 100644 --- a/packages/instantsearch.js/src/middlewares/createInsightsMiddleware.ts +++ b/packages/instantsearch.js/src/middlewares/createInsightsMiddleware.ts @@ -465,11 +465,11 @@ function saveTokenAsCookie(token: string, cookieDuration?: number) { function isModernInsightsClient(client: InsightsClientWithGlobals): boolean { const [major, minor] = (client.version || '').split('.').map(Number); - /* eslint-disable instantsearch/naming-convention */ + /* oxlint-disable instantsearch/naming-convention */ const v3 = major >= 3; const v2_6 = major === 2 && minor >= 6; const v1_10 = major === 1 && minor >= 10; - /* eslint-enable instantsearch/naming-convention */ + /* oxlint-enable instantsearch/naming-convention */ return v3 || v2_6 || v1_10; } diff --git a/scripts/eslint-plugin-instantsearch-editor/index.cjs b/scripts/eslint-plugin-instantsearch-editor/index.cjs new file mode 100644 index 00000000000..c3e4894ae51 --- /dev/null +++ b/scripts/eslint-plugin-instantsearch-editor/index.cjs @@ -0,0 +1,52 @@ +module.exports = { + rules: { + 'prefer-prettier-ignore-comment': { + meta: { + type: 'problem', + fixable: 'code', + docs: { + description: + 'Use `// prettier-ignore` instead of `eslint-disable prettier/prettier`.', + }, + schema: [], + messages: { + forbidden: + "`eslint-disable prettier/prettier` only silences the editor rule; CI's standalone `prettier --check` does not honor it. Use `// prettier-ignore` on the line above instead.", + }, + }, + create(context) { + const triggerPattern = /eslint-disable[^\n]*\bprettier\/prettier\b/; + // Auto-fix only when `prettier/prettier` is the sole rule in an + // `eslint-disable-next-line` directive. Compound or block-scope + // disables carry extra semantics; leave those to manual fixes. + const soleNextLinePattern = + /^\s*eslint-disable-next-line\s+prettier\/prettier\s*$/; + const source = context.getSourceCode(); + + return { + Program() { + for (const comment of source.getAllComments()) { + if (!triggerPattern.test(comment.value)) continue; + + const canFix = soleNextLinePattern.test(comment.value); + + context.report({ + node: comment, + messageId: 'forbidden', + fix: canFix + ? (fixer) => { + const replacement = + comment.type === 'Block' + ? '/* prettier-ignore */' + : '// prettier-ignore'; + return fixer.replaceTextRange(comment.range, replacement); + } + : null, + }); + } + }, + }; + }, + }, + }, +}; diff --git a/scripts/eslint-plugin-instantsearch-editor/package.json b/scripts/eslint-plugin-instantsearch-editor/package.json new file mode 100644 index 00000000000..95c311ef410 --- /dev/null +++ b/scripts/eslint-plugin-instantsearch-editor/package.json @@ -0,0 +1,8 @@ +{ + "name": "eslint-plugin-instantsearch-editor", + "version": "0.0.0", + "private": true, + "description": "Editor-only ESLint rules that mirror .oxlintrc.json's custom rules so VS Code gets live diagnostics for them.", + "main": "index.cjs", + "license": "MIT" +} diff --git a/scripts/lint/instantsearch-oxlint-plugin.mjs b/scripts/lint/instantsearch-oxlint-plugin.mjs index 35ddbacacaa..bb6f3ed8917 100644 --- a/scripts/lint/instantsearch-oxlint-plugin.mjs +++ b/scripts/lint/instantsearch-oxlint-plugin.mjs @@ -156,6 +156,36 @@ const plugin = { }; }, }, + 'prefer-prettier-ignore-comment': { + meta: { + docs: { + description: + 'Disallow disabling the `prettier/prettier` rule via `eslint-disable`; use the native `// prettier-ignore` directive instead.', + }, + messages: { + forbidden: + "`eslint-disable prettier/prettier` only silences the editor rule; CI's standalone `prettier --check` does not honor it. Use `// prettier-ignore` on the line above instead.", + }, + schema: [], + type: 'problem', + }, + create(context) { + const pattern = /eslint-disable[^\n]*\bprettier\/prettier\b/; + + return { + Program() { + for (const comment of context.sourceCode.getAllComments()) { + if (pattern.test(comment.value)) { + context.report({ + messageId: 'forbidden', + node: comment, + }); + } + } + }, + }; + }, + }, 'no-default-props-assignment': { meta: { docs: { From 55e2d3193da6714f08cd5906c116d9dc2969f09d Mon Sep 17 00:00:00 2001 From: Shahmir Ejaz Date: Tue, 21 Apr 2026 16:02:12 +0100 Subject: [PATCH 07/14] fix formatting --- .../src/connectors/chat/connectChat.ts | 38 +++++++++++-------- tests/common/widgets/chat/options.tsx | 15 ++++++-- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/packages/instantsearch.js/src/connectors/chat/connectChat.ts b/packages/instantsearch.js/src/connectors/chat/connectChat.ts index 9537f43d844..bb9fc09b166 100644 --- a/packages/instantsearch.js/src/connectors/chat/connectChat.ts +++ b/packages/instantsearch.js/src/connectors/chat/connectChat.ts @@ -665,27 +665,33 @@ export default (function connectChat( }; if ('parts' in message && message.parts) { - return _chatInstance.sendMessage({ - ...message, - parts: [contextTextPart, ...message.parts], - text: undefined, - files: undefined, - }, ...rest); + return _chatInstance.sendMessage( + { + ...message, + parts: [contextTextPart, ...message.parts], + text: undefined, + files: undefined, + }, + ...rest + ); } const textContent = 'text' in message && message.text ? message.text : ''; - return _chatInstance.sendMessage({ - parts: [ - contextTextPart, - { type: 'text' as const, text: textContent }, - ], - metadata: message.metadata, - messageId: message.messageId, - files: undefined, - text: undefined, - }, ...rest); + return _chatInstance.sendMessage( + { + parts: [ + contextTextPart, + { type: 'text' as const, text: textContent }, + ], + metadata: message.metadata, + messageId: message.messageId, + files: undefined, + text: undefined, + }, + ...rest + ); }; return { diff --git a/tests/common/widgets/chat/options.tsx b/tests/common/widgets/chat/options.tsx index 5925a8e74c8..c8cacfa843a 100644 --- a/tests/common/widgets/chat/options.tsx +++ b/tests/common/widgets/chat/options.tsx @@ -169,7 +169,10 @@ export function createOptionsTests( searchClient, }, widgetParams: { - javascript: { ...createDefaultWidgetParams(chat), context: contextValue }, + javascript: { + ...createDefaultWidgetParams(chat), + context: contextValue, + }, react: { ...createDefaultWidgetParams(chat), context: contextValue }, vue: {}, }, @@ -214,7 +217,10 @@ export function createOptionsTests( searchClient, }, widgetParams: { - javascript: { ...createDefaultWidgetParams(chat), context: contextFn }, + javascript: { + ...createDefaultWidgetParams(chat), + context: contextFn, + }, react: { ...createDefaultWidgetParams(chat), context: contextFn }, vue: {}, }, @@ -265,7 +271,10 @@ export function createOptionsTests( searchClient, }, widgetParams: { - javascript: { ...createDefaultWidgetParams(chat), context: contextValue }, + javascript: { + ...createDefaultWidgetParams(chat), + context: contextValue, + }, react: { ...createDefaultWidgetParams(chat), context: contextValue }, vue: {}, }, From 2960b4b57f9d4c97ec95be49dc26b9f1ed755bf1 Mon Sep 17 00:00:00 2001 From: Shahmir Ejaz Date: Tue, 19 May 2026 11:44:52 +0100 Subject: [PATCH 08/14] chore: drop eslint + prettier, switch formatting to oxfmt Removes the editor-only ESLint config introduced earlier in this branch, deletes Prettier and all related plugins, and configures oxfmt as the single formatter. Prettier settings (singleQuote, proseWrap: never, trailingComma: es5) and ignore patterns were migrated to .oxfmtrc.json via `oxfmt --migrate=prettier`. The accompanying repo-wide reformat lands in the following commit. Co-Authored-By: Claude Opus 4.7 (1M context) --- .eslintignore | 56 --- .eslintrc.cjs | 40 -- .gitignore | 1 - .oxfmtrc.json | 50 ++ .oxlintrc.json | 7 +- .prettierignore | 68 --- .prettierrc | 5 - package.json | 10 +- packages/algoliasearch-helper/.eslintignore | 5 - packages/algoliasearch-helper/.prettierignore | 1 - .../create-instantsearch-app/.eslintrc.js | 8 - .../index.cjs | 52 --- .../package.json | 8 - scripts/lint/instantsearch-oxlint-plugin.mjs | 30 -- yarn.lock | 430 +++++++----------- 15 files changed, 212 insertions(+), 559 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.cjs create mode 100644 .oxfmtrc.json delete mode 100644 .prettierignore delete mode 100644 .prettierrc delete mode 100644 packages/algoliasearch-helper/.eslintignore delete mode 100644 packages/algoliasearch-helper/.prettierignore delete mode 100644 packages/create-instantsearch-app/.eslintrc.js delete mode 100644 scripts/eslint-plugin-instantsearch-editor/index.cjs delete mode 100644 scripts/eslint-plugin-instantsearch-editor/package.json diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 279bd64d527..00000000000 --- a/.eslintignore +++ /dev/null @@ -1,56 +0,0 @@ -# Vendors -node_modules -**/node_modules/** -.yarn -**/.yarn/** - -# Artifacts -dist -build -website -**/cjs -**/es -**/dist -**/vue2 -**/vue3 -coverage - -# Caches -.cache -.parcel-cache -.expo -.next - -# Non-lintable source files -## Symlinked packages in examples (already linted from their real location) -examples/js/e-commerce-umd/public/packages -## Polyfills for examples, retrieved from polyfill.io -examples/**/polyfills.js -## React-Native TypeScript wasn't supporting the mix of react 18 and 17 -examples/react/react-native -## Next.js examples have their own tsconfig and are type-checked during their build -examples/react/next -examples/react/next-routing -examples/react/next-app-router -## Excluded from global typescript config -**/next-env.d.ts -specs/src/env.d.ts -## templates that don't get installed -packages/create-instantsearch-app/src/templates -packages/create-instantsearch-app/src/templates/** -## test fixtures for codemods -packages/instantsearch-codemods/__testfixtures__ -packages/instantsearch-codemods/__testfixtures__/** -## legacy ESLint configs kept for reference/migration only -**/.eslintrc -**/.eslintrc.js -**/.eslintrc.cjs -**/eslint.config.js - -# Playwright artifacts and test files (Playwright has its own tsconfig) -**/playwright-report/** -**/test-results/** -tests/e2e/playwright/** - -## Rollup configs use import attributes syntax not yet supported by ESLint parser -**/rollup.config.mjs diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index 4ba6e7ae0d0..00000000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,40 +0,0 @@ -// Editor-only ESLint config for VS Code. Provides live `import/order` diagnostics -// until oxlint's jsPlugins ship LSP support. CLI authority is .oxlintrc.json. -module.exports = { - root: true, - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 2022, - sourceType: 'module', - ecmaFeatures: { jsx: true }, - }, - plugins: ['import', 'prettier', 'instantsearch-editor'], - settings: { - 'import/resolver': { - node: { extensions: ['.js', '.jsx', '.ts', '.tsx'] }, - }, - }, - rules: { - 'prettier/prettier': 'error', - 'instantsearch-editor/prefer-prettier-ignore-comment': 'error', - 'import/order': [ - 'error', - { - alphabetize: { caseInsensitive: true, order: 'asc' }, - groups: [ - 'builtin', - 'external', - 'parent', - 'sibling', - 'index', - 'type', - ], - 'newlines-between': 'always', - pathGroups: [ - { group: 'parent', pattern: '@/**/*', position: 'before' }, - ], - pathGroupsExcludedImportTypes: ['builtin'], - }, - ], - }, -}; diff --git a/.gitignore b/.gitignore index 0d2606644e0..21144ec8123 100644 --- a/.gitignore +++ b/.gitignore @@ -35,7 +35,6 @@ scripts/*/CHANGELOG.md .vscode/ # Caches -.eslintcache .parcel-cache .nuxt diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 00000000000..95183b4650c --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,50 @@ +{ + "singleQuote": true, + "proseWrap": "never", + "trailingComma": "es5", + "printWidth": 80, + "sortPackageJson": false, + "ignorePatterns": [ + "node_modules", + "**/node_modules/**", + ".yarn", + "**/.yarn/**", + "yarn.lock", + "dist", + "build", + "website", + "**/cjs", + "**/es", + "**/dist", + "**/vue2", + "**/vue3", + "coverage", + "**/CHANGELOG.md", + ".cache", + ".parcel-cache", + ".expo", + ".next", + "**/.nuxt", + "**/.nuxt/**", + "examples/js/e-commerce-umd/public/packages", + "examples/**/polyfills.js", + "examples/react/react-native", + "examples/react/next", + "examples/react/next-routing", + "examples/react/next-app-router", + "**/next-env.d.ts", + "specs/src/env.d.ts", + "packages/create-instantsearch-app/src/templates", + "packages/create-instantsearch-app/src/templates/**", + "packages/instantsearch-codemods/__testfixtures__", + "packages/instantsearch-codemods/__testfixtures__/**", + "**/playwright-report/**", + "**/test-results/**", + "tests/e2e/playwright/**", + "**/rollup.config.mjs", + "packages/algoliasearch-helper/documentation-src/partials/**/*.hbs", + "packages/instantsearch.css/components/**", + "packages/instantsearch.css/themes/**", + "specs/public/themes/**" + ] +} diff --git a/.oxlintrc.json b/.oxlintrc.json index 47fb37ac0f4..6f56c536d59 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -2,10 +2,6 @@ "$schema": "./node_modules/oxlint/configuration_schema.json", "ignorePatterns": [ ".yarn/**", - "**/.eslintrc", - "**/.eslintrc.js", - "**/.eslintrc.cjs", - "**/eslint.config.js", "packages/create-instantsearch-app/src/templates/**", "packages/instantsearch-codemods/__testfixtures__/**" ], @@ -152,8 +148,7 @@ "patterns": ["instantsearch.js/cjs/*"] } ], - "instantsearch/no-default-props-assignment": "error", - "instantsearch/prefer-prettier-ignore-comment": "error" + "instantsearch/no-default-props-assignment": "error" }, "overrides": [ { diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 601435affd0..00000000000 --- a/.prettierignore +++ /dev/null @@ -1,68 +0,0 @@ -# Vendors -node_modules -**/node_modules/** -.yarn -**/.yarn/** -yarn.lock - -# Artifacts -dist -build -website -**/cjs -**/es -**/dist -**/vue2 -**/vue3 -coverage -**/CHANGELOG.md - -# Caches -.cache -.parcel-cache -.expo -.next -**/.nuxt -**/.nuxt/** - -# Non-formattable source files -## Symlinked packages in examples (already formatted from their real location) -examples/js/e-commerce-umd/public/packages -## Polyfills for examples, retrieved from polyfill.io -examples/**/polyfills.js -## React-Native TypeScript wasn't supporting the mix of react 18 and 17 -examples/react/react-native -## Next.js examples have their own tsconfig and are type-checked during their build -examples/react/next -examples/react/next-routing -examples/react/next-app-router -## Excluded from global typescript config -**/next-env.d.ts -specs/src/env.d.ts -## templates that don't get installed -packages/create-instantsearch-app/src/templates -packages/create-instantsearch-app/src/templates/** -## test fixtures for codemods -packages/instantsearch-codemods/__testfixtures__ -packages/instantsearch-codemods/__testfixtures__/** -## legacy ESLint configs kept for reference/migration only -**/.eslintrc -**/.eslintrc.js -**/.eslintrc.cjs -**/eslint.config.js - -# Playwright artifacts and test files (Playwright has its own tsconfig) -**/playwright-report/** -**/test-results/** -tests/e2e/playwright/** - -## Rollup configs use import attributes syntax not yet supported by the parser -**/rollup.config.mjs - -## Handlebars partials aren't supported by Prettier -packages/algoliasearch-helper/documentation-src/partials/**/*.hbs - -## Generated CSS output from instantsearch.css SCSS build -packages/instantsearch.css/components/** -packages/instantsearch.css/themes/** -specs/public/themes/** diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 833f03b6214..00000000000 --- a/.prettierrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "singleQuote": true, - "proseWrap": "never", - "trailingComma": "es5" -} diff --git a/package.json b/package.json index dd588d9dd7f..a59f0223c7b 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,8 @@ "doctoc": "doctoc --no-title --maxlevel 3 README.md CONTRIBUTING.md packages/*/README.md packages/create-instantsearch-app/docs", "website:storybook": "lerna run storybook:build", "website:examples": "lerna run website:examples", - "format": "prettier --write .", - "format:check": "prettier --check .", + "format": "oxfmt .", + "format:check": "oxfmt --check .", "lint": "node ./scripts/lint/run-lint.cjs", "lint:changed": "node ./scripts/lint/run-oxlint.cjs --changed", "lint:fix": "node ./scripts/lint/run-oxlint.cjs --fix", @@ -83,7 +83,6 @@ "@types/react-test-renderer": "19.0.0", "@types/storybook__addon-actions": "3.4.2", "@types/storybook__addon-knobs": "^5.0.0", - "@typescript-eslint/parser": "4.31.2", "@vue/vue2-jest": "27", "@vue/vue3-jest": "27", "@wdio/cli": "5.16.9", @@ -101,9 +100,6 @@ "bundlesize": "0.18.0", "doctoc": "1.4.0", "enzyme": "3.11.0", - "eslint": "6.8.0", - "eslint-plugin-import": "2.24.2", - "eslint-plugin-prettier": "3.4.0", "jest": "27.4.7", "jest-diff": "27.4.6", "jest-environment-jsdom": "27.1.0", @@ -114,7 +110,6 @@ "lerna": "6.0.3", "patch-package": "6.2.2", "places.js": "1.17.1", - "prettier": "^2.4.1", "prop-types": "15.6.2", "react": "19.0.0", "react-dom": "19.0.0", @@ -128,6 +123,7 @@ "typescript": "5.5.2" }, "optionalDependencies": { + "oxfmt": "0.51.0", "oxlint": "1.55.0", "oxlint-tsgolint": "0.17.0" }, diff --git a/packages/algoliasearch-helper/.eslintignore b/packages/algoliasearch-helper/.eslintignore deleted file mode 100644 index 07a978bfe71..00000000000 --- a/packages/algoliasearch-helper/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -dist/ -documentation-src/ -documentation/ -scripts/rollup.esm.config.js -*.ts diff --git a/packages/algoliasearch-helper/.prettierignore b/packages/algoliasearch-helper/.prettierignore deleted file mode 100644 index 79454359ee1..00000000000 --- a/packages/algoliasearch-helper/.prettierignore +++ /dev/null @@ -1 +0,0 @@ -documentation-src/partials diff --git a/packages/create-instantsearch-app/.eslintrc.js b/packages/create-instantsearch-app/.eslintrc.js deleted file mode 100644 index bfd3a913d9c..00000000000 --- a/packages/create-instantsearch-app/.eslintrc.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - extends: ['algolia', 'algolia/jest'], - rules: { - 'import/no-commonjs': 'off', - 'no-console': 'off', - 'no-process-exit': 'off', - }, -}; diff --git a/scripts/eslint-plugin-instantsearch-editor/index.cjs b/scripts/eslint-plugin-instantsearch-editor/index.cjs deleted file mode 100644 index c3e4894ae51..00000000000 --- a/scripts/eslint-plugin-instantsearch-editor/index.cjs +++ /dev/null @@ -1,52 +0,0 @@ -module.exports = { - rules: { - 'prefer-prettier-ignore-comment': { - meta: { - type: 'problem', - fixable: 'code', - docs: { - description: - 'Use `// prettier-ignore` instead of `eslint-disable prettier/prettier`.', - }, - schema: [], - messages: { - forbidden: - "`eslint-disable prettier/prettier` only silences the editor rule; CI's standalone `prettier --check` does not honor it. Use `// prettier-ignore` on the line above instead.", - }, - }, - create(context) { - const triggerPattern = /eslint-disable[^\n]*\bprettier\/prettier\b/; - // Auto-fix only when `prettier/prettier` is the sole rule in an - // `eslint-disable-next-line` directive. Compound or block-scope - // disables carry extra semantics; leave those to manual fixes. - const soleNextLinePattern = - /^\s*eslint-disable-next-line\s+prettier\/prettier\s*$/; - const source = context.getSourceCode(); - - return { - Program() { - for (const comment of source.getAllComments()) { - if (!triggerPattern.test(comment.value)) continue; - - const canFix = soleNextLinePattern.test(comment.value); - - context.report({ - node: comment, - messageId: 'forbidden', - fix: canFix - ? (fixer) => { - const replacement = - comment.type === 'Block' - ? '/* prettier-ignore */' - : '// prettier-ignore'; - return fixer.replaceTextRange(comment.range, replacement); - } - : null, - }); - } - }, - }; - }, - }, - }, -}; diff --git a/scripts/eslint-plugin-instantsearch-editor/package.json b/scripts/eslint-plugin-instantsearch-editor/package.json deleted file mode 100644 index 95c311ef410..00000000000 --- a/scripts/eslint-plugin-instantsearch-editor/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "eslint-plugin-instantsearch-editor", - "version": "0.0.0", - "private": true, - "description": "Editor-only ESLint rules that mirror .oxlintrc.json's custom rules so VS Code gets live diagnostics for them.", - "main": "index.cjs", - "license": "MIT" -} diff --git a/scripts/lint/instantsearch-oxlint-plugin.mjs b/scripts/lint/instantsearch-oxlint-plugin.mjs index bb6f3ed8917..35ddbacacaa 100644 --- a/scripts/lint/instantsearch-oxlint-plugin.mjs +++ b/scripts/lint/instantsearch-oxlint-plugin.mjs @@ -156,36 +156,6 @@ const plugin = { }; }, }, - 'prefer-prettier-ignore-comment': { - meta: { - docs: { - description: - 'Disallow disabling the `prettier/prettier` rule via `eslint-disable`; use the native `// prettier-ignore` directive instead.', - }, - messages: { - forbidden: - "`eslint-disable prettier/prettier` only silences the editor rule; CI's standalone `prettier --check` does not honor it. Use `// prettier-ignore` on the line above instead.", - }, - schema: [], - type: 'problem', - }, - create(context) { - const pattern = /eslint-disable[^\n]*\bprettier\/prettier\b/; - - return { - Program() { - for (const comment of context.sourceCode.getAllComments()) { - if (pattern.test(comment.value)) { - context.report({ - messageId: 'forbidden', - node: comment, - }); - } - } - }, - }; - }, - }, 'no-default-props-assignment': { meta: { docs: { diff --git a/yarn.lock b/yarn.lock index 136dcdf6ee3..d8133eec16a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5254,6 +5254,101 @@ dependencies: "@octokit/openapi-types" "^14.0.0" +"@oxfmt/binding-android-arm-eabi@0.51.0": + version "0.51.0" + resolved "https://registry.yarnpkg.com/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.51.0.tgz#aa1b9ef3c637deff8d068f407c5025557a140327" + integrity sha512-Ni0sCqg5CIHaLIYFGj+ncbcumylvNC6FE4rfD0KfdmnWHbPJ+zev0qZCXKxy2hFVa0fYRK0yPzf5nzPbkZou7g== + +"@oxfmt/binding-android-arm64@0.51.0": + version "0.51.0" + resolved "https://registry.yarnpkg.com/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.51.0.tgz#608bc9ec7c1b715b1a17ee2081fc86b6eced0a2b" + integrity sha512-eu5lAZjuo0KAkp+M24EhDqfOwA8owQ8d7wyBlOUUGRbDLHpU3IRlDHp8Dif+YqGlxs6jra7yS6WQu/NkPhAxeg== + +"@oxfmt/binding-darwin-arm64@0.51.0": + version "0.51.0" + resolved "https://registry.yarnpkg.com/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.51.0.tgz#86051323e7d879e780baed2d0e7ee892a766c131" + integrity sha512-6LsUNIdURhhcIfIn8+xsOb61mSTa9msAHTeSGx9Jf4rsP/gN8PGCF+SKWPAQZbND2w/WBkqQ6303jqEEIXzMdQ== + +"@oxfmt/binding-darwin-x64@0.51.0": + version "0.51.0" + resolved "https://registry.yarnpkg.com/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.51.0.tgz#56be4aac362bd6e18eec8ae6e327c94ab6849a91" + integrity sha512-9aUMGmVxdHjYMsEAW1tNRoieTJXlVNDFkRvIR1J7LttJXWjVYCu2ekclLij2KJtxBxSQOYSHd12ME/adVGVbZg== + +"@oxfmt/binding-freebsd-x64@0.51.0": + version "0.51.0" + resolved "https://registry.yarnpkg.com/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.51.0.tgz#bc980f22a7e2fa1a176c2d222bb2857dc22aa00c" + integrity sha512-mkY1nhZTqYb+NHaAWxOCKISN6FwdrwMNsu17vTUA3wzUV2VJ+Paq15ZokRcsMU/2PUdHO73prxyeJpjXQ3MPpQ== + +"@oxfmt/binding-linux-arm-gnueabihf@0.51.0": + version "0.51.0" + resolved "https://registry.yarnpkg.com/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.51.0.tgz#de06f649a6407063a6459a7486991f0b64c12936" + integrity sha512-wtFwNwE4+YCNuPaWoGDZeGsKvD6D1YSUNBJNn/rJBh7CrDBThFE+TBI5kY7vRW9rIOQRsbW2IpyyL3Du4Zqwiw== + +"@oxfmt/binding-linux-arm-musleabihf@0.51.0": + version "0.51.0" + resolved "https://registry.yarnpkg.com/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.51.0.tgz#b663b0d55e00098618b2b09e7f884080e90c1d1e" + integrity sha512-rnOaNx86G7iRKM6lsCIQMux0SMGNC/TEbFR+r7lpruJ12bnrIWgxd5w1PLqOvgR9r8ZJbpK/zfRKctJnh8/Jfg== + +"@oxfmt/binding-linux-arm64-gnu@0.51.0": + version "0.51.0" + resolved "https://registry.yarnpkg.com/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.51.0.tgz#e03c66a41d1767319f8bcc9801c8c37ad8f00d1c" + integrity sha512-jOgDzSqWcICGRjsp4mc08FxKMN8vzP2Kgs4E0d2HUP99F+nJDQKklRV4Zuj+0gcBgjrzx2CbpqaIdUVPepCojA== + +"@oxfmt/binding-linux-arm64-musl@0.51.0": + version "0.51.0" + resolved "https://registry.yarnpkg.com/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.51.0.tgz#1c8b05a590ceb4706aa233cacc3058605f6a4a1f" + integrity sha512-KBUCdrH5bwVrAvI9gU/1S55oH6fzXjr++J/oVocdu7bYTks1l7DNNT+rLd/1TDdAEjObGwmfWamn7LC1m8A0DQ== + +"@oxfmt/binding-linux-ppc64-gnu@0.51.0": + version "0.51.0" + resolved "https://registry.yarnpkg.com/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.51.0.tgz#3f96b0b6dfb4fd5fc8085ca415b6d7f625f15179" + integrity sha512-NapfjYsABFqTJ1Dn9Efq6sN5esaHconVKwVLbDGNQLrwpOx/g17mkwErHzU72PutL67nf3wNAkbq122H+zLxag== + +"@oxfmt/binding-linux-riscv64-gnu@0.51.0": + version "0.51.0" + resolved "https://registry.yarnpkg.com/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.51.0.tgz#1a8ac28e46c9bec9ea3e83608b9fc1f4e5e91d99" + integrity sha512-5dlDt1dUZCVi6elIhiK1PWg9wpTzTcIuj0IZnSurvIoMrhOWqqTcc1dSTxcSkNaBZhfsNqRZdINI1zAgbKkJNQ== + +"@oxfmt/binding-linux-riscv64-musl@0.51.0": + version "0.51.0" + resolved "https://registry.yarnpkg.com/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.51.0.tgz#d87cf83be567a24ee5cf66c88a630aaf5daa4d7f" + integrity sha512-pgdWUJn0S5nulyiVdlFV8DzCUnGXkU99W5PSkkmbaZW+LrZBPxpezun4G0DDHbQaVYuJeCuKsXsGKGo77CkUTQ== + +"@oxfmt/binding-linux-s390x-gnu@0.51.0": + version "0.51.0" + resolved "https://registry.yarnpkg.com/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.51.0.tgz#2c56624067b7a55443f9fbbbbf7c3947856acbd5" + integrity sha512-2XTFUe97CbDGAI8vjwDfZ1HdakO0XIADyJ24idEg64SC4/K4in/OisXVnrW4NMK7I6TgC7EqRhC0Ln/nKhAemA== + +"@oxfmt/binding-linux-x64-gnu@0.51.0": + version "0.51.0" + resolved "https://registry.yarnpkg.com/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.51.0.tgz#a5208625ff9000a47e5d1b1e32ff8442f7e81ffd" + integrity sha512-kQ1OuCqqt/yyf0ZN9VFxW1/JnlgJgii3Dr7pWf9vNBvrX1hv6g39/+mc5oGRHRGJFZtl3zsGDWR9c5N2B/gwBw== + +"@oxfmt/binding-linux-x64-musl@0.51.0": + version "0.51.0" + resolved "https://registry.yarnpkg.com/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.51.0.tgz#52e2f148abb8114d879b141f23c48685c25873e1" + integrity sha512-ARTYqxHF475o96Gbn41hvSWSSRygPlRDXZZgZ9I2scU1y0qiWpCQyZCoefaQa0mwv+wwtZ+luS4YOzsRzM/izg== + +"@oxfmt/binding-openharmony-arm64@0.51.0": + version "0.51.0" + resolved "https://registry.yarnpkg.com/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.51.0.tgz#deca8a3a3cc4df3e797ce8ed46b8dfd04b432e63" + integrity sha512-QiC1XrCl6a6BmqMzduO8hdIRMf1m44hCkt2Q68KWkTvUB/E7fd2iomyNh6KnnRca5w6eBrRAAtLFqTh+xjsjJA== + +"@oxfmt/binding-win32-arm64-msvc@0.51.0": + version "0.51.0" + resolved "https://registry.yarnpkg.com/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.51.0.tgz#87bf318e600b5c922e88bd0c96a521d1e4e0bd0d" + integrity sha512-NC/hJb9dtU23Zf8L7IVK95xnFjiQ7AfcLO2l5pb69TDEr958qxrtnB2CveeeNSCBFNIkgaTCfd/vHNSoG78l9g== + +"@oxfmt/binding-win32-ia32-msvc@0.51.0": + version "0.51.0" + resolved "https://registry.yarnpkg.com/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.51.0.tgz#f1bf8ab8cc5ea6a551f8be87f7e06966bbe137c3" + integrity sha512-2C45za4Rj36n8YIbhRL1PQbxmXJYf81WEcAgvj5I4ptRROG+A+81hREEN5bmCHADE1UfYaN312U6tkILoZZy6w== + +"@oxfmt/binding-win32-x64-msvc@0.51.0": + version "0.51.0" + resolved "https://registry.yarnpkg.com/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.51.0.tgz#396678bccf40060a685cbfe8fa1061cb66a1b5d6" + integrity sha512-73RqdAuVKQTkjZIDw08JaDHUM4lav5Qu+CaPwg4QbbA7k8o7LEW0p3UsfZ/F8dsO/pwVYh3RzFcanwLRTTahbQ== + "@oxlint-tsgolint/darwin-arm64@0.17.0": version "0.17.0" resolved "https://registry.yarnpkg.com/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-0.17.0.tgz#fa642aed18d84f3f6b994f1d0be6d6ae3120b6b4" @@ -7367,16 +7462,6 @@ natural-compare "^1.4.0" ts-api-utils "^2.1.0" -"@typescript-eslint/parser@4.31.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.31.2.tgz#54aa75986e3302d91eff2bbbaa6ecfa8084e9c34" - integrity sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw== - dependencies: - "@typescript-eslint/scope-manager" "4.31.2" - "@typescript-eslint/types" "4.31.2" - "@typescript-eslint/typescript-estree" "4.31.2" - debug "^4.3.1" - "@typescript-eslint/parser@8.46.2": version "8.46.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.46.2.tgz#dd938d45d581ac8ffa9d8a418a50282b306f7ebf" @@ -7397,14 +7482,6 @@ "@typescript-eslint/types" "^8.46.2" debug "^4.3.4" -"@typescript-eslint/scope-manager@4.31.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz#1d528cb3ed3bcd88019c20a57c18b897b073923a" - integrity sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w== - dependencies: - "@typescript-eslint/types" "4.31.2" - "@typescript-eslint/visitor-keys" "4.31.2" - "@typescript-eslint/scope-manager@8.46.2": version "8.46.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz#7d37df2493c404450589acb3b5d0c69cc0670a88" @@ -7429,29 +7506,11 @@ debug "^4.3.4" ts-api-utils "^2.1.0" -"@typescript-eslint/types@4.31.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.31.2.tgz#2aea7177d6d744521a168ed4668eddbd912dfadf" - integrity sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w== - "@typescript-eslint/types@8.46.2", "@typescript-eslint/types@^8.46.2": version "8.46.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.46.2.tgz#2bad7348511b31e6e42579820e62b73145635763" integrity sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ== -"@typescript-eslint/typescript-estree@4.31.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz#abfd50594d8056b37e7428df3b2d185ef2d0060c" - integrity sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA== - dependencies: - "@typescript-eslint/types" "4.31.2" - "@typescript-eslint/visitor-keys" "4.31.2" - debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" - semver "^7.3.5" - tsutils "^3.21.0" - "@typescript-eslint/typescript-estree@8.46.2": version "8.46.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz#ab547a27e4222bb6a3281cb7e98705272e2c7d08" @@ -7478,14 +7537,6 @@ "@typescript-eslint/types" "8.46.2" "@typescript-eslint/typescript-estree" "8.46.2" -"@typescript-eslint/visitor-keys@4.31.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz#7d5b4a4705db7fe59ecffb273c1d082760f635cc" - integrity sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug== - dependencies: - "@typescript-eslint/types" "4.31.2" - eslint-visitor-keys "^2.0.0" - "@typescript-eslint/visitor-keys@8.46.2": version "8.46.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz#803fa298948c39acf810af21bdce6f8babfa9738" @@ -8390,7 +8441,7 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-jsx@^5.2.0, acorn-jsx@^5.3.2: +acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== @@ -8585,16 +8636,6 @@ ajv@^6.0.1, ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@ json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.10.0: - version "6.14.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.14.0.tgz#fd067713e228210636ebb08c60bd3765d6dbe73a" - integrity sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ajv@^8.0.0, ajv@^8.0.1, ajv@^8.9.0: version "8.17.1" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" @@ -9040,7 +9081,7 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= -array-includes@^3.0.3, array-includes@^3.1.3, array-includes@^3.1.6, array-includes@^3.1.8, array-includes@^3.1.9: +array-includes@^3.0.3, array-includes@^3.1.6, array-includes@^3.1.8, array-includes@^3.1.9: version "3.1.9" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.9.tgz#1f0ccaa08e90cdbc3eb433210f903ad0f17c3f3a" integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== @@ -9127,7 +9168,7 @@ array.prototype.findlastindex@^1.2.6: es-object-atoms "^1.1.1" es-shim-unscopables "^1.1.0" -array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.3, array.prototype.flat@^1.2.4, array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.3: +array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.3, array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== @@ -13027,7 +13068,7 @@ debug@2, debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, de dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.6, debug@^4.4.0, debug@^4.4.3: +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.6, debug@^4.4.0, debug@^4.4.3: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== @@ -13545,13 +13586,6 @@ doctrine@^2.1.0: dependencies: esutils "^2.0.2" -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - doctypes@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" @@ -14496,34 +14530,13 @@ eslint-import-resolver-typescript@^3.5.2: tinyglobby "^0.2.13" unrs-resolver "^1.6.2" -eslint-module-utils@^2.12.1, eslint-module-utils@^2.6.2: +eslint-module-utils@^2.12.1: version "2.12.1" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz#f76d3220bfb83c057651359295ab5854eaad75ff" integrity sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw== dependencies: debug "^3.2.7" -eslint-plugin-import@2.24.2: - version "2.24.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz#2c8cd2e341f3885918ee27d18479910ade7bb4da" - integrity sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q== - dependencies: - array-includes "^3.1.3" - array.prototype.flat "^1.2.4" - debug "^2.6.9" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.6.2" - find-up "^2.0.0" - has "^1.0.3" - is-core-module "^2.6.0" - minimatch "^3.0.4" - object.values "^1.1.4" - pkg-up "^2.0.0" - read-pkg-up "^3.0.0" - resolve "^1.20.0" - tsconfig-paths "^3.11.0" - eslint-plugin-import@^2.32.0: version "2.32.0" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz#602b55faa6e4caeaa5e970c198b5c00a37708980" @@ -14570,13 +14583,6 @@ eslint-plugin-jsx-a11y@^6.10.0: safe-regex-test "^1.0.3" string.prototype.includes "^2.0.1" -eslint-plugin-prettier@3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz#cdbad3bf1dbd2b177e9825737fe63b476a08f0c7" - integrity sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw== - dependencies: - prettier-linter-helpers "^1.0.0" - eslint-plugin-react-hooks@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz#66e258db58ece50723ef20cc159f8aa908219169" @@ -14620,14 +14626,6 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - eslint-scope@^8.4.0: version "8.4.0" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" @@ -14636,23 +14634,6 @@ eslint-scope@^8.4.0: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" @@ -14663,49 +14644,6 @@ eslint-visitor-keys@^4.2.1: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== -eslint@6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^7.0.0" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.3" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - eslint@^9.0.0: version "9.39.1" resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.1.tgz#be8bf7c6de77dcc4252b5a8dcb31c2efff74a6e5" @@ -14760,15 +14698,6 @@ espree@^10.0.1, espree@^10.4.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^4.2.1" -espree@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== - dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" - esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -15524,13 +15453,6 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -15770,15 +15692,6 @@ find-yarn-workspace-root@~2.0.0: dependencies: micromatch "^4.0.2" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -15805,11 +15718,6 @@ flatstr@^1.0.4: resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931" integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - flatted@^3.1.0, flatted@^3.2.9: version "3.3.3" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" @@ -16181,11 +16089,6 @@ function.prototype.name@^1.1.0, function.prototype.name@^1.1.2, function.prototy hasown "^2.0.2" is-callable "^1.2.7" -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" @@ -16485,7 +16388,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -16613,13 +16516,6 @@ globals@16.4.0: resolved "https://registry.yarnpkg.com/globals/-/globals-16.4.0.tgz#574bc7e72993d40cf27cf6c241f324ee77808e51" integrity sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw== -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== - dependencies: - type-fest "^0.8.1" - globals@^14.0.0: version "14.0.0" resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" @@ -16672,7 +16568,7 @@ globby@^10.0.1: merge2 "^1.2.3" slash "^3.0.0" -globby@^11.0.1, globby@^11.0.2, globby@^11.0.3, globby@^11.0.4, globby@^11.1.0: +globby@^11.0.1, globby@^11.0.2, globby@^11.0.4, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -17766,7 +17662,7 @@ ignore@^3.3.5: resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== -ignore@^4.0.3, ignore@^4.0.6: +ignore@^4.0.3: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== @@ -17828,14 +17724,6 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.0.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" - integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -18276,7 +18164,7 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.1.0, is-core-module@^2.13.0, is-core-module@^2.16.1, is-core-module@^2.5.0, is-core-module@^2.6.0, is-core-module@^2.8.1: +is-core-module@^2.1.0, is-core-module@^2.13.0, is-core-module@^2.16.1, is-core-module@^2.5.0, is-core-module@^2.8.1: version "2.16.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== @@ -20323,14 +20211,6 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -20339,6 +20219,14 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + libnpmaccess@^6.0.3: version "6.0.4" resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-6.0.4.tgz#2dd158bd8a071817e2207d3b201d37cf1ad6ae6b" @@ -23394,7 +23282,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.4, object.values@^1.1.6, object.values@^1.2.1: +object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.6, object.values@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== @@ -23527,7 +23415,7 @@ optimize-css-assets-webpack-plugin@^6.0.1: last-call-webpack-plugin "^3.0.0" postcss "^8.2.1" -optionator@^0.8.1, optionator@^0.8.3: +optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -23652,6 +23540,33 @@ own-keys@^1.0.1: object-keys "^1.1.1" safe-push-apply "^1.0.0" +oxfmt@0.51.0: + version "0.51.0" + resolved "https://registry.yarnpkg.com/oxfmt/-/oxfmt-0.51.0.tgz#8e2919e8fb9632abcecc5b65bb20f4829f6fc4c8" + integrity sha512-l/AoAnaEOV7Q5/Z9kHOMDehVJnCgYN7wRoooWCTUMBMi16BJhLZqd9cmCnwcVFfVlzkt53zK2KLPFNp8vSsoDg== + dependencies: + tinypool "2.1.0" + optionalDependencies: + "@oxfmt/binding-android-arm-eabi" "0.51.0" + "@oxfmt/binding-android-arm64" "0.51.0" + "@oxfmt/binding-darwin-arm64" "0.51.0" + "@oxfmt/binding-darwin-x64" "0.51.0" + "@oxfmt/binding-freebsd-x64" "0.51.0" + "@oxfmt/binding-linux-arm-gnueabihf" "0.51.0" + "@oxfmt/binding-linux-arm-musleabihf" "0.51.0" + "@oxfmt/binding-linux-arm64-gnu" "0.51.0" + "@oxfmt/binding-linux-arm64-musl" "0.51.0" + "@oxfmt/binding-linux-ppc64-gnu" "0.51.0" + "@oxfmt/binding-linux-riscv64-gnu" "0.51.0" + "@oxfmt/binding-linux-riscv64-musl" "0.51.0" + "@oxfmt/binding-linux-s390x-gnu" "0.51.0" + "@oxfmt/binding-linux-x64-gnu" "0.51.0" + "@oxfmt/binding-linux-x64-musl" "0.51.0" + "@oxfmt/binding-openharmony-arm64" "0.51.0" + "@oxfmt/binding-win32-arm64-msvc" "0.51.0" + "@oxfmt/binding-win32-ia32-msvc" "0.51.0" + "@oxfmt/binding-win32-x64-msvc" "0.51.0" + oxlint-tsgolint@0.17.0: version "0.17.0" resolved "https://registry.yarnpkg.com/oxlint-tsgolint/-/oxlint-tsgolint-0.17.0.tgz#a6e7d05774ced2ef5620220cdb0769427c348004" @@ -25946,7 +25861,7 @@ progress-stream@^2.0.0: speedometer "~1.0.0" through2 "~2.0.3" -progress@2.0.3, progress@^2.0.0, progress@^2.0.3: +progress@2.0.3, progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -27178,11 +27093,6 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.5.3, regexp.prototype.f gopd "^1.2.0" set-function-name "^2.0.2" -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - regexpu-core@^6.3.1: version "6.4.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.4.0.tgz#3580ce0c4faedef599eccb146612436b62a176e5" @@ -27748,13 +27658,6 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2.6.3, rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -27781,6 +27684,13 @@ rimraf@~2.4.0: dependencies: glob "^6.0.1" +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" @@ -28824,7 +28734,7 @@ slice-ansi@1.0.0: dependencies: is-fullwidth-code-point "^2.0.0" -slice-ansi@^2.0.0, slice-ansi@^2.1.0: +slice-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== @@ -29765,7 +29675,7 @@ strip-json-comments@^2.0.0, strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -strip-json-comments@^3.0.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1, strip-json-comments@~3.1.1: +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1, strip-json-comments@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -30170,16 +30080,6 @@ table@^4.0.3: slice-ansi "1.0.0" string-width "^2.1.1" -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - table@^6.8.1: version "6.8.1" resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" @@ -30638,6 +30538,11 @@ tinyglobby@^0.2.13: fdir "^6.5.0" picomatch "^4.0.3" +tinypool@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-2.1.0.tgz#303a671d6ef68d03c9512cdc9a47c86b8a85f20c" + integrity sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw== + title-case@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" @@ -30929,7 +30834,7 @@ tsconfck@^3.0.0: resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-3.0.0.tgz#b469f1ced12973bbec3209a55ed8de3bb04223c9" integrity sha512-w3wnsIrJNi7avf4Zb0VjOoodoO0woEqGgZGQm+LHH9przdUI+XDKsWAXwxHA1DaRTjeuZNcregSzr7RaA8zG9A== -tsconfig-paths@^3.11.0, tsconfig-paths@^3.15.0, tsconfig-paths@^3.9.0: +tsconfig-paths@^3.15.0, tsconfig-paths@^3.9.0: version "3.15.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== @@ -30949,7 +30854,7 @@ tsconfig@^7.0.0: strip-bom "^3.0.0" strip-json-comments "^2.0.0" -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.10.0, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -30959,13 +30864,6 @@ tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3 resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -31852,11 +31750,6 @@ v8-compile-cache@2.3.0, v8-compile-cache@^2.3.0: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -v8-compile-cache@^2.0.3: - version "2.4.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz#cdada8bec61e15865f05d097c5f4fd30e94dc128" - integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw== - v8-to-istanbul@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz#0aeb763894f1a0a1676adf8a8b7612a38902446c" @@ -33099,13 +32992,6 @@ write-pkg@^4.0.0: type-fest "^0.4.1" write-json-file "^3.2.0" -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - ws@^1.1.0, ws@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51" From 3e2abd41c28a6dec768ac7a2c3b531300d8bc62e Mon Sep 17 00:00:00 2001 From: Shahmir Ejaz Date: Tue, 19 May 2026 11:46:32 +0100 Subject: [PATCH 09/14] chore: reformat repo with oxfmt Mechanical reformat produced by running `yarn format` (`oxfmt .`) with the migrated Prettier settings in .oxfmtrc.json. No semantic code changes; SHA recorded in .git-blame-ignore-revs in a follow-up commit. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/prompts/docs-automation.md | 4 - examples/js/algolia-experiences/index.html | 15 +++- examples/js/algolia-experiences/local.html | 15 +++- examples/js/algolia-experiences/toggle.html | 15 +++- examples/js/calendar-widget/main.css | 16 +++- examples/js/default-theme/index.html | 2 +- examples/js/default-theme/src/app.css | 5 +- examples/js/default-theme/src/tabs.css | 6 +- examples/js/e-commerce-umd/index.html | 2 +- examples/js/e-commerce-umd/src/app.css | 17 +++- examples/js/e-commerce-umd/src/app.mobile.css | 3 +- examples/js/e-commerce-umd/src/theme.css | 6 +- examples/js/e-commerce/index.html | 2 +- examples/js/e-commerce/src/app.css | 17 +++- examples/js/e-commerce/src/app.mobile.css | 3 +- examples/js/e-commerce/src/theme.css | 6 +- examples/js/getting-started/index.html | 2 +- examples/js/getting-started/products.html | 2 +- examples/js/getting-started/src/app.css | 4 +- examples/js/getting-started/src/index.css | 5 +- examples/js/media/index.html | 2 +- examples/js/media/src/app.css | 13 ++- examples/js/query-suggestions/index.html | 2 +- examples/js/query-suggestions/products.html | 2 +- examples/js/query-suggestions/src/app.css | 7 +- examples/js/query-suggestions/src/index.css | 5 +- examples/js/showcase/index.html | 2 +- examples/js/tourism/index.html | 2 +- examples/react/default-theme/index.html | 2 +- examples/react/default-theme/src/App.css | 5 +- .../src/components/layout/Tabs.css | 6 +- .../default-theme/src/isModifierClick.ts | 8 +- examples/react/e-commerce/App.css | 17 +++- examples/react/e-commerce/App.mobile.css | 3 +- examples/react/e-commerce/Theme.css | 6 +- .../e-commerce/components/PriceSlider.css | 3 +- examples/react/e-commerce/index.html | 2 +- examples/react/getting-started/index.html | 2 +- examples/react/getting-started/products.html | 2 +- examples/react/getting-started/src/App.css | 9 +- examples/react/query-suggestions/index.html | 2 +- .../react/query-suggestions/products.html | 2 +- examples/react/query-suggestions/src/App.css | 12 ++- examples/vue/default-theme/index.html | 2 +- examples/vue/default-theme/src/App.css | 5 +- examples/vue/e-commerce/index.html | 2 +- examples/vue/e-commerce/src/App.css | 17 +++- examples/vue/e-commerce/src/App.mobile.css | 3 +- examples/vue/e-commerce/src/Theme.css | 6 +- .../e-commerce/src/widgets/PriceSlider.css | 3 +- examples/vue/getting-started/index.html | 2 +- examples/vue/getting-started/src/App.vue | 5 +- examples/vue/media/index.html | 2 +- examples/vue/media/src/App.css | 5 +- examples/vue/nuxt/layouts/default.vue | 3 +- examples/vue/ssr/public/index.html | 2 +- examples/vue/ssr/src/main.js | 4 +- netlify.toml | 6 +- packages/algolia-experiences/src/render.tsx | 20 +++-- packages/algolia-experiences/src/types.ts | 12 +-- .../stylesheets/components/_buttons.scss | 8 +- .../components/_examples-intro.scss | 10 ++- .../stylesheets/components/_fonts.scss | 6 +- .../stylesheets/components/_footer.scss | 4 +- .../stylesheets/vendors/_base.scss | 12 ++- .../stylesheets/vendors/_communityHeader.scss | 4 +- .../stylesheets/vendors/_mixins.scss | 6 +- .../stylesheets/vendors/_variables.scss | 8 +- packages/algoliasearch-helper/index.d.ts | 4 +- .../src/SearchParameters/RefinementList.js | 3 +- .../src/SearchParameters/index.js | 51 ++++++------ .../src/SearchResults/index.js | 82 ++++++++++--------- .../src/utils/sortAndMergeRecommendations.js | 3 +- .../test/spec/algoliasearch.helper/clears.js | 22 ++--- .../types/algoliasearch.d.ts | 69 ++++++++-------- .../src/components/Carousel.tsx | 2 +- .../src/components/FilterSuggestions.tsx | 2 +- .../components/FrequentlyBoughtTogether.tsx | 2 +- .../src/components/LookingSimilar.tsx | 2 +- .../src/components/RelatedProducts.tsx | 2 +- .../src/components/TrendingItems.tsx | 2 +- .../autocomplete/AutocompleteIndex.tsx | 2 +- .../AutocompletePromptSuggestion.tsx | 2 +- .../autocomplete/AutocompleteRecentSearch.tsx | 2 +- .../autocomplete/AutocompleteSuggestion.tsx | 2 +- .../src/components/chat/ChatMessages.tsx | 6 +- .../src/components/chat/types.ts | 30 ++----- .../src/lib/utils/promptSuggestions.ts | 4 +- .../src/types/Recommend.ts | 6 +- packages/instantsearch.css/devtools/index.js | 4 +- .../src/components/autocomplete.scss | 13 +-- .../src/components/button.scss | 3 +- .../src/components/chat/_chat-messages.scss | 7 +- .../components/chat/_chat-overlay-layout.scss | 7 +- .../src/components/chat/_chat-prompt.scss | 3 +- .../chat/_chat-sidepanel-layout.scss | 7 +- .../components/chat/_chat-toggle-button.scss | 3 +- .../src/shared/_variables.scss | 9 +- .../src/themes/satellite.scss | 45 +++++++--- .../src/widgets/_hierarchical-menu.scss | 3 +- .../instantsearch.css/src/widgets/_hits.scss | 3 +- .../instantsearch.css/src/widgets/_menu.scss | 3 +- .../src/widgets/_numeric-menu.scss | 6 +- .../src/widgets/_rating-menu.scss | 3 +- .../src/widgets/_refinement-list.scss | 3 +- .../src/widgets/_searchbox.scss | 6 +- .../.storybook/static/storybook.css | 15 ++-- packages/instantsearch.js/README.md | 9 +- .../RefinementList/RefinementList.tsx | 4 +- .../__tests__/connectAutocomplete-test.ts | 5 +- .../__tests__/connectClearRefinements-test.ts | 5 +- .../connectFrequentlyBoughtTogether.ts | 10 +-- .../connectors/geo-search/connectGeoSearch.ts | 2 +- .../infinite-hits/connectInfiniteHits.ts | 10 +-- .../looking-similar/connectLookingSimilar.ts | 10 +-- .../connectRelatedProducts.ts | 10 +-- .../trending-facets/connectTrendingFacets.ts | 2 +- .../trending-items/connectTrendingItems.ts | 8 +- .../instantsearch.js/src/lib/InstantSearch.ts | 4 +- .../src/lib/ai-lite/abstract-chat.ts | 2 +- .../src/lib/ai-lite/transport.ts | 8 +- .../instantsearch.js/src/lib/ai-lite/types.ts | 34 +++----- .../instantsearch.js/src/lib/chat/chat.ts | 8 +- .../src/lib/stateMappings/simple.ts | 2 +- .../src/lib/stateMappings/singleIndex.ts | 2 +- .../instantsearch.js/src/lib/utils/omit.ts | 21 +++-- .../middlewares/createInsightsMiddleware.ts | 6 +- .../src/middlewares/createRouterMiddleware.ts | 4 +- .../instantsearch.js/src/types/connector.ts | 2 +- .../instantsearch.js/src/types/insights.ts | 2 +- packages/instantsearch.js/src/types/utils.ts | 2 +- .../src/types/widget-factory.ts | 2 +- packages/instantsearch.js/src/types/widget.ts | 8 +- .../src/widgets/autocomplete/autocomplete.tsx | 8 +- .../src/widgets/chat/chat.tsx | 6 +- .../frequently-bought-together.tsx | 6 +- .../geo-search/__tests__/geo-search-test.ts | 2 +- .../src/widgets/geo-search/geo-search.ts | 2 +- .../widgets/infinite-hits/infinite-hits.tsx | 4 +- .../looking-similar/looking-similar.tsx | 4 +- .../src/widgets/panel/panel.tsx | 2 +- .../related-products/related-products.tsx | 4 +- .../widgets/trending-items/trending-items.tsx | 2 +- .../instantsearch.js/test/createWidget.ts | 2 +- .../src/components/DynamicWidgets.tsx | 2 +- .../src/components/InstantSearch.tsx | 4 +- .../components/InstantSearchSSRProvider.tsx | 2 +- .../components/InstantSearchServerContext.ts | 2 +- .../src/hooks/useConnector.ts | 2 +- .../src/lib/InstantSearchSSRContext.ts | 2 +- .../src/lib/useInstantSearchApi.ts | 4 +- .../src/lib/useInstantSearchContext.ts | 2 +- .../src/lib/useInstantSearchSSRContext.ts | 2 +- .../src/lib/useInstantSearchServerContext.ts | 2 +- .../src/lib/useSearchState.ts | 2 +- .../src/InstantSearchNext.tsx | 4 +- .../src/useInstantSearchRouting.ts | 2 +- .../src/types/Translatable.ts | 2 +- .../src/ui/lib/isModifierClick.ts | 8 +- .../src/widgets/Autocomplete.tsx | 4 +- .../react-instantsearch/src/widgets/Chat.tsx | 4 +- .../react-instantsearch/src/widgets/Hits.tsx | 11 ++- .../__tests__/__utils__/all-widgets.tsx | 6 +- .../widgets/__tests__/all-widgets.test.tsx | 2 +- .../vue-instantsearch/.storybook/styles.css | 5 +- tests/common/common.ts | 8 +- tests/mocks/createAlgoliaSearchClient.ts | 11 +-- tests/mocks/createCompositionClient.ts | 2 +- 168 files changed, 679 insertions(+), 503 deletions(-) diff --git a/.github/prompts/docs-automation.md b/.github/prompts/docs-automation.md index 78acd655afa..d95fad05176 100644 --- a/.github/prompts/docs-automation.md +++ b/.github/prompts/docs-automation.md @@ -14,21 +14,18 @@ You are running from the root directory where: ## Task 1. Read the changelogs to understand what changed in the latest release: - - instantsearch/packages/instantsearch.js/CHANGELOG.md - instantsearch/packages/react-instantsearch/CHANGELOG.md - instantsearch/packages/react-instantsearch-core/CHANGELOG.md - instantsearch/packages/vue-instantsearch/CHANGELOG.md (low priority - only update Vue docs if this changelog shows explicit feature additions) 2. Find and read ONE existing doc as a format reference: - - Use Glob to find InstantSearch widget docs: docs-new/**/instantsearch/**/\*.mdx - Read just ONE example file to understand the format (don't read many) 3. Update documentation for any new features, modified components, or breaking changes. 4. After making changes, run link check to catch broken links: - - cd docs-new && npm run check:links Fix any broken links you introduced, but don't spend time on pre-existing issues. 5. ## REQUIRED: Write a summary file at CHANGES_SUMMARY.md with this exact format: @@ -36,7 +33,6 @@ You are running from the root directory where: First line: A short title describing the main change (e.g., 'Add useFrequentlyBoughtTogether hook documentation') Blank line, then a markdown list of what was changed: - - Added docs for X widget/hook - Updated Y component with new Z prop - Fixed broken links in W page diff --git a/examples/js/algolia-experiences/index.html b/examples/js/algolia-experiences/index.html index 8c877d9a498..5dfc6dbdbf3 100644 --- a/examples/js/algolia-experiences/index.html +++ b/examples/js/algolia-experiences/index.html @@ -1,4 +1,4 @@ - + @@ -9,8 +9,17 @@ />