Repository: rolldown/rolldown
Pull request #4429: feat: move filter related utils to `@rolldown/pluginutils`
Author: login: IWANABETHATGUY
Labels: name: needs-triage
Created: 2025-05-06T15:28:24Z | Merged: 2025-05-07T17:35:28Z

<!-- Thank you for contributing! -->

### Description

<!-- Please insert your description here and provide especially info about the "what" this PR is solving -->


<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **New Features**
  - Introduced a new utility package for building composable filter expressions, providing flexible filtering options for plugins.

- **Refactor**
  - Updated internal code to use the new utility package for filter expressions, replacing previous local implementations.

- **Chores**
  - Added configuration files and scripts to support building and publishing the new utility package.
  - Updated dependencies and TypeScript settings for improved module compatibility.
  - Enhanced CI workflow to build the new utility package during testing.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/.github/workflows/benchmark-node.yml b/.github/workflows/benchmark-node.yml
index 30bb7df4ed1a..65bd789aa2e3 100644
--- a/.github/workflows/benchmark-node.yml
+++ b/.github/workflows/benchmark-node.yml
@@ -68,7 +68,9 @@ jobs:
         run: just setup-bench
 
       - name: Build packages
-        run: just build native release
+        run: |
+          pnpm --filter '@rolldown/pluginutils' build
+          just build native release
 
       - name: Run benchmarks
         run: pnpm --filter bench run bench-ci
diff --git a/.github/workflows/reusable-browser-test.yml b/.github/workflows/reusable-browser-test.yml
index c36e4e49b767..a15b5ab35796 100644
--- a/.github/workflows/reusable-browser-test.yml
+++ b/.github/workflows/reusable-browser-test.yml
@@ -38,6 +38,9 @@ jobs:
       - name: Add WASI target
         run: rustup target add wasm32-wasip1-threads
 
+      - name: Build `@rolldown/pluginutils`
+        run: pnpm --filter '@rolldown/pluginutils' build
+
       - name: Build Browser Rolldown
         run: just build browser release
 
diff --git a/.github/workflows/reusable-node-test.yml b/.github/workflows/reusable-node-test.yml
index 821bb0cc2da8..dfaf9d36f7ad 100644
--- a/.github/workflows/reusable-node-test.yml
+++ b/.github/workflows/reusable-node-test.yml
@@ -35,6 +35,9 @@ jobs:
       - name: Setup Node For Development
         uses: ./.github/actions/setup-node
 
+      - name: Build `@rolldown/pluginutils`
+        run: pnpm --filter '@rolldown/pluginutils' build
+
       - name: Build Native Rolldown
         run: just build native
 
diff --git a/packages/pluginutils/build.mjs b/packages/pluginutils/build.mjs
new file mode 100644
index 000000000000..d3d014e1d68e
--- /dev/null
+++ b/packages/pluginutils/build.mjs
@@ -0,0 +1,24 @@
+import { spawnSync } from 'node:child_process';
+import * as fs from 'node:fs';
+import * as path from 'node:path';
+import { fileURLToPath } from 'node:url';
+
+fs.rmSync('dist', { recursive: true, force: true });
+
+const command = 'npm'; // Replace with the command you want to execute
+const args = ['run', 'build:all']; // Replace with any arguments for the command
+
+spawnSync(command, args, {
+  stdio: ['pipe', process.stdout, process.stderr],
+  shell: true,
+});
+
+fs.writeFileSync(
+  path.resolve(
+    path.dirname(fileURLToPath(import.meta.url)),
+    'dist/cjs/package.json',
+  ),
+  `{
+  "type": "commonjs"
+}`,
+);
diff --git a/packages/pluginutils/package.json b/packages/pluginutils/package.json
new file mode 100644
index 000000000000..5aa24d4870c4
--- /dev/null
+++ b/packages/pluginutils/package.json
@@ -0,0 +1,35 @@
+{
+  "name": "@rolldown/pluginutils",
+  "version": "1.0.0-beta.8",
+  "private": true,
+  "license": "MIT",
+  "type": "module",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/rolldown/rolldown.git",
+    "directory": "packages/pluginutils"
+  },
+  "publishConfig": {
+    "access": "public"
+  },
+  "exports": {
+    ".": {
+      "import": "./dist/esm/index.js",
+      "require": "./dist/cjs/index.js",
+      "types": "./dist/cjs/index.d.ts"
+    }
+  },
+  "files": [
+    "dist"
+  ],
+  "devDependencies": {
+    "rimraf": "^5.0.0"
+  },
+  "scripts": {
+    "build": "node build.mjs",
+    "build:all": "npm run build:esm && npm run build:cjs",
+    "build:esm": "tsc -p ./tsconfig.esm.json",
+    "build:cjs": "tsc -p ./tsconfig.cjs.json",
+    "test": "echo \"Error: no test specified\" && exit 1"
+  }
+}
diff --git a/packages/pluginutils/src/index.ts b/packages/pluginutils/src/index.ts
new file mode 100644
index 000000000000..765a1d468695
--- /dev/null
+++ b/packages/pluginutils/src/index.ts
@@ -0,0 +1,226 @@
+type StringOrRegExp = string | RegExp;
+
+// Inline this type to avoid import it from `rolldown`.
+// The only downside is we need to keep it in sync with `rolldown` manually,
+// it is alright since it is pretty stable now.
+type PluginModuleType =
+  | 'js'
+  | 'jsx'
+  | 'ts'
+  | 'tsx'
+  | 'json'
+  | 'text'
+  | 'base64'
+  | 'dataurl'
+  | 'binary'
+  | 'empty'
+  | (string & {});
+
+export type FilterExpressionKind = FilterExpression['kind'];
+
+export type FilterExpression =
+  | And
+  | Or
+  | Not
+  | Id
+  | ModuleType
+  | Code
+  | Include
+  | Exclude;
+
+export type TopLevelFilterExpression = Include | Exclude;
+
+export class And {
+  kind: 'and';
+  args: FilterExpression[];
+  constructor(...args: FilterExpression[]) {
+    if (args.length === 0) {
+      throw new Error('`And` expects at least one operand');
+    }
+    this.args = args;
+    this.kind = 'and';
+  }
+}
+class Or {
+  kind: 'or';
+  args: FilterExpression[];
+  constructor(...args: FilterExpression[]) {
+    if (args.length === 0) {
+      throw new Error('`Or` expects at least one operand');
+    }
+    this.args = args;
+    this.kind = 'or';
+  }
+}
+
+class Not {
+  kind: 'not';
+  expr: FilterExpression;
+  constructor(expr: FilterExpression) {
+    this.expr = expr;
+    this.kind = 'not';
+  }
+}
+
+class Id {
+  kind: 'id';
+  pattern: StringOrRegExp;
+  constructor(pattern: StringOrRegExp) {
+    this.pattern = pattern;
+    this.kind = 'id';
+  }
+}
+
+class ModuleType {
+  kind: 'moduleType';
+  pattern: PluginModuleType;
+  constructor(pattern: PluginModuleType) {
+    this.pattern = pattern;
+    this.kind = 'moduleType';
+  }
+}
+
+class Code {
+  kind: 'code';
+  pattern: StringOrRegExp;
+  constructor(expr: StringOrRegExp) {
+    this.pattern = expr;
+    this.kind = 'code';
+  }
+}
+
+class Include {
+  kind: 'include';
+  expr: FilterExpression;
+  constructor(expr: FilterExpression) {
+    this.expr = expr;
+    this.kind = 'include';
+  }
+}
+
+class Exclude {
+  kind: 'exclude';
+  expr: FilterExpression;
+  constructor(expr: FilterExpression) {
+    this.expr = expr;
+    this.kind = 'exclude';
+  }
+}
+
+export function and(...args: FilterExpression[]): And {
+  return new And(...args);
+}
+
+export function or(...args: FilterExpression[]): Or {
+  return new Or(...args);
+}
+
+export function not(expr: FilterExpression): Not {
+  return new Not(expr);
+}
+
+export function id(pattern: StringOrRegExp): Id {
+  return new Id(pattern);
+}
+
+export function moduleType(pattern: PluginModuleType): ModuleType {
+  return new ModuleType(pattern);
+}
+
+export function code(pattern: StringOrRegExp): Code {
+  return new Code(pattern);
+}
+
+export function include(expr: FilterExpression): Include {
+  return new Include(expr);
+}
+
+export function exclude(expr: FilterExpression): Exclude {
+  return new Exclude(expr);
+}
+
+export function interpreter(
+  exprs: TopLevelFilterExpression | TopLevelFilterExpression[],
+  code?: string,
+  id?: string,
+  moduleType?: PluginModuleType,
+): boolean {
+  let arr: TopLevelFilterExpression[] = [];
+  if (Array.isArray(exprs)) {
+    arr = exprs;
+  } else {
+    arr = [exprs];
+  }
+  return interpreterImpl(arr, code, id, moduleType);
+}
+
+export function interpreterImpl(
+  expr: TopLevelFilterExpression[],
+  code?: string,
+  id?: string,
+  moduleType?: PluginModuleType,
+): boolean {
+  let hasInclude = false;
+  for (const e of expr) {
+    switch (e.kind) {
+      case 'include': {
+        hasInclude = true;
+        if (exprInterpreter(e.expr, code, id, moduleType)) {
+          return true;
+        }
+        break;
+      }
+      case 'exclude': {
+        if (exprInterpreter(e.expr, code, id, moduleType)) {
+          return false;
+        }
+        break;
+      }
+    }
+  }
+  return !hasInclude;
+}
+
+export function exprInterpreter(
+  expr: FilterExpression,
+  code?: string,
+  id?: string,
+  moduleType?: PluginModuleType,
+): boolean {
+  switch (expr.kind) {
+    case 'and': {
+      return expr.args.every((e) => exprInterpreter(e, code, id, moduleType));
+    }
+    case 'or': {
+      return expr.args.some((e) => exprInterpreter(e, code, id, moduleType));
+    }
+    case 'not': {
+      return !exprInterpreter(expr.expr, code, id, moduleType);
+    }
+    case 'id': {
+      if (id === undefined) {
+        throw new Error('`id` is required for `id` expression');
+      }
+      return typeof expr.pattern === 'string'
+        ? id === expr.pattern
+        : expr.pattern.test(id);
+    }
+    case 'moduleType': {
+      if (moduleType === undefined) {
+        throw new Error('`moduleType` is required for `moduleType` expression');
+      }
+      return moduleType === expr.pattern;
+    }
+    case 'code': {
+      if (code === undefined) {
+        throw new Error('`code` is required for `code` expression');
+      }
+      return typeof expr.pattern === 'string'
+        ? code.includes(expr.pattern)
+        : expr.pattern.test(code);
+    }
+    default: {
+      throw new Error(`Expression kind ${expr.kind} is not expected.`);
+    }
+  }
+}
diff --git a/packages/pluginutils/tsconfig.base.json b/packages/pluginutils/tsconfig.base.json
new file mode 100644
index 000000000000..90a96c0d80e0
--- /dev/null
+++ b/packages/pluginutils/tsconfig.base.json
@@ -0,0 +1,22 @@
+{
+  "compilerOptions": {
+    "incremental": false, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
+
+    /* Language and Environment */
+    "target": "ESNext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
+    "moduleResolution": "node", /* Specify module resolution strategy. */
+    /* Modules */
+    "module": "ESNext", /* Specify what module code is generated. */
+    "rootDir": "./src", /* Specify the root folder within your source files. */
+    "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
+    "outDir": "./dist/esm", /* Specify an output folder for all emitted files. */
+    "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
+    // "preserveSymlinks": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
+    "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
+
+    /* Type Checking */
+    "strict": true, /* Enable all strict type-checking options. */
+    "skipLibCheck": true /* Skip type checking all .d.ts files. */
+  },
+  "include": ["src"]
+}
diff --git a/packages/pluginutils/tsconfig.cjs.json b/packages/pluginutils/tsconfig.cjs.json
new file mode 100644
index 000000000000..b57f43bfdc25
--- /dev/null
+++ b/packages/pluginutils/tsconfig.cjs.json
@@ -0,0 +1,7 @@
+{
+  "extends": "./tsconfig.base.json",
+  "compilerOptions": {
+    "module": "commonjs", /* Specify what module code is generated. */
+    "outDir": "./dist/cjs" /* Specify an output folder for all emitted files. */
+  }
+}
diff --git a/packages/pluginutils/tsconfig.esm.json b/packages/pluginutils/tsconfig.esm.json
new file mode 100644
index 000000000000..88fe68148e33
--- /dev/null
+++ b/packages/pluginutils/tsconfig.esm.json
@@ -0,0 +1,7 @@
+{
+  "extends": "./tsconfig.base.json",
+  "compilerOptions": {
+    "module": "ESNext", /* Specify what module code is generated. */
+    "outDir": "./dist/esm" /* Specify an output folder for all emitted files. */
+  }
+}
diff --git a/packages/rolldown/package.json b/packages/rolldown/package.json
index 614baafdf73b..10ed80dc1d82 100644
--- a/packages/rolldown/package.json
+++ b/packages/rolldown/package.json
@@ -105,7 +105,8 @@
   },
   "dependencies": {
     "@oxc-project/types": "catalog:",
-    "ansis": "^3.17.0"
+    "ansis": "^3.17.0",
+    "@rolldown/pluginutils": "workspace:*"
   },
   "peerDependencies": {
     "@oxc-project/runtime": "catalog:"
diff --git a/packages/rolldown/src/filter-index.ts b/packages/rolldown/src/filter-index.ts
index 5a60b2e48d5f..dd0111c5d4fb 100644
--- a/packages/rolldown/src/filter-index.ts
+++ b/packages/rolldown/src/filter-index.ts
@@ -1,127 +1,11 @@
-import type { ModuleType as PluginModuleType } from './plugin';
-import type { StringOrRegExp } from './types/utils';
-
-export type FilterExpressionKind = FilterExpression['kind'];
-
-export type FilterExpression =
-  | And
-  | Or
-  | Not
-  | Id
-  | ModuleType
-  | Code
-  | Include
-  | Exclude;
-
-export type TopLevelFilterExpression = Include | Exclude;
-
-export class And {
-  kind: 'and';
-  args: FilterExpression[];
-  constructor(...args: FilterExpression[]) {
-    if (args.length === 0) {
-      throw new Error('`And` expects at least one operand');
-    }
-    this.args = args;
-    this.kind = 'and';
-  }
-}
-class Or {
-  kind: 'or';
-  args: FilterExpression[];
-  constructor(...args: FilterExpression[]) {
-    if (args.length === 0) {
-      throw new Error('`Or` expects at least one operand');
-    }
-    this.args = args;
-    this.kind = 'or';
-  }
-}
-
-class Not {
-  kind: 'not';
-  expr: FilterExpression;
-  constructor(expr: FilterExpression) {
-    this.expr = expr;
-    this.kind = 'not';
-  }
-}
-
-class Id {
-  kind: 'id';
-  pattern: StringOrRegExp;
-  constructor(pattern: StringOrRegExp) {
-    this.pattern = pattern;
-    this.kind = 'id';
-  }
-}
-
-class ModuleType {
-  kind: 'moduleType';
-  pattern: PluginModuleType;
-  constructor(pattern: PluginModuleType) {
-    this.pattern = pattern;
-    this.kind = 'moduleType';
-  }
-}
-
-class Code {
-  kind: 'code';
-  pattern: StringOrRegExp;
-  constructor(expr: StringOrRegExp) {
-    this.pattern = expr;
-    this.kind = 'code';
-  }
-}
-
-class Include {
-  kind: 'include';
-  expr: FilterExpression;
-  constructor(expr: FilterExpression) {
-    this.expr = expr;
-    this.kind = 'include';
-  }
-}
-
-class Exclude {
-  kind: 'exclude';
-  expr: FilterExpression;
-  constructor(expr: FilterExpression) {
-    this.expr = expr;
-    this.kind = 'exclude';
-  }
-}
-
-export function and(...args: FilterExpression[]): And {
-  return new And(...args);
-}
-
-export function or(...args: FilterExpression[]): Or {
-  return new Or(...args);
-}
-
-export function not(expr: FilterExpression): Not {
-  return new Not(expr);
-}
-
-export function id(pattern: StringOrRegExp): Id {
-  return new Id(pattern);
-}
-
-export function moduleType(pattern: PluginModuleType): ModuleType {
-  return new ModuleType(pattern);
-}
-
-export function code(pattern: StringOrRegExp): Code {
-  return new Code(pattern);
-}
-
-export function include(expr: FilterExpression): Include {
-  return new Include(expr);
-}
-
-export function exclude(expr: FilterExpression): Exclude {
-  return new Exclude(expr);
-}
-
+export {
+  and,
+  code,
+  exclude,
+  id,
+  include,
+  moduleType,
+  not,
+  or,
+} from '@rolldown/pluginutils';
 export { withFilter } from './plugin';
diff --git a/packages/rolldown/src/plugin/bindingify-hook-filter.ts b/packages/rolldown/src/plugin/bindingify-hook-filter.ts
index 97b6f5c6ec27..73cc651f18a1 100644
--- a/packages/rolldown/src/plugin/bindingify-hook-filter.ts
+++ b/packages/rolldown/src/plugin/bindingify-hook-filter.ts
@@ -1,7 +1,7 @@
+import type { FilterExpression } from '@rolldown/pluginutils';
+import * as filter from '@rolldown/pluginutils';
 import * as R from 'remeda';
 import type { BindingFilterToken, BindingHookFilter } from '../binding.d';
-import type { FilterExpression } from '../filter-index';
-import * as filter from '../filter-index';
 import type { StringOrRegExp } from '../types/utils';
 import { arraify } from '../utils/misc';
 import type { HookFilterExtension } from '.';
diff --git a/packages/rolldown/src/plugin/hook-filter.ts b/packages/rolldown/src/plugin/hook-filter.ts
index e64f75407cdd..f30853e1726c 100644
--- a/packages/rolldown/src/plugin/hook-filter.ts
+++ b/packages/rolldown/src/plugin/hook-filter.ts
@@ -1,4 +1,4 @@
-import type { TopLevelFilterExpression } from '../filter-index';
+import type { TopLevelFilterExpression } from '@rolldown/pluginutils';
 import type { ModuleType } from '../index';
 import type { MaybeArray } from '../types/utils';
 import type { StringOrRegExp } from '../types/utils';
diff --git a/packages/rolldown/tsconfig.check.json b/packages/rolldown/tsconfig.check.json
index 940b1643ed17..10065f628c24 100644
--- a/packages/rolldown/tsconfig.check.json
+++ b/packages/rolldown/tsconfig.check.json
@@ -3,8 +3,8 @@
   // https://github.com/vitejs/vite/blob/1465b2064ee23ac5df5414b13355a394ccd931af/packages/vite/tsconfig.check.json
   "compilerOptions": {
     "target": "ES2020",
-    "moduleResolution": "node16",
-    "module": "node16",
+    "moduleResolution": "bundler",
+    "module": "ESNext",
     "lib": ["ES2020", "ESNext.Disposable"], // ES2020 is very conservative check for client types, could be bumped if needed
     "types": ["node"], // Avoid checking unrelated node_modules types
     "noEmit": true,
diff --git a/packages/test-dev-server/tests/fixtures.test.ts b/packages/test-dev-server/tests/fixtures.test.ts
index 5d9c707437e1..9a09b4ed9b33 100644
--- a/packages/test-dev-server/tests/fixtures.test.ts
+++ b/packages/test-dev-server/tests/fixtures.test.ts
@@ -35,7 +35,7 @@ function main() {
       projectName,
     );
     copyProjectToTmp(projectName);
-    await execa('pnpm install', {
+    await execa('pnpm install --no-frozen-lockfile', {
       cwd: tmpProjectPath,
       shell: true,
       stdio: 'inherit',
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 205cb7b286ae..7cc34c2342b2 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -290,6 +290,12 @@ importers:
 
   packages/debug: {}
 
+  packages/pluginutils:
+    devDependencies:
+      rimraf:
+        specifier: ^5.0.0
+        version: 5.0.10
+
   packages/rolldown:
     dependencies:
       '@oxc-project/runtime':
@@ -298,6 +304,9 @@ importers:
       '@oxc-project/types':
         specifier: 'catalog:'
         version: 0.68.1
+      '@rolldown/pluginutils':
+        specifier: workspace:*
+        version: link:../pluginutils
       ansis:
         specifier: ^3.17.0
         version: 3.17.0
@@ -569,12 +578,6 @@ importers:
         specifier: workspace:*
         version: link:../../..
 
-  packages/test-dev-server/tests/tmp/fixtures/basic:
-    devDependencies:
-      '@rolldown/test-dev-server':
-        specifier: workspace:*
-        version: link:../../../..
-
   packages/testing: {}
 
   scripts:
@@ -6089,7 +6092,11 @@ packages:
   right-pad@1.0.1:
     resolution: {integrity: sha512-bYBjgxmkvTAfgIYy328fmkwhp39v8lwVgWhhrzxPV3yHtcSqyYKe9/XOhvW48UFjATg3VuJbpsp5822ACNvkmw==}
     engines: {node: '>= 0.10'}
-    deprecated: Please use String.prototype.padEnd() over this package.
+    deprecated: Use String.prototype.padEnd() instead
+
+  rimraf@5.0.10:
+    resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==}
+    hasBin: true
 
   rimraf@6.0.1:
     resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==}
@@ -12411,6 +12418,10 @@ snapshots:
 
   right-pad@1.0.1: {}
 
+  rimraf@5.0.10:
+    dependencies:
+      glob: 10.4.5
+
   rimraf@6.0.1:
     dependencies:
       glob: 11.0.1


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 3**

<details>
<summary>🧹 Nitpick comments (2)</summary><blockquote>

<details>
<summary>packages/pluginutils/src/index.ts (1)</summary><blockquote>

`56-90`: **The pattern in Code class constructor has inconsistent naming with other classes.**

In the `Code` class constructor, the parameter is named `expr` but is assigned to `this.pattern`, which is inconsistent with the other pattern-based classes.


```diff
class Code {
  kind: 'code';
  pattern: StringOrRegExp;
-  constructor(expr: StringOrRegExp) {
-    this.pattern = expr;
+  constructor(pattern: StringOrRegExp) {
+    this.pattern = pattern;
    this.kind = 'code';
  }
}
```

</blockquote></details>
<details>
<summary>packages/pluginutils/tsconfig.json (1)</summary><blockquote>

`1-22`: **The TypeScript configuration looks good, but consider adding a few more settings.**

The TypeScript configuration is correctly set up for a modern library with strict typechecking. However, a few additional settings could be beneficial.


Consider adding these TypeScript compiler options:

```diff
{
  "compilerOptions": {
    "incremental": false, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */

    /* Language and Environment */
    "target": "ESNext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
    "moduleResolution": "node", /* Specify module resolution strategy. */
    /* Modules */
    "module": "ESNext", /* Specify what module code is generated. */
    "rootDir": "./src", /* Specify the root folder within your source files. */
    "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
+   "declarationMap": true, /* Create sourcemaps for d.ts files. */
+   "sourceMap": true, /* Create source map files for emitted JavaScript files. */
    "outDir": "./dist", /* Specify an output folder for all emitted files. */
    "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
    // "preserveSymlinks": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
    "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */

    /* Type Checking */
    "strict": true, /* Enable all strict type-checking options. */
+   "noUnusedLocals": true, /* Report errors on unused locals. */
+   "noUnusedParameters": true, /* Report errors on unused parameters. */
    "skipLibCheck": true /* Skip type checking all .d.ts files. */
  },
  "include": ["src"]
}
```

Source maps will help with debugging, and the unused locals/parameters checks will help maintain a cleaner codebase.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 55efe080fcc1a19416bf1c3340b077ec0ebf285b and 780b06d3cbf45eac7fec96449ba29c35114473de.

</details>

<details>
<summary>⛔ Files ignored due to path filters (1)</summary>

* `pnpm-lock.yaml` is excluded by `!**/pnpm-lock.yaml`

</details>

<details>
<summary>📒 Files selected for processing (5)</summary>

* `packages/pluginutils/package.json` (1 hunks)
* `packages/pluginutils/src/index.ts` (1 hunks)
* `packages/pluginutils/tsconfig.json` (1 hunks)
* `packages/rolldown/package.json` (1 hunks)
* `packages/rolldown/src/filter-index.ts` (1 hunks)

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (7)</summary>

* GitHub Check: node-test (windows-latest) / Node Test
* GitHub Check: node-test (ubuntu-latest) / Node Test
* GitHub Check: node-test (macos-latest) / Node Test
* GitHub Check: browser-test (windows-latest) / WASI Test
* GitHub Check: browser-test (macos-latest) / WASI Test
* GitHub Check: browser-test (ubuntu-latest) / WASI Test
* GitHub Check: Benchmark Node

</details>

<details>
<summary>🔇 Additional comments (5)</summary><blockquote>

<details>
<summary>packages/pluginutils/src/index.ts (1)</summary>

`110-140`: **LGTM! The factory functions provide a clean API for creating filter expressions.**

The factory functions are well-implemented and provide a concise, readable way to create filter expressions. This approach gives users a nice alternative to using class constructors directly.

</details>
<details>
<summary>packages/rolldown/package.json (1)</summary>

`108-109`: **LGTM! The dependency on @rolldown/pluginutils is properly added.**

Adding the pluginutils package as a workspace dependency is the right approach for this monorepo structure. This aligns with moving the filter logic to a separate package.

</details>
<details>
<summary>packages/rolldown/src/filter-index.ts (3)</summary>

`11-15`: **Verify type re-exports and TS configuration**  
Re-exporting types (`FilterExpression`, `FilterExpressionKind`, `TopLevelFilterExpression`) is correct, but ensure your TypeScript setup resolves them without errors. Double-check `paths` mappings in `tsconfig.json` and that `declaration` output is enabled for both packages.

---

`1-10`: <details>
<summary>✅ Verification successful</summary>

**Ensure re-exported filter functions align with `@rolldown/pluginutils` API**  
The bulk re-exports look concise, but please verify that all names (`and`, `code`, `exclude`, `id`, `include`, `moduleType`, `not`, `or`) exactly match the named exports in `@rolldown/pluginutils`. A typo or missing export will surface as a build-time or runtime error. Also confirm that `@rolldown/pluginutils` is correctly declared in `packages/rolldown/package.json` (and in your workspace setup).

---

🏁 Script executed:

```shell
#!/bin/bash
# Verify named exports in the pluginutils source
rg -n "export (and|code|exclude|id|include|moduleType|not|or)" packages/pluginutils/src/index.ts

# Check that the dependency is listed in the local package.json
jq -r '.dependencies["@rolldown/pluginutils"]' packages/rolldown/package.json
```

Length of output: 190

---

🏁 Script executed:

```shell
#!/bin/bash
# Display the re-export statements in pluginutils index
echo "=== packages/pluginutils/src/index.ts ==="
sed -n '1,200p' packages/pluginutils/src/index.ts

# List all source files to confirm presence of each filter module
echo
echo "=== packages/pluginutils/src files ==="
ls -1 packages/pluginutils/src
```

Length of output: 3018

---



</details>

**Filter exports and dependency declaration verified**  
All re-exported functions in `packages/rolldown/src/filter-index.ts` exactly match the named exports in `@rolldown/pluginutils`, and the dependency is correctly listed as a workspace dependency in `packages/rolldown/package.json`. No further changes are required.

---

`16-16`: <details>
<summary>✅ Verification successful</summary>

**Confirm `withFilter` exists and integrates properly**  
The only remaining local export is `withFilter`. Please ensure `packages/rolldown/src/plugin.ts` defines and exports this function, and that it correctly composes with the newly re-exported filter expressions.

---

🏁 Script executed:

```shell
#!/bin/bash
# Check that withFilter is exported in the plugin module
rg -n "export .*withFilter" packages/rolldown/src/plugin.ts
```

Length of output: 133

---

```bash
#!/bin/bash
# Locate any plugin files under the rolldown package and search for withFilter
echo "🔍 Searching for plugin files in packages/rolldown/src..."
find packages/rolldown/src -type f -iname "plugin*" | sed 's/^/ - /'

echo
echo "🔍 Checking each candidate for 'withFilter' export or definition..."
for file in $(find packages/rolldown/src -type f -iname "plugin*"); do
  echo "📂 File: $file"
  rg -n "withFilter" "$file" || echo "   ✖ No occurrences of 'withFilter' found in $file"
done
```

---

🏁 Script executed:

```shell
#!/bin/bash
# Locate plugin files within packages/rolldown/src
echo "🔍 Plugin files in packages/rolldown/src:"
find packages/rolldown/src -type f -iname "*plugin*.ts" || echo "   ✖ No plugin files found"

echo
# Search for all occurrences of withFilter in the rolldown package
echo "🔍 Searching for 'withFilter' references in packages/rolldown/src:"
rg -n "withFilter" packages/rolldown/src || echo "   ✖ No references to 'withFilter' found"
```

Length of output: 2076

---



</details>

**Confirmed `withFilter` export and integration**  
The `withFilter` function is defined in `packages/rolldown/src/plugin/with-filter.ts` and re-exported in `packages/rolldown/src/plugin/index.ts` (line 34). The statement in `filter-index.ts` correctly re-exports it:

- packages/rolldown/src/plugin/with-filter.ts: defines `withFilter`
- packages/rolldown/src/plugin/index.ts: `export { withFilter } from './with-filter';`
- packages/rolldown/src/filter-index.ts: `export { withFilter } from './plugin';`

No further action needed.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-06T15:33:25Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>packages/pluginutils/tsconfig.base.json (1)</summary><blockquote>

`1-23`: **Consider cleaning up duplicate `outDir` and enabling project references.**  
- The base config already sets `"outDir": "./dist/esm"`, so overriding it to the same path in `tsconfig.esm.json` is redundant. You can remove the duplicate `outDir` from the ESM config.  
- For better monorepo build performance and type safety, consider turning on project references (`"composite": true`) and specifying a `tsBuildInfoFile` in the base config. This lets downstream packages (`rolldown`, etc.) reference `pluginutils` directly and speeds up incremental builds.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Biome (1.9.4)</summary>

[error] 3-3: JSON standard does not allow comments.



(parse)

---

[error] 5-5: JSON standard does not allow comments.



(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: JSON standard does not allow comments.



(parse)

---

[error] 7-7: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-7: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-7: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-8: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-7: JSON standard does not allow comments.



(parse)

---

[error] 8-8: JSON standard does not allow comments.



(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: JSON standard does not allow comments.



(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: JSON standard does not allow comments.



(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: JSON standard does not allow comments.



(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: JSON standard does not allow comments.



(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-14: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: JSON standard does not allow comments.



(parse)

---

[error] 15-15: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-15: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-15: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-17: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-15: JSON standard does not allow comments.



(parse)

---

[error] 17-17: JSON standard does not allow comments.



(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: JSON standard does not allow comments.



(parse)

---

[error] 19-19: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 19-19: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 19-19: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 19-19: JSON standard does not allow comments.



(parse)

---

[error] 21-21: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 21-21: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 21-21: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 21-22: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

</details>

</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 780b06d3cbf45eac7fec96449ba29c35114473de and fba1b433324d1f9d1ee453f0643c8a5862def8d1.

</details>

<details>
<summary>⛔ Files ignored due to path filters (1)</summary>

* `pnpm-lock.yaml` is excluded by `!**/pnpm-lock.yaml`

</details>

<details>
<summary>📒 Files selected for processing (9)</summary>

* `packages/pluginutils/package.json` (1 hunks)
* `packages/pluginutils/src/index.ts` (1 hunks)
* `packages/pluginutils/tsconfig.base.json` (1 hunks)
* `packages/pluginutils/tsconfig.cjs.json` (1 hunks)
* `packages/pluginutils/tsconfig.esm.json` (1 hunks)
* `packages/rolldown/src/filter-index.ts` (1 hunks)
* `packages/rolldown/src/plugin/bindingify-hook-filter.ts` (1 hunks)
* `packages/rolldown/src/plugin/hook-filter.ts` (1 hunks)
* `packages/rolldown/tsconfig.check.json` (1 hunks)

</details>

<details>
<summary>✅ Files skipped from review due to trivial changes (4)</summary>

* packages/rolldown/src/plugin/hook-filter.ts
* packages/rolldown/src/plugin/bindingify-hook-filter.ts
* packages/rolldown/tsconfig.check.json
* packages/rolldown/src/filter-index.ts

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (2)</summary>

* packages/pluginutils/package.json
* packages/pluginutils/src/index.ts

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🪛 Biome (1.9.4)</summary>

<details>
<summary>packages/pluginutils/tsconfig.base.json</summary>

[error] 3-3: JSON standard does not allow comments.



(parse)

---

[error] 5-5: JSON standard does not allow comments.



(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: JSON standard does not allow comments.



(parse)

---

[error] 7-7: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-7: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-7: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-8: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-7: JSON standard does not allow comments.



(parse)

---

[error] 8-8: JSON standard does not allow comments.



(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: JSON standard does not allow comments.



(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: JSON standard does not allow comments.



(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: JSON standard does not allow comments.



(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: JSON standard does not allow comments.



(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-14: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: JSON standard does not allow comments.



(parse)

---

[error] 15-15: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-15: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-15: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-17: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-15: JSON standard does not allow comments.



(parse)

---

[error] 17-17: JSON standard does not allow comments.



(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: JSON standard does not allow comments.



(parse)

---

[error] 19-19: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 19-19: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 19-19: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 19-19: JSON standard does not allow comments.



(parse)

---

[error] 21-21: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 21-21: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 21-21: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 21-22: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

</details>
<details>
<summary>packages/pluginutils/tsconfig.cjs.json</summary>

[error] 4-4: JSON standard does not allow comments.



(parse)

---

[error] 5-5: expected `,` but instead found `"outDir"`

Remove "outDir"

(parse)

---

[error] 5-5: JSON standard does not allow comments.



(parse)

</details>
<details>
<summary>packages/pluginutils/tsconfig.esm.json</summary>

[error] 4-4: JSON standard does not allow comments.



(parse)

---

[error] 5-5: expected `,` but instead found `"outDir"`

Remove "outDir"

(parse)

---

[error] 5-5: JSON standard does not allow comments.



(parse)

</details>

</details>

</details>

<details>
<summary>🔇 Additional comments (2)</summary><blockquote>

<details>
<summary>packages/pluginutils/tsconfig.cjs.json (1)</summary>

`1-7`: **Comments in tsconfig JSONC are valid.**  
TypeScript’s compiler supports comments in tsconfig files (JSONC), so the `/* … */` annotations here are acceptable even though strict JSON linters (e.g., Biome) will complain. You can safely ignore or whitelist `tsconfig.*.json` in your lint config to suppress those false positives.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Biome (1.9.4)</summary>

[error] 4-4: JSON standard does not allow comments.



(parse)

---

[error] 5-5: expected `,` but instead found `"outDir"`

Remove "outDir"

(parse)

---

[error] 5-5: JSON standard does not allow comments.



(parse)

</details>

</details>

</details>
<details>
<summary>packages/pluginutils/tsconfig.esm.json (1)</summary>

`1-7`: **JSONC comments are fine in tsconfig files.**  
As with the CommonJS config, the inline comments are supported by the TypeScript parser. To avoid noise from strict JSON parsers, add a rule to treat these files as JSONC or disable comment checks for `tsconfig.*.json`.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Biome (1.9.4)</summary>

[error] 4-4: JSON standard does not allow comments.



(parse)

---

[error] 5-5: expected `,` but instead found `"outDir"`

Remove "outDir"

(parse)

---

[error] 5-5: JSON standard does not allow comments.



(parse)

</details>

</details>

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-06T16:37:23Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (2)</summary><blockquote>

<details>
<summary>packages/pluginutils/tsconfig.base.json (1)</summary><blockquote>

`11-13`: **Enhancement: Enable project references and declaration maps**  
To support incremental builds via project references and generate `.d.ts.map` files for easier debugging, consider adding `"composite": true` and `"declarationMap": true` under `compilerOptions`.  

Apply this diff:
```diff
   "declaration": true,
+  "declarationMap": true,
+  "composite": true,
   "outDir": "./dist/esm",
```

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Biome (1.9.4)</summary>

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: JSON standard does not allow comments.



(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: JSON standard does not allow comments.



(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: JSON standard does not allow comments.



(parse)

</details>

</details>

</blockquote></details>
<details>
<summary>packages/pluginutils/tsconfig.esm.json (1)</summary><blockquote>

`3-7`: **Enhance JSONC support and editor integration**  
TypeScript’s tsconfig files are parsed as JSON with comments (JSONC), which is fine for `tsconfig.*.json`, but linters like Biome may flag the inline comments. To improve IDE validation and avoid linter errors, consider:
- Adding a `$schema` reference at the top for editor auto-completion.
- Moving or removing inline comments if you prefer strict JSON.

Example refactor:
```diff
 {
+  "$schema": "https://json.schemastore.org/tsconfig",
   "extends": "./tsconfig.base.json",
   "compilerOptions": {
     "module": "ESNext",
     "outDir": "./dist/esm"
   }
 }
```

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Biome (1.9.4)</summary>

[error] 4-4: JSON standard does not allow comments.



(parse)

---

[error] 5-5: expected `,` but instead found `"outDir"`

Remove "outDir"

(parse)

---

[error] 5-5: JSON standard does not allow comments.



(parse)

</details>

</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between fba1b433324d1f9d1ee453f0643c8a5862def8d1 and aaddd48f448317bdc759c9cd41d3f04ab34b187f.

</details>

<details>
<summary>⛔ Files ignored due to path filters (1)</summary>

* `pnpm-lock.yaml` is excluded by `!**/pnpm-lock.yaml`

</details>

<details>
<summary>📒 Files selected for processing (6)</summary>

* `packages/pluginutils/src/index.ts` (1 hunks)
* `packages/pluginutils/tsconfig.base.json` (1 hunks)
* `packages/pluginutils/tsconfig.cjs.json` (1 hunks)
* `packages/pluginutils/tsconfig.esm.json` (1 hunks)
* `packages/rolldown/src/filter-index.ts` (1 hunks)
* `packages/rolldown/src/plugin/bindingify-hook-filter.ts` (1 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (3)</summary>

* packages/rolldown/src/plugin/bindingify-hook-filter.ts
* packages/rolldown/src/filter-index.ts
* packages/pluginutils/src/index.ts

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🪛 Biome (1.9.4)</summary>

<details>
<summary>packages/pluginutils/tsconfig.base.json</summary>

[error] 3-3: JSON standard does not allow comments.



(parse)

---

[error] 5-5: JSON standard does not allow comments.



(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: JSON standard does not allow comments.



(parse)

---

[error] 7-7: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-7: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-7: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-8: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-7: JSON standard does not allow comments.



(parse)

---

[error] 8-8: JSON standard does not allow comments.



(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: JSON standard does not allow comments.



(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: JSON standard does not allow comments.



(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: JSON standard does not allow comments.



(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: JSON standard does not allow comments.



(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-14: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: JSON standard does not allow comments.



(parse)

---

[error] 15-15: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-15: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-15: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-17: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-15: JSON standard does not allow comments.



(parse)

---

[error] 17-17: JSON standard does not allow comments.



(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: JSON standard does not allow comments.



(parse)

---

[error] 19-19: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 19-19: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 19-19: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 19-19: JSON standard does not allow comments.



(parse)

---

[error] 21-21: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 21-21: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 21-21: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 21-22: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

</details>
<details>
<summary>packages/pluginutils/tsconfig.cjs.json</summary>

[error] 4-4: JSON standard does not allow comments.



(parse)

---

[error] 5-5: expected `,` but instead found `"outDir"`

Remove "outDir"

(parse)

---

[error] 5-5: JSON standard does not allow comments.



(parse)

</details>
<details>
<summary>packages/pluginutils/tsconfig.esm.json</summary>

[error] 4-4: JSON standard does not allow comments.



(parse)

---

[error] 5-5: expected `,` but instead found `"outDir"`

Remove "outDir"

(parse)

---

[error] 5-5: JSON standard does not allow comments.



(parse)

</details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (8)</summary>

* GitHub Check: node-test (windows-latest) / Node Test
* GitHub Check: node-test (ubuntu-latest) / Node Test
* GitHub Check: node-test (macos-latest) / Node Test
* GitHub Check: browser-test (ubuntu-latest) / WASI Test
* GitHub Check: browser-test (macos-latest) / WASI Test
* GitHub Check: browser-test (windows-latest) / WASI Test
* GitHub Check: Repo Validation
* GitHub Check: Benchmark Node

</details>

<details>
<summary>🔇 Additional comments (4)</summary><blockquote>

<details>
<summary>packages/pluginutils/tsconfig.base.json (1)</summary>

`1-22`: **Configuration Valid**  
This `tsconfig.base.json` is well-structured as JSONC (comments allowed), with strict type checking, declaration generation, and modern module targets. All settings align with a library package build setup.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Biome (1.9.4)</summary>

[error] 3-3: JSON standard does not allow comments.



(parse)

---

[error] 5-5: JSON standard does not allow comments.



(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: JSON standard does not allow comments.



(parse)

---

[error] 7-7: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-7: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-7: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-8: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-7: JSON standard does not allow comments.



(parse)

---

[error] 8-8: JSON standard does not allow comments.



(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: JSON standard does not allow comments.



(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: JSON standard does not allow comments.



(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: JSON standard does not allow comments.



(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: JSON standard does not allow comments.



(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-14: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: JSON standard does not allow comments.



(parse)

---

[error] 15-15: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-15: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-15: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-17: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-15: JSON standard does not allow comments.



(parse)

---

[error] 17-17: JSON standard does not allow comments.



(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: JSON standard does not allow comments.



(parse)

---

[error] 19-19: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 19-19: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 19-19: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 19-19: JSON standard does not allow comments.



(parse)

---

[error] 21-21: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 21-21: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 21-21: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 21-22: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

</details>

</details>

</details>
<details>
<summary>packages/pluginutils/tsconfig.esm.json (1)</summary>

`1-2`: **Extends base config: verify path resolution**  
Extending `tsconfig.base.json` is correct to inherit shared settings. Make sure that `tsconfig.base.json` resides alongside this file so the relative path `"./tsconfig.base.json"` resolves as intended.

</details>
<details>
<summary>packages/pluginutils/tsconfig.cjs.json (2)</summary>

`4-5`: **CommonJS settings look good; comments are valid in tsconfig**  
The `"module": "commonjs"` and `"outDir": "./dist/cjs"` options correctly target your CJS build. TypeScript’s JSONC parser supports block comments in tsconfig files, so you can safely ignore the static‐analysis warnings about comments here.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Biome (1.9.4)</summary>

[error] 4-4: JSON standard does not allow comments.



(parse)

---

[error] 5-5: expected `,` but instead found `"outDir"`

Remove "outDir"

(parse)

---

[error] 5-5: JSON standard does not allow comments.



(parse)

</details>

</details>

---

`1-3`: <details>
<summary>✅ Verification successful</summary>

**Validate the `extends` path**  
Ensure that `packages/pluginutils/tsconfig.base.json` exists in the same directory and contains the shared compiler settings for both ESM and CJS builds.

---

🏁 Script executed:

```shell
#!/bin/bash
# Verify that tsconfig.base.json is present in packages/pluginutils
if [ -f packages/pluginutils/tsconfig.base.json ]; then
  echo "✅ Found base config"
else
  echo "❌ Missing packages/pluginutils/tsconfig.base.json"
  exit 1
fi
```

Length of output: 101

---



</details>

**Extends path is valid**  
The `tsconfig.base.json` file exists in `packages/pluginutils`, so the `"extends": "./tsconfig.base.json"` reference in `tsconfig.cjs.json` is correct. No further action required.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-06T16:49:24Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (4)</summary><blockquote>

<details>
<summary>.github/workflows/reusable-node-test.yml (1)</summary><blockquote>

`38-40`: **Consider adding a dedicated test step for `@rolldown/pluginutils`**  
To prevent regressions in the newly factored package, you may want to invoke its test suite right after building. For example:

```yaml
- name: Test `@rolldown/pluginutils`
  run: pnpm --filter '@rolldown/pluginutils' test
```

You could place this immediately after the build step—and, if needed, replicate it under the Node18/20/22 matrices for full cross-version coverage.

</blockquote></details>
<details>
<summary>packages/pluginutils/tsconfig.base.json (3)</summary><blockquote>

`3-3`: **Inaccurate inline comment for `incremental`**  
The comment says “Save .tsbuildinfo files to allow for incremental compilation,” but you’ve set `incremental: false`, which disables that feature. Please update or remove the comment to match the actual setting.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Biome (1.9.4)</summary>

[error] 3-3: JSON standard does not allow comments.



(parse)

</details>

</details>

---

`14-14`: **Inconsistent comment style**  
You’re using `//` for the commented-out `preserveSymlinks` line while other comments use `/* ... */`. For readability and consistency in JSONC, consider standardizing on one comment style.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Biome (1.9.4)</summary>

[error] 13-14: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

</details>

</details>

---

`2-20`: **Consider enabling project references and declaration maps**  
If you intend to leverage TypeScript project references or speed up rebuilds, adding the following to `"compilerOptions"` can help:  
```jsonc
"composite": true,
"declarationMap": true,
```
This generates `.tsbuildinfo` for incremental builds and `.d.ts.map` files for improved debugging.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Biome (1.9.4)</summary>

[error] 3-3: JSON standard does not allow comments.



(parse)

---

[error] 5-5: JSON standard does not allow comments.



(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: JSON standard does not allow comments.



(parse)

---

[error] 7-7: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-7: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-7: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-8: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-7: JSON standard does not allow comments.



(parse)

---

[error] 8-8: JSON standard does not allow comments.



(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: JSON standard does not allow comments.



(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: JSON standard does not allow comments.



(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: JSON standard does not allow comments.



(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: JSON standard does not allow comments.



(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-14: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: JSON standard does not allow comments.



(parse)

---

[error] 15-15: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-15: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-15: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-17: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-15: JSON standard does not allow comments.



(parse)

---

[error] 17-17: JSON standard does not allow comments.



(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: JSON standard does not allow comments.



(parse)

---

[error] 19-19: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 19-19: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 19-19: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 19-19: JSON standard does not allow comments.



(parse)

</details>

</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between aaddd48f448317bdc759c9cd41d3f04ab34b187f and ece42741145ef66381759a3016a205f1aab5d2b2.

</details>

<details>
<summary>📒 Files selected for processing (8)</summary>

* `.github/workflows/reusable-node-test.yml` (1 hunks)
* `packages/pluginutils/package.json` (1 hunks)
* `packages/pluginutils/src/index.ts` (1 hunks)
* `packages/pluginutils/tsconfig.base.json` (1 hunks)
* `packages/pluginutils/tsconfig.cjs.json` (1 hunks)
* `packages/pluginutils/tsconfig.esm.json` (1 hunks)
* `packages/rolldown/src/filter-index.ts` (1 hunks)
* `packages/rolldown/src/plugin/bindingify-hook-filter.ts` (1 hunks)

</details>

<details>
<summary>✅ Files skipped from review due to trivial changes (1)</summary>

* packages/pluginutils/package.json

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (3)</summary>

* packages/rolldown/src/plugin/bindingify-hook-filter.ts
* packages/rolldown/src/filter-index.ts
* packages/pluginutils/src/index.ts

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🪛 Biome (1.9.4)</summary>

<details>
<summary>packages/pluginutils/tsconfig.base.json</summary>

[error] 3-3: JSON standard does not allow comments.



(parse)

---

[error] 5-5: JSON standard does not allow comments.



(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 6-6: JSON standard does not allow comments.



(parse)

---

[error] 7-7: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-7: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-7: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-8: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 7-7: JSON standard does not allow comments.



(parse)

---

[error] 8-8: JSON standard does not allow comments.



(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 9-9: JSON standard does not allow comments.



(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 10-10: JSON standard does not allow comments.



(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 11-11: JSON standard does not allow comments.



(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 12-12: JSON standard does not allow comments.



(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-14: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 13-13: JSON standard does not allow comments.



(parse)

---

[error] 15-15: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-15: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-15: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-17: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 15-15: JSON standard does not allow comments.



(parse)

---

[error] 17-17: JSON standard does not allow comments.



(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 18-18: JSON standard does not allow comments.



(parse)

---

[error] 19-19: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 19-19: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 19-19: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 19-19: JSON standard does not allow comments.



(parse)

---

[error] 21-21: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 21-21: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 21-21: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

---

[error] 21-22: End of file expected

Use an array for a sequence of values: `[1, 2]`

(parse)

</details>
<details>
<summary>packages/pluginutils/tsconfig.cjs.json</summary>

[error] 4-4: JSON standard does not allow comments.



(parse)

---

[error] 5-5: expected `,` but instead found `"outDir"`

Remove "outDir"

(parse)

---

[error] 5-5: JSON standard does not allow comments.



(parse)

</details>
<details>
<summary>packages/pluginutils/tsconfig.esm.json</summary>

[error] 4-4: JSON standard does not allow comments.



(parse)

---

[error] 5-5: expected `,` but instead found `"outDir"`

Remove "outDir"

(parse)

---

[error] 5-5: JSON standard does not allow comments.



(parse)

</details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (12)</summary>

* GitHub Check: node-test (windows-latest) / Node Test
* GitHub Check: node-test (ubuntu-latest) / Node Test
* GitHub Check: node-test (macos-latest) / Node Test
* GitHub Check: cargo-test (windows-latest) / Cargo Test
* GitHub Check: cargo-test (ubuntu-latest) / Cargo Test
* GitHub Check: cargo-test (macos-latest) / Cargo Test
* GitHub Check: browser-test (windows-latest) / WASI Test
* GitHub Check: browser-test (macos-latest) / WASI Test
* GitHub Check: browser-test (ubuntu-latest) / WASI Test
* GitHub Check: Benchmark Node
* GitHub Check: Benchmark Rust
* GitHub Check: Codspeed Benchmark

</details>

<details>
<summary>🔇 Additional comments (3)</summary><blockquote>

<details>
<summary>.github/workflows/reusable-node-test.yml (1)</summary>

`38-40`: **Proper integration of the new `@rolldown/pluginutils` build step**  
The `pnpm --filter '@rolldown/pluginutils' build` command is correctly placed after setup-node and before the native Rolldown build, ensuring the freshly extracted utility package is compiled first.

</details>
<details>
<summary>packages/pluginutils/tsconfig.cjs.json (1)</summary>

`1-7`: **Appropriate CommonJS configuration**  
The `tsconfig.cjs.json` correctly extends the base config, overrides the module to `"commonjs"`, and emits into `./dist/cjs`. Note that TSConfig supports JSONC, so your inline comments are valid here.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Biome (1.9.4)</summary>

[error] 4-4: JSON standard does not allow comments.



(parse)

---

[error] 5-5: expected `,` but instead found `"outDir"`

Remove "outDir"

(parse)

---

[error] 5-5: JSON standard does not allow comments.



(parse)

</details>

</details>

</details>
<details>
<summary>packages/pluginutils/tsconfig.esm.json (1)</summary>

`1-7`: **Correct ESM build configuration**  
The `tsconfig.esm.json` cleanly extends the base config, sets `"module": "ESNext"`, and outputs to `./dist/esm`. This aligns perfectly with your dual ESM/CJS build strategy.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Biome (1.9.4)</summary>

[error] 4-4: JSON standard does not allow comments.



(parse)

---

[error] 5-5: expected `,` but instead found `"outDir"`

Remove "outDir"

(parse)

---

[error] 5-5: JSON standard does not allow comments.



(parse)

</details>

</details>

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-06T17:36:49Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 2**

<details>
<summary>♻️ Duplicate comments (2)</summary><blockquote>

<details>
<summary>packages/pluginutils/src/index.ts (2)</summary><blockquote>

`3-17`: **Use TypeScript's import type mechanism instead of duplicating the PluginModuleType.**

Duplicating the `PluginModuleType` from the main `rolldown` package creates a maintenance burden. If the type changes in the main package, you'll need to manually update it here as well.

```diff
-// Inline this type to avoid import it from `rolldown`.
-// The only downside is we need to keep it in sync with `rolldown` manually,
-// it is alright since it is pretty stable now.
-type PluginModuleType =
-  | 'js'
-  | 'jsx'
-  | 'ts'
-  | 'tsx'
-  | 'json'
-  | 'text'
-  | 'base64'
-  | 'dataurl'
-  | 'binary'
-  | 'empty'
-  | (string & {});
+import type { PluginModuleType } from 'rolldown';
```

If there are circular dependency concerns, consider moving this type to a shared types package.

---

`44-54`: **Export the Or class to be consistent with other classes.**

The `And` class is exported but the `Or` class is not, creating inconsistency in the API. All filter expression classes should be exported for API completeness.

```diff
-class Or {
+export class Or {
  kind: 'or';
  args: FilterExpression[];
  constructor(...args: FilterExpression[]) {
    if (args.length === 0) {
      throw new Error('`Or` expects at least one operand');
    }
    this.args = args;
    this.kind = 'or';
  }
}
```

</blockquote></details>

</blockquote></details>

<details>
<summary>🧹 Nitpick comments (5)</summary><blockquote>

<details>
<summary>packages/pluginutils/src/index.ts (5)</summary><blockquote>

`56-63`: **Export the Not class to be consistent with other classes.**

Similar to the `Or` class, the `Not` class should also be exported for API consistency.

```diff
-class Not {
+export class Not {
  kind: 'not';
  expr: FilterExpression;
  constructor(expr: FilterExpression) {
    this.expr = expr;
    this.kind = 'not';
  }
}
```

---

`65-72`: **Export the Id class to be consistent with other classes.**

For API consistency, the `Id` class should be exported like the `And` class.

```diff
-class Id {
+export class Id {
  kind: 'id';
  pattern: StringOrRegExp;
  constructor(pattern: StringOrRegExp) {
    this.pattern = pattern;
    this.kind = 'id';
  }
}
```

---

`74-81`: **Export the ModuleType class to be consistent with other classes.**

For API consistency, the `ModuleType` class should be exported like the `And` class.

```diff
-class ModuleType {
+export class ModuleType {
  kind: 'moduleType';
  pattern: PluginModuleType;
  constructor(pattern: PluginModuleType) {
    this.pattern = pattern;
    this.kind = 'moduleType';
  }
}
```

---

`92-99`: **Export the Include class to be consistent with other classes.**

For API consistency, the `Include` class should be exported like the `And` class.

```diff
-class Include {
+export class Include {
  kind: 'include';
  expr: FilterExpression;
  constructor(expr: FilterExpression) {
    this.expr = expr;
    this.kind = 'include';
  }
}
```

---

`101-108`: **Export the Exclude class to be consistent with other classes.**

For API consistency, the `Exclude` class should be exported like the `And` class.

```diff
-class Exclude {
+export class Exclude {
  kind: 'exclude';
  expr: FilterExpression;
  constructor(expr: FilterExpression) {
    this.expr = expr;
    this.kind = 'exclude';
  }
}
```

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between ece42741145ef66381759a3016a205f1aab5d2b2 and 35d6fe506a21b0da5ddf9b530d77f8bacac68d6e.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `packages/pluginutils/src/index.ts` (1 hunks)

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (15)</summary>

* GitHub Check: node-test (windows-latest) / Node Test
* GitHub Check: node-test (ubuntu-latest) / Node Test
* GitHub Check: node-test (macos-latest) / Node Test
* GitHub Check: cargo-test (windows-latest) / Cargo Test
* GitHub Check: cargo-test (ubuntu-latest) / Cargo Test
* GitHub Check: cargo-test (macos-latest) / Cargo Test
* GitHub Check: browser-test (ubuntu-latest) / WASI Test
* GitHub Check: browser-test (macos-latest) / WASI Test
* GitHub Check: browser-test (windows-latest) / WASI Test
* GitHub Check: Rust Validation
* GitHub Check: Repo Validation
* GitHub Check: Codspeed Benchmark
* GitHub Check: Benchmark Node
* GitHub Check: Benchmark Rust
* GitHub Check: zizmor

</details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-07T01:48:09Z
user: login: hyf0
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-07T11:16:40Z
user: login: graphite-app[bot]
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-07T16:52:41Z

Review comments:
diff_hunk: @@ -0,0 +1,27 @@
+{
+  "name": "@rolldown/pluginutils",
+  "version": "1.0.0-beta.8",
+  "license": "MIT",
+  "type": "module",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/rolldown/rolldown.git",
+    "directory": "packages/pluginutils"
+  },
+  "publishConfig": {
+    "access": "public"
+  },
+  "exports": {
+    ".": {
+      "import": "./dist/index.js",
+      "types": "./dist/index.d.ts"
+    }
+  },
+  "files": [
+    "dist"
+  ],
+  "scripts": {
+    "build": "tsc -b",
+    "test": "echo \"Error: no test specified\" && exit 1"
+  }
+}
path: packages/pluginutils/package.json
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Package configuration looks good, but the test script needs implementation.**

The package configuration is well-structured with appropriate metadata, exports, and build script. However, the test script is just a placeholder that exits with an error.


Consider implementing proper tests for this package, as it will be a core utility for plugin authors. You could use Jest, Vitest, or a similar framework for testing.

```diff
-  "scripts": {
-    "build": "tsc -b",
-    "test": "echo \"Error: no test specified\" && exit 1"
-  }
+  "scripts": {
+    "build": "tsc -b",
+    "test": "vitest run"
+  },
+  "devDependencies": {
+    "vitest": "^1.0.0"
+  }
```


> Committable suggestion skipped: line range outside the PR's diff.

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-06T15:33:24Z
author_association: NONE
diff_hunk: @@ -0,0 +1,140 @@
+type StringOrRegExp = string | RegExp;
+
+// Inline this type to avoid import it from `rolldown`.
+// The only downside is we need to keep it in sync with `rolldown` manually,
+// it is alright since it is pretty stable now.
+type PluginModuleType =
+  | 'js'
+  | 'jsx'
+  | 'ts'
+  | 'tsx'
+  | 'json'
+  | 'text'
+  | 'base64'
+  | 'dataurl'
+  | 'binary'
+  | 'empty'
+  | (string & {});
path: packages/pluginutils/src/index.ts
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Consider using TypeScript's import type mechanism instead of duplicating the PluginModuleType.**

The comment indicates you're manually duplicating a type from rolldown. While this could work, it creates a maintenance burden to keep them in sync.


Consider using TypeScript's `import type` mechanism to import the type instead. This would avoid duplication and potential sync issues.

```diff
-// Inline this type to avoid import it from `rolldown`.
-// The only downside is we need to keep it in sync with `rolldown` manually,
-// it is alright since it is pretty stable now.
-type PluginModuleType =
-  | 'js'
-  | 'jsx'
-  | 'ts'
-  | 'tsx'
-  | 'json'
-  | 'text'
-  | 'base64'
-  | 'dataurl'
-  | 'binary'
-  | 'empty'
-  | (string & {});
+import type { PluginModuleType } from 'rolldown';
```

If there are circular dependency concerns, consider moving this type to a shared types package.

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-06T15:33:24Z
author_association: NONE
diff_hunk: @@ -0,0 +1,140 @@
+type StringOrRegExp = string | RegExp;
+
+// Inline this type to avoid import it from `rolldown`.
+// The only downside is we need to keep it in sync with `rolldown` manually,
+// it is alright since it is pretty stable now.
+type PluginModuleType =
+  | 'js'
+  | 'jsx'
+  | 'ts'
+  | 'tsx'
+  | 'json'
+  | 'text'
+  | 'base64'
+  | 'dataurl'
+  | 'binary'
+  | 'empty'
+  | (string & {});
+
+export type FilterExpressionKind = FilterExpression['kind'];
+
+export type FilterExpression =
+  | And
+  | Or
+  | Not
+  | Id
+  | ModuleType
+  | Code
+  | Include
+  | Exclude;
+
+export type TopLevelFilterExpression = Include | Exclude;
+
+export class And {
+  kind: 'and';
+  args: FilterExpression[];
+  constructor(...args: FilterExpression[]) {
+    if (args.length === 0) {
+      throw new Error('`And` expects at least one operand');
+    }
+    this.args = args;
+    this.kind = 'and';
+  }
+}
+class Or {
+  kind: 'or';
+  args: FilterExpression[];
+  constructor(...args: FilterExpression[]) {
+    if (args.length === 0) {
+      throw new Error('`Or` expects at least one operand');
+    }
+    this.args = args;
+    this.kind = 'or';
+  }
+}
path: packages/pluginutils/src/index.ts
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Export the Or class to be consistent with other classes.**

The `And` class is exported but the `Or` class is not, creating inconsistency in the API. All other filter expression classes should be exported for API completeness.


```diff
-class Or {
+export class Or {
  kind: 'or';
  args: FilterExpression[];
  constructor(...args: FilterExpression[]) {
    if (args.length === 0) {
      throw new Error('`Or` expects at least one operand');
    }
    this.args = args;
    this.kind = 'or';
  }
}
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
export class Or {
  kind: 'or';
  args: FilterExpression[];
  constructor(...args: FilterExpression[]) {
    if (args.length === 0) {
      throw new Error('`Or` expects at least one operand');
    }
    this.args = args;
    this.kind = 'or';
  }
}
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-06T15:33:24Z
author_association: NONE
diff_hunk: @@ -0,0 +1,226 @@
+type StringOrRegExp = string | RegExp;
+
+// Inline this type to avoid import it from `rolldown`.
+// The only downside is we need to keep it in sync with `rolldown` manually,
+// it is alright since it is pretty stable now.
+type PluginModuleType =
+  | 'js'
+  | 'jsx'
+  | 'ts'
+  | 'tsx'
+  | 'json'
+  | 'text'
+  | 'base64'
+  | 'dataurl'
+  | 'binary'
+  | 'empty'
+  | (string & {});
+
+export type FilterExpressionKind = FilterExpression['kind'];
+
+export type FilterExpression =
+  | And
+  | Or
+  | Not
+  | Id
+  | ModuleType
+  | Code
+  | Include
+  | Exclude;
+
+export type TopLevelFilterExpression = Include | Exclude;
+
+export class And {
+  kind: 'and';
+  args: FilterExpression[];
+  constructor(...args: FilterExpression[]) {
+    if (args.length === 0) {
+      throw new Error('`And` expects at least one operand');
+    }
+    this.args = args;
+    this.kind = 'and';
+  }
+}
+class Or {
+  kind: 'or';
+  args: FilterExpression[];
+  constructor(...args: FilterExpression[]) {
+    if (args.length === 0) {
+      throw new Error('`Or` expects at least one operand');
+    }
+    this.args = args;
+    this.kind = 'or';
+  }
+}
+
+class Not {
+  kind: 'not';
+  expr: FilterExpression;
+  constructor(expr: FilterExpression) {
+    this.expr = expr;
+    this.kind = 'not';
+  }
+}
+
+class Id {
+  kind: 'id';
+  pattern: StringOrRegExp;
+  constructor(pattern: StringOrRegExp) {
+    this.pattern = pattern;
+    this.kind = 'id';
+  }
+}
+
+class ModuleType {
+  kind: 'moduleType';
+  pattern: PluginModuleType;
+  constructor(pattern: PluginModuleType) {
+    this.pattern = pattern;
+    this.kind = 'moduleType';
+  }
+}
+
+class Code {
+  kind: 'code';
+  pattern: StringOrRegExp;
+  constructor(expr: StringOrRegExp) {
+    this.pattern = expr;
+    this.kind = 'code';
+  }
+}
+
+class Include {
+  kind: 'include';
+  expr: FilterExpression;
+  constructor(expr: FilterExpression) {
+    this.expr = expr;
+    this.kind = 'include';
+  }
+}
+
+class Exclude {
+  kind: 'exclude';
+  expr: FilterExpression;
+  constructor(expr: FilterExpression) {
+    this.expr = expr;
+    this.kind = 'exclude';
+  }
+}
+
+export function and(...args: FilterExpression[]): And {
+  return new And(...args);
+}
+
+export function or(...args: FilterExpression[]): Or {
+  return new Or(...args);
+}
+
+export function not(expr: FilterExpression): Not {
+  return new Not(expr);
+}
+
+export function id(pattern: StringOrRegExp): Id {
+  return new Id(pattern);
+}
+
+export function moduleType(pattern: PluginModuleType): ModuleType {
+  return new ModuleType(pattern);
+}
+
+export function code(pattern: StringOrRegExp): Code {
+  return new Code(pattern);
+}
+
+export function include(expr: FilterExpression): Include {
+  return new Include(expr);
+}
+
+export function exclude(expr: FilterExpression): Exclude {
+  return new Exclude(expr);
+}
+
+export function interpreter(
+  exprs: TopLevelFilterExpression | TopLevelFilterExpression[],
+  code?: string,
+  id?: string,
+  moduleType?: PluginModuleType,
+): boolean {
+  let arr: TopLevelFilterExpression[] = [];
+  if (Array.isArray(exprs)) {
+    arr = exprs;
+  } else {
+    arr = [exprs];
+  }
+  return interpreterImpl(arr, code, id, moduleType);
+}
+
+export function interpreterImpl(
+  expr: TopLevelFilterExpression[],
+  code?: string,
+  id?: string,
+  moduleType?: PluginModuleType,
+): boolean {
+  let hasInclude = false;
+  for (const e of expr) {
+    switch (e.kind) {
+      case 'include': {
+        hasInclude = true;
+        if (exprInterpreter(e.expr, code, id, moduleType)) {
+          return true;
+        }
+        break;
+      }
+      case 'exclude': {
+        if (exprInterpreter(e.expr, code, id, moduleType)) {
+          return false;
+        }
+        break;
+      }
+    }
+  }
+  return !hasInclude;
+}
+
+export function exprInterpreter(
+  expr: FilterExpression,
+  code?: string,
+  id?: string,
+  moduleType?: PluginModuleType,
+): boolean {
+  switch (expr.kind) {
+    case 'and': {
+      return expr.args.every((e) => exprInterpreter(e, code, id, moduleType));
+    }
+    case 'or': {
+      return expr.args.some((e) => exprInterpreter(e, code, id, moduleType));
+    }
+    case 'not': {
+      return !exprInterpreter(expr.expr, code, id, moduleType);
+    }
+    case 'id': {
+      if (id === undefined) {
+        throw new Error('`id` is required for `id` expression');
+      }
+      return typeof expr.pattern === 'string'
+        ? id === expr.pattern
+        : expr.pattern.test(id);
+    }
+    case 'moduleType': {
+      if (moduleType === undefined) {
+        throw new Error('`moduleType` is required for `moduleType` expression');
+      }
+      return moduleType === expr.pattern;
+    }
+    case 'code': {
+      if (code === undefined) {
+        throw new Error('`code` is required for `code` expression');
+      }
+      return typeof expr.pattern === 'string'
+        ? code.includes(expr.pattern)
+        : expr.pattern.test(code);
+    }
+    default: {
+      throw new Error(`Expression kind ${expr.kind} is not expected.`);
+    }
+  }
+}
path: packages/pluginutils/src/index.ts
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Add JSDoc comments to improve code documentation.**

The file lacks documentation explaining the purpose and usage of the filter expression system. Adding JSDoc comments to types, classes, and functions would make the API more understandable and easier to use.

Example for the top-level interpreter function:

```typescript
/**
 * Evaluates one or multiple filter expressions against optional inputs.
 * 
 * @param exprs - Single or array of top-level filter expressions to evaluate
 * @param code - Optional code content to match against 'code' expressions
 * @param id - Optional id to match against 'id' expressions
 * @param moduleType - Optional module type to match against 'moduleType' expressions
 * @returns Boolean indicating whether the inputs match the filter expressions
 */
export function interpreter(
  exprs: TopLevelFilterExpression | TopLevelFilterExpression[],
  code?: string,
  id?: string,
  moduleType?: PluginModuleType,
): boolean {
  // ...
}
```

Consider adding similar documentation for all exported types, classes, and functions.

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-07T01:48:09Z
author_association: NONE
diff_hunk: @@ -0,0 +1,226 @@
+type StringOrRegExp = string | RegExp;
+
+// Inline this type to avoid import it from `rolldown`.
+// The only downside is we need to keep it in sync with `rolldown` manually,
+// it is alright since it is pretty stable now.
+type PluginModuleType =
+  | 'js'
+  | 'jsx'
+  | 'ts'
+  | 'tsx'
+  | 'json'
+  | 'text'
+  | 'base64'
+  | 'dataurl'
+  | 'binary'
+  | 'empty'
+  | (string & {});
+
+export type FilterExpressionKind = FilterExpression['kind'];
+
+export type FilterExpression =
+  | And
+  | Or
+  | Not
+  | Id
+  | ModuleType
+  | Code
+  | Include
+  | Exclude;
+
+export type TopLevelFilterExpression = Include | Exclude;
+
+export class And {
+  kind: 'and';
+  args: FilterExpression[];
+  constructor(...args: FilterExpression[]) {
+    if (args.length === 0) {
+      throw new Error('`And` expects at least one operand');
+    }
+    this.args = args;
+    this.kind = 'and';
+  }
+}
+class Or {
+  kind: 'or';
+  args: FilterExpression[];
+  constructor(...args: FilterExpression[]) {
+    if (args.length === 0) {
+      throw new Error('`Or` expects at least one operand');
+    }
+    this.args = args;
+    this.kind = 'or';
+  }
+}
+
+class Not {
+  kind: 'not';
+  expr: FilterExpression;
+  constructor(expr: FilterExpression) {
+    this.expr = expr;
+    this.kind = 'not';
+  }
+}
+
+class Id {
+  kind: 'id';
+  pattern: StringOrRegExp;
+  constructor(pattern: StringOrRegExp) {
+    this.pattern = pattern;
+    this.kind = 'id';
+  }
+}
+
+class ModuleType {
+  kind: 'moduleType';
+  pattern: PluginModuleType;
+  constructor(pattern: PluginModuleType) {
+    this.pattern = pattern;
+    this.kind = 'moduleType';
+  }
+}
+
+class Code {
+  kind: 'code';
+  pattern: StringOrRegExp;
+  constructor(expr: StringOrRegExp) {
+    this.pattern = expr;
+    this.kind = 'code';
+  }
+}
path: packages/pluginutils/src/index.ts
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Fix inconsistent parameter naming in Code constructor and export the class.**

1. The constructor parameter is named `expr` but the property is named `pattern`, which is inconsistent with the naming in other classes.
2. The class should be exported for API consistency.

```diff
-class Code {
+export class Code {
  kind: 'code';
  pattern: StringOrRegExp;
-  constructor(expr: StringOrRegExp) {
+  constructor(pattern: StringOrRegExp) {
-    this.pattern = expr;
+    this.pattern = pattern;
    this.kind = 'code';
  }
}
```



<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
export class Code {
  kind: 'code';
  pattern: StringOrRegExp;
  constructor(pattern: StringOrRegExp) {
    this.pattern = pattern;
    this.kind = 'code';
  }
}
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-07T01:48:09Z
author_association: NONE
diff_hunk: @@ -0,0 +1,20 @@
+import { spawnSync } from 'node:child_process';
+import * as fs from 'node:fs';
+import * as path from 'node:path';
+
+fs.rmSync('dist', { recursive: true, force: true });
+
+const command = 'npm'; // Replace with the command you want to execute
+const args = ['run', 'build:all']; // Replace with any arguments for the command
+
+spawnSync(command, args, {
+  stdio: ['pipe', process.stdout, process.stderr],
+  shell: true,
+});
+
+fs.writeFileSync(
+  path.resolve(import.meta.dirname, 'dist/cjs/package.json'),
path: packages/pluginutils/build.mjs
user: login: graphite-app[bot]
body: `import.meta.dirname` is not a standard property of the `import.meta` object. For Node.js ESM modules, the recommended approach is to use `import.meta.url` with the `fileURLToPath` utility:

```js
import { fileURLToPath } from 'node:url';
import * as path from 'node:path';

const __dirname = path.dirname(fileURLToPath(import.meta.url));
path.resolve(__dirname, 'dist/cjs/package.json');
```

This pattern ensures compatibility across Node.js versions and follows the ESM best practices for file path resolution.
```suggestion
  path.resolve(path.dirname(fileURLToPath(import.meta.url)), 'dist/cjs/package.json'),
```
  

*Spotted by [Diamond](https://app.graphite.dev/diamond/?org=rolldown&ref=ai-review-comment)*<i class='graphite__hidden'><br /><br />Is this helpful? React 👍 or 👎 to let us know.</i>
created_at: 2025-05-07T16:52:40Z
author_association: CONTRIBUTOR

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-05-06T15:28:31Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough

A new `@rolldown/pluginutils` package was introduced, providing a composable filter expression system with TypeScript types, classes, and factory functions. The main `rolldown` package now depends on this utility, and all local filter-related code was refactored to import from the new package. TypeScript configurations were updated to support the new structure.

## Changes

| Files/Group                                                                                      | Change Summary                                                                                                    |
|------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------|
| packages/pluginutils/package.json, tsconfig.base.json, tsconfig.cjs.json, tsconfig.esm.json    | Added new package definition and TypeScript configurations for the `@rolldown/pluginutils` package.              |
| packages/pluginutils/src/index.ts                                                               | Introduced filter expression types, classes, factory functions, and interpreter logic for plugin utilities.      |
| packages/rolldown/package.json                                                                  | Added `@rolldown/pluginutils` as a workspace dependency.                                                         |
| packages/rolldown/src/filter-index.ts                                                           | Removed local filter expression implementations; re-exported them from `@rolldown/pluginutils`.                  |
| packages/rolldown/src/plugin/bindingify-hook-filter.ts, packages/rolldown/src/plugin/hook-filter.ts | Changed imports to use filter types/functions from `@rolldown/pluginutils` instead of local modules.              |
| packages/rolldown/tsconfig.check.json                                                          | Changed TypeScript module resolution to `"bundler"` and target module system to `"ESNext"`.                      |
| .github/workflows/reusable-node-test.yml                                                       | Added build step for `@rolldown/pluginutils` package in the Node Test job.                                       |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant Plugin as Plugin Code
    participant PluginUtils as @rolldown/pluginutils
    participant Rolldown as rolldown Core

    Plugin->>PluginUtils: Create filter expressions (And, Or, Not, etc.)
    Plugin->>Rolldown: Pass filter expressions to core
    Rolldown->>PluginUtils: Evaluate filter expressions via imported utilities
```

## Poem

> In the warren of code, a new path appears,  
> With filters and types, the logic now clears.  
> PluginUtils hops in, with classes to lend,  
> No more local clutter, just imports to tend.  
> TypeScript now guides us, as bunnies intend!  
> 🐇✨

<!-- walkthrough_end -->


---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 35d6fe506a21b0da5ddf9b530d77f8bacac68d6e and 1b8a7dfcf0930697135ae38f889a15b02543cfad.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `packages/pluginutils/package.json` (1 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* packages/pluginutils/package.json

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (14)</summary>

* GitHub Check: node-test (windows-latest) / Node Test
* GitHub Check: node-test (ubuntu-latest) / Node Test
* GitHub Check: node-test (macos-latest) / Node Test
* GitHub Check: cargo-test (windows-latest) / Cargo Test
* GitHub Check: cargo-test (ubuntu-latest) / Cargo Test
* GitHub Check: cargo-test (macos-latest) / Cargo Test
* GitHub Check: browser-test (macos-latest) / WASI Test
* GitHub Check: browser-test (ubuntu-latest) / WASI Test
* GitHub Check: browser-test (windows-latest) / WASI Test
* GitHub Check: Repo Validation
* GitHub Check: Codspeed Benchmark
* GitHub Check: Benchmark Rust
* GitHub Check: Benchmark Node
* GitHub Check: zizmor

</details>

</details>
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=rolldown/rolldown&utm_content=4429):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: NONE
user: login: netlify[bot]
created_at: 2025-05-06T15:29:09Z
body: ### <span aria-hidden="true">✅</span> Deploy Preview for *rolldown-rs* canceled.


|  Name | Link |
|:-:|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | 20874c8f08fcf13af99eecd9e143ab38ce0af4d5 |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/sites/rolldown-rs/deploys/681b944dd6b11a000822e095 |
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-06T17:43:53Z
body: ### Benchmarks Rust
- target: `main`(e96f26872c3d209c173917d53bfe603f7c7c6e69)
- pr: `pluginutils`(20874c8f08fcf13af99eecd9e143ab38ce0af4d5)
```
group                                                               pr                                     target
-----                                                               --                                     ------
bundle/bundle@multi-duplicated-top-level-symbol                     1.00     80.6±1.65ms        ? ?/sec    1.00     80.6±1.62ms        ? ?/sec
bundle/bundle@multi-duplicated-top-level-symbol-minify              1.00     99.5±1.73ms        ? ?/sec    1.01    100.0±1.57ms        ? ?/sec
bundle/bundle@multi-duplicated-top-level-symbol-minify-sourcemap    1.00    113.5±2.11ms        ? ?/sec    1.00    113.7±1.74ms        ? ?/sec
bundle/bundle@multi-duplicated-top-level-symbol-sourcemap           1.00     89.6±2.61ms        ? ?/sec    1.00     89.8±2.28ms        ? ?/sec
bundle/bundle@rome-ts                                               1.00    123.0±3.30ms        ? ?/sec    1.00    122.4±2.67ms        ? ?/sec
bundle/bundle@rome-ts-minify                                        1.03    204.6±7.07ms        ? ?/sec    1.00    198.3±3.65ms        ? ?/sec
bundle/bundle@rome-ts-minify-sourcemap                              1.00    235.3±6.65ms        ? ?/sec    1.02    240.2±9.11ms        ? ?/sec
bundle/bundle@rome-ts-sourcemap                                     1.01    136.9±2.62ms        ? ?/sec    1.00    135.8±2.47ms        ? ?/sec
bundle/bundle@threejs                                               1.02     44.0±2.93ms        ? ?/sec    1.00     43.1±1.02ms        ? ?/sec
bundle/bundle@threejs-minify                                        1.08     91.1±2.61ms        ? ?/sec    1.00     84.5±1.43ms        ? ?/sec
bundle/bundle@threejs-minify-sourcemap                              1.00    103.9±2.34ms        ? ?/sec    1.02    105.8±4.26ms        ? ?/sec
bundle/bundle@threejs-sourcemap                                     1.02     50.3±0.79ms        ? ?/sec    1.00     49.2±0.87ms        ? ?/sec
bundle/bundle@threejs10x                                            1.00    434.8±6.11ms        ? ?/sec    1.00    435.9±8.08ms        ? ?/sec
bundle/bundle@threejs10x-minify                                     1.00  1074.4±17.67ms        ? ?/sec    1.00  1076.7±14.67ms        ? ?/sec
bundle/bundle@threejs10x-minify-sourcemap                           1.00  1246.1±13.63ms        ? ?/sec    1.01  1256.8±10.27ms        ? ?/sec
bundle/bundle@threejs10x-sourcemap                                  1.00    503.5±3.98ms        ? ?/sec    1.01    510.0±7.06ms        ? ?/sec
remapping/remapping                                                 1.05     27.0±1.30ms        ? ?/sec    1.00     25.7±0.13ms        ? ?/sec
remapping/render-chunk-remapping                                    1.06     74.1±5.75ms        ? ?/sec    1.00     70.0±5.45ms        ? ?/sec
scan/scan@rome-ts                                                   1.01     99.3±2.34ms        ? ?/sec    1.00     98.0±1.50ms        ? ?/sec
scan/scan@threejs                                                   1.00     32.6±1.31ms        ? ?/sec    1.00     32.5±0.74ms        ? ?/sec
scan/scan@threejs10x                                                1.01    325.6±4.68ms        ? ?/sec    1.00    321.9±5.96ms        ? ?/sec
```
author_association: CONTRIBUTOR
user: login: socket-security[bot]
created_at: 2025-05-07T15:59:59Z
body: **Review the following changes in direct dependencies.** Learn more about [Socket for GitHub](https://socket.dev?utm_medium=gh).

<table>
<thead>
<tr>
<th>Diff</th>
<th width="200px">Package</th>
<th align="center" width="100px">Supply Chain<br/>Security</th>
<th align="center" width="100px">Vulnerability</th>
<th align="center" width="100px">Quality</th>
<th align="center" width="100px">Maintenance</th>
<th align="center" width="100px">License</th>
</tr>
</thead>
<tbody>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15956906085"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15956906085">ansis@​3.17.0</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15956906085"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15956906085"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15956906085"><img src="https://github-app-statics.socket.dev/score-53.svg" title="Quality" width="40" height="40" alt="53"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15956906085"><img src="https://github-app-statics.socket.dev/score-96.svg" title="Maintenance" width="40" height="40" alt="96"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15956906085"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15914414302"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15914414302">husky@​9.1.7</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15914414302"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15914414302"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15914414302"><img src="https://github-app-statics.socket.dev/score-59.svg" title="Quality" width="40" height="40" alt="59"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15914414302"><img src="https://github-app-statics.socket.dev/score-82.svg" title="Maintenance" width="40" height="40" alt="82"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15914414302"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=16183712997"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=16183712997">dprint@​0.49.1</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=16183712997"><img src="https://github-app-statics.socket.dev/score-91.svg" title="Supply Chain Security" width="40" height="40" alt="91"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=16183712997"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=16183712997"><img src="https://github-app-statics.socket.dev/score-65.svg" title="Quality" width="40" height="40" alt="65"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=16183712997"><img src="https://github-app-statics.socket.dev/score-86.svg" title="Maintenance" width="40" height="40" alt="86"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=16183712997"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=21190708194"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=21190708194">@​vueuse/​core@​13.1.0</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=21190708194"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=21190708194"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=21190708194"><img src="https://github-app-statics.socket.dev/score-73.svg" title="Quality" width="40" height="40" alt="73"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=21190708194"><img src="https://github-app-statics.socket.dev/score-91.svg" title="Maintenance" width="40" height="40" alt="91"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=21190708194"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=27072537"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=27072537">kill-port@​2.0.1</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=27072537"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=27072537"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=27072537"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=27072537"><img src="https://github-app-statics.socket.dev/score-76.svg" title="Maintenance" width="40" height="40" alt="76"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=27072537"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=17018"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=17018">connect@​3.7.0</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=17018"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=17018"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=17018"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=17018"><img src="https://github-app-statics.socket.dev/score-76.svg" title="Maintenance" width="40" height="40" alt="76"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=17018"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15929817717"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15929817717">fast-glob@​3.3.3</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15929817717"><img src="https://github-app-statics.socket.dev/score-99.svg" title="Supply Chain Security" width="40" height="40" alt="99"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15929817717"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15929817717"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15929817717"><img src="https://github-app-statics.socket.dev/score-77.svg" title="Maintenance" width="40" height="40" alt="77"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15929817717"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15880182107"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15880182107">astring@​1.9.0</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15880182107"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15880182107"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15880182107"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15880182107"><img src="https://github-app-statics.socket.dev/score-77.svg" title="Maintenance" width="40" height="40" alt="77"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15880182107"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=4699320730"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=4699320730">fixturify@​3.0.0</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=4699320730"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=4699320730"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=4699320730"><img src="https://github-app-statics.socket.dev/score-93.svg" title="Quality" width="40" height="40" alt="93"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=4699320730"><img src="https://github-app-statics.socket.dev/score-79.svg" title="Maintenance" width="40" height="40" alt="79"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=4699320730"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15924755680"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15924755680">chalk@​5.4.1</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15924755680"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15924755680"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15924755680"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15924755680"><img src="https://github-app-statics.socket.dev/score-80.svg" title="Maintenance" width="40" height="40" alt="80"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15924755680"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=155951"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=155951">http-server@​14.1.1</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=155951"><img src="https://github-app-statics.socket.dev/score-98.svg" title="Supply Chain Security" width="40" height="40" alt="98"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=155951"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=155951"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=155951"><img src="https://github-app-statics.socket.dev/score-81.svg" title="Maintenance" width="40" height="40" alt="81"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=155951"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15934818387"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15934818387">fs-extra@​11.3.0</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15934818387"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15934818387"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15934818387"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15934818387"><img src="https://github-app-statics.socket.dev/score-81.svg" title="Maintenance" width="40" height="40" alt="81"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15934818387"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15885463866"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15885463866">follow-redirects@​1.15.9</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15885463866"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15885463866"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15885463866"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15885463866"><img src="https://github-app-statics.socket.dev/score-81.svg" title="Maintenance" width="40" height="40" alt="81"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15885463866"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=26440981"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=26440981">buble@​0.20.0</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=26440981"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=26440981"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=26440981"><img src="https://github-app-statics.socket.dev/score-84.svg" title="Quality" width="40" height="40" alt="84"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=26440981"><img src="https://github-app-statics.socket.dev/score-81.svg" title="Maintenance" width="40" height="40" alt="81"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=26440981"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15920290403"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15920290403">debug@​4.4.0</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15920290403"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15920290403"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15920290403"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15920290403"><img src="https://github-app-statics.socket.dev/score-82.svg" title="Maintenance" width="40" height="40" alt="82"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15920290403"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15557587520"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15557587520">conventional-changelog-cli@​5.0.0</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15557587520"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15557587520"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15557587520"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15557587520"><img src="https://github-app-statics.socket.dev/score-82.svg" title="Maintenance" width="40" height="40" alt="82"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15557587520"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15958733900"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15958733900">acorn@​8.14.1</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15958733900"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15958733900"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15958733900"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15958733900"><img src="https://github-app-statics.socket.dev/score-84.svg" title="Maintenance" width="40" height="40" alt="84"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15958733900"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15951400640"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15951400640">cjs-module-lexer@​2.1.0</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15951400640"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15951400640"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15951400640"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15951400640"><img src="https://github-app-statics.socket.dev/score-84.svg" title="Maintenance" width="40" height="40" alt="84"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15951400640"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15298602113"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15298602113">dedent@​1.5.3</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15298602113"><img src="https://github-app-statics.socket.dev/score-99.svg" title="Supply Chain Security" width="40" height="40" alt="99"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15298602113"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15298602113"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15298602113"><img src="https://github-app-statics.socket.dev/score-86.svg" title="Maintenance" width="40" height="40" alt="86"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15298602113"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15885667845"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15885667845">diff@​7.0.0</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15885667845"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15885667845"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15885667845"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15885667845"><img src="https://github-app-statics.socket.dev/score-86.svg" title="Maintenance" width="40" height="40" alt="86"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15885667845"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=16122247704"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=16122247704">consola@​3.4.2</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=16122247704"><img src="https://github-app-statics.socket.dev/score-99.svg" title="Supply Chain Security" width="40" height="40" alt="99"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=16122247704"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=16122247704"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=16122247704"><img src="https://github-app-statics.socket.dev/score-87.svg" title="Maintenance" width="40" height="40" alt="87"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=16122247704"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15887804720"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15887804720">estree-toolkit@​1.7.8</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15887804720"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15887804720"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15887804720"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15887804720"><img src="https://github-app-statics.socket.dev/score-87.svg" title="Maintenance" width="40" height="40" alt="87"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15887804720"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15932333087"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15932333087">glob@​11.0.1</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15932333087"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15932333087"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15932333087"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15932333087"><img src="https://github-app-statics.socket.dev/score-88.svg" title="Maintenance" width="40" height="40" alt="88"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15932333087"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15900522951"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15900522951">emnapi@​1.3.1</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15900522951"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15900522951"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15900522951"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15900522951"><img src="https://github-app-statics.socket.dev/score-89.svg" title="Maintenance" width="40" height="40" alt="89"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15900522951"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15962258898"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15962258898">lint-staged@​15.5.0</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15962258898"><img src="https://github-app-statics.socket.dev/score-99.svg" title="Supply Chain Security" width="40" height="40" alt="99"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15962258898"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15962258898"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15962258898"><img src="https://github-app-statics.socket.dev/score-93.svg" title="Maintenance" width="40" height="40" alt="93"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=15962258898"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=18456830150"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=18456830150">cspell@​8.18.1</a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=18456830150"><img src="https://github-app-statics.socket.dev/score-99.svg" title="Supply Chain Security" width="40" height="40" alt="99"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=18456830150"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=18456830150"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=18456830150"><img src="https://github-app-statics.socket.dev/score-95.svg" title="Maintenance" width="40" height="40" alt="95"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies&dependency_item_key=18456830150"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
</tbody>
</table>

[View full report](https://socket.dev/dashboard/org/rolldown/diff/5ae0fd48-d5b8-4145-8826-03d66dc19566/060e7463-4a20-4a54-9821-acc730f2c7f1?tab=dependencies)

<!-- overview-comment -->
author_association: NONE