From b5566ab41e2dff3060c87307854e23074d1f0ffc Mon Sep 17 00:00:00 2001 From: Soner Sayakci Date: Tue, 17 Feb 2026 11:00:09 +0100 Subject: [PATCH 1/2] feat: eslint 10 upgrade --- .../6.7/require-explict-emits.js | 2 +- packages/admin-eslint-rules/6.7/state-import.js | 2 +- packages/admin-eslint-rules/no-snippet-import.js | 1 + packages/admin-eslint-rules/no-src-import.js | 9 +++++++++ packages/admin-eslint-rules/package.json | 2 +- .../storefront-eslint-rules/dom-access-helper.js | 15 ++++++++------- packages/storefront-eslint-rules/http-client.js | 3 ++- .../storefront-eslint-rules/plugin-manager.js | 1 + packages/storefront-eslint-rules/query-string.js | 2 +- pnpm-lock.yaml | 4 ++-- pnpm-workspace.yaml | 2 +- 11 files changed, 28 insertions(+), 15 deletions(-) diff --git a/packages/admin-eslint-rules/6.7/require-explict-emits.js b/packages/admin-eslint-rules/6.7/require-explict-emits.js index 0c2c0ac..a1cb110 100644 --- a/packages/admin-eslint-rules/6.7/require-explict-emits.js +++ b/packages/admin-eslint-rules/6.7/require-explict-emits.js @@ -70,7 +70,7 @@ export default { function getEmitCallsFromTemplate(importNode) { if (importNode.name === "template") { const templateFileName = importNode.parent.parent.source.value; - const directoryPath = dirname(context.getFilename()); + const directoryPath = dirname(context.filename); const templateSource = readFileSync( resolve(directoryPath, templateFileName), "utf8", diff --git a/packages/admin-eslint-rules/6.7/state-import.js b/packages/admin-eslint-rules/6.7/state-import.js index 6546d71..cf1d43c 100644 --- a/packages/admin-eslint-rules/6.7/state-import.js +++ b/packages/admin-eslint-rules/6.7/state-import.js @@ -13,7 +13,7 @@ export default { }, create(context) { - const sourceCode = context.getSourceCode(); + const sourceCode = context.sourceCode; const stateVariableNames = new Set(); function getBaseIndent(node) { diff --git a/packages/admin-eslint-rules/no-snippet-import.js b/packages/admin-eslint-rules/no-snippet-import.js index cdd202f..634bf06 100644 --- a/packages/admin-eslint-rules/no-snippet-import.js +++ b/packages/admin-eslint-rules/no-snippet-import.js @@ -7,6 +7,7 @@ export default { category: "Best Practices", recommended: true, }, + schema: [], }, create(context) { return { diff --git a/packages/admin-eslint-rules/no-src-import.js b/packages/admin-eslint-rules/no-src-import.js index 5cd0311..a33abdb 100644 --- a/packages/admin-eslint-rules/no-src-import.js +++ b/packages/admin-eslint-rules/no-src-import.js @@ -1,4 +1,13 @@ export default { + meta: { + type: "problem", + docs: { + description: "Forbid imports directly from the Shopware Core via @administration/", + category: "Best Practices", + recommended: true, + }, + schema: [], + }, create(context) { return { ImportDeclaration(node) { diff --git a/packages/admin-eslint-rules/package.json b/packages/admin-eslint-rules/package.json index 5d8848c..bcda4d7 100644 --- a/packages/admin-eslint-rules/package.json +++ b/packages/admin-eslint-rules/package.json @@ -37,7 +37,7 @@ "test": "vitest run" }, "devDependencies": { - "eslint": "^9.38.0", + "eslint": "catalog:", "vitest": "^4.0.1" } } diff --git a/packages/storefront-eslint-rules/dom-access-helper.js b/packages/storefront-eslint-rules/dom-access-helper.js index 3bc6302..5481f1a 100644 --- a/packages/storefront-eslint-rules/dom-access-helper.js +++ b/packages/storefront-eslint-rules/dom-access-helper.js @@ -7,6 +7,7 @@ export default { recommended: true, }, fixable: "code", + schema: [], }, create(context) { @@ -42,25 +43,25 @@ export default { ) { const method = node.callee.property.name; const args = node.arguments; + const sourceCode = context.sourceCode; const dataSetKey = toCamelCase( - context - .getSourceCode() + sourceCode .getText(args[1]) .replace(/^data-/, ""), ); const fixes = { getDataAttribute: () => - `${context.getSourceCode().getText(args[0])}.dataset['${dataSetKey}']`, + `${sourceCode.getText(args[0])}.dataset['${dataSetKey}']`, hasAttribute: () => - `${context.getSourceCode().getText(args[0])}.hasAttribute(${context.getSourceCode().getText(args[1])})`, + `${sourceCode.getText(args[0])}.hasAttribute(${sourceCode.getText(args[1])})`, getAttribute: () => - `${context.getSourceCode().getText(args[0])}.getAttribute(${context.getSourceCode().getText(args[1])})`, + `${sourceCode.getText(args[0])}.getAttribute(${sourceCode.getText(args[1])})`, querySelector: () => - `${context.getSourceCode().getText(args[0])}.querySelector(${context.getSourceCode().getText(args[1])})`, + `${sourceCode.getText(args[0])}.querySelector(${sourceCode.getText(args[1])})`, querySelectorAll: () => - `${context.getSourceCode().getText(args[0])}.querySelectorAll(${context.getSourceCode().getText(args[1])})`, + `${sourceCode.getText(args[0])}.querySelectorAll(${sourceCode.getText(args[1])})`, }; if (fixes[method]) { diff --git a/packages/storefront-eslint-rules/http-client.js b/packages/storefront-eslint-rules/http-client.js index b8f0c94..4e552eb 100644 --- a/packages/storefront-eslint-rules/http-client.js +++ b/packages/storefront-eslint-rules/http-client.js @@ -7,6 +7,7 @@ export default { recommended: false, }, fixable: "code", + schema: [], }, create(context) { let httpClientPropertyName = null; @@ -62,7 +63,7 @@ export default { node.callee.object.name === httpClientVariableName; if (isClassPropertyCall || isLocalVariableCall) { - const sourceCode = context.getSourceCode(); + const sourceCode = context.sourceCode; const method = node.callee.property.name; let urlArg; diff --git a/packages/storefront-eslint-rules/plugin-manager.js b/packages/storefront-eslint-rules/plugin-manager.js index bb71efc..90c7d21 100644 --- a/packages/storefront-eslint-rules/plugin-manager.js +++ b/packages/storefront-eslint-rules/plugin-manager.js @@ -8,6 +8,7 @@ export default { recommended: false, }, fixable: "code", + schema: [], }, create(context) { diff --git a/packages/storefront-eslint-rules/query-string.js b/packages/storefront-eslint-rules/query-string.js index d13f6c0..8a0e613 100644 --- a/packages/storefront-eslint-rules/query-string.js +++ b/packages/storefront-eslint-rules/query-string.js @@ -33,7 +33,7 @@ export default { node.callee.property.name === "stringify") && node.arguments.length > 0 ) { - const sourceCode = context.getSourceCode(); + const sourceCode = context.sourceCode; const argumentSource = sourceCode.getText(node.arguments[0]); if (node.callee.property.name === "parse") { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 753bd1d..275fcf9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,7 +7,7 @@ settings: catalogs: default: eslint: - specifier: ^9.38.0 + specifier: ^9.38.0 || ^10.0.0 version: 9.39.2 vitest: specifier: ^4.0.1 @@ -28,7 +28,7 @@ importers: version: 6.1.1 devDependencies: eslint: - specifier: ^9.38.0 + specifier: 'catalog:' version: 9.39.2 vitest: specifier: ^4.0.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 61abf07..be70ffd 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,5 +5,5 @@ onlyBuiltDependencies: - esbuild catalog: - eslint: ^9.38.0 + eslint: ^9.38.0 || ^10.0.0 vitest: ^4.0.1 From 2c854d00fd90a29e8798b661c2a8b7c1b9125cb4 Mon Sep 17 00:00:00 2001 From: Soner Sayakci Date: Tue, 17 Feb 2026 11:07:58 +0100 Subject: [PATCH 2/2] feat: replace biome with oxlint --- .github/workflows/publish.yml | 4 +- .github/workflows/test.yml | 51 +- .github/workflows/update-biome-schema.yml | 66 --- .oxfmtrc.json | 5 + .oxlintrc.json | 7 + README.md | 2 +- biome.json | 46 -- package.json | 16 +- .../6.7/require-explict-emits.js | 32 +- .../admin-eslint-rules/6.7/state-import.js | 41 +- packages/admin-eslint-rules/README.md | 20 +- packages/admin-eslint-rules/index.js | 7 +- .../admin-eslint-rules/no-snippet-import.js | 3 +- packages/admin-eslint-rules/no-src-import.js | 4 +- .../no-sw-extension-override.js | 4 +- packages/admin-eslint-rules/package.json | 46 +- packages/admin-stylelint-rules/README.md | 16 +- packages/admin-stylelint-rules/package.json | 22 +- .../wrong-scss-import.js | 73 ++- packages/storefront-eslint-rules/README.md | 2 +- .../dom-access-helper.js | 9 +- .../storefront-eslint-rules/http-client.js | 13 +- packages/storefront-eslint-rules/package.json | 18 +- .../storefront-eslint-rules/plugin-manager.js | 16 +- .../storefront-eslint-rules/query-string.js | 11 +- .../test/dom-access-helper.test.js | 19 +- .../test/plugin-manager.test.js | 3 +- .../test/query-string.test.js | 11 +- pnpm-lock.yaml | 506 ++++++++++++++---- 29 files changed, 619 insertions(+), 454 deletions(-) delete mode 100644 .github/workflows/update-biome-schema.yml create mode 100644 .oxfmtrc.json create mode 100644 .oxlintrc.json delete mode 100644 biome.json diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 80f1f65..ec6dafa 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v6 - + - name: Setup pnpm uses: pnpm/action-setup@v4 @@ -21,7 +21,7 @@ jobs: uses: actions/setup-node@v6 with: node-version: "24" - cache: 'pnpm' + cache: "pnpm" registry-url: "https://registry.npmjs.org" - name: Update npm diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a618110..904ef02 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -7,20 +7,49 @@ on: pull_request: jobs: - biome: - name: Biome + oxlint: + name: oxlint runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v6 + - name: Checkout + uses: actions/checkout@v6 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: "24" + cache: "pnpm" - - name: Setup Biome - uses: biomejs/setup-biome@v2 - with: - version: latest + - name: Install dependencies + run: pnpm install + + - name: Run oxlint + run: pnpm oxlint + + oxfmt: + name: oxfmt + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: "24" + cache: "pnpm" + + - name: Install dependencies + run: pnpm install - - name: Run Biome - run: biome ci . + - name: Run oxfmt + run: pnpm oxfmt:check test: name: Vitest @@ -37,7 +66,7 @@ jobs: uses: actions/setup-node@v6 with: node-version: "24" - cache: 'pnpm' + cache: "pnpm" - name: Install dependencies run: pnpm install diff --git a/.github/workflows/update-biome-schema.yml b/.github/workflows/update-biome-schema.yml deleted file mode 100644 index d51b4fa..0000000 --- a/.github/workflows/update-biome-schema.yml +++ /dev/null @@ -1,66 +0,0 @@ -name: Update Biome Schema - -on: - pull_request: - paths: - - 'package.json' - - 'pnpm-lock.yaml' - -permissions: - contents: write - pull-requests: write - -jobs: - update-schema: - name: Update Biome Schema - runs-on: ubuntu-latest - if: github.event.pull_request.user.login == 'dependabot[bot]' - - steps: - - name: Checkout code - uses: actions/checkout@v6 - with: - token: ${{ secrets.GITHUB_TOKEN }} - ref: ${{ github.head_ref }} - - - name: Setup pnpm - uses: pnpm/action-setup@v4 - - - name: Setup Node.js - uses: actions/setup-node@v6 - with: - node-version: "24" - cache: 'pnpm' - - - name: Install dependencies - run: pnpm install - - - name: Get Biome version - id: biome-version - run: | - BIOME_VERSION=$(pnpm list @biomejs/biome --json | jq -r '.[0].devDependencies."@biomejs/biome".version') - echo "version=${BIOME_VERSION}" >> $GITHUB_OUTPUT - - - name: Update biome.json schema - run: | - BIOME_VERSION="${{ steps.biome-version.outputs.version }}" - jq --arg schema "https://biomejs.dev/schemas/${BIOME_VERSION}/schema.json" '."$schema" = $schema' biome.json > biome.json.tmp - mv biome.json.tmp biome.json - - - name: Check for changes - id: check-changes - run: | - if git diff --quiet; then - echo "changed=false" >> $GITHUB_OUTPUT - else - echo "changed=true" >> $GITHUB_OUTPUT - fi - - - name: Commit changes - if: steps.check-changes.outputs.changed == 'true' - run: | - git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" - git config --local user.name "github-actions[bot]" - git add biome.json pnpm-lock.yaml - git commit -m "chore: update biome.json schema to match installed version" - git push \ No newline at end of file diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 0000000..0e343dd --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,5 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "useTabs": true, + "singleQuote": false +} diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000..c9bd16f --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,7 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "categories": { + "correctness": "error" + }, + "plugins": ["eslint", "typescript", "unicorn", "oxc", "import"] +} diff --git a/README.md b/README.md index b574827..5cc5107 100644 --- a/README.md +++ b/README.md @@ -10,4 +10,4 @@ This repository is a monorepo for ESLint and Stylelint rules for Shopware. ## License -[MIT](./LICENSE) \ No newline at end of file +[MIT](./LICENSE) diff --git a/biome.json b/biome.json deleted file mode 100644 index 14000fd..0000000 --- a/biome.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/2.3.11/schema.json", - "vcs": { - "enabled": false, - "clientKind": "git", - "useIgnoreFile": false - }, - "files": { - "ignoreUnknown": false - }, - "formatter": { - "enabled": true, - "indentStyle": "tab" - }, - "linter": { - "enabled": true, - "rules": { - "recommended": true, - "style": { - "noParameterAssign": "error", - "useAsConstAssertion": "error", - "useDefaultParameterLast": "error", - "useEnumInitializers": "error", - "useSelfClosingElements": "error", - "useSingleVarDeclarator": "error", - "noUnusedTemplateLiteral": "error", - "useNumberNamespace": "error", - "noInferrableTypes": "error", - "noUselessElse": "error" - } - } - }, - "javascript": { - "formatter": { - "quoteStyle": "double" - } - }, - "assist": { - "enabled": true, - "actions": { - "source": { - "organizeImports": "on" - } - } - } -} diff --git a/package.json b/package.json index 89d9a72..04d975c 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,13 @@ { - "packageManager": "pnpm@10.28.1", + "scripts": { + "oxlint": "oxlint .", + "oxlint:fix": "oxlint --fix .", + "oxfmt": "oxfmt .", + "oxfmt:check": "oxfmt --check" + }, "devDependencies": { - "@biomejs/biome": "~2.3.11" + "oxfmt": "^0.33.0", + "oxlint": "^1.48.0" }, - "scripts": { - "biome": "biome", - "biome:fix": "biome format --write . && biome lint --fix --unsafe . && biome check --fix --unsafe .", - "biome:check": "biome ci ." - } + "packageManager": "pnpm@10.28.1" } diff --git a/packages/admin-eslint-rules/6.7/require-explict-emits.js b/packages/admin-eslint-rules/6.7/require-explict-emits.js index a1cb110..a1ece13 100644 --- a/packages/admin-eslint-rules/6.7/require-explict-emits.js +++ b/packages/admin-eslint-rules/6.7/require-explict-emits.js @@ -49,9 +49,7 @@ export default { if (isComponentDefinition(objectNode)) { componentNode = objectNode; emitsNode = objectNode.properties.find( - (property) => - property.key?.name === "emits" && - property.value.type === "ArrayExpression", + (property) => property.key?.name === "emits" && property.value.type === "ArrayExpression", )?.value; } } @@ -71,14 +69,9 @@ export default { if (importNode.name === "template") { const templateFileName = importNode.parent.parent.source.value; const directoryPath = dirname(context.filename); - const templateSource = readFileSync( - resolve(directoryPath, templateFileName), - "utf8", - ); - - const templateEventsNames = Array.from( - templateSource.matchAll(EVENT_NAME_REGEXP), - ) + const templateSource = readFileSync(resolve(directoryPath, templateFileName), "utf8"); + + const templateEventsNames = Array.from(templateSource.matchAll(EVENT_NAME_REGEXP)) .map(([, capturedGroup]) => capturedGroup) .filter(Boolean); @@ -145,8 +138,7 @@ export default { } function fixMissingEmitDefinitions(programNode) { - const emitsDefinition = - emitsNode?.elements.map((element) => element.value) ?? []; + const emitsDefinition = emitsNode?.elements.map((element) => element.value) ?? []; const pendingEmitDefinitions = Array.from(emittedEvents).filter( (e) => e && !emitsDefinition.includes(e), ); @@ -170,10 +162,7 @@ export default { // emits with already some event in the component const lastElement = emitsNode.elements.at(-1); if (lastElement) { - return fixer.insertTextAfter( - lastElement, - `, ${stringEmitEvents}`, - ); + return fixer.insertTextAfter(lastElement, `, ${stringEmitEvents}`); } // emits without any event in @@ -201,15 +190,12 @@ export default { "provide", ]; - const nodeAfterWhichToInsert = componentNode.properties.findLast( - (property) => fieldsBeforeEmits.includes(property.key.name), + const nodeAfterWhichToInsert = componentNode.properties.findLast((property) => + fieldsBeforeEmits.includes(property.key.name), ); if (nodeAfterWhichToInsert) { - return fixer.insertTextAfter( - nodeAfterWhichToInsert, - `,\n\nemits: [${stringEmitEvents}]`, - ); + return fixer.insertTextAfter(nodeAfterWhichToInsert, `,\n\nemits: [${stringEmitEvents}]`); } // in the case there is no fields that should be before emits, then we insert at the beginning of the component diff --git a/packages/admin-eslint-rules/6.7/state-import.js b/packages/admin-eslint-rules/6.7/state-import.js index cf1d43c..37aa7f4 100644 --- a/packages/admin-eslint-rules/6.7/state-import.js +++ b/packages/admin-eslint-rules/6.7/state-import.js @@ -57,8 +57,7 @@ export default { stateVariableNames.add(localName); context.report({ node: prop, - message: - "Do not use destructured 'State', use destructured 'Store' instead.", + message: "Do not use destructured 'State', use destructured 'Store' instead.", fix(fixer) { // Fix the property key to change "State" to "Store" // Preserve possible aliasing e.g., { State: MyState } @@ -81,14 +80,10 @@ export default { node.declarations[0].init.callee.type === "MemberExpression" ) { const callee = node.declarations[0].init.callee; - if ( - callee.object.name === "Component" && - callee.property.name === "getComponentHelper" - ) { + if (callee.object.name === "Component" && callee.property.name === "getComponentHelper") { context.report({ node, - message: - "Remove the unused Component.getComponentHelper() import.", + message: "Remove the unused Component.getComponentHelper() import.", fix(fixer) { // Remove the entire variable declaration. return fixer.remove(node); @@ -105,8 +100,7 @@ export default { arg && arg.type === "CallExpression" && arg.callee && - (arg.callee.name === "mapState" || - arg.callee.name === "mapGetters") && + (arg.callee.name === "mapState" || arg.callee.name === "mapGetters") && arg.arguments.length === 2 && arg.arguments[0].type === "Literal" && (arg.arguments[1].type === "ArrayExpression" || @@ -119,10 +113,7 @@ export default { // a. Handle array syntax: if (arg.arguments[1].type === "ArrayExpression") { const props = arg.arguments[1].elements - .filter( - (el) => - el && el.type === "Literal" && typeof el.value === "string", - ) + .filter((el) => el && el.type === "Literal" && typeof el.value === "string") .map((el) => el.value); computedText = props @@ -157,10 +148,7 @@ export default { } // Case 1: property value is a literal string (mapping). - if ( - prop.value.type === "Literal" && - typeof prop.value.value === "string" - ) { + if (prop.value.type === "Literal" && typeof prop.value.value === "string") { const mappedProp = prop.value.value; return ( "\n" + @@ -228,8 +216,7 @@ export default { context.report({ node, - message: - "Replace spread mapState call with explicit computed property definitions.", + message: "Replace spread mapState call with explicit computed property definitions.", fix(fixer) { return fixer.replaceText(node, computedText); }, @@ -260,10 +247,7 @@ export default { stateMember.property.name === "State" ) { isValid = true; - } else if ( - stateMember.type === "Identifier" && - stateMember.name === "State" - ) { + } else if (stateMember.type === "Identifier" && stateMember.name === "State") { isValid = true; shortHand = true; } @@ -272,17 +256,12 @@ export default { if (node.arguments.length < 1) return; const firstArg = node.arguments[0]; - if ( - firstArg.type === "Literal" && - typeof firstArg.value === "string" - ) { + if (firstArg.type === "Literal" && typeof firstArg.value === "string") { const parts = firstArg.value.split("/"); if (parts.length === 2) { const [storeName, methodName] = parts; const args = node.arguments.slice(1); - const argsText = args - .map((arg) => sourceCode.getText(arg)) - .join(", "); + const argsText = args.map((arg) => sourceCode.getText(arg)).join(", "); const newCode = `${shortHand ? "" : "Shopware."}Store.get('${storeName}').${methodName}(${ argsText ? argsText : "" })`; diff --git a/packages/admin-eslint-rules/README.md b/packages/admin-eslint-rules/README.md index 3d00785..8bd0c2b 100644 --- a/packages/admin-eslint-rules/README.md +++ b/packages/admin-eslint-rules/README.md @@ -16,16 +16,14 @@ Add the following to your `.eslintrc.js` file: ```javascript module.exports = { - "plugins": [ - "@shopware-ag/admin-eslint-rules" - ], - "rules": { - "@shopware-ag/admin-eslint-rules/no-snippet-import": "error", - "@shopware-ag/admin-eslint-rules/no-src-import": "error", - "@shopware-ag/admin-eslint-rules/no-sw-extension-override": "error", - "@shopware-ag/admin-eslint-rules/require-explict-emits": "error", - "@shopware-ag/admin-eslint-rules/state-import": "error" - } + plugins: ["@shopware-ag/admin-eslint-rules"], + rules: { + "@shopware-ag/admin-eslint-rules/no-snippet-import": "error", + "@shopware-ag/admin-eslint-rules/no-src-import": "error", + "@shopware-ag/admin-eslint-rules/no-sw-extension-override": "error", + "@shopware-ag/admin-eslint-rules/require-explict-emits": "error", + "@shopware-ag/admin-eslint-rules/state-import": "error", + }, }; ``` @@ -35,4 +33,4 @@ module.exports = { - `no-src-import`: Prevents direct import of `src` files. - `no-sw-extension-override`: Prevents overriding of `sw-extension` components. - `require-explict-emits`: Requires explicit emits in components. -- `state-import`: Enforces correct import of state. \ No newline at end of file +- `state-import`: Enforces correct import of state. diff --git a/packages/admin-eslint-rules/index.js b/packages/admin-eslint-rules/index.js index 60e581a..97a456d 100644 --- a/packages/admin-eslint-rules/index.js +++ b/packages/admin-eslint-rules/index.js @@ -20,12 +20,7 @@ if (process.env.SHOPWARE_VERSION) { return true; } - return ( - compareVersions( - process.env.SHOPWARE_VERSION, - rule.meta.minShopwareVersion, - ) >= 0 - ); + return compareVersions(process.env.SHOPWARE_VERSION, rule.meta.minShopwareVersion) >= 0; }), ); } diff --git a/packages/admin-eslint-rules/no-snippet-import.js b/packages/admin-eslint-rules/no-snippet-import.js index 634bf06..986a662 100644 --- a/packages/admin-eslint-rules/no-snippet-import.js +++ b/packages/admin-eslint-rules/no-snippet-import.js @@ -2,8 +2,7 @@ export default { meta: { type: "problem", docs: { - description: - "Forbid passing `snippets` to Shopware.Module.register or Module.register", + description: "Forbid passing `snippets` to Shopware.Module.register or Module.register", category: "Best Practices", recommended: true, }, diff --git a/packages/admin-eslint-rules/no-src-import.js b/packages/admin-eslint-rules/no-src-import.js index a33abdb..d9b2f4e 100644 --- a/packages/admin-eslint-rules/no-src-import.js +++ b/packages/admin-eslint-rules/no-src-import.js @@ -12,9 +12,7 @@ export default { return { ImportDeclaration(node) { const invalidNodeSources = []; - invalidNodeSources.push( - node.source.value.startsWith("@administration/"), - ); + invalidNodeSources.push(node.source.value.startsWith("@administration/")); if (invalidNodeSources.includes(true)) { context.report({ diff --git a/packages/admin-eslint-rules/no-sw-extension-override.js b/packages/admin-eslint-rules/no-sw-extension-override.js index 7382bef..2fbabe9 100644 --- a/packages/admin-eslint-rules/no-sw-extension-override.js +++ b/packages/admin-eslint-rules/no-sw-extension-override.js @@ -23,9 +23,7 @@ export default { node.init.type === "Identifier" && node.init.name === "Shopware" ) { - const componentProperty = node.id.properties.find( - (p) => p.key.name === "Component", - ); + const componentProperty = node.id.properties.find((p) => p.key.name === "Component"); if (componentProperty) { componentVariableName = componentProperty.value.name; } diff --git a/packages/admin-eslint-rules/package.json b/packages/admin-eslint-rules/package.json index bcda4d7..adcc67b 100644 --- a/packages/admin-eslint-rules/package.json +++ b/packages/admin-eslint-rules/package.json @@ -1,43 +1,43 @@ { "name": "@shopware-ag/admin-eslint-rules", - "type": "module", - "description": "Shopware Administration ESLint rules", "version": "1.0.1", - "main": "index.js", + "description": "Shopware Administration ESLint rules", + "keywords": [ + "eslint", + "eslint-plugin", + "eslint-rules", + "shopware" + ], + "homepage": "https://github.com/shopwareLabs/shopware-javascript-code-quality/tree/main/packages/admin-eslint-rules#readme", + "bugs": { + "url": "https://github.com/shopwareLabs/shopware-javascript-code-quality/issues" + }, "license": "MIT", "author": "Shopware AG", - "dependencies": { - "compare-versions": "^6.1.1" - }, - "peerDependencies": { - "eslint": "catalog:" + "repository": { + "type": "git", + "url": "https://github.com/shopwareLabs/shopware-javascript-code-quality.git", + "directory": "packages/admin-eslint-rules" }, + "type": "module", + "main": "index.js", "exports": { ".": { "import": "./index.js", "require": "./index.js" } }, - "repository": { - "type": "git", - "url": "https://github.com/shopwareLabs/shopware-javascript-code-quality.git", - "directory": "packages/admin-eslint-rules" - }, - "keywords": [ - "shopware", - "eslint", - "eslint-plugin", - "eslint-rules" - ], - "homepage": "https://github.com/shopwareLabs/shopware-javascript-code-quality/tree/main/packages/admin-eslint-rules#readme", - "bugs": { - "url": "https://github.com/shopwareLabs/shopware-javascript-code-quality/issues" - }, "scripts": { "test": "vitest run" }, + "dependencies": { + "compare-versions": "^6.1.1" + }, "devDependencies": { "eslint": "catalog:", "vitest": "^4.0.1" + }, + "peerDependencies": { + "eslint": "catalog:" } } diff --git a/packages/admin-stylelint-rules/README.md b/packages/admin-stylelint-rules/README.md index 1eb94e0..d3f02a6 100644 --- a/packages/admin-stylelint-rules/README.md +++ b/packages/admin-stylelint-rules/README.md @@ -16,12 +16,10 @@ Add the plugin to your stylelint configuration file (e.g., `.stylelintrc.json`) ```json { - "plugins": [ - "@shopware-ag/admin-stylelint-rules" - ], - "rules": { - "@shopware-ag/admin-stylelint-rules/wrong-scss-import": true - } + "plugins": ["@shopware-ag/admin-stylelint-rules"], + "rules": { + "@shopware-ag/admin-stylelint-rules/wrong-scss-import": true + } } ``` @@ -37,12 +35,12 @@ This rule can automatically fix violations. ```scss @import "~scss/variables.scss"; -@import '~scss/mixins.scss'; +@import "~scss/mixins.scss"; ``` **Example of correct code for this rule:** ```scss @import "~scss/variables"; -@import '~scss/mixins'; -``` \ No newline at end of file +@import "~scss/mixins"; +``` diff --git a/packages/admin-stylelint-rules/package.json b/packages/admin-stylelint-rules/package.json index e70311d..bc0c4f8 100644 --- a/packages/admin-stylelint-rules/package.json +++ b/packages/admin-stylelint-rules/package.json @@ -1,14 +1,13 @@ { "name": "@shopware-ag/admin-stylelint-rules", "version": "1.0.1", - "main": "index.js", - "type": "module", - "peerDependencies": { - "stylelint": "^16.0.0 || ^17.0.0" - }, - "devDependencies": { - "vitest": "catalog:" + "repository": { + "type": "git", + "url": "https://github.com/shopwareLabs/shopware-javascript-code-quality.git", + "directory": "packages/admin-stylelint-rules" }, + "type": "module", + "main": "index.js", "exports": { ".": { "import": "./index.js", @@ -18,9 +17,10 @@ "scripts": { "test": "vitest run" }, - "repository": { - "type": "git", - "url": "https://github.com/shopwareLabs/shopware-javascript-code-quality.git", - "directory": "packages/admin-stylelint-rules" + "devDependencies": { + "vitest": "catalog:" + }, + "peerDependencies": { + "stylelint": "^16.0.0 || ^17.0.0" } } diff --git a/packages/admin-stylelint-rules/wrong-scss-import.js b/packages/admin-stylelint-rules/wrong-scss-import.js index a46a19f..0d466d8 100644 --- a/packages/admin-stylelint-rules/wrong-scss-import.js +++ b/packages/admin-stylelint-rules/wrong-scss-import.js @@ -8,46 +8,43 @@ export const messages = stylelint.utils.ruleMessages(ruleName, { "Use \"@import '~scss/variables'\" instead.", }); -export default stylelint.createPlugin( - ruleName, - (primaryOption, _secondaryOptions, context) => { - return (root, result) => { - const validOptions = stylelint.utils.validateOptions(result, ruleName, { - actual: primaryOption, - }); - if (!validOptions) { - return; - } +export default stylelint.createPlugin(ruleName, (primaryOption, _secondaryOptions, context) => { + return (root, result) => { + const validOptions = stylelint.utils.validateOptions(result, ruleName, { + actual: primaryOption, + }); + if (!validOptions) { + return; + } - root.walkAtRules("import", (atRule) => { - // Get import params; remove quotes and semicolon elements. - let importPath = atRule.params.trim(); + root.walkAtRules("import", (atRule) => { + // Get import params; remove quotes and semicolon elements. + let importPath = atRule.params.trim(); - // Remove wrapping quotes (either single or double) - const matchQuotes = importPath.match(/^(['"])(.*)\1$/); - if (matchQuotes) { - importPath = matchQuotes[2]; - } + // Remove wrapping quotes (either single or double) + const matchQuotes = importPath.match(/^(['"])(.*)\1$/); + if (matchQuotes) { + importPath = matchQuotes[2]; + } - // Check if it starts with "~scss" and ends with ".scss" - if (importPath.startsWith("~scss") && importPath.endsWith(".scss")) { - // Create the fixed import path by stripping the .scss extension. - const fixedPath = importPath.replace(/\.scss$/, ""); + // Check if it starts with "~scss" and ends with ".scss" + if (importPath.startsWith("~scss") && importPath.endsWith(".scss")) { + // Create the fixed import path by stripping the .scss extension. + const fixedPath = importPath.replace(/\.scss$/, ""); - if (context.fix) { - // Use the same quote character or default to double quotes. - const quote = matchQuotes ? matchQuotes[1] : '"'; - atRule.params = `${quote}${fixedPath}${quote}`; - } else { - stylelint.utils.report({ - message: messages.rejected, - node: atRule, - result, - ruleName, - }); - } + if (context.fix) { + // Use the same quote character or default to double quotes. + const quote = matchQuotes ? matchQuotes[1] : '"'; + atRule.params = `${quote}${fixedPath}${quote}`; + } else { + stylelint.utils.report({ + message: messages.rejected, + node: atRule, + result, + ruleName, + }); } - }); - }; - }, -); + } + }); + }; +}); diff --git a/packages/storefront-eslint-rules/README.md b/packages/storefront-eslint-rules/README.md index 24330c0..4ac91af 100644 --- a/packages/storefront-eslint-rules/README.md +++ b/packages/storefront-eslint-rules/README.md @@ -40,4 +40,4 @@ export default [ - `migrate-plugin-manager`: This rule flags imports from src/plugin-system/plugin.manager and suggests using window.PluginManager instead. It also flags imports from src/plugin-system/plugin.class and suggests using window.PluginBaseClass. - `no-dom-access-helper`: This rule identifies usages of the DomAccessHelper and suggests using native DOM methods instead. - `no-http-client`: This rule identifies usages of the HttpClient and suggests using the fetch API instead. -- `no-query-string`: This rule identifies usages of the query-string library and suggests using URLSearchParams instead. \ No newline at end of file +- `no-query-string`: This rule identifies usages of the query-string library and suggests using URLSearchParams instead. diff --git a/packages/storefront-eslint-rules/dom-access-helper.js b/packages/storefront-eslint-rules/dom-access-helper.js index 5481f1a..81c0fd3 100644 --- a/packages/storefront-eslint-rules/dom-access-helper.js +++ b/packages/storefront-eslint-rules/dom-access-helper.js @@ -45,15 +45,10 @@ export default { const args = node.arguments; const sourceCode = context.sourceCode; - const dataSetKey = toCamelCase( - sourceCode - .getText(args[1]) - .replace(/^data-/, ""), - ); + const dataSetKey = toCamelCase(sourceCode.getText(args[1]).replace(/^data-/, "")); const fixes = { - getDataAttribute: () => - `${sourceCode.getText(args[0])}.dataset['${dataSetKey}']`, + getDataAttribute: () => `${sourceCode.getText(args[0])}.dataset['${dataSetKey}']`, hasAttribute: () => `${sourceCode.getText(args[0])}.hasAttribute(${sourceCode.getText(args[1])})`, getAttribute: () => diff --git a/packages/storefront-eslint-rules/http-client.js b/packages/storefront-eslint-rules/http-client.js index 4e552eb..6283648 100644 --- a/packages/storefront-eslint-rules/http-client.js +++ b/packages/storefront-eslint-rules/http-client.js @@ -83,11 +83,7 @@ export default { // Find the callback function argument const startIndexForCallbackSearch = method === "post" ? 2 : 1; - for ( - let i = startIndexForCallbackSearch; - i < node.arguments.length; - i++ - ) { + for (let i = startIndexForCallbackSearch; i < node.arguments.length; i++) { const arg = node.arguments[i]; if ( arg.type === "ArrowFunctionExpression" || @@ -108,15 +104,12 @@ export default { if (method === "post") { contentTypeArgText = "'application/json'"; // Default if (callbackFnIndex + 1 < node.arguments.length) { - const potentialContentTypeArg = - node.arguments[callbackFnIndex + 1]; + const potentialContentTypeArg = node.arguments[callbackFnIndex + 1]; if ( potentialContentTypeArg.type === "Literal" && typeof potentialContentTypeArg.value === "string" ) { - contentTypeArgText = sourceCode.getText( - potentialContentTypeArg, - ); + contentTypeArgText = sourceCode.getText(potentialContentTypeArg); } } } diff --git a/packages/storefront-eslint-rules/package.json b/packages/storefront-eslint-rules/package.json index f7139ef..59afa5f 100644 --- a/packages/storefront-eslint-rules/package.json +++ b/packages/storefront-eslint-rules/package.json @@ -1,12 +1,14 @@ { "name": "@shopware-ag/storefront-eslint-rules", - "type": "module", - "description": "Shopware Storefront ESLint rules", "version": "1.0.0", - "main": "index.js", - "peerDependencies": { - "eslint": "catalog:" + "description": "Shopware Storefront ESLint rules", + "repository": { + "type": "git", + "url": "https://github.com/shopwareLabs/shopware-javascript-code-quality.git", + "directory": "packages/storefront-eslint-rules" }, + "type": "module", + "main": "index.js", "exports": { ".": { "import": "./index.js", @@ -20,9 +22,7 @@ "eslint": "catalog:", "vitest": "catalog:" }, - "repository": { - "type": "git", - "url": "https://github.com/shopwareLabs/shopware-javascript-code-quality.git", - "directory": "packages/storefront-eslint-rules" + "peerDependencies": { + "eslint": "catalog:" } } diff --git a/packages/storefront-eslint-rules/plugin-manager.js b/packages/storefront-eslint-rules/plugin-manager.js index 90c7d21..f27f923 100644 --- a/packages/storefront-eslint-rules/plugin-manager.js +++ b/packages/storefront-eslint-rules/plugin-manager.js @@ -2,8 +2,7 @@ export default { meta: { type: "suggestion", docs: { - description: - "Migrate PluginManager import to window.PluginManager assignment", + description: "Migrate PluginManager import to window.PluginManager assignment", category: "Migration", recommended: false, }, @@ -22,13 +21,9 @@ export default { if (importedName) { context.report({ node, - message: - "Import from plugin.manager should use window.PluginManager", + message: "Import from plugin.manager should use window.PluginManager", fix(fixer) { - return fixer.replaceText( - node, - `const ${importedName} = window.PluginManager;`, - ); + return fixer.replaceText(node, `const ${importedName} = window.PluginManager;`); }, }); } @@ -44,10 +39,7 @@ export default { message: "Import from src/plugin-system/plugin.class should use window.PluginBaseClass", fix(fixer) { - return fixer.replaceText( - node, - `const ${importedName} = window.PluginBaseClass;`, - ); + return fixer.replaceText(node, `const ${importedName} = window.PluginBaseClass;`); }, }); } diff --git a/packages/storefront-eslint-rules/query-string.js b/packages/storefront-eslint-rules/query-string.js index 8a0e613..7fb49c4 100644 --- a/packages/storefront-eslint-rules/query-string.js +++ b/packages/storefront-eslint-rules/query-string.js @@ -15,8 +15,7 @@ export default { if (node.source.value === "query-string") { context.report({ node, - message: - "Remove querystring import as URLSearchParams is used instead", + message: "Remove querystring import as URLSearchParams is used instead", fix(fixer) { return fixer.remove(node); }, @@ -29,8 +28,7 @@ export default { node.callee.type === "MemberExpression" && node.callee.object.name === "querystring" && node.callee.property.name && - (node.callee.property.name === "parse" || - node.callee.property.name === "stringify") && + (node.callee.property.name === "parse" || node.callee.property.name === "stringify") && node.arguments.length > 0 ) { const sourceCode = context.sourceCode; @@ -52,10 +50,7 @@ export default { node, message: "Use URLSearchParams instead of querystring.stringify", fix(fixer) { - return fixer.replaceText( - node, - `new URLSearchParams(${argumentSource}).toString()`, - ); + return fixer.replaceText(node, `new URLSearchParams(${argumentSource}).toString()`); }, }); } diff --git a/packages/storefront-eslint-rules/test/dom-access-helper.test.js b/packages/storefront-eslint-rules/test/dom-access-helper.test.js index df5566b..80c1466 100644 --- a/packages/storefront-eslint-rules/test/dom-access-helper.test.js +++ b/packages/storefront-eslint-rules/test/dom-access-helper.test.js @@ -32,17 +32,14 @@ describe("dom-access-helper", () => { { code: `import DomAccessHelper from 'src/helper/dom-access.helper';`, output: "", - errors: [ - { message: "Use native DOM methods instead of DomAccessHelper" }, - ], + errors: [{ message: "Use native DOM methods instead of DomAccessHelper" }], }, { code: `const value = DomAccessHelper.getDataAttribute(element, 'data-foo');`, output: `const value = element.dataset['foo'];`, errors: [ { - message: - "Use native DOM method instead of DomAccessHelper.getDataAttribute", + message: "Use native DOM method instead of DomAccessHelper.getDataAttribute", }, ], }, @@ -51,8 +48,7 @@ describe("dom-access-helper", () => { output: `const has = element.hasAttribute('data-foo');`, errors: [ { - message: - "Use native DOM method instead of DomAccessHelper.hasAttribute", + message: "Use native DOM method instead of DomAccessHelper.hasAttribute", }, ], }, @@ -61,8 +57,7 @@ describe("dom-access-helper", () => { output: `const attr = element.getAttribute('data-foo');`, errors: [ { - message: - "Use native DOM method instead of DomAccessHelper.getAttribute", + message: "Use native DOM method instead of DomAccessHelper.getAttribute", }, ], }, @@ -71,8 +66,7 @@ describe("dom-access-helper", () => { output: `const el = element.querySelector('.foo');`, errors: [ { - message: - "Use native DOM method instead of DomAccessHelper.querySelector", + message: "Use native DOM method instead of DomAccessHelper.querySelector", }, ], }, @@ -81,8 +75,7 @@ describe("dom-access-helper", () => { output: `const els = element.querySelectorAll('.foo');`, errors: [ { - message: - "Use native DOM method instead of DomAccessHelper.querySelectorAll", + message: "Use native DOM method instead of DomAccessHelper.querySelectorAll", }, ], }, diff --git a/packages/storefront-eslint-rules/test/plugin-manager.test.js b/packages/storefront-eslint-rules/test/plugin-manager.test.js index d234481..10a1208 100644 --- a/packages/storefront-eslint-rules/test/plugin-manager.test.js +++ b/packages/storefront-eslint-rules/test/plugin-manager.test.js @@ -33,8 +33,7 @@ describe("plugin-manager", () => { output: "const PluginManager = window.PluginManager;", errors: [ { - message: - "Import from plugin.manager should use window.PluginManager", + message: "Import from plugin.manager should use window.PluginManager", }, ], }, diff --git a/packages/storefront-eslint-rules/test/query-string.test.js b/packages/storefront-eslint-rules/test/query-string.test.js index d7a370a..3512803 100644 --- a/packages/storefront-eslint-rules/test/query-string.test.js +++ b/packages/storefront-eslint-rules/test/query-string.test.js @@ -30,8 +30,7 @@ describe("query-string", () => { output: "", errors: [ { - message: - "Remove querystring import as URLSearchParams is used instead", + message: "Remove querystring import as URLSearchParams is used instead", }, ], }, @@ -39,16 +38,12 @@ describe("query-string", () => { code: "const params = querystring.parse(window.location.search);", output: "const params = Object.fromEntries(new URLSearchParams(window.location.search).entries());", - errors: [ - { message: "Use URLSearchParams instead of querystring.parse" }, - ], + errors: [{ message: "Use URLSearchParams instead of querystring.parse" }], }, { code: `const params = querystring.stringify({ foo: 'bar' });`, output: `const params = new URLSearchParams({ foo: 'bar' }).toString();`, - errors: [ - { message: "Use URLSearchParams instead of querystring.stringify" }, - ], + errors: [{ message: "Use URLSearchParams instead of querystring.stringify" }], }, ], }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 275fcf9..01c34b7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,9 +17,12 @@ importers: .: devDependencies: - '@biomejs/biome': - specifier: ~2.3.11 - version: 2.3.11 + oxfmt: + specifier: ^0.33.0 + version: 0.33.0 + oxlint: + specifier: ^1.48.0 + version: 1.48.0 packages/admin-eslint-rules: dependencies: @@ -63,59 +66,6 @@ packages: resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@biomejs/biome@2.3.11': - resolution: {integrity: sha512-/zt+6qazBWguPG6+eWmiELqO+9jRsMZ/DBU3lfuU2ngtIQYzymocHhKiZRyrbra4aCOoyTg/BmY+6WH5mv9xmQ==} - engines: {node: '>=14.21.3'} - hasBin: true - - '@biomejs/cli-darwin-arm64@2.3.11': - resolution: {integrity: sha512-/uXXkBcPKVQY7rc9Ys2CrlirBJYbpESEDme7RKiBD6MmqR2w3j0+ZZXRIL2xiaNPsIMMNhP1YnA+jRRxoOAFrA==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [darwin] - - '@biomejs/cli-darwin-x64@2.3.11': - resolution: {integrity: sha512-fh7nnvbweDPm2xEmFjfmq7zSUiox88plgdHF9OIW4i99WnXrAC3o2P3ag9judoUMv8FCSUnlwJCM1B64nO5Fbg==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [darwin] - - '@biomejs/cli-linux-arm64-musl@2.3.11': - resolution: {integrity: sha512-XPSQ+XIPZMLaZ6zveQdwNjbX+QdROEd1zPgMwD47zvHV+tCGB88VH+aynyGxAHdzL+Tm/+DtKST5SECs4iwCLg==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - - '@biomejs/cli-linux-arm64@2.3.11': - resolution: {integrity: sha512-l4xkGa9E7Uc0/05qU2lMYfN1H+fzzkHgaJoy98wO+b/7Gl78srbCRRgwYSW+BTLixTBrM6Ede5NSBwt7rd/i6g==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - - '@biomejs/cli-linux-x64-musl@2.3.11': - resolution: {integrity: sha512-vU7a8wLs5C9yJ4CB8a44r12aXYb8yYgBn+WeyzbMjaCMklzCv1oXr8x+VEyWodgJt9bDmhiaW/I0RHbn7rsNmw==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - - '@biomejs/cli-linux-x64@2.3.11': - resolution: {integrity: sha512-/1s9V/H3cSe0r0Mv/Z8JryF5x9ywRxywomqZVLHAoa/uN0eY7F8gEngWKNS5vbbN/BsfpCG5yeBT5ENh50Frxg==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - - '@biomejs/cli-win32-arm64@2.3.11': - resolution: {integrity: sha512-PZQ6ElCOnkYapSsysiTy0+fYX+agXPlWugh6+eQ6uPKI3vKAqNp6TnMhoM3oY2NltSB89hz59o8xIfOdyhi9Iw==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [win32] - - '@biomejs/cli-win32-x64@2.3.11': - resolution: {integrity: sha512-43VrG813EW+b5+YbDbz31uUsheX+qFKCpXeY9kfdAx+ww3naKxeVkTD9zLIWxUPfJquANMHrmW3wbe/037G0Qg==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [win32] - '@csstools/css-parser-algorithms@3.0.5': resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} engines: {node: '>=18'} @@ -370,6 +320,234 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@oxfmt/binding-android-arm-eabi@0.33.0': + resolution: {integrity: sha512-ML6qRW8/HiBANteqfyFAR1Zu0VrJu+6o4gkPLsssq74hQ7wDMkufBYJXI16PGSERxEYNwKxO5fesCuMssgTv9w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.33.0': + resolution: {integrity: sha512-WimmcyrGpTOntj7F7CO9RMssncOKYall93nBnzJbI2ZZDhVRuCkvFwTpwz80cZqwYm5udXRXfF40ZXcCxjp9jg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.33.0': + resolution: {integrity: sha512-PorspsX9O5ISstVaq34OK4esN0LVcuU4DVg+XuSqJsfJ//gn6z6WH2Tt7s0rTQaqEcp76g7+QdWQOmnJDZsEVg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.33.0': + resolution: {integrity: sha512-8278bqQtOcHRPhhzcqwN9KIideut+cftBjF8d2TOsSQrlsJSFx41wCCJ38mFmH9NOmU1M+x9jpeobHnbRP1okw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.33.0': + resolution: {integrity: sha512-BiqYVwWFHLf5dkfg0aCKsXa9rpi//vH1+xePCpd7Ulz9yp9pJKP4DWgS5g+OW8MaqOtt7iyAszhxtk/j1nDKHQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.33.0': + resolution: {integrity: sha512-oAVmmurXx0OKbNOVv71oK92LsF1LwYWpnhDnX0VaAy/NLsCKf4B7Zo7lxkJh80nfhU20TibcdwYfoHVaqlStPQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.33.0': + resolution: {integrity: sha512-YB6S8CiRol59oRxnuclJiWoV6l+l8ru/NsuQNYjXZnnPXfSTXKtMLWHCnL/figpCFYA1E7JyjrBbar1qxe2aZg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.33.0': + resolution: {integrity: sha512-hrYy+FpWoB6N24E9oGRimhVkqlls9yeqcRmQakEPUHoAbij6rYxsHHYIp3+FHRiQZFAOUxWKn/CCQoy/Mv3Dgw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-arm64-musl@0.33.0': + resolution: {integrity: sha512-O1YIzymGRdWj9cG5iVTjkP7zk9/hSaVN8ZEbqMnWZjLC1phXlv54cUvANGGXndgJp2JS4W9XENn7eo5I4jZueg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-ppc64-gnu@0.33.0': + resolution: {integrity: sha512-2lrkNe+B0w1tCgQTaozfUNQCYMbqKKCGcnTDATmWCZzO77W2sh+3n04r1lk9Q1CK3bI+C3fPwhFPUR2X2BvlyQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-gnu@0.33.0': + resolution: {integrity: sha512-8DSG1q0M6097vowHAkEyHnKed75/BWr1IBtgCJfytnWQg+Jn1X4DryhfjqonKZOZiv74oFQl5J8TCbdDuXXdtQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-musl@0.33.0': + resolution: {integrity: sha512-eWaxnpPz7+p0QGUnw7GGviVBDOXabr6Cd0w7S/vnWTqQo9z1VroT7XXFnJEZ3dBwxMB9lphyuuYi/GLTCxqxlg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-s390x-gnu@0.33.0': + resolution: {integrity: sha512-+mH8cQTqq+Tu2CdoB2/Wmk9CqotXResi+gPvXpb+AAUt/LiwpicTQqSolMheQKogkDTYHPuUiSN23QYmy7IXNQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxfmt/binding-linux-x64-gnu@0.33.0': + resolution: {integrity: sha512-fjyslAYAPE2+B6Ckrs5LuDQ6lB1re5MumPnzefAXsen3JGwiRilra6XdjUmszTNoExJKbewoxxd6bcLSTpkAJQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-linux-x64-musl@0.33.0': + resolution: {integrity: sha512-ve/jGBlTt35Jl/I0A0SfCQX3wKnadzPDdyOFEwe2ZgHHIT9uhqhAv1PaVXTenSBpauICEWYH8mWy+ittzlVE/A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-openharmony-arm64@0.33.0': + resolution: {integrity: sha512-lsWRgY9e+uPvwXnuDiJkmJ2Zs3XwwaQkaALJ3/SXU9kjZP0Qh8/tGW8Tk/Z6WL32sDxx+aOK5HuU7qFY9dHJhg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.33.0': + resolution: {integrity: sha512-w8AQHyGDRZutxtQ7IURdBEddwFrtHQiG6+yIFpNJ4HiMyYEqeAWzwBQBfwSAxtSNh6Y9qqbbc1OM2mHN6AB3Uw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.33.0': + resolution: {integrity: sha512-j2X4iumKVwDzQtUx3JBDkaydx6eLuncgUZPl2ybZ8llxJMFbZIniws70FzUQePMfMtzLozIm7vo4bjkvQFsOzw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.33.0': + resolution: {integrity: sha512-lsBQxbepASwOBUh3chcKAjU+jVAQhLElbPYiagIq26cU8vA9Bttj6t20bMvCQCw31m440IRlNhrK7NpnUI8mzA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.48.0': + resolution: {integrity: sha512-1Pz/stJvveO9ZO7ll4ZoEY3f6j2FiUgBLBcCRCiW6ylId9L9UKs+gn3X28m3eTnoiFCkhKwmJJ+VO6vwsu7Qtg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.48.0': + resolution: {integrity: sha512-Zc42RWGE8huo6Ht0lXKjd0NH2lWNmimQHUmD0JFcvShLOuwN+RSEE/kRakc2/0LIgOUuU/R7PaDMCOdQlPgNUQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.48.0': + resolution: {integrity: sha512-jgZs563/4vaG5jH2RSt2TSh8A2jwsFdmhLXrElMdm3Mmto0HPf85FgInLSNi9HcwzQFvkYV8JofcoUg2GH1HTA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.48.0': + resolution: {integrity: sha512-kvo87BujEUjCJREuWDC4aPh1WoXCRFFWE4C7uF6wuoMw2f6N2hypA/cHHcYn9DdL8R2RrgUZPefC8JExyeIMKA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.48.0': + resolution: {integrity: sha512-eyzzPaHQKn0RIM+ueDfgfJF2RU//Wp4oaKs2JVoVYcM5HjbCL36+O0S3wO5Xe1NWpcZIG3cEHc/SuOCDRqZDSg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.48.0': + resolution: {integrity: sha512-p3kSloztK7GRO7FyO3u38UCjZxQTl92VaLDsMQAq0eGoiNmeeEF1KPeE4+Fr+LSkQhF8WvJKSuls6TwOlurdPA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.48.0': + resolution: {integrity: sha512-uWM+wiTqLW/V0ZmY/eyTWs8ykhIkzU+K2tz/8m35YepYEzohiUGRbnkpAFXj2ioXpQL+GUe5vmM3SLH6ozlfFw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.48.0': + resolution: {integrity: sha512-OhQNPjs/OICaYqxYJjKKMaIY7p3nJ9IirXcFoHKD+CQE1BZFCeUUAknMzUeLclDCfudH9Vb/UgjFm8+ZM5puAg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-arm64-musl@1.48.0': + resolution: {integrity: sha512-adu5txuwGvQ4C4fjYHJD+vnY+OCwCixBzn7J3KF3iWlVHBBImcosSv+Ye+fbMMJui4HGjifNXzonjKm9pXmOiw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-ppc64-gnu@1.48.0': + resolution: {integrity: sha512-inlQQRUnHCny/7b7wA6NjEoJSSZPNea4qnDhWyeqBYWx8ukf2kzNDSiamfhOw6bfAYPm/PVlkVRYaNXQbkLeTQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxlint/binding-linux-riscv64-gnu@1.48.0': + resolution: {integrity: sha512-YiJx6sW6bYebQDZRVWLKm/Drswx/hcjIgbLIhULSn0rRcBKc7d9V6mkqPjKDbhcxJgQD5Zi0yVccJiOdF40AWA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-riscv64-musl@1.48.0': + resolution: {integrity: sha512-zwSqxMgmb2ITamNfDv9Q9EKBc/4ZhCBP9gkg2hhcgR6sEVGPUDl1AKPC89CBKMxkmPUi3685C38EvqtZn5OtHw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-s390x-gnu@1.48.0': + resolution: {integrity: sha512-c/+2oUWAOsQB5JTem0rW8ODlZllF6pAtGSGXoLSvPTonKI1vAwaKhD9Qw1X36jRbcI3Etkpu/9z/RRjMba8vFQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxlint/binding-linux-x64-gnu@1.48.0': + resolution: {integrity: sha512-PhauDqeFW5DGed6QxCY5lXZYKSlcBdCXJnH03ZNU6QmDZ0BFM/zSy1oPT2MNb1Afx1G6yOOVk8ErjWsQ7c59ng==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-linux-x64-musl@1.48.0': + resolution: {integrity: sha512-6d7LIFFZGiavbHndhf1cK9kG9qmy2Dmr37sV9Ep7j3H+ciFdKSuOzdLh85mEUYMih+b+esMDlF5DU0WQRZPQjw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-openharmony-arm64@1.48.0': + resolution: {integrity: sha512-r+0KK9lK6vFp3tXAgDMOW32o12dxvKS3B9La1uYMGdWAMoSeu2RzG34KmzSpXu6MyLDl4aSVyZLFM8KGdEjwaw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.48.0': + resolution: {integrity: sha512-Nkw/MocyT3HSp0OJsKPXrcbxZqSPMTYnLLfsqsoiFKoL1ppVNL65MFa7vuTxJehPlBkjy+95gUgacZtuNMECrg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.48.0': + resolution: {integrity: sha512-reO1SpefvRmeZSP+WeyWkQd1ArxxDD1MyKgMUKuB8lNuUoxk9QEohYtKnsfsxJuFwMT0JTr7p9wZjouA85GzGQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.48.0': + resolution: {integrity: sha512-T6zwhfcsrorqAybkOglZdPkTLlEwipbtdO1qjE+flbawvwOMsISoyiuaa7vM7zEyfq1hmDvMq1ndvkYFioranA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rollup/rollup-android-arm-eabi@4.55.2': resolution: {integrity: sha512-21J6xzayjy3O6NdnlO6aXi/urvSRjm6nCI6+nF6ra2YofKruGixN9kfT+dt55HVNwfDmpDHJcaS3JuP/boNnlA==} cpu: [arm] @@ -991,6 +1169,21 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + oxfmt@0.33.0: + resolution: {integrity: sha512-ogxBXA9R4BFeo8F1HeMIIxHr5kGnQwKTYZ5k131AEGOq1zLxInNhvYSpyRQ+xIXVMYfCN7yZHKff/lb5lp4auQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + oxlint@1.48.0: + resolution: {integrity: sha512-m5vyVBgPtPhVCJc3xI//8je9lRc8bYuYB4R/1PH3VPGOjA4vjVhkHtyJukdEjYEjwrw4Qf1eIf+pP9xvfhfMow==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.12.2' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -1164,6 +1357,10 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + tinyrainbow@3.0.3: resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} @@ -1292,41 +1489,6 @@ snapshots: '@babel/helper-validator-identifier@7.27.1': {} - '@biomejs/biome@2.3.11': - optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.3.11 - '@biomejs/cli-darwin-x64': 2.3.11 - '@biomejs/cli-linux-arm64': 2.3.11 - '@biomejs/cli-linux-arm64-musl': 2.3.11 - '@biomejs/cli-linux-x64': 2.3.11 - '@biomejs/cli-linux-x64-musl': 2.3.11 - '@biomejs/cli-win32-arm64': 2.3.11 - '@biomejs/cli-win32-x64': 2.3.11 - - '@biomejs/cli-darwin-arm64@2.3.11': - optional: true - - '@biomejs/cli-darwin-x64@2.3.11': - optional: true - - '@biomejs/cli-linux-arm64-musl@2.3.11': - optional: true - - '@biomejs/cli-linux-arm64@2.3.11': - optional: true - - '@biomejs/cli-linux-x64-musl@2.3.11': - optional: true - - '@biomejs/cli-linux-x64@2.3.11': - optional: true - - '@biomejs/cli-win32-arm64@2.3.11': - optional: true - - '@biomejs/cli-win32-x64@2.3.11': - optional: true - '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': dependencies: '@csstools/css-tokenizer': 3.0.4 @@ -1497,6 +1659,120 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 + '@oxfmt/binding-android-arm-eabi@0.33.0': + optional: true + + '@oxfmt/binding-android-arm64@0.33.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.33.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.33.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.33.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.33.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.33.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.33.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.33.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.33.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.33.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.33.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.33.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.33.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.33.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.33.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.33.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.33.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.33.0': + optional: true + + '@oxlint/binding-android-arm-eabi@1.48.0': + optional: true + + '@oxlint/binding-android-arm64@1.48.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.48.0': + optional: true + + '@oxlint/binding-darwin-x64@1.48.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.48.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.48.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.48.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.48.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.48.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.48.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.48.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.48.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.48.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.48.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.48.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.48.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.48.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.48.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.48.0': + optional: true + '@rollup/rollup-android-arm-eabi@4.55.2': optional: true @@ -2063,6 +2339,52 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + oxfmt@0.33.0: + dependencies: + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.33.0 + '@oxfmt/binding-android-arm64': 0.33.0 + '@oxfmt/binding-darwin-arm64': 0.33.0 + '@oxfmt/binding-darwin-x64': 0.33.0 + '@oxfmt/binding-freebsd-x64': 0.33.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.33.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.33.0 + '@oxfmt/binding-linux-arm64-gnu': 0.33.0 + '@oxfmt/binding-linux-arm64-musl': 0.33.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.33.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.33.0 + '@oxfmt/binding-linux-riscv64-musl': 0.33.0 + '@oxfmt/binding-linux-s390x-gnu': 0.33.0 + '@oxfmt/binding-linux-x64-gnu': 0.33.0 + '@oxfmt/binding-linux-x64-musl': 0.33.0 + '@oxfmt/binding-openharmony-arm64': 0.33.0 + '@oxfmt/binding-win32-arm64-msvc': 0.33.0 + '@oxfmt/binding-win32-ia32-msvc': 0.33.0 + '@oxfmt/binding-win32-x64-msvc': 0.33.0 + + oxlint@1.48.0: + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.48.0 + '@oxlint/binding-android-arm64': 1.48.0 + '@oxlint/binding-darwin-arm64': 1.48.0 + '@oxlint/binding-darwin-x64': 1.48.0 + '@oxlint/binding-freebsd-x64': 1.48.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.48.0 + '@oxlint/binding-linux-arm-musleabihf': 1.48.0 + '@oxlint/binding-linux-arm64-gnu': 1.48.0 + '@oxlint/binding-linux-arm64-musl': 1.48.0 + '@oxlint/binding-linux-ppc64-gnu': 1.48.0 + '@oxlint/binding-linux-riscv64-gnu': 1.48.0 + '@oxlint/binding-linux-riscv64-musl': 1.48.0 + '@oxlint/binding-linux-s390x-gnu': 1.48.0 + '@oxlint/binding-linux-x64-gnu': 1.48.0 + '@oxlint/binding-linux-x64-musl': 1.48.0 + '@oxlint/binding-openharmony-arm64': 1.48.0 + '@oxlint/binding-win32-arm64-msvc': 1.48.0 + '@oxlint/binding-win32-ia32-msvc': 1.48.0 + '@oxlint/binding-win32-x64-msvc': 1.48.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -2272,6 +2594,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinypool@2.1.0: {} + tinyrainbow@3.0.3: {} to-regex-range@5.0.1: