diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 7cf3873..dd46837 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -6,18 +6,18 @@ jobs:
   test:
     runs-on: ubuntu-latest
     concurrency:
-      group: ci-${{ github.ref }}
+      group: ${{ github.workflow }}-${{ github.ref }}
       cancel-in-progress: true
     steps:
-      - uses: actions/checkout@v2
-      - uses: actions/cache@v2
-        with:
-          path: ~/.pnpm-store
-          key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
-          restore-keys: |
-            ${{ runner.os }}-
-      - uses: pnpm/action-setup@v2.0.1
+      - uses: actions/checkout@v4
+      - uses: pnpm/action-setup@v2
         with:
           version: latest
-          run_install: true
-      - run: pnpm test
+      - uses: actions/setup-node@v4
+        with:
+          node-version: 20
+          cache: pnpm
+      - run: |
+          pnpm install
+          pnpm build
+          pnpm test
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 7280abc..84770a3 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -2,21 +2,30 @@ name: Node.js Package
 
 on:
   push:
-    tags: "*"
+    tags: '*'
 
 jobs:
   build:
     runs-on: ubuntu-latest
+    permissions:
+      contents: read
+      id-token: write
+    concurrency:
+      group: ${{ github.workflow }}-${{ github.ref }}
+      cancel-in-progress: true
     steps:
-      - uses: actions/checkout@v2
-      - uses: pnpm/action-setup@v2.0.1
+      - uses: actions/checkout@v4
+      - uses: pnpm/action-setup@v2
         with:
           version: latest
-          run_install: true
-      - run: pnpm build
-      - name: Publish Package
+      - uses: actions/setup-node@v4
+        with:
+          node-version: 20
+          registry-url: 'https://registry.npmjs.org'
+          cache: pnpm
+      - run: |
+          pnpm install
+          pnpm build
+      - run: pnpm publish --provenance --access public --no-git-checks
         env:
-          NPM_TOKEN: ${{secrets.NPM_TOKEN}}
-        run: |
-          pnpm config set "//registry.npmjs.org/:_authToken" "${NPM_TOKEN}"
-          pnpm publish --access public --no-git-checks
+          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 5b9559b..7218a7d 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -4,8 +4,8 @@
   "prettier.enable": true,
   "editor.defaultFormatter": "esbenp.prettier-vscode",
   "editor.codeActionsOnSave": {
-    "source.sortImports": true,
-    "source.fixAll.eslint": false
+    "source.sortImports": "explicit",
+    "source.fixAll.eslint": "never"
   },
   "prettier.tabWidth": 2,
   "prettier.endOfLine": "auto",
diff --git a/README.md b/README.md
index acd336e..ba94631 100644
--- a/README.md
+++ b/README.md
@@ -9,21 +9,21 @@ other bundlers from analyzing the dependencies. For example:
 
 ```js
 // some commonjs library, like react-dom
-var React = require("react");
+var React = require('react')
 
 // your esm code
-export { render } from "react-dom";
+export { render } from 'react-dom'
 
 // after esbuild --bundle
-var React = __require("react"); // <- you dislike this
-("...");
-export { render };
+var React = __require('react') // <- you dislike this
+// ...
+export { render }
 
 // with this plugin
-import __import_react from "react"; // <- you want this
-var React = __import_react;
-("...");
-export { render };
+import __import_react from 'react' // <- you want this
+var React = __import_react
+// ...
+export { render }
 ```
 
 This plugin was inspired by [a comment under esbuild#1921][4]
@@ -54,7 +54,7 @@ require("esbuild").build({
 ## Options
 
 ```js
-commonjs({ filter: /\.c?js$/, transform: false });
+commonjs({ filter: /\.c?js$/, transform: false })
 ```
 
 **filter** (default: `/\.c?js$/`)
@@ -63,6 +63,34 @@ A RegExp passed to [`onLoad()`](https://esbuild.github.io/plugins/#on-load) to
 match commonjs modules, it is recommended to set a custom filter to skip files
 for better performance.
 
+**requireReturnsDefault** (default: `true`)
+
+```ts
+requireReturnsDefault: boolean | ((path: string) => boolean)
+```
+
+Controls which style of import statement to use replacing require calls in commonjs modules.
+
+```js
+// input
+const foo = require('foo')
+
+// output if requireReturnsDefault is true (default behavior)
+import foo from 'foo'
+
+// output if requireReturnsDefault is false
+import * as foo from 'foo'
+```
+
+**ignore**
+
+Do not convert require calls to these modules. Note that this will cause esbuild
+to generate `__require()` wrappers and throw errors at runtime.
+
+```ts
+ignore: string[] | ((path: string) => boolean)
+```
+
 **transform** (default: `false`)
 
 Try to transform commonjs to es modules. This trick is done with [`cjs-module-lexer`](https://github.com/nodejs/cjs-module-lexer)
@@ -70,8 +98,6 @@ to match the native (node) behavior as much as possible. Because this
 transformation may cause many bugs around the interop between cjs and esm,
 it can also accept a function to filter in the "safe to convert" modules by yourself.
 
-Type:
-
 ```ts
 transform: boolean | ((path: string) => {
   behavior?: "node" | "babel", exports?: string[], sideEffects?: boolean
@@ -81,9 +107,9 @@ transform: boolean | ((path: string) => {
 By default, if you toggle `transform` to `true`, it will convert this code:
 
 ```js
-exports.__esModule = true;
-exports.default = {};
-exports.foo = 42;
+exports.__esModule = true
+exports.default = {}
+exports.foo = 42
 ```
 
 To this:
@@ -120,6 +146,10 @@ exports, which sucks obviously.
 
 Add experimental option `transform` and `transformConfig`.
 
+### 0.2.3
+
+Add options `requireReturnsDefault` and `ignore`.
+
 ## License
 
 MIT @ [hyrious](https://github.com/hyrious)
diff --git a/build-type.ts b/build-type.ts
deleted file mode 100644
index baf1c0e..0000000
--- a/build-type.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { rollup } from "rollup";
-import dts from "rollup-plugin-dts";
-import ts from "typescript";
-import { peerDependencies } from "./package.json";
-import { compilerOptions } from "./tsconfig.json";
-
-const start = Date.now();
-
-const bundle = await rollup({
-  input: "./index.ts",
-  output: { file: "index.d.ts" },
-  plugins: [
-    dts({
-      compilerOptions: {
-        ...ts.parseJsonConfigFileContent({ compilerOptions }, ts.sys, ".").options,
-        declaration: true,
-        noEmit: false,
-        emitDeclarationOnly: true,
-        noEmitOnError: true,
-        checkJs: false,
-        declarationMap: false,
-        skipLibCheck: true,
-        preserveSymlinks: false,
-      },
-    }),
-  ],
-  external: Object.keys(peerDependencies),
-});
-
-const result = await bundle.write({
-  dir: ".",
-  format: "esm",
-  exports: "named",
-});
-
-console.log(`Built ${result.output.map(e => e.fileName).join(", ")} in ${Math.floor(Date.now() - start)}ms`);
diff --git a/fixture/react-dom.js b/fixture/react-dom.js
index c4ed9e7..76264c0 100644
--- a/fixture/react-dom.js
+++ b/fixture/react-dom.js
@@ -1,9 +1,11 @@
-exports.__esModule = true;
-exports.default = {};
-exports.foo = 42;
+exports.__esModule = true
+exports.default = {}
+exports.foo = 42
 
-if (process.env.NODE_ENV === "production") {
-  exports.render = require("./react-dom-production").render;
+if (process.env.NODE_ENV === 'production') {
+  exports.render = require('./react-dom-production').render
 } else {
-  exports.render = require("./react-dom-development").render;
+  exports.render = require('./react-dom-development').render
 }
+
+exports.v4 = require('./uuid').v4
diff --git a/fixture/uuid.js b/fixture/uuid.js
new file mode 100644
index 0000000..4c60836
--- /dev/null
+++ b/fixture/uuid.js
@@ -0,0 +1 @@
+export const v4 = () => 'uuid-v4'
diff --git a/index.test.ts b/index.test.ts
index 7f5bf89..c3aa36f 100644
--- a/index.test.ts
+++ b/index.test.ts
@@ -1,14 +1,19 @@
-import { build } from "esbuild";
-import { commonjs } from "./index";
+import { build } from 'esbuild'
+import { commonjs } from './index'
 
 build({
-  entryPoints: ["fixture/entry.ts"],
+  entryPoints: ['fixture/entry.ts'],
   bundle: true,
-  plugins: [commonjs({ transform: true })],
+  plugins: [
+    commonjs({
+      transform: path => path.startsWith('react-dom'),
+      requireReturnsDefault: a => a !== './uuid',
+    }),
+  ],
   minifySyntax: true,
-  format: "esm",
-  external: ["react"],
+  format: 'esm',
+  external: ['react'],
   define: {
-    "process.env.NODE_ENV": '"production"',
+    'process.env.NODE_ENV': '"production"',
   },
-}).catch(() => process.exit(1));
+}).catch(() => process.exit(1))
diff --git a/index.ts b/index.ts
index ecbb9d4..d3ddc08 100644
--- a/index.ts
+++ b/index.ts
@@ -1,7 +1,7 @@
-import type { Message, Plugin } from "esbuild";
-import { promises } from "fs";
-import { Lexer } from "./lexer";
-import { cachedReduce, makeLegalIdentifier, orderedUniq } from "./utils";
+import type { Message, Plugin } from 'esbuild'
+import { promises } from 'fs'
+import { Lexer } from './lexer'
+import { cachedReduce, makeLegalIdentifier, orderedUniq } from './utils'
 
 export interface CommonJSOptions {
   /**
@@ -9,7 +9,7 @@ export interface CommonJSOptions {
    *
    * @default /\.c?js$/
    */
-  filter?: RegExp;
+  filter?: RegExp
 
   /**
    * _Experimental_: Transform commonjs to es modules. You have to install
@@ -31,12 +31,43 @@ export interface CommonJSOptions {
    *
    * @default false
    */
-  transform?: boolean | ((path: string) => TransformConfig | null | void);
+  transform?: boolean | ((path: string) => boolean | TransformConfig | null | void)
 
   /**
    * _Experimental_: This options acts as a fallback of the `transform` option above.
    */
-  transformConfig?: Pick<TransformConfig, "behavior" | "sideEffects">;
+  transformConfig?: Pick<TransformConfig, 'behavior' | 'sideEffects'>
+
+  /**
+   * Controls which style of import should be used. By default, it transforms:
+   *
+   * ```js
+   * // input
+   * const foo = require("foo")
+   * // output
+   * import foo from "foo"
+   * ```
+   *
+   * The above case is often correct when 'foo' is also a commonjs module.
+   * But if 'foo' has es module exports, it is better to use:
+   *
+   * ```js
+   * // output
+   * import * as foo from "foo"
+   * ```
+   *
+   * In which case you can set `requireReturnsDefault` to `false` to get the above output.
+   * Or use the callback style to control the behavior for each module.
+   *
+   * @default true
+   */
+  requireReturnsDefault?: boolean | ((path: string) => boolean)
+
+  /**
+   * Don't replace require("ignored-modules"). Note that this will cause
+   * esbuild generates the __require() wrapper which throw error at runtime.
+   */
+  ignore?: string[] | ((path: string) => boolean)
 }
 
 export interface TransformConfig {
@@ -50,14 +81,14 @@ export interface TransformConfig {
    *
    * @default "node"
    */
-  behavior?: "babel" | "node";
+  behavior?: 'babel' | 'node'
 
   /**
    * Also include these named exports if they aren't recognized automatically.
    *
    * @example ["something"]
    */
-  exports?: string[];
+  exports?: string[]
 
   /**
    * If `false`, slightly change the result to make it side-effect free.
@@ -65,189 +96,203 @@ export interface TransformConfig {
    *
    * ```js
    * var mod;
-   * var exports = /+ @__PURE__ +/ ((exports, module) => {
+   * var exports = /\*#__PURE__*\/ ((exports, module) => {
    *   // ... original content ...
    *   return module.exports;
    * })((mod = { exports: {} }).exports, mod);
    * export default exports;
-   * var a_b = /+ @__PURE__ +/ (() => exports['a-b'])();
-   * var something = /+ @__PURE__ +/ (() => exports.something)();
+   * var a_b = /\*#__PURE__*\/ (() => exports['a-b'])();
+   * var something = /\*#__PURE__*\/ (() => exports.something)();
    * export { a_b as "a-b", something };
    * ```
-   *
-   * Note: the `/+ @__PURE__ +/` above is actually `'/' + '* @__PURE__ *' + '/'`.
    */
-  sideEffects?: boolean;
+  sideEffects?: boolean
 }
 
 export function commonjs({
   filter = /\.c?js$/,
   transform = false,
   transformConfig,
+  requireReturnsDefault = true,
+  ignore,
 }: CommonJSOptions = {}): Plugin {
-  let init_cjs_module_lexer: Promise<typeof import("cjs-module-lexer")> | undefined;
-  if (transform) {
-    init_cjs_module_lexer = import("cjs-module-lexer");
-  }
+  const init_cjs_module_lexer = transform ? import('cjs-module-lexer') : undefined
+
+  const use_default_export =
+    typeof requireReturnsDefault === 'function'
+      ? requireReturnsDefault
+      : (_path: string) => requireReturnsDefault
+
+  const is_ignored =
+    typeof ignore === 'function'
+      ? ignore
+      : Array.isArray(ignore)
+      ? (path: string) => ignore.includes(path)
+      : () => false
 
   return {
-    name: "commonjs",
+    name: 'commonjs',
     setup({ onLoad, esbuild }) {
-      let esbuild_shim: typeof import("esbuild") | undefined;
-      const require_esbuild = () => esbuild || (esbuild_shim ||= require("esbuild"));
-      const read = promises.readFile;
-      const lexer = new Lexer();
+      let esbuild_shim: typeof import('esbuild') | undefined
+      const require_esbuild = () => esbuild || (esbuild_shim ||= require('esbuild'))
+      const read = promises.readFile
+      const lexer = new Lexer()
 
       onLoad({ filter }, async args => {
-        let parseCJS: typeof import("cjs-module-lexer").parse | undefined;
+        let parseCJS: typeof import('cjs-module-lexer').parse | undefined
         if (init_cjs_module_lexer) {
-          const { init, parse } = await init_cjs_module_lexer;
-          await init();
-          parseCJS = parse;
+          const { init, parse } = await init_cjs_module_lexer
+          await init()
+          parseCJS = parse
         }
 
-        let contents: string;
+        let contents: string
         try {
-          contents = await read(args.path, "utf8");
+          contents = await read(args.path, 'utf8')
         } catch {
-          return null;
+          return null
         }
 
-        const willTransform = transform === true || (typeof transform === "function" && transform(args.path));
+        const willTransform = transform === true || (typeof transform === 'function' && transform(args.path))
 
-        let cjsExports: ReturnType<NonNullable<typeof parseCJS>> | undefined;
+        let cjsExports: ReturnType<NonNullable<typeof parseCJS>> | undefined
         if (parseCJS && willTransform) {
           // move sourcemap to the end of the transformed file
-          let sourcemapIndex = contents.lastIndexOf("//# sourceMappingURL=");
-          let sourcemap: string | undefined;
+          let sourcemapIndex = contents.lastIndexOf('//# sourceMappingURL=')
+          let sourcemap: string | undefined
           if (sourcemapIndex !== -1) {
-            sourcemap = contents.slice(sourcemapIndex);
-            let sourcemapEnd = sourcemap.indexOf("\n");
+            sourcemap = contents.slice(sourcemapIndex)
+            let sourcemapEnd = sourcemap.indexOf('\n')
             if (sourcemapEnd !== -1 && sourcemap.slice(sourcemapEnd + 1).trimStart().length > 0) {
               // if there's code after sourcemap, it is invalid, don't do this.
-              sourcemap = undefined;
+              sourcemap = undefined
             } else {
-              contents = contents.slice(0, sourcemapIndex);
+              contents = contents.slice(0, sourcemapIndex)
             }
           }
           // transform commonjs to es modules, easy mode
-          cjsExports = parseCJS(contents);
+          cjsExports = parseCJS(contents)
           let { behavior, exports, sideEffects } =
-            typeof willTransform === "object" ? willTransform : ({} as TransformConfig);
-          behavior ??= transformConfig?.behavior ?? "node";
-          exports = orderedUniq(cjsExports.exports.concat(exports ?? []));
-          sideEffects ??= transformConfig?.sideEffects ?? true;
+            typeof willTransform === 'object' ? willTransform : ({} as TransformConfig)
+          behavior ??= transformConfig?.behavior ?? 'node'
+          exports = orderedUniq(cjsExports.exports.concat(exports ?? []))
+          sideEffects ??= transformConfig?.sideEffects ?? true
           let exportDefault =
-            behavior === "node"
-              ? "export default exports;"
-              : "export default exports.__esModule ? exports.default : exports;";
-          let exportsMap = exports.map(e => [e, makeLegalIdentifier(e)]);
-          if (exportsMap.some(([e]) => e === "default")) {
-            if (behavior === "node") {
-              exportsMap = exportsMap.filter(([e]) => e !== "default");
+            behavior === 'node'
+              ? 'export default exports;'
+              : 'export default exports.__esModule ? exports.default : exports;'
+          let exportsMap = exports.map(e => [e, makeLegalIdentifier(e)])
+          if (exportsMap.some(([e]) => e === 'default')) {
+            if (behavior === 'node') {
+              exportsMap = exportsMap.filter(([e]) => e !== 'default')
             } else {
-              exportDefault = "";
+              exportDefault = ''
             }
           }
-          let reexports = cjsExports.reexports.map(e => `export * from ${JSON.stringify(e)};`).join("");
-          let transformed: string[];
+          let reexports = cjsExports.reexports.map(e => `export * from ${JSON.stringify(e)};`).join('')
+          let transformed: string[]
           if (sideEffects === false) {
             transformed = [
               // make sure we don't manipulate the first line so that sourcemap is fine
-              reexports + "var mod, exports = /* @__PURE__ */ ((exports, module) => {" + contents,
-              "return module.exports})((mod = { exports: {} }).exports, mod); " + exportDefault,
-            ];
+              reexports + 'var mod, exports = /* @__PURE__ */ ((exports, module) => {' + contents,
+              'return module.exports})((mod = { exports: {} }).exports, mod); ' + exportDefault,
+            ]
             if (exportsMap.length > 0) {
               for (const [e, name] of exportsMap) {
-                transformed.push(`var ${name} = /* @__PURE__ */ (() => exports[${JSON.stringify(e)}])();`);
+                transformed.push(`var ${name} = /* @__PURE__ */ (() => exports[${JSON.stringify(e)}])();`)
               }
               transformed.push(
                 `export { ${exportsMap
                   .map(([e, name]) => (e === name ? e : `${name} as ${JSON.stringify(e)}`))
-                  .join(", ")} };`
-              );
+                  .join(', ')} };`
+              )
             }
           } else {
             transformed = [
-              reexports + "var exports = {}, module = { exports }; {" + contents,
-              "}; exports = module.exports; " + exportDefault,
-            ];
+              reexports + 'var exports = {}, module = { exports }; {' + contents,
+              '}; exports = module.exports; ' + exportDefault,
+            ]
             if (exportsMap.length > 0) {
               transformed.push(
                 `var { ${exportsMap
                   .map(([e, name]) => (e === name ? e : `${JSON.stringify(e)}: ${name}`))
-                  .join(", ")} } = exports;`,
+                  .join(', ')} } = exports;`,
                 `export { ${exportsMap
                   .map(([e, name]) => (e === name ? e : `${name} as ${JSON.stringify(e)}`))
-                  .join(", ")} };`
-              );
+                  .join(', ')} };`
+              )
             }
           }
-          contents = transformed.join("\n") + (sourcemap ? "\n" + sourcemap : "");
+          contents = transformed.join('\n') + (sourcemap ? '\n' + sourcemap : '')
         }
 
         function makeName(path: string) {
-          let name = `__import_${makeLegalIdentifier(path)}`;
+          let name = `__import_${makeLegalIdentifier(path)}`
 
           if (contents.includes(name)) {
-            let suffix = 2;
-            while (contents.includes(`${name}_${suffix}`)) suffix++;
-            name = `${name}_${suffix}`;
+            let suffix = 2
+            while (contents.includes(`${name}${suffix}`)) suffix++
+            name = `${name}${suffix}`
           }
 
-          return name;
+          return name
         }
 
-        let warnings: Message[];
+        let warnings: Message[]
         try {
-          ({ warnings } = await require_esbuild().transform(contents, { format: "esm", logLevel: "silent" }));
+          ;({ warnings } = await require_esbuild().transform(contents, { format: 'esm', logLevel: 'silent' }))
         } catch (err) {
-          ({ warnings } = err as any);
+          ;({ warnings } = err as any)
         }
 
-        let lines = contents.split("\n");
-        let getOffset = cachedReduce(lines, (a, b) => a + 1 + b.length, 0);
+        let lines = contents.split('\n')
+        let getOffset = cachedReduce(lines, (a, b) => a + 1 + b.length, 0)
 
         if (warnings && (warnings = warnings.filter(e => e.text.includes('"require" to "esm"'))).length) {
-          let edits: [start: number, end: number, replace: string][] = [];
-          let imports: string[] = [];
+          let edits: [start: number, end: number, replace: string][] = []
+          let imports: string[] = []
 
           for (const { location } of warnings) {
-            if (location === null) continue;
+            if (location === null) continue
 
-            const { line, lineText, column, length } = location;
+            const { line, lineText, column, length } = location
 
-            const leftBrace = column + length + 1;
-            const path = lexer.readString(lineText, leftBrace);
-            if (path === null) continue;
-            const rightBrace = lineText.indexOf(")", leftBrace + 2 + path.length) + 1;
+            const leftBrace = column + length + 1
+            const path = lexer.readString(lineText, leftBrace)
+            if (path === null || is_ignored(path)) continue
+            const rightBrace = lineText.indexOf(')', leftBrace + 2 + path.length) + 1
 
-            let name = makeName(path);
-            let import_statement = `import ${name} from ${JSON.stringify(path)};`;
+            let name = makeName(path)
+            let import_statement: string
+            if (use_default_export(path)) {
+              import_statement = `import ${name} from ${JSON.stringify(path)};`
+            } else {
+              import_statement = `import * as ${name} from ${JSON.stringify(path)};`
+            }
 
-            let offset = getOffset(line - 1);
-            edits.push([offset + column, offset + rightBrace, name]);
-            imports.push(import_statement);
+            let offset = getOffset(line - 1)
+            edits.push([offset + column, offset + rightBrace, name])
+            imports.push(import_statement)
           }
 
-          if (imports.length === 0) return null;
+          if (imports.length === 0) return null
 
-          imports = orderedUniq(imports);
+          imports = orderedUniq(imports)
 
-          let offset = 0;
+          let offset = 0
           for (const [start, end, name] of edits) {
-            contents = contents.slice(0, start + offset) + name + contents.slice(end + offset);
-            offset += name.length - (end - start);
+            contents = contents.slice(0, start + offset) + name + contents.slice(end + offset)
+            offset += name.length - (end - start)
           }
 
           // if we have transformed this module (i.e. having `cjsExports`), don't make the file commonjs
-          contents = [...imports, cjsExports ? "exports;" : "", contents].join("");
+          contents = [...imports, cjsExports ? 'exports;' : '', contents].join('')
 
-          return { contents };
+          return { contents }
         }
-      });
+      })
     },
-  };
+  }
 }
 
-export default commonjs;
+export default commonjs
diff --git a/package.json b/package.json
index eeb6081..11fa6bc 100644
--- a/package.json
+++ b/package.json
@@ -2,29 +2,32 @@
   "name": "@hyrious/esbuild-plugin-commonjs",
   "version": "0.2.2",
   "description": "Bundle commonjs externals in es module in esbuild.",
+  "author": "hyrious <hyrious@outlook.com>",
+  "license": "MIT",
+  "keywords": [
+    "esbuild",
+    "plugin",
+    "commonjs",
+    "modules",
+    "require"
+  ],
   "main": "index.js",
   "types": "index.d.ts",
   "files": [
+    "index.d.ts",
     "index.js",
     "index.js.map",
     "index.ts",
     "lexer.ts",
-    "utils.ts",
-    "index.d.ts"
-  ],
-  "keywords": [
-    "esbuild",
-    "plugin",
-    "commonjs",
-    "modules",
-    "require"
+    "utils.ts"
   ],
-  "author": "hyrious <hyrious@outlook.com>",
-  "license": "MIT",
+  "engines": {
+    "node": ">=14"
+  },
   "scripts": {
     "build": "npm run build:js && npm run build:type",
-    "build:js": "esbuild index.ts --bundle --external:esbuild --external:cjs-module-lexer --sourcemap --sources-content=false --outfile=index.js --platform=node --target=node14",
-    "build:type": "esbuild-dev build-type.ts",
+    "build:js": "esbuild index.ts --bundle --packages=external --sourcemap --sources-content=false --outfile=index.js --platform=node --target=node14",
+    "build:type": "dts index.ts -o index.d.ts",
     "test": "esbuild-dev index.test.ts"
   },
   "peerDependencies": {
@@ -37,15 +40,10 @@
     }
   },
   "devDependencies": {
-    "@hyrious/esbuild-dev": "^0.8.6",
-    "@types/node": "^14",
-    "cjs-module-lexer": "^1.2.2",
-    "esbuild": "^0.15.14",
-    "rollup": "^3.3.0",
-    "rollup-plugin-dts": "^5.0.0",
-    "typescript": "^4.9.3"
-  },
-  "engines": {
-    "node": ">=14"
+    "@hyrious/dts": "^0.2.0",
+    "@hyrious/esbuild-dev": "^0.10.5",
+    "@types/node": "^20.10.6",
+    "cjs-module-lexer": "^1.2.3",
+    "esbuild": "^0.19.11"
   }
 }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 188c2d3..b0a343f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,118 +1,85 @@
-lockfileVersion: 5.4
+lockfileVersion: '6.0'
 
-specifiers:
-  '@hyrious/esbuild-dev': ^0.8.6
-  '@types/node': ^14
-  cjs-module-lexer: ^1.2.2
-  esbuild: ^0.15.14
-  rollup: ^3.3.0
-  rollup-plugin-dts: ^5.0.0
-  typescript: ^4.9.3
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false
 
 devDependencies:
-  '@hyrious/esbuild-dev': 0.8.6_esbuild@0.15.14
-  '@types/node': 14.18.33
-  cjs-module-lexer: 1.2.2
-  esbuild: 0.15.14
-  rollup: 3.3.0
-  rollup-plugin-dts: 5.0.0_6annma2bj33shm6er7hwi5u4z4
-  typescript: 4.9.3
+  '@hyrious/dts':
+    specifier: ^0.2.0
+    version: 0.2.0
+  '@hyrious/esbuild-dev':
+    specifier: ^0.10.5
+    version: 0.10.5(esbuild@0.19.11)
+  '@types/node':
+    specifier: ^20.10.6
+    version: 20.10.6
+  cjs-module-lexer:
+    specifier: ^1.2.3
+    version: 1.2.3
+  esbuild:
+    specifier: ^0.19.11
+    version: 0.19.11
 
 packages:
 
-  /@babel/code-frame/7.18.6:
-    resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==}
+  /@babel/code-frame@7.23.5:
+    resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==}
     engines: {node: '>=6.9.0'}
     requiresBuild: true
     dependencies:
-      '@babel/highlight': 7.18.6
+      '@babel/highlight': 7.23.4
+      chalk: 2.4.2
     dev: true
     optional: true
 
-  /@babel/helper-validator-identifier/7.19.1:
-    resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
+  /@babel/helper-validator-identifier@7.22.20:
+    resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
     engines: {node: '>=6.9.0'}
+    requiresBuild: true
     dev: true
     optional: true
 
-  /@babel/highlight/7.18.6:
-    resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==}
+  /@babel/highlight@7.23.4:
+    resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==}
     engines: {node: '>=6.9.0'}
+    requiresBuild: true
     dependencies:
-      '@babel/helper-validator-identifier': 7.19.1
+      '@babel/helper-validator-identifier': 7.22.20
       chalk: 2.4.2
       js-tokens: 4.0.0
     dev: true
     optional: true
 
-  /@esbuild/android-arm/0.15.14:
-    resolution: {integrity: sha512-+Rb20XXxRGisNu2WmNKk+scpanb7nL5yhuI1KR9wQFiC43ddPj/V1fmNyzlFC9bKiG4mYzxW7egtoHVcynr+OA==}
+  /@esbuild/aix-ppc64@0.19.11:
+    resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==}
     engines: {node: '>=12'}
-    cpu: [arm]
-    os: [android]
+    cpu: [ppc64]
+    os: [aix]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@esbuild/linux-loong64/0.15.14:
-    resolution: {integrity: sha512-eQi9rosGNVQFJyJWV0HCA5WZae/qWIQME7s8/j8DMvnylfBv62Pbu+zJ2eUDqNf2O4u3WB+OEXyfkpBoe194sg==}
+  /@esbuild/android-arm64@0.19.11:
+    resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==}
     engines: {node: '>=12'}
-    cpu: [loong64]
-    os: [linux]
+    cpu: [arm64]
+    os: [android]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@hyrious/esbuild-dev/0.8.6_esbuild@0.15.14:
-    resolution: {integrity: sha512-zpiY53A+0ZyArySY/6GUeTruXmS/WSE3kr7LbbG/eBzX4UOo2oGqef6U9V5uFGGzAZ6z2eaPhvDqSR8FIjCpyQ==}
-    engines: {node: ^14.18.0 || >=16.0.0}
-    hasBin: true
-    peerDependencies:
-      esbuild: '*'
-    dependencies:
-      esbuild: 0.15.14
-    dev: true
-
-  /@types/node/14.18.33:
-    resolution: {integrity: sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==}
-    dev: true
-
-  /ansi-styles/3.2.1:
-    resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
-    engines: {node: '>=4'}
-    dependencies:
-      color-convert: 1.9.3
-    dev: true
-    optional: true
-
-  /chalk/2.4.2:
-    resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
-    engines: {node: '>=4'}
-    dependencies:
-      ansi-styles: 3.2.1
-      escape-string-regexp: 1.0.5
-      supports-color: 5.5.0
-    dev: true
-    optional: true
-
-  /cjs-module-lexer/1.2.2:
-    resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==}
-    dev: true
-
-  /color-convert/1.9.3:
-    resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
-    dependencies:
-      color-name: 1.1.3
-    dev: true
-    optional: true
-
-  /color-name/1.1.3:
-    resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+  /@esbuild/android-arm@0.19.11:
+    resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
     dev: true
     optional: true
 
-  /esbuild-android-64/0.15.14:
-    resolution: {integrity: sha512-HuilVIb4rk9abT4U6bcFdU35UHOzcWVGLSjEmC58OVr96q5UiRqzDtWjPlCMugjhgUGKEs8Zf4ueIvYbOStbIg==}
+  /@esbuild/android-x64@0.19.11:
+    resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [android]
@@ -120,17 +87,17 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-android-arm64/0.15.14:
-    resolution: {integrity: sha512-/QnxRVxsR2Vtf3XottAHj7hENAMW2wCs6S+OZcAbc/8nlhbAL/bCQRCVD78VtI5mdwqWkVi3wMqM94kScQCgqg==}
+  /@esbuild/darwin-arm64@0.19.11:
+    resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==}
     engines: {node: '>=12'}
     cpu: [arm64]
-    os: [android]
+    os: [darwin]
     requiresBuild: true
     dev: true
     optional: true
 
-  /esbuild-darwin-64/0.15.14:
-    resolution: {integrity: sha512-ToNuf1uifu8hhwWvoZJGCdLIX/1zpo8cOGnT0XAhDQXiKOKYaotVNx7pOVB1f+wHoWwTLInrOmh3EmA7Fd+8Vg==}
+  /@esbuild/darwin-x64@0.19.11:
+    resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [darwin]
@@ -138,17 +105,17 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-darwin-arm64/0.15.14:
-    resolution: {integrity: sha512-KgGP+y77GszfYJgceO0Wi/PiRtYo5y2Xo9rhBUpxTPaBgWDJ14gqYN0+NMbu+qC2fykxXaipHxN4Scaj9tUS1A==}
+  /@esbuild/freebsd-arm64@0.19.11:
+    resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==}
     engines: {node: '>=12'}
     cpu: [arm64]
-    os: [darwin]
+    os: [freebsd]
     requiresBuild: true
     dev: true
     optional: true
 
-  /esbuild-freebsd-64/0.15.14:
-    resolution: {integrity: sha512-xr0E2n5lyWw3uFSwwUXHc0EcaBDtsal/iIfLioflHdhAe10KSctV978Te7YsfnsMKzcoGeS366+tqbCXdqDHQA==}
+  /@esbuild/freebsd-x64@0.19.11:
+    resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [freebsd]
@@ -156,89 +123,89 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-freebsd-arm64/0.15.14:
-    resolution: {integrity: sha512-8XH96sOQ4b1LhMlO10eEWOjEngmZ2oyw3pW4o8kvBcpF6pULr56eeYVP5radtgw54g3T8nKHDHYEI5AItvskZg==}
+  /@esbuild/linux-arm64@0.19.11:
+    resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==}
     engines: {node: '>=12'}
     cpu: [arm64]
-    os: [freebsd]
+    os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /esbuild-linux-32/0.15.14:
-    resolution: {integrity: sha512-6ssnvwaTAi8AzKN8By2V0nS+WF5jTP7SfuK6sStGnDP7MCJo/4zHgM9oE1eQTS2jPmo3D673rckuCzRlig+HMA==}
+  /@esbuild/linux-arm@0.19.11:
+    resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==}
     engines: {node: '>=12'}
-    cpu: [ia32]
+    cpu: [arm]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /esbuild-linux-64/0.15.14:
-    resolution: {integrity: sha512-ONySx3U0wAJOJuxGUlXBWxVKFVpWv88JEv0NZ6NlHknmDd1yCbf4AEdClSgLrqKQDXYywmw4gYDvdLsS6z0hcw==}
+  /@esbuild/linux-ia32@0.19.11:
+    resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==}
     engines: {node: '>=12'}
-    cpu: [x64]
+    cpu: [ia32]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /esbuild-linux-arm/0.15.14:
-    resolution: {integrity: sha512-D2LImAIV3QzL7lHURyCHBkycVFbKwkDb1XEUWan+2fb4qfW7qAeUtul7ZIcIwFKZgPcl+6gKZmvLgPSj26RQ2Q==}
+  /@esbuild/linux-loong64@0.19.11:
+    resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==}
     engines: {node: '>=12'}
-    cpu: [arm]
+    cpu: [loong64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /esbuild-linux-arm64/0.15.14:
-    resolution: {integrity: sha512-kle2Ov6a1e5AjlHlMQl1e+c4myGTeggrRzArQFmWp6O6JoqqB9hT+B28EW4tjFWgV/NxUq46pWYpgaWXsXRPAg==}
+  /@esbuild/linux-mips64el@0.19.11:
+    resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==}
     engines: {node: '>=12'}
-    cpu: [arm64]
+    cpu: [mips64el]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /esbuild-linux-mips64le/0.15.14:
-    resolution: {integrity: sha512-FVdMYIzOLXUq+OE7XYKesuEAqZhmAIV6qOoYahvUp93oXy0MOVTP370ECbPfGXXUdlvc0TNgkJa3YhEwyZ6MRA==}
+  /@esbuild/linux-ppc64@0.19.11:
+    resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==}
     engines: {node: '>=12'}
-    cpu: [mips64el]
+    cpu: [ppc64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /esbuild-linux-ppc64le/0.15.14:
-    resolution: {integrity: sha512-2NzH+iuzMDA+jjtPjuIz/OhRDf8tzbQ1tRZJI//aT25o1HKc0reMMXxKIYq/8nSHXiJSnYV4ODzTiv45s+h73w==}
+  /@esbuild/linux-riscv64@0.19.11:
+    resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==}
     engines: {node: '>=12'}
-    cpu: [ppc64]
+    cpu: [riscv64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /esbuild-linux-riscv64/0.15.14:
-    resolution: {integrity: sha512-VqxvutZNlQxmUNS7Ac+aczttLEoHBJ9e3OYGqnULrfipRvG97qLrAv9EUY9iSrRKBqeEbSvS9bSfstZqwz0T4Q==}
+  /@esbuild/linux-s390x@0.19.11:
+    resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==}
     engines: {node: '>=12'}
-    cpu: [riscv64]
+    cpu: [s390x]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /esbuild-linux-s390x/0.15.14:
-    resolution: {integrity: sha512-+KVHEUshX5n6VP6Vp/AKv9fZIl5kr2ph8EUFmQUJnDpHwcfTSn2AQgYYm0HTBR2Mr4d0Wlr0FxF/Cs5pbFgiOw==}
+  /@esbuild/linux-x64@0.19.11:
+    resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==}
     engines: {node: '>=12'}
-    cpu: [s390x]
+    cpu: [x64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /esbuild-netbsd-64/0.15.14:
-    resolution: {integrity: sha512-6D/dr17piEgevIm1xJfZP2SjB9Z+g8ERhNnBdlZPBWZl+KSPUKLGF13AbvC+nzGh8IxOH2TyTIdRMvKMP0nEzQ==}
+  /@esbuild/netbsd-x64@0.19.11:
+    resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [netbsd]
@@ -246,8 +213,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-openbsd-64/0.15.14:
-    resolution: {integrity: sha512-rREQBIlMibBetgr2E9Lywt2Qxv2ZdpmYahR4IUlAQ1Efv/A5gYdO0/VIN3iowDbCNTLxp0bb57Vf0LFcffD6kA==}
+  /@esbuild/openbsd-x64@0.19.11:
+    resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [openbsd]
@@ -255,8 +222,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-sunos-64/0.15.14:
-    resolution: {integrity: sha512-DNVjSp/BY4IfwtdUAvWGIDaIjJXY5KI4uD82+15v6k/w7px9dnaDaJJ2R6Mu+KCgr5oklmFc0KjBjh311Gxl9Q==}
+  /@esbuild/sunos-x64@0.19.11:
+    resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [sunos]
@@ -264,8 +231,17 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-windows-32/0.15.14:
-    resolution: {integrity: sha512-pHBWrcA+/oLgvViuG9FO3kNPO635gkoVrRQwe6ZY1S0jdET07xe2toUvQoJQ8KT3/OkxqUasIty5hpuKFLD+eg==}
+  /@esbuild/win32-arm64@0.19.11:
+    resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-ia32@0.19.11:
+    resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==}
     engines: {node: '>=12'}
     cpu: [ia32]
     os: [win32]
@@ -273,8 +249,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-windows-64/0.15.14:
-    resolution: {integrity: sha512-CszIGQVk/P8FOS5UgAH4hKc9zOaFo69fe+k1rqgBHx3CSK3Opyk5lwYriIamaWOVjBt7IwEP6NALz+tkVWdFog==}
+  /@esbuild/win32-x64@0.19.11:
+    resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [win32]
@@ -282,113 +258,348 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-windows-arm64/0.15.14:
-    resolution: {integrity: sha512-KW9W4psdZceaS9A7Jsgl4WialOznSURvqX/oHZk3gOP7KbjtHLSsnmSvNdzagGJfxbAe30UVGXRe8q8nDsOSQw==}
-    engines: {node: '>=12'}
+  /@hyrious/dts@0.2.0:
+    resolution: {integrity: sha512-RKVkbW6/DlnOhixL42XZcwQhc/kAnXeL4IkeGCGfC4x+eLtCH6vIIYrsJVLhDH4axGC/fKPryKNPLsT89J9z2g==}
+    hasBin: true
+    dependencies:
+      '@rollup/plugin-json': 6.1.0(rollup@4.9.2)
+      rollup: 4.9.2
+      rollup-plugin-dts: 6.1.0(rollup@4.9.2)(typescript@5.3.3)
+      sade: 1.8.1
+      typescript: 5.3.3
+    dev: true
+
+  /@hyrious/esbuild-dev@0.10.5(esbuild@0.19.11):
+    resolution: {integrity: sha512-f8ODDk7AP29tR+MKN29a8x4IpMs2LIYEK/eOY34oD5xjqtj+gP6cx4rrcnP4R9cZKKGMlLFDm0RN51eSqOnMlg==}
+    engines: {node: ^14.18 || >=16}
+    hasBin: true
+    peerDependencies:
+      esbuild: '>=0.17'
+    dependencies:
+      esbuild: 0.19.11
+    dev: true
+
+  /@jridgewell/sourcemap-codec@1.4.15:
+    resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+    dev: true
+
+  /@rollup/plugin-json@6.1.0(rollup@4.9.2):
+    resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==}
+    engines: {node: '>=14.0.0'}
+    peerDependencies:
+      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+    peerDependenciesMeta:
+      rollup:
+        optional: true
+    dependencies:
+      '@rollup/pluginutils': 5.1.0(rollup@4.9.2)
+      rollup: 4.9.2
+    dev: true
+
+  /@rollup/pluginutils@5.1.0(rollup@4.9.2):
+    resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==}
+    engines: {node: '>=14.0.0'}
+    peerDependencies:
+      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+    peerDependenciesMeta:
+      rollup:
+        optional: true
+    dependencies:
+      '@types/estree': 1.0.5
+      estree-walker: 2.0.2
+      picomatch: 2.3.1
+      rollup: 4.9.2
+    dev: true
+
+  /@rollup/rollup-android-arm-eabi@4.9.2:
+    resolution: {integrity: sha512-RKzxFxBHq9ysZ83fn8Iduv3A283K7zPPYuhL/z9CQuyFrjwpErJx0h4aeb/bnJ+q29GRLgJpY66ceQ/Wcsn3wA==}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-android-arm64@4.9.2:
+    resolution: {integrity: sha512-yZ+MUbnwf3SHNWQKJyWh88ii2HbuHCFQnAYTeeO1Nb8SyEiWASEi5dQUygt3ClHWtA9My9RQAYkjvrsZ0WK8Xg==}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-darwin-arm64@4.9.2:
+    resolution: {integrity: sha512-vqJ/pAUh95FLc/G/3+xPqlSBgilPnauVf2EXOQCZzhZJCXDXt/5A8mH/OzU6iWhb3CNk5hPJrh8pqJUPldN5zw==}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-darwin-x64@4.9.2:
+    resolution: {integrity: sha512-otPHsN5LlvedOprd3SdfrRNhOahhVBwJpepVKUN58L0RnC29vOAej1vMEaVU6DadnpjivVsNTM5eNt0CcwTahw==}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-arm-gnueabihf@4.9.2:
+    resolution: {integrity: sha512-ewG5yJSp+zYKBYQLbd1CUA7b1lSfIdo9zJShNTyc2ZP1rcPrqyZcNlsHgs7v1zhgfdS+kW0p5frc0aVqhZCiYQ==}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-arm64-gnu@4.9.2:
+    resolution: {integrity: sha512-pL6QtV26W52aCWTG1IuFV3FMPL1m4wbsRG+qijIvgFO/VBsiXJjDPE/uiMdHBAO6YcpV4KvpKtd0v3WFbaxBtg==}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-arm64-musl@4.9.2:
+    resolution: {integrity: sha512-On+cc5EpOaTwPSNetHXBuqylDW+765G/oqB9xGmWU3npEhCh8xu0xqHGUA+4xwZLqBbIZNcBlKSIYfkBm6ko7g==}
     cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-riscv64-gnu@4.9.2:
+    resolution: {integrity: sha512-Wnx/IVMSZ31D/cO9HSsU46FjrPWHqtdF8+0eyZ1zIB5a6hXaZXghUKpRrC4D5DcRTZOjml2oBhXoqfGYyXKipw==}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-x64-gnu@4.9.2:
+    resolution: {integrity: sha512-ym5x1cj4mUAMBummxxRkI4pG5Vht1QMsJexwGP8547TZ0sox9fCLDHw9KCH9c1FO5d9GopvkaJsBIOkTKxksdw==}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-x64-musl@4.9.2:
+    resolution: {integrity: sha512-m0hYELHGXdYx64D6IDDg/1vOJEaiV8f1G/iO+tejvRCJNSwK4jJ15e38JQy5Q6dGkn1M/9KcyEOwqmlZ2kqaZg==}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-win32-arm64-msvc@4.9.2:
+    resolution: {integrity: sha512-x1CWburlbN5JjG+juenuNa4KdedBdXLjZMp56nHFSHTOsb/MI2DYiGzLtRGHNMyydPGffGId+VgjOMrcltOksA==}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-win32-ia32-msvc@4.9.2:
+    resolution: {integrity: sha512-VVzCB5yXR1QlfsH1Xw1zdzQ4Pxuzv+CPr5qpElpKhVxlxD3CRdfubAG9mJROl6/dmj5gVYDDWk8sC+j9BI9/kQ==}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-win32-x64-msvc@4.9.2:
+    resolution: {integrity: sha512-SYRedJi+mweatroB+6TTnJYLts0L0bosg531xnQWtklOI6dezEagx4Q0qDyvRdK+qgdA3YZpjjGuPFtxBmddBA==}
+    cpu: [x64]
     os: [win32]
     requiresBuild: true
     dev: true
     optional: true
 
-  /esbuild/0.15.14:
-    resolution: {integrity: sha512-pJN8j42fvWLFWwSMG4luuupl2Me7mxciUOsMegKvwCmhEbJ2covUdFnihxm0FMIBV+cbwbtMoHgMCCI+pj1btQ==}
+  /@types/estree@1.0.5:
+    resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
+    dev: true
+
+  /@types/node@20.10.6:
+    resolution: {integrity: sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==}
+    dependencies:
+      undici-types: 5.26.5
+    dev: true
+
+  /ansi-styles@3.2.1:
+    resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+    engines: {node: '>=4'}
+    requiresBuild: true
+    dependencies:
+      color-convert: 1.9.3
+    dev: true
+    optional: true
+
+  /chalk@2.4.2:
+    resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+    engines: {node: '>=4'}
+    requiresBuild: true
+    dependencies:
+      ansi-styles: 3.2.1
+      escape-string-regexp: 1.0.5
+      supports-color: 5.5.0
+    dev: true
+    optional: true
+
+  /cjs-module-lexer@1.2.3:
+    resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==}
+    dev: true
+
+  /color-convert@1.9.3:
+    resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+    requiresBuild: true
+    dependencies:
+      color-name: 1.1.3
+    dev: true
+    optional: true
+
+  /color-name@1.1.3:
+    resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild@0.19.11:
+    resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==}
     engines: {node: '>=12'}
     hasBin: true
     requiresBuild: true
     optionalDependencies:
-      '@esbuild/android-arm': 0.15.14
-      '@esbuild/linux-loong64': 0.15.14
-      esbuild-android-64: 0.15.14
-      esbuild-android-arm64: 0.15.14
-      esbuild-darwin-64: 0.15.14
-      esbuild-darwin-arm64: 0.15.14
-      esbuild-freebsd-64: 0.15.14
-      esbuild-freebsd-arm64: 0.15.14
-      esbuild-linux-32: 0.15.14
-      esbuild-linux-64: 0.15.14
-      esbuild-linux-arm: 0.15.14
-      esbuild-linux-arm64: 0.15.14
-      esbuild-linux-mips64le: 0.15.14
-      esbuild-linux-ppc64le: 0.15.14
-      esbuild-linux-riscv64: 0.15.14
-      esbuild-linux-s390x: 0.15.14
-      esbuild-netbsd-64: 0.15.14
-      esbuild-openbsd-64: 0.15.14
-      esbuild-sunos-64: 0.15.14
-      esbuild-windows-32: 0.15.14
-      esbuild-windows-64: 0.15.14
-      esbuild-windows-arm64: 0.15.14
-    dev: true
-
-  /escape-string-regexp/1.0.5:
+      '@esbuild/aix-ppc64': 0.19.11
+      '@esbuild/android-arm': 0.19.11
+      '@esbuild/android-arm64': 0.19.11
+      '@esbuild/android-x64': 0.19.11
+      '@esbuild/darwin-arm64': 0.19.11
+      '@esbuild/darwin-x64': 0.19.11
+      '@esbuild/freebsd-arm64': 0.19.11
+      '@esbuild/freebsd-x64': 0.19.11
+      '@esbuild/linux-arm': 0.19.11
+      '@esbuild/linux-arm64': 0.19.11
+      '@esbuild/linux-ia32': 0.19.11
+      '@esbuild/linux-loong64': 0.19.11
+      '@esbuild/linux-mips64el': 0.19.11
+      '@esbuild/linux-ppc64': 0.19.11
+      '@esbuild/linux-riscv64': 0.19.11
+      '@esbuild/linux-s390x': 0.19.11
+      '@esbuild/linux-x64': 0.19.11
+      '@esbuild/netbsd-x64': 0.19.11
+      '@esbuild/openbsd-x64': 0.19.11
+      '@esbuild/sunos-x64': 0.19.11
+      '@esbuild/win32-arm64': 0.19.11
+      '@esbuild/win32-ia32': 0.19.11
+      '@esbuild/win32-x64': 0.19.11
+    dev: true
+
+  /escape-string-regexp@1.0.5:
     resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
     engines: {node: '>=0.8.0'}
+    requiresBuild: true
     dev: true
     optional: true
 
-  /fsevents/2.3.2:
-    resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+  /estree-walker@2.0.2:
+    resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+    dev: true
+
+  /fsevents@2.3.3:
+    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
     engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
     os: [darwin]
     requiresBuild: true
     dev: true
     optional: true
 
-  /has-flag/3.0.0:
+  /has-flag@3.0.0:
     resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
     engines: {node: '>=4'}
+    requiresBuild: true
     dev: true
     optional: true
 
-  /js-tokens/4.0.0:
+  /js-tokens@4.0.0:
     resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+    requiresBuild: true
     dev: true
     optional: true
 
-  /magic-string/0.26.7:
-    resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==}
+  /magic-string@0.30.5:
+    resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==}
     engines: {node: '>=12'}
     dependencies:
-      sourcemap-codec: 1.4.8
+      '@jridgewell/sourcemap-codec': 1.4.15
+    dev: true
+
+  /mri@1.2.0:
+    resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /picomatch@2.3.1:
+    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+    engines: {node: '>=8.6'}
     dev: true
 
-  /rollup-plugin-dts/5.0.0_6annma2bj33shm6er7hwi5u4z4:
-    resolution: {integrity: sha512-OO8ayCvuJCKaQSShyVTARxGurVVk4ulzbuvz+0zFd1f93vlnWFU5pBMT7HFeS6uj7MvvZLx4kUAarGATSU1+Ng==}
-    engines: {node: '>=v14'}
+  /rollup-plugin-dts@6.1.0(rollup@4.9.2)(typescript@5.3.3):
+    resolution: {integrity: sha512-ijSCPICkRMDKDLBK9torss07+8dl9UpY9z1N/zTeA1cIqdzMlpkV3MOOC7zukyvQfDyxa1s3Dl2+DeiP/G6DOw==}
+    engines: {node: '>=16'}
     peerDependencies:
-      rollup: ^3.0.0
-      typescript: ^4.1
+      rollup: ^3.29.4 || ^4
+      typescript: ^4.5 || ^5.0
     dependencies:
-      magic-string: 0.26.7
-      rollup: 3.3.0
-      typescript: 4.9.3
+      magic-string: 0.30.5
+      rollup: 4.9.2
+      typescript: 5.3.3
     optionalDependencies:
-      '@babel/code-frame': 7.18.6
+      '@babel/code-frame': 7.23.5
     dev: true
 
-  /rollup/3.3.0:
-    resolution: {integrity: sha512-wqOV/vUJCYEbWsXvwCkgGWvgaEnsbn4jxBQWKpN816CqsmCimDmCNJI83c6if7QVD4v/zlyRzxN7U2yDT5rfoA==}
-    engines: {node: '>=14.18.0', npm: '>=8.0.0'}
+  /rollup@4.9.2:
+    resolution: {integrity: sha512-66RB8OtFKUTozmVEh3qyNfH+b+z2RXBVloqO2KCC/pjFaGaHtxP9fVfOQKPSGXg2mElmjmxjW/fZ7iKrEpMH5Q==}
+    engines: {node: '>=18.0.0', npm: '>=8.0.0'}
     hasBin: true
     optionalDependencies:
-      fsevents: 2.3.2
-    dev: true
-
-  /sourcemap-codec/1.4.8:
-    resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
+      '@rollup/rollup-android-arm-eabi': 4.9.2
+      '@rollup/rollup-android-arm64': 4.9.2
+      '@rollup/rollup-darwin-arm64': 4.9.2
+      '@rollup/rollup-darwin-x64': 4.9.2
+      '@rollup/rollup-linux-arm-gnueabihf': 4.9.2
+      '@rollup/rollup-linux-arm64-gnu': 4.9.2
+      '@rollup/rollup-linux-arm64-musl': 4.9.2
+      '@rollup/rollup-linux-riscv64-gnu': 4.9.2
+      '@rollup/rollup-linux-x64-gnu': 4.9.2
+      '@rollup/rollup-linux-x64-musl': 4.9.2
+      '@rollup/rollup-win32-arm64-msvc': 4.9.2
+      '@rollup/rollup-win32-ia32-msvc': 4.9.2
+      '@rollup/rollup-win32-x64-msvc': 4.9.2
+      fsevents: 2.3.3
+    dev: true
+
+  /sade@1.8.1:
+    resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
+    engines: {node: '>=6'}
+    dependencies:
+      mri: 1.2.0
     dev: true
 
-  /supports-color/5.5.0:
+  /supports-color@5.5.0:
     resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
     engines: {node: '>=4'}
+    requiresBuild: true
     dependencies:
       has-flag: 3.0.0
     dev: true
     optional: true
 
-  /typescript/4.9.3:
-    resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==}
-    engines: {node: '>=4.2.0'}
+  /typescript@5.3.3:
+    resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
+    engines: {node: '>=14.17'}
     hasBin: true
     dev: true
+
+  /undici-types@5.26.5:
+    resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+    dev: true