]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
build: use rolldown
authorEvan You <evan@vuejs.org>
Thu, 14 Nov 2024 12:57:59 +0000 (20:57 +0800)
committerEvan You <evan@vuejs.org>
Thu, 14 Nov 2024 12:57:59 +0000 (20:57 +0800)
14 files changed:
eslint.config.js
package.json
packages/compiler-sfc/__tests__/parse.spec.ts
packages/compiler-sfc/src/compileTemplate.ts
packages/compiler-sfc/src/script/context.ts
packages/runtime-dom/src/apiCustomElement.ts
pnpm-lock.yaml
rollup.dts.config.js
scripts/build-types.js [new file with mode: 0644]
scripts/build-with-rollup.js [new file with mode: 0644]
scripts/build.js
scripts/create-rolldown-config.js [new file with mode: 0644]
scripts/inline-enums.js
scripts/test.js [new file with mode: 0644]

index b752b2e19f15ef4190fce5ddcf92d9da11375d90..614b9483b029d26b96eb29449a60e209dd1384b4 100644 (file)
@@ -148,6 +148,7 @@ export default tseslint.config(
     files: [
       'eslint.config.js',
       'rollup*.config.js',
+      'rolldown*.config.js',
       'scripts/**',
       './*.{js,ts}',
       'packages/*/*.js',
index 2d3af0f27d26343e6be28d21b4dd603632e26624..93463fded7ccaf404a45fbf55e5bac253df90be9 100644 (file)
@@ -6,7 +6,9 @@
   "scripts": {
     "dev": "node scripts/dev.js",
     "build": "node scripts/build.js",
-    "build-dts": "tsc -p tsconfig.build.json --noCheck && rollup -c rollup.dts.config.js",
+    "build-rollup": "node scripts/build-with-rollup.js",
+    "build-dts": "node scripts/build-types.js",
+    "build-dts-tsc": "tsc -p tsconfig.build.json --noCheck && rollup -c rollup.dts.config.js",
     "clean": "rimraf --glob packages/*/dist temp .eslintcache",
     "size": "run-s \"size-*\" && node scripts/usage-size.js",
     "size-global": "node scripts/build.js vue runtime-dom -f global -p --size",
@@ -62,8 +64,8 @@
     "node": ">=18.12.0"
   },
   "devDependencies": {
-    "@babel/parser": "catalog:",
     "@babel/types": "catalog:",
+    "@rolldown/plugin-node-polyfills": "^1.0.0",
     "@rollup/plugin-alias": "^5.1.1",
     "@rollup/plugin-commonjs": "^28.0.1",
     "@rollup/plugin-json": "^6.1.0",
@@ -75,6 +77,7 @@
     "@types/semver": "^7.5.8",
     "@types/serve-handler": "^6.1.4",
     "@vitest/coverage-v8": "^2.1.1",
+    "@vitest/eslint-plugin": "^1.0.1",
     "@vue/consolidate": "1.0.0",
     "conventional-changelog-cli": "^5.0.0",
     "enquirer": "^2.4.1",
@@ -82,8 +85,8 @@
     "esbuild-plugin-polyfill-node": "^0.3.0",
     "eslint": "^9.14.0",
     "eslint-plugin-import-x": "^4.4.0",
-    "@vitest/eslint-plugin": "^1.0.1",
     "estree-walker": "catalog:",
+    "fast-glob": "^3.3.2",
     "jsdom": "^25.0.0",
     "lint-staged": "^15.2.10",
     "lodash": "^4.17.21",
     "markdown-table": "^3.0.4",
     "marked": "13.0.3",
     "npm-run-all2": "^7.0.1",
+    "oxc-parser": "^0.35.0",
+    "oxc-transform": "^0.35.0",
     "picocolors": "^1.1.1",
     "prettier": "^3.3.3",
     "pretty-bytes": "^6.1.1",
     "pug": "^3.0.3",
     "puppeteer": "~23.3.0",
     "rimraf": "^6.0.1",
+    "rolldown": "0.14.0-snapshot-d5e797b-20241114003621",
     "rollup": "^4.25.0",
     "rollup-plugin-dts": "^6.1.1",
     "rollup-plugin-esbuild": "^6.1.1",
index 87cd05ed0efe606006bf9b23e480ea16bdf35a98..265655e47efe54f17f401618e08e09e87694199c 100644 (file)
@@ -81,7 +81,7 @@ font-weight: bold;
 
       const consumer = new SourceMapConsumer(script!.map!)
       consumer.eachMapping(mapping => {
-        expect(mapping.originalLine - mapping.generatedLine).toBe(padding)
+        expect(mapping.originalLine! - mapping.generatedLine).toBe(padding)
       })
     })
 
@@ -100,8 +100,8 @@ font-weight: bold;
 
       const consumer = new SourceMapConsumer(template.map!)
       consumer.eachMapping(mapping => {
-        expect(mapping.originalLine - mapping.generatedLine).toBe(padding)
-        expect(mapping.originalColumn - mapping.generatedColumn).toBe(2)
+        expect(mapping.originalLine! - mapping.generatedLine).toBe(padding)
+        expect(mapping.originalColumn! - mapping.generatedColumn).toBe(2)
       })
     })
 
@@ -115,7 +115,7 @@ font-weight: bold;
 
       const consumer = new SourceMapConsumer(custom!.map!)
       consumer.eachMapping(mapping => {
-        expect(mapping.originalLine - mapping.generatedLine).toBe(padding)
+        expect(mapping.originalLine! - mapping.generatedLine).toBe(padding)
       })
     })
   })
index 322b1570e1aefd5e1a237c6276dedddfd00999e5..b043cf813d740392ed7a2f1d1eb856495415764c 100644 (file)
@@ -289,7 +289,7 @@ function mapLines(oldMap: RawSourceMap, newMap: RawSourceMap): RawSourceMap {
 
     const origPosInOldMap = oldMapConsumer.originalPositionFor({
       line: m.originalLine,
-      column: m.originalColumn,
+      column: m.originalColumn!,
     })
 
     if (origPosInOldMap.source == null) {
@@ -305,7 +305,7 @@ function mapLines(oldMap: RawSourceMap, newMap: RawSourceMap): RawSourceMap {
         line: origPosInOldMap.line, // map line
         // use current column, since the oldMap produced by @vue/compiler-sfc
         // does not
-        column: m.originalColumn,
+        column: m.originalColumn!,
       },
       source: origPosInOldMap.source,
       name: origPosInOldMap.name,
index 47b6b442a492ce092224be86472e7952cf4035ea..4545a88c4918a394d54f4e2bf1fd89f24a8ab8aa 100644 (file)
@@ -18,12 +18,11 @@ export class ScriptCompileContext {
   scriptAst: Program | null
   scriptSetupAst: Program | null
 
-  source: string = this.descriptor.source
-  filename: string = this.descriptor.filename
-  s: MagicString = new MagicString(this.source)
-  startOffset: number | undefined =
-    this.descriptor.scriptSetup?.loc.start.offset
-  endOffset: number | undefined = this.descriptor.scriptSetup?.loc.end.offset
+  source: string
+  filename: string
+  s: MagicString
+  startOffset: number | undefined
+  endOffset: number | undefined
 
   // import / type analysis
   scope?: TypeScope
@@ -87,6 +86,12 @@ export class ScriptCompileContext {
     const scriptLang = script && script.lang
     const scriptSetupLang = scriptSetup && scriptSetup.lang
 
+    this.source = descriptor.source
+    this.filename = descriptor.filename
+    this.s = new MagicString(descriptor.source)
+    this.startOffset = descriptor.scriptSetup?.loc.start.offset
+    this.endOffset = descriptor.scriptSetup?.loc.end.offset
+
     this.isJS =
       scriptLang === 'js' ||
       scriptLang === 'jsx' ||
@@ -99,7 +104,7 @@ export class ScriptCompileContext {
       scriptSetupLang === 'tsx'
 
     const customElement = options.customElement
-    const filename = this.descriptor.filename
+    const filename = descriptor.filename
     if (customElement) {
       this.isCE =
         typeof customElement === 'boolean'
index 6ddaf89713016db4582689ec2c2dec0cd349b21e..729a322224ccef95abeb5b814a702fed3f0f2b9e 100644 (file)
@@ -219,7 +219,7 @@ export class VueElement
   /**
    * @internal
    */
-  _nonce: string | undefined = this._def.nonce
+  _nonce: string | undefined
 
   /**
    * @internal
@@ -253,6 +253,7 @@ export class VueElement
     private _createApp: CreateAppFunction<Element> = createApp,
   ) {
     super()
+    this._nonce = _def.nonce
     if (this.shadowRoot && _createApp !== createApp) {
       this._root = this.shadowRoot
     } else {
@@ -313,7 +314,7 @@ export class VueElement
     }
   }
 
-  private _setParent(parent = this._parent) {
+  private _setParent(parent: VueElement | undefined = this._parent): void {
     if (parent) {
       this._instance!.parent = parent._instance
       this._instance!.provides = parent._instance!.provides
index 74a863972bdbbdf347aee838f888ba7d2187ff78..dfaf1a9a59e7aa7967fe4061f7c047a899d2da0e 100644 (file)
@@ -20,24 +20,24 @@ catalogs:
       version: 2.0.2
     magic-string:
       specifier: ^0.30.11
-      version: 0.30.11
+      version: 0.30.12
     source-map-js:
       specifier: ^1.2.0
-      version: 1.2.0
+      version: 1.2.1
     vite:
       specifier: ^5.4.0
-      version: 5.4.0
+      version: 5.4.8
 
 importers:
 
   .:
     devDependencies:
-      '@babel/parser':
-        specifier: 'catalog:'
-        version: 7.25.3
       '@babel/types':
         specifier: 'catalog:'
         version: 7.25.2
+      '@rolldown/plugin-node-polyfills':
+        specifier: ^1.0.0
+        version: 1.0.0
       '@rollup/plugin-alias':
         specifier: ^5.1.1
         version: 5.1.1(rollup@4.25.0)
@@ -98,6 +98,9 @@ importers:
       estree-walker:
         specifier: 'catalog:'
         version: 2.0.2
+      fast-glob:
+        specifier: ^3.3.2
+        version: 3.3.2
       jsdom:
         specifier: ^25.0.0
         version: 25.0.0
@@ -119,6 +122,12 @@ importers:
       npm-run-all2:
         specifier: ^7.0.1
         version: 7.0.1
+      oxc-parser:
+        specifier: ^0.35.0
+        version: 0.35.0
+      oxc-transform:
+        specifier: ^0.35.0
+        version: 0.35.0
       picocolors:
         specifier: ^1.1.1
         version: 1.1.1
@@ -137,6 +146,9 @@ importers:
       rimraf:
         specifier: ^6.0.1
         version: 6.0.1
+      rolldown:
+        specifier: 0.14.0-snapshot-d5e797b-20241114003621
+        version: 0.14.0-snapshot-d5e797b-20241114003621
       rollup:
         specifier: ^4.25.0
         version: 4.25.0
@@ -175,7 +187,7 @@ importers:
         version: 8.12.2(eslint@9.14.0)(typescript@5.6.2)
       vite:
         specifier: 'catalog:'
-        version: 5.4.0(@types/node@22.8.7)(sass@1.80.6)
+        version: 5.4.8(@types/node@22.8.7)(sass@1.80.6)
       vitest:
         specifier: ^2.1.1
         version: 2.1.1(@types/node@22.8.7)(jsdom@25.0.0)(sass@1.80.6)
@@ -218,10 +230,10 @@ importers:
     devDependencies:
       '@vitejs/plugin-vue':
         specifier: 'catalog:'
-        version: 5.1.2(vite@5.4.0(@types/node@22.8.7)(sass@1.80.6))(vue@packages+vue)
+        version: 5.1.2(vite@5.4.8(@types/node@22.8.7)(sass@1.80.6))(vue@packages+vue)
       vite:
         specifier: 'catalog:'
-        version: 5.4.0(@types/node@22.8.7)(sass@1.80.6)
+        version: 5.4.8(@types/node@22.8.7)(sass@1.80.6)
 
   packages-private/template-explorer:
     dependencies:
@@ -236,10 +248,10 @@ importers:
     devDependencies:
       '@vitejs/plugin-vue':
         specifier: 'catalog:'
-        version: 5.1.2(vite@5.4.0(@types/node@22.8.7)(sass@1.80.6))(vue@packages+vue)
+        version: 5.1.2(vite@5.4.8(@types/node@22.8.7)(sass@1.80.6))(vue@packages+vue)
       vite:
         specifier: 'catalog:'
-        version: 5.4.0(@types/node@22.8.7)(sass@1.80.6)
+        version: 5.4.8(@types/node@22.8.7)(sass@1.80.6)
       vue:
         specifier: workspace:*
         version: link:../../packages/vue
@@ -260,7 +272,7 @@ importers:
         version: 2.0.2
       source-map-js:
         specifier: 'catalog:'
-        version: 1.2.0
+        version: 1.2.1
     devDependencies:
       '@babel/types':
         specifier: 'catalog:'
@@ -297,13 +309,13 @@ importers:
         version: 2.0.2
       magic-string:
         specifier: 'catalog:'
-        version: 0.30.11
+        version: 0.30.12
       postcss:
         specifier: ^8.4.48
         version: 8.4.48
       source-map-js:
         specifier: 'catalog:'
-        version: 1.2.0
+        version: 1.2.1
     devDependencies:
       '@babel/types':
         specifier: 'catalog:'
@@ -433,19 +445,23 @@ importers:
         version: 2.0.2
       source-map-js:
         specifier: 'catalog:'
-        version: 1.2.0
+        version: 1.2.1
       vue:
         specifier: workspace:*
         version: link:../vue
 
 packages:
 
+  '@aashutoshrathi/word-wrap@1.2.6':
+    resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
+    engines: {node: '>=0.10.0'}
+
   '@ampproject/remapping@2.3.0':
     resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
     engines: {node: '>=6.0.0'}
 
-  '@babel/code-frame@7.24.7':
-    resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==}
+  '@babel/code-frame@7.24.2':
+    resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==}
     engines: {node: '>=6.9.0'}
 
   '@babel/helper-string-parser@7.24.8':
@@ -456,8 +472,8 @@ packages:
     resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/highlight@7.24.7':
-    resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==}
+  '@babel/highlight@7.24.2':
+    resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==}
     engines: {node: '>=6.9.0'}
 
   '@babel/parser@7.25.3':
@@ -484,6 +500,15 @@ packages:
       conventional-commits-parser:
         optional: true
 
+  '@emnapi/core@1.3.1':
+    resolution: {integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==}
+
+  '@emnapi/runtime@1.3.1':
+    resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==}
+
+  '@emnapi/wasi-threads@1.0.1':
+    resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==}
+
   '@esbuild/aix-ppc64@0.21.5':
     resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
     engines: {node: '>=12'}
@@ -857,6 +882,9 @@ packages:
   '@jspm/core@2.0.1':
     resolution: {integrity: sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==}
 
+  '@napi-rs/wasm-runtime@0.2.5':
+    resolution: {integrity: sha512-kwUxR7J9WLutBbulqg1dfOrMTwhMdXLdcGUhcbCcGwnPLt3gz19uHVdwH1syKVDbE022ZS2vZxOWflFLS0YTjw==}
+
   '@nodelib/fs.scandir@2.1.5':
     resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
     engines: {node: '>= 8'}
@@ -869,6 +897,89 @@ packages:
     resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
     engines: {node: '>= 8'}
 
+  '@oxc-parser/binding-darwin-arm64@0.35.0':
+    resolution: {integrity: sha512-2SSWMTMlrW8Ljcvgi0BOWr3Na6IX0Y9JYRRf4irV2OR9ZMGq1AcnK65ujMYE+w+zOfgqRKXVanz8vz6ii1bEmw==}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@oxc-parser/binding-darwin-x64@0.35.0':
+    resolution: {integrity: sha512-q0p/DCz74/9pCZlzGgYw5nC11p2ilImq6XFCOsBOWDdAcB5FFEFO8dyLBxiWgKzXZW+B+FoAJQAGV3UPswx8Jw==}
+    cpu: [x64]
+    os: [darwin]
+
+  '@oxc-parser/binding-linux-arm64-gnu@0.35.0':
+    resolution: {integrity: sha512-MzSTS1nsYhuXHXaZvrKDFXGpUA5UOKFTb30kFVpRLmzunE3Rhp4BeT6aQib64oJBevuI+7OYE14p/CmfgOiavw==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@oxc-parser/binding-linux-arm64-musl@0.35.0':
+    resolution: {integrity: sha512-5WoOYIwE7/HN0IjGMToylXKclvczKM19R1ecbVFsYtKbuj7S6aXkP37x02njA+1DLtTRYv2TySxZjRrov+JFZg==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@oxc-parser/binding-linux-x64-gnu@0.35.0':
+    resolution: {integrity: sha512-wLtbsco7oRAjQH6LZ10jChW0R4l/UrYtr2lOTv2uvguZ/Xtab8xbKV3J+i/ct3XyuPo05W9Z3gBeJVePV/4xHw==}
+    cpu: [x64]
+    os: [linux]
+
+  '@oxc-parser/binding-linux-x64-musl@0.35.0':
+    resolution: {integrity: sha512-DdqhCOm1uvHG3qCijQsdmGzVkGSQiVp5/576+01gvtIB1Xi72zJpo0d5Aoz/Ef262b+YkRJ23UncBMv2IWNLRQ==}
+    cpu: [x64]
+    os: [linux]
+
+  '@oxc-parser/binding-win32-arm64-msvc@0.35.0':
+    resolution: {integrity: sha512-a+DgOdXBKvsNRHi0ohJViuGXUCKVYM5VWC77QEbScuDz5kM0VoAobCxOgaqW90xk0ASqL5U9MS/C0c0e17LZ3A==}
+    cpu: [arm64]
+    os: [win32]
+
+  '@oxc-parser/binding-win32-x64-msvc@0.35.0':
+    resolution: {integrity: sha512-Rm0CRpvsGLJI8++o06Fmz09Nza6vkzluOJj3Bye4DwqKcr4kLA+L/f+TyfiOZrzy9I9J9H8zM7C2UMdU0ws8/g==}
+    cpu: [x64]
+    os: [win32]
+
+  '@oxc-project/types@0.35.0':
+    resolution: {integrity: sha512-IM45j7X1wrbu5xDXtrqbQRkQSsTxKZOCaw6OujjBGItICRKvFE6VGq21czpgKUwDIH0BqTQlFabCbt+d1/7v2A==}
+
+  '@oxc-transform/binding-darwin-arm64@0.35.0':
+    resolution: {integrity: sha512-oh+L/TM7/u3A1qIlFz2hEW0LIVPdhgK+dGAgnyDCOaXqP0P45MgkklbTF+lSAXkv5PgpvNmrnocu4j1mjswskA==}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@oxc-transform/binding-darwin-x64@0.35.0':
+    resolution: {integrity: sha512-/B8YOmxxHGKeNqCeCoe7FY3eLrru5R07kS5pObkOGZgz2jqWw2CnJ3XMq+GaNAAgvVJc4O7wU88yV8a/TX3ppQ==}
+    cpu: [x64]
+    os: [darwin]
+
+  '@oxc-transform/binding-linux-arm64-gnu@0.35.0':
+    resolution: {integrity: sha512-Smbku1J3IofBVEJFvnP6IcGyavZsAskbGBs++ty/4+JQqv67fCeGFNRf8erAWpNQGhpgsL/EW7QIPuZ89SlIBw==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@oxc-transform/binding-linux-arm64-musl@0.35.0':
+    resolution: {integrity: sha512-H0CV1mf4TNIPm4PwkHWJUxekgOHvyyCTehHimUjBaB2XxImwo1pEa+bO79wkJYm/F1aSDRM4APivK9c3Hi4F0w==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@oxc-transform/binding-linux-x64-gnu@0.35.0':
+    resolution: {integrity: sha512-VSOiPOx4I/e3yTNED50Vn0VwHb3Pa0QQwqCZYRDKmqztsTQN6RSKnawWG+EPY+9mqLJs+8KfMphQMsjRE2K+hA==}
+    cpu: [x64]
+    os: [linux]
+
+  '@oxc-transform/binding-linux-x64-musl@0.35.0':
+    resolution: {integrity: sha512-ItoZZ1auUQsgSE+lvL559+cLBnZb4Q2zotTB0JpH8M8rxROpW+GVwU3TzBwQHmtGE9ri+KuywpXkPREifdOx9g==}
+    cpu: [x64]
+    os: [linux]
+
+  '@oxc-transform/binding-win32-arm64-msvc@0.35.0':
+    resolution: {integrity: sha512-XuvyU0mhgpF5NIAcoknQPQnl70s/kfkBASo6xCx2HQP74vGGP6Aj810U4N0D66jGazpVw+mbaEsDzGHm3KWwiw==}
+    cpu: [arm64]
+    os: [win32]
+
+  '@oxc-transform/binding-win32-x64-msvc@0.35.0':
+    resolution: {integrity: sha512-+hTWKxqO519Iot9A6XdCEdvokg/2Yid4NevjhsEJnsa1MrHHxbOjzWKq22GRjv0CpMgKlMyJXWHP4YKzDZ/Sog==}
+    cpu: [x64]
+    os: [win32]
+
   '@parcel/watcher-android-arm64@2.4.1':
     resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==}
     engines: {node: '>= 10.0.0'}
@@ -954,6 +1065,69 @@ packages:
     engines: {node: '>=18'}
     hasBin: true
 
+  '@rolldown/binding-darwin-arm64@0.14.0-snapshot-d5e797b-20241114003621':
+    resolution: {integrity: sha512-K+kETZAdSaIHG+ivKes6IGiyFK4+uriEXhUHMPWvKqz4njcaXA9Lk5wEOiIFMLNsiyygkddBvuE2JXiiqtc7pw==}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@rolldown/binding-darwin-x64@0.14.0-snapshot-d5e797b-20241114003621':
+    resolution: {integrity: sha512-ZrW/GM6xu0VMHBnnboAoID2mtHgg/aO0C6dVuu41FXxNTb5TenK+CL7o6TRErIYh9UggOE8ElePlw9yDCquRqw==}
+    cpu: [x64]
+    os: [darwin]
+
+  '@rolldown/binding-freebsd-x64@0.14.0-snapshot-d5e797b-20241114003621':
+    resolution: {integrity: sha512-ay0xOrOCH2DA5iBpn2w02o7BMw0ftqHnfu6hq5eXMkzAioObA0eCLS+8vpbN9FpPpWRPYZoK9z519npn9GfVcw==}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@rolldown/binding-linux-arm-gnueabihf@0.14.0-snapshot-d5e797b-20241114003621':
+    resolution: {integrity: sha512-flQG9NDOlYTlV9Y+7Lim+NZyv554Xrea8bN84ep9AJy49NHkwhzan46Ct9/drwbK4uQvTePk1Cof7CdX4/tJ7w==}
+    cpu: [arm]
+    os: [linux]
+
+  '@rolldown/binding-linux-arm64-gnu@0.14.0-snapshot-d5e797b-20241114003621':
+    resolution: {integrity: sha512-osxZlZdtOC+ck8PZiQ27ujf2jbi67rrQmWx60wwuTnFznl7Rj4pULTDmxaq7oO14yYAW7w00in8OKGXcvRQ5yw==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@rolldown/binding-linux-arm64-musl@0.14.0-snapshot-d5e797b-20241114003621':
+    resolution: {integrity: sha512-B1d+iRhQiKgBkbcO7ByUYoNUeWqV+XMP3Vz8Y27Nj+flgvt5GkmOEYJ2pJ4Nv5h9bzd4SwHsjzJ7XdXdbRk3Xw==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@rolldown/binding-linux-x64-gnu@0.14.0-snapshot-d5e797b-20241114003621':
+    resolution: {integrity: sha512-dQNu7BKid2dhJpRUJ7M+Lr+O77wyZfVDifjF3BEb5mlL/YJR029VZSEoguzyf0ir0xNFwcoFmXqvNol6RuCC7g==}
+    cpu: [x64]
+    os: [linux]
+
+  '@rolldown/binding-linux-x64-musl@0.14.0-snapshot-d5e797b-20241114003621':
+    resolution: {integrity: sha512-NKB/1i7f0j1YNnTd/DvOzlAfVufCVCovELxxBvdY1GqPBIbY8IrWsggHcw/A3ETdiHv/5qo6bg0OwyY0XJcUcA==}
+    cpu: [x64]
+    os: [linux]
+
+  '@rolldown/binding-wasm32-wasi@0.14.0-snapshot-d5e797b-20241114003621':
+    resolution: {integrity: sha512-3s1aV1BwnR1lGd4tq/f9of9q/9HjjYwukr6t++rK/hLG+SvhchLroHycjIdodew/cvvUNJjQoxp6o3XnoNzSVQ==}
+    engines: {node: '>=14.21.3'}
+    cpu: [wasm32]
+
+  '@rolldown/binding-win32-arm64-msvc@0.14.0-snapshot-d5e797b-20241114003621':
+    resolution: {integrity: sha512-Yb0WpkFVDog5jaa9wsp9S/S4OaNR/HwGC4gOUM24Aho7aJBogjwnnX9YXf6c9AS3CPqdeWhslRtgWfRKBzQZCQ==}
+    cpu: [arm64]
+    os: [win32]
+
+  '@rolldown/binding-win32-ia32-msvc@0.14.0-snapshot-d5e797b-20241114003621':
+    resolution: {integrity: sha512-9ECBsIsmjEyKofobNQfgwjc2apokoLfP8hYxu/dQKUT1Mb8KPCZp2pPqhi27HpLB+asEOnO3xMleABJdrYGmtg==}
+    cpu: [ia32]
+    os: [win32]
+
+  '@rolldown/binding-win32-x64-msvc@0.14.0-snapshot-d5e797b-20241114003621':
+    resolution: {integrity: sha512-sIHCWBHaqpuF2SCfkGTb4Ml4sYAHCc4tyX8DW1/7tgA8uRsQ01UqoBZSv32KCao38AIYQSpC9HGQumcnjnximw==}
+    cpu: [x64]
+    os: [win32]
+
+  '@rolldown/plugin-node-polyfills@1.0.0':
+    resolution: {integrity: sha512-JUmEhvz+B6+0AaeUGvZ7SnJec7wpwYqZ+FcAng1I3UVGYKA1uSmE1H4vKHUewU665Nb37znDd9N4o/iImmKeVg==}
+
   '@rollup/plugin-alias@5.1.1':
     resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==}
     engines: {node: '>=14.0.0'}
@@ -1017,41 +1191,21 @@ packages:
       rollup:
         optional: true
 
-  '@rollup/rollup-android-arm-eabi@4.20.0':
-    resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==}
-    cpu: [arm]
-    os: [android]
-
   '@rollup/rollup-android-arm-eabi@4.25.0':
     resolution: {integrity: sha512-CC/ZqFZwlAIbU1wUPisHyV/XRc5RydFrNLtgl3dGYskdwPZdt4HERtKm50a/+DtTlKeCq9IXFEWR+P6blwjqBA==}
     cpu: [arm]
     os: [android]
 
-  '@rollup/rollup-android-arm64@4.20.0':
-    resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==}
-    cpu: [arm64]
-    os: [android]
-
   '@rollup/rollup-android-arm64@4.25.0':
     resolution: {integrity: sha512-/Y76tmLGUJqVBXXCfVS8Q8FJqYGhgH4wl4qTA24E9v/IJM0XvJCGQVSW1QZ4J+VURO9h8YCa28sTFacZXwK7Rg==}
     cpu: [arm64]
     os: [android]
 
-  '@rollup/rollup-darwin-arm64@4.20.0':
-    resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==}
-    cpu: [arm64]
-    os: [darwin]
-
   '@rollup/rollup-darwin-arm64@4.25.0':
     resolution: {integrity: sha512-YVT6L3UrKTlC0FpCZd0MGA7NVdp7YNaEqkENbWQ7AOVOqd/7VzyHpgIpc1mIaxRAo1ZsJRH45fq8j4N63I/vvg==}
     cpu: [arm64]
     os: [darwin]
 
-  '@rollup/rollup-darwin-x64@4.20.0':
-    resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==}
-    cpu: [x64]
-    os: [darwin]
-
   '@rollup/rollup-darwin-x64@4.25.0':
     resolution: {integrity: sha512-ZRL+gexs3+ZmmWmGKEU43Bdn67kWnMeWXLFhcVv5Un8FQcx38yulHBA7XR2+KQdYIOtD0yZDWBCudmfj6lQJoA==}
     cpu: [x64]
@@ -1067,121 +1221,61 @@ packages:
     cpu: [x64]
     os: [freebsd]
 
-  '@rollup/rollup-linux-arm-gnueabihf@4.20.0':
-    resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==}
-    cpu: [arm]
-    os: [linux]
-
   '@rollup/rollup-linux-arm-gnueabihf@4.25.0':
     resolution: {integrity: sha512-uD/dbLSs1BEPzg564TpRAQ/YvTnCds2XxyOndAO8nJhaQcqQGFgv/DAVko/ZHap3boCvxnzYMa3mTkV/B/3SWA==}
     cpu: [arm]
     os: [linux]
 
-  '@rollup/rollup-linux-arm-musleabihf@4.20.0':
-    resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==}
-    cpu: [arm]
-    os: [linux]
-
   '@rollup/rollup-linux-arm-musleabihf@4.25.0':
     resolution: {integrity: sha512-ZVt/XkrDlQWegDWrwyC3l0OfAF7yeJUF4fq5RMS07YM72BlSfn2fQQ6lPyBNjt+YbczMguPiJoCfaQC2dnflpQ==}
     cpu: [arm]
     os: [linux]
 
-  '@rollup/rollup-linux-arm64-gnu@4.20.0':
-    resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==}
-    cpu: [arm64]
-    os: [linux]
-
   '@rollup/rollup-linux-arm64-gnu@4.25.0':
     resolution: {integrity: sha512-qboZ+T0gHAW2kkSDPHxu7quaFaaBlynODXpBVnPxUgvWYaE84xgCKAPEYE+fSMd3Zv5PyFZR+L0tCdYCMAtG0A==}
     cpu: [arm64]
     os: [linux]
 
-  '@rollup/rollup-linux-arm64-musl@4.20.0':
-    resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==}
-    cpu: [arm64]
-    os: [linux]
-
   '@rollup/rollup-linux-arm64-musl@4.25.0':
     resolution: {integrity: sha512-ndWTSEmAaKr88dBuogGH2NZaxe7u2rDoArsejNslugHZ+r44NfWiwjzizVS1nUOHo+n1Z6qV3X60rqE/HlISgw==}
     cpu: [arm64]
     os: [linux]
 
-  '@rollup/rollup-linux-powerpc64le-gnu@4.20.0':
-    resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==}
-    cpu: [ppc64]
-    os: [linux]
-
   '@rollup/rollup-linux-powerpc64le-gnu@4.25.0':
     resolution: {integrity: sha512-BVSQvVa2v5hKwJSy6X7W1fjDex6yZnNKy3Kx1JGimccHft6HV0THTwNtC2zawtNXKUu+S5CjXslilYdKBAadzA==}
     cpu: [ppc64]
     os: [linux]
 
-  '@rollup/rollup-linux-riscv64-gnu@4.20.0':
-    resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==}
-    cpu: [riscv64]
-    os: [linux]
-
   '@rollup/rollup-linux-riscv64-gnu@4.25.0':
     resolution: {integrity: sha512-G4hTREQrIdeV0PE2JruzI+vXdRnaK1pg64hemHq2v5fhv8C7WjVaeXc9P5i4Q5UC06d/L+zA0mszYIKl+wY8oA==}
     cpu: [riscv64]
     os: [linux]
 
-  '@rollup/rollup-linux-s390x-gnu@4.20.0':
-    resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==}
-    cpu: [s390x]
-    os: [linux]
-
   '@rollup/rollup-linux-s390x-gnu@4.25.0':
     resolution: {integrity: sha512-9T/w0kQ+upxdkFL9zPVB6zy9vWW1deA3g8IauJxojN4bnz5FwSsUAD034KpXIVX5j5p/rn6XqumBMxfRkcHapQ==}
     cpu: [s390x]
     os: [linux]
 
-  '@rollup/rollup-linux-x64-gnu@4.20.0':
-    resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==}
-    cpu: [x64]
-    os: [linux]
-
   '@rollup/rollup-linux-x64-gnu@4.25.0':
     resolution: {integrity: sha512-ThcnU0EcMDn+J4B9LD++OgBYxZusuA7iemIIiz5yzEcFg04VZFzdFjuwPdlURmYPZw+fgVrFzj4CA64jSTG4Ig==}
     cpu: [x64]
     os: [linux]
 
-  '@rollup/rollup-linux-x64-musl@4.20.0':
-    resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==}
-    cpu: [x64]
-    os: [linux]
-
   '@rollup/rollup-linux-x64-musl@4.25.0':
     resolution: {integrity: sha512-zx71aY2oQxGxAT1JShfhNG79PnjYhMC6voAjzpu/xmMjDnKNf6Nl/xv7YaB/9SIa9jDYf8RBPWEnjcdlhlv1rQ==}
     cpu: [x64]
     os: [linux]
 
-  '@rollup/rollup-win32-arm64-msvc@4.20.0':
-    resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==}
-    cpu: [arm64]
-    os: [win32]
-
   '@rollup/rollup-win32-arm64-msvc@4.25.0':
     resolution: {integrity: sha512-JT8tcjNocMs4CylWY/CxVLnv8e1lE7ff1fi6kbGocWwxDq9pj30IJ28Peb+Y8yiPNSF28oad42ApJB8oUkwGww==}
     cpu: [arm64]
     os: [win32]
 
-  '@rollup/rollup-win32-ia32-msvc@4.20.0':
-    resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==}
-    cpu: [ia32]
-    os: [win32]
-
   '@rollup/rollup-win32-ia32-msvc@4.25.0':
     resolution: {integrity: sha512-dRLjLsO3dNOfSN6tjyVlG+Msm4IiZnGkuZ7G5NmpzwF9oOc582FZG05+UdfTbz5Jd4buK/wMb6UeHFhG18+OEg==}
     cpu: [ia32]
     os: [win32]
 
-  '@rollup/rollup-win32-x64-msvc@4.20.0':
-    resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==}
-    cpu: [x64]
-    os: [win32]
-
   '@rollup/rollup-win32-x64-msvc@4.25.0':
     resolution: {integrity: sha512-/RqrIFtLB926frMhZD0a5oDa4eFIbyNEwLLloMTEjmqfwZWXywwVVOVmwTsuyhC9HKkVEZcOOi+KV4U9wmOdlg==}
     cpu: [x64]
@@ -1265,8 +1359,8 @@ packages:
   '@tootallnate/quickjs-emscripten@0.23.0':
     resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==}
 
-  '@types/estree@1.0.5':
-    resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
+  '@tybys/wasm-util@0.9.0':
+    resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==}
 
   '@types/estree@1.0.6':
     resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
@@ -1527,8 +1621,8 @@ packages:
   asap@2.0.6:
     resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
 
-  assert-never@1.3.0:
-    resolution: {integrity: sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ==}
+  assert-never@1.2.1:
+    resolution: {integrity: sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==}
 
   assertion-error@2.0.1:
     resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
@@ -1551,20 +1645,17 @@ packages:
   balanced-match@1.0.2:
     resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
 
-  bare-events@2.4.2:
-    resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==}
-
-  bare-fs@2.3.1:
-    resolution: {integrity: sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==}
+  bare-events@2.2.2:
+    resolution: {integrity: sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==}
 
-  bare-os@2.4.0:
-    resolution: {integrity: sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==}
+  bare-fs@2.2.3:
+    resolution: {integrity: sha512-amG72llr9pstfXOBOHve1WjiuKKAMnebcmMbPWDZ7BCevAoJLpugjuAPRsDINEyjT0a6tbaVx3DctkXIRbLuJw==}
 
-  bare-path@2.1.3:
-    resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==}
+  bare-os@2.2.1:
+    resolution: {integrity: sha512-OwPyHgBBMkhC29Hl3O4/YfxW9n7mdTr2+SsO29XBWKKJsbgj3mnorDB80r5TiCQgQstgE5ga1qNYrpes6NvX2w==}
 
-  bare-stream@2.1.3:
-    resolution: {integrity: sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==}
+  bare-path@2.1.1:
+    resolution: {integrity: sha512-OHM+iwRDRMDBsSW7kl3dO62JyHdBKO3B25FB9vNQBPcGHMo4+eA8Yj41Lfbk3pS/seDY+siNge0LdRTulAau/A==}
 
   base64-js@1.5.1:
     resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
@@ -1940,8 +2031,8 @@ packages:
     resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
     engines: {node: '>= 0.4'}
 
-  es-module-lexer@1.5.4:
-    resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==}
+  es-module-lexer@1.5.0:
+    resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==}
 
   esbuild-plugin-polyfill-node@0.3.0:
     resolution: {integrity: sha512-SHG6CKUfWfYyYXGpW143NEZtcVVn8S/WHcEOxk62LuDXnY4Zpmc+WmxJKN6GMTgTClXJXhEM5KQlxKY6YjbucQ==}
@@ -2241,8 +2332,8 @@ packages:
     resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
     engines: {node: '>= 0.4'}
 
-  hosted-git-info@7.0.2:
-    resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==}
+  hosted-git-info@7.0.1:
+    resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==}
     engines: {node: ^16.14.0 || >=18.0.0}
 
   html-encoding-sniffer@4.0.0:
@@ -2256,6 +2347,10 @@ packages:
     resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
     engines: {node: '>= 14'}
 
+  https-proxy-agent@7.0.4:
+    resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==}
+    engines: {node: '>= 14'}
+
   https-proxy-agent@7.0.5:
     resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==}
     engines: {node: '>= 14'}
@@ -2500,8 +2595,8 @@ packages:
     resolution: {integrity: sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==}
     engines: {node: '>=18.0.0'}
 
-  loader-utils@3.3.1:
-    resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==}
+  loader-utils@3.2.1:
+    resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==}
     engines: {node: '>= 12.13.0'}
 
   locate-path@6.0.0:
@@ -2539,9 +2634,6 @@ packages:
     resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==}
     engines: {node: '>=12'}
 
-  magic-string@0.30.11:
-    resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==}
-
   magic-string@0.30.12:
     resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==}
 
@@ -2669,8 +2761,8 @@ packages:
   node-addon-api@7.1.1:
     resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
 
-  normalize-package-data@6.0.2:
-    resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==}
+  normalize-package-data@6.0.0:
+    resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==}
     engines: {node: ^16.14.0 || >=18.0.0}
 
   npm-normalize-package-bin@4.0.0:
@@ -2716,10 +2808,16 @@ packages:
     resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
     engines: {node: '>=18'}
 
-  optionator@0.9.4:
-    resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+  optionator@0.9.3:
+    resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
     engines: {node: '>= 0.8.0'}
 
+  oxc-parser@0.35.0:
+    resolution: {integrity: sha512-80Xpm5vOvEE5iP9aSN95WMLGbRpdl5oTV/rbtM+epGQpro5737R5CWcoHiStwzU/1zZKgZlSNfaeuTj1iV3kYA==}
+
+  oxc-transform@0.35.0:
+    resolution: {integrity: sha512-biVB7H7ZxuAQYbMJPUZw1umT7nzDU44tEBYyqMgLle0mnAbi9AetadIqTpjAp8KmcOYpG6VmvGeFPxWihFCWFQ==}
+
   p-limit@3.1.0:
     resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
     engines: {node: '>=10'}
@@ -2728,8 +2826,8 @@ packages:
     resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
     engines: {node: '>=10'}
 
-  pac-proxy-agent@7.0.2:
-    resolution: {integrity: sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==}
+  pac-proxy-agent@7.0.1:
+    resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==}
     engines: {node: '>= 14'}
 
   pac-resolver@7.0.1:
@@ -2848,10 +2946,6 @@ packages:
   postcss-value-parser@4.2.0:
     resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
 
-  postcss@8.4.41:
-    resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==}
-    engines: {node: ^10 || ^12 || >=14}
-
   postcss@8.4.48:
     resolution: {integrity: sha512-GCRK8F6+Dl7xYniR5a4FYbpBzU8XnZVeowqsQFYdcXuSbChgiks7qybSkbvnaeqv0G0B+dd9/jJgH8kkLDQeEA==}
     engines: {node: ^10 || ^12 || >=14}
@@ -2895,6 +2989,9 @@ packages:
   pug-code-gen@3.0.3:
     resolution: {integrity: sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==}
 
+  pug-error@2.0.0:
+    resolution: {integrity: sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==}
+
   pug-error@2.1.0:
     resolution: {integrity: sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==}
 
@@ -3022,6 +3119,10 @@ packages:
     engines: {node: 20 || >=22}
     hasBin: true
 
+  rolldown@0.14.0-snapshot-d5e797b-20241114003621:
+    resolution: {integrity: sha512-xJTXkA5ROenUW64VVgaqOglIDmrhJFkY1aFk100ROHAe59Gp2A6kaG8tpOoHDfnC4gmpXZnLr1dPDhdg960wYQ==}
+    hasBin: true
+
   rollup-plugin-dts@6.1.1:
     resolution: {integrity: sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==}
     engines: {node: '>=16'}
@@ -3041,11 +3142,6 @@ packages:
     peerDependencies:
       rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0
 
-  rollup@4.20.0:
-    resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==}
-    engines: {node: '>=18.0.0', npm: '>=8.0.0'}
-    hasBin: true
-
   rollup@4.25.0:
     resolution: {integrity: sha512-uVbClXmR6wvx5R1M3Od4utyLUxrmOcEm3pAtMphn73Apq19PDtHpgZoEvqH2YnnaNUuvKmg2DgRd2Sqv+odyqg==}
     engines: {node: '>=18.0.0', npm: '>=8.0.0'}
@@ -3135,18 +3231,14 @@ packages:
     resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
     engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
 
-  socks-proxy-agent@8.0.4:
-    resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==}
+  socks-proxy-agent@8.0.3:
+    resolution: {integrity: sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==}
     engines: {node: '>= 14'}
 
   socks@2.8.3:
     resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==}
     engines: {node: '>= 10.0.0', npm: '>= 3.0.0'}
 
-  source-map-js@1.2.0:
-    resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
-    engines: {node: '>=0.10.0'}
-
   source-map-js@1.2.1:
     resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
     engines: {node: '>=0.10.0'}
@@ -3164,8 +3256,8 @@ packages:
   spdx-expression-parse@3.0.1:
     resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
 
-  spdx-license-ids@3.0.18:
-    resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==}
+  spdx-license-ids@3.0.17:
+    resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==}
 
   sprintf-js@1.1.3:
     resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==}
@@ -3179,8 +3271,8 @@ packages:
   std-env@3.7.0:
     resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==}
 
-  streamx@2.18.0:
-    resolution: {integrity: sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==}
+  streamx@2.16.1:
+    resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==}
 
   string-argv@0.3.2:
     resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
@@ -3197,8 +3289,8 @@ packages:
     resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
     engines: {node: '>=12'}
 
-  string-width@7.2.0:
-    resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
+  string-width@7.1.0:
+    resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==}
     engines: {node: '>=18'}
 
   string_decoder@1.1.1:
@@ -3261,9 +3353,6 @@ packages:
     resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==}
     engines: {node: '>=18'}
 
-  text-decoder@1.1.1:
-    resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==}
-
   text-table@0.2.0:
     resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
 
@@ -3404,37 +3493,6 @@ packages:
     engines: {node: ^18.0.0 || >=20.0.0}
     hasBin: true
 
-  vite@5.4.0:
-    resolution: {integrity: sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==}
-    engines: {node: ^18.0.0 || >=20.0.0}
-    hasBin: true
-    peerDependencies:
-      '@types/node': ^18.0.0 || >=20.0.0
-      less: '*'
-      lightningcss: ^1.21.0
-      sass: '*'
-      sass-embedded: '*'
-      stylus: '*'
-      sugarss: '*'
-      terser: ^5.4.0
-    peerDependenciesMeta:
-      '@types/node':
-        optional: true
-      less:
-        optional: true
-      lightningcss:
-        optional: true
-      sass:
-        optional: true
-      sass-embedded:
-        optional: true
-      stylus:
-        optional: true
-      sugarss:
-        optional: true
-      terser:
-        optional: true
-
   vite@5.4.8:
     resolution: {integrity: sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==}
     engines: {node: ^18.0.0 || >=20.0.0}
@@ -3538,10 +3596,6 @@ packages:
     resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==}
     engines: {node: '>= 10.0.0'}
 
-  word-wrap@1.2.5:
-    resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
-    engines: {node: '>=0.10.0'}
-
   wordwrap@1.0.0:
     resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==}
 
@@ -3608,21 +3662,23 @@ packages:
 
 snapshots:
 
+  '@aashutoshrathi/word-wrap@1.2.6': {}
+
   '@ampproject/remapping@2.3.0':
     dependencies:
       '@jridgewell/gen-mapping': 0.3.5
       '@jridgewell/trace-mapping': 0.3.25
 
-  '@babel/code-frame@7.24.7':
+  '@babel/code-frame@7.24.2':
     dependencies:
-      '@babel/highlight': 7.24.7
+      '@babel/highlight': 7.24.2
       picocolors: 1.1.1
 
   '@babel/helper-string-parser@7.24.8': {}
 
   '@babel/helper-validator-identifier@7.24.7': {}
 
-  '@babel/highlight@7.24.7':
+  '@babel/highlight@7.24.2':
     dependencies:
       '@babel/helper-validator-identifier': 7.24.7
       chalk: 2.4.2
@@ -3649,6 +3705,22 @@ snapshots:
       conventional-commits-filter: 5.0.0
       conventional-commits-parser: 6.0.0
 
+  '@emnapi/core@1.3.1':
+    dependencies:
+      '@emnapi/wasi-threads': 1.0.1
+      tslib: 2.8.1
+    optional: true
+
+  '@emnapi/runtime@1.3.1':
+    dependencies:
+      tslib: 2.8.1
+    optional: true
+
+  '@emnapi/wasi-threads@1.0.1':
+    dependencies:
+      tslib: 2.8.1
+    optional: true
+
   '@esbuild/aix-ppc64@0.21.5':
     optional: true
 
@@ -3876,6 +3948,13 @@ snapshots:
 
   '@jspm/core@2.0.1': {}
 
+  '@napi-rs/wasm-runtime@0.2.5':
+    dependencies:
+      '@emnapi/core': 1.3.1
+      '@emnapi/runtime': 1.3.1
+      '@tybys/wasm-util': 0.9.0
+    optional: true
+
   '@nodelib/fs.scandir@2.1.5':
     dependencies:
       '@nodelib/fs.stat': 2.0.5
@@ -3888,6 +3967,56 @@ snapshots:
       '@nodelib/fs.scandir': 2.1.5
       fastq: 1.17.1
 
+  '@oxc-parser/binding-darwin-arm64@0.35.0':
+    optional: true
+
+  '@oxc-parser/binding-darwin-x64@0.35.0':
+    optional: true
+
+  '@oxc-parser/binding-linux-arm64-gnu@0.35.0':
+    optional: true
+
+  '@oxc-parser/binding-linux-arm64-musl@0.35.0':
+    optional: true
+
+  '@oxc-parser/binding-linux-x64-gnu@0.35.0':
+    optional: true
+
+  '@oxc-parser/binding-linux-x64-musl@0.35.0':
+    optional: true
+
+  '@oxc-parser/binding-win32-arm64-msvc@0.35.0':
+    optional: true
+
+  '@oxc-parser/binding-win32-x64-msvc@0.35.0':
+    optional: true
+
+  '@oxc-project/types@0.35.0': {}
+
+  '@oxc-transform/binding-darwin-arm64@0.35.0':
+    optional: true
+
+  '@oxc-transform/binding-darwin-x64@0.35.0':
+    optional: true
+
+  '@oxc-transform/binding-linux-arm64-gnu@0.35.0':
+    optional: true
+
+  '@oxc-transform/binding-linux-arm64-musl@0.35.0':
+    optional: true
+
+  '@oxc-transform/binding-linux-x64-gnu@0.35.0':
+    optional: true
+
+  '@oxc-transform/binding-linux-x64-musl@0.35.0':
+    optional: true
+
+  '@oxc-transform/binding-win32-arm64-msvc@0.35.0':
+    optional: true
+
+  '@oxc-transform/binding-win32-x64-msvc@0.35.0':
+    optional: true
+
   '@parcel/watcher-android-arm64@2.4.1':
     optional: true
 
@@ -3961,6 +4090,46 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  '@rolldown/binding-darwin-arm64@0.14.0-snapshot-d5e797b-20241114003621':
+    optional: true
+
+  '@rolldown/binding-darwin-x64@0.14.0-snapshot-d5e797b-20241114003621':
+    optional: true
+
+  '@rolldown/binding-freebsd-x64@0.14.0-snapshot-d5e797b-20241114003621':
+    optional: true
+
+  '@rolldown/binding-linux-arm-gnueabihf@0.14.0-snapshot-d5e797b-20241114003621':
+    optional: true
+
+  '@rolldown/binding-linux-arm64-gnu@0.14.0-snapshot-d5e797b-20241114003621':
+    optional: true
+
+  '@rolldown/binding-linux-arm64-musl@0.14.0-snapshot-d5e797b-20241114003621':
+    optional: true
+
+  '@rolldown/binding-linux-x64-gnu@0.14.0-snapshot-d5e797b-20241114003621':
+    optional: true
+
+  '@rolldown/binding-linux-x64-musl@0.14.0-snapshot-d5e797b-20241114003621':
+    optional: true
+
+  '@rolldown/binding-wasm32-wasi@0.14.0-snapshot-d5e797b-20241114003621':
+    dependencies:
+      '@napi-rs/wasm-runtime': 0.2.5
+    optional: true
+
+  '@rolldown/binding-win32-arm64-msvc@0.14.0-snapshot-d5e797b-20241114003621':
+    optional: true
+
+  '@rolldown/binding-win32-ia32-msvc@0.14.0-snapshot-d5e797b-20241114003621':
+    optional: true
+
+  '@rolldown/binding-win32-x64-msvc@0.14.0-snapshot-d5e797b-20241114003621':
+    optional: true
+
+  '@rolldown/plugin-node-polyfills@1.0.0': {}
+
   '@rollup/plugin-alias@5.1.1(rollup@4.25.0)':
     optionalDependencies:
       rollup: 4.25.0
@@ -4016,27 +4185,15 @@ snapshots:
     optionalDependencies:
       rollup: 4.25.0
 
-  '@rollup/rollup-android-arm-eabi@4.20.0':
-    optional: true
-
   '@rollup/rollup-android-arm-eabi@4.25.0':
     optional: true
 
-  '@rollup/rollup-android-arm64@4.20.0':
-    optional: true
-
   '@rollup/rollup-android-arm64@4.25.0':
     optional: true
 
-  '@rollup/rollup-darwin-arm64@4.20.0':
-    optional: true
-
   '@rollup/rollup-darwin-arm64@4.25.0':
     optional: true
 
-  '@rollup/rollup-darwin-x64@4.20.0':
-    optional: true
-
   '@rollup/rollup-darwin-x64@4.25.0':
     optional: true
 
@@ -4046,75 +4203,39 @@ snapshots:
   '@rollup/rollup-freebsd-x64@4.25.0':
     optional: true
 
-  '@rollup/rollup-linux-arm-gnueabihf@4.20.0':
-    optional: true
-
   '@rollup/rollup-linux-arm-gnueabihf@4.25.0':
     optional: true
 
-  '@rollup/rollup-linux-arm-musleabihf@4.20.0':
-    optional: true
-
   '@rollup/rollup-linux-arm-musleabihf@4.25.0':
     optional: true
 
-  '@rollup/rollup-linux-arm64-gnu@4.20.0':
-    optional: true
-
   '@rollup/rollup-linux-arm64-gnu@4.25.0':
     optional: true
 
-  '@rollup/rollup-linux-arm64-musl@4.20.0':
-    optional: true
-
   '@rollup/rollup-linux-arm64-musl@4.25.0':
     optional: true
 
-  '@rollup/rollup-linux-powerpc64le-gnu@4.20.0':
-    optional: true
-
   '@rollup/rollup-linux-powerpc64le-gnu@4.25.0':
     optional: true
 
-  '@rollup/rollup-linux-riscv64-gnu@4.20.0':
-    optional: true
-
   '@rollup/rollup-linux-riscv64-gnu@4.25.0':
     optional: true
 
-  '@rollup/rollup-linux-s390x-gnu@4.20.0':
-    optional: true
-
   '@rollup/rollup-linux-s390x-gnu@4.25.0':
     optional: true
 
-  '@rollup/rollup-linux-x64-gnu@4.20.0':
-    optional: true
-
   '@rollup/rollup-linux-x64-gnu@4.25.0':
     optional: true
 
-  '@rollup/rollup-linux-x64-musl@4.20.0':
-    optional: true
-
   '@rollup/rollup-linux-x64-musl@4.25.0':
     optional: true
 
-  '@rollup/rollup-win32-arm64-msvc@4.20.0':
-    optional: true
-
   '@rollup/rollup-win32-arm64-msvc@4.25.0':
     optional: true
 
-  '@rollup/rollup-win32-ia32-msvc@4.20.0':
-    optional: true
-
   '@rollup/rollup-win32-ia32-msvc@4.25.0':
     optional: true
 
-  '@rollup/rollup-win32-x64-msvc@4.20.0':
-    optional: true
-
   '@rollup/rollup-win32-x64-msvc@4.25.0':
     optional: true
 
@@ -4172,7 +4293,10 @@ snapshots:
 
   '@tootallnate/quickjs-emscripten@0.23.0': {}
 
-  '@types/estree@1.0.5': {}
+  '@tybys/wasm-util@0.9.0':
+    dependencies:
+      tslib: 2.8.1
+    optional: true
 
   '@types/estree@1.0.6': {}
 
@@ -4320,9 +4444,9 @@ snapshots:
       '@typescript-eslint/types': 8.12.2
       eslint-visitor-keys: 3.4.3
 
-  '@vitejs/plugin-vue@5.1.2(vite@5.4.0(@types/node@22.8.7)(sass@1.80.6))(vue@packages+vue)':
+  '@vitejs/plugin-vue@5.1.2(vite@5.4.8(@types/node@22.8.7)(sass@1.80.6))(vue@packages+vue)':
     dependencies:
-      vite: 5.4.0(@types/node@22.8.7)(sass@1.80.6)
+      vite: 5.4.8(@types/node@22.8.7)(sass@1.80.6)
       vue: link:packages/vue
 
   '@vitest/coverage-v8@2.1.1(vitest@2.1.1(@types/node@22.8.7)(jsdom@25.0.0)(sass@1.80.6))':
@@ -4466,7 +4590,7 @@ snapshots:
 
   asap@2.0.6: {}
 
-  assert-never@1.3.0: {}
+  assert-never@1.2.1: {}
 
   assertion-error@2.0.1: {}
 
@@ -4484,27 +4608,22 @@ snapshots:
 
   balanced-match@1.0.2: {}
 
-  bare-events@2.4.2:
+  bare-events@2.2.2:
     optional: true
 
-  bare-fs@2.3.1:
+  bare-fs@2.2.3:
     dependencies:
-      bare-events: 2.4.2
-      bare-path: 2.1.3
-      bare-stream: 2.1.3
+      bare-events: 2.2.2
+      bare-path: 2.1.1
+      streamx: 2.16.1
     optional: true
 
-  bare-os@2.4.0:
+  bare-os@2.2.1:
     optional: true
 
-  bare-path@2.1.3:
+  bare-path@2.1.1:
     dependencies:
-      bare-os: 2.4.0
-    optional: true
-
-  bare-stream@2.1.3:
-    dependencies:
-      streamx: 2.18.0
+      bare-os: 2.2.1
     optional: true
 
   base64-js@1.5.1: {}
@@ -4611,7 +4730,7 @@ snapshots:
   cli-truncate@4.0.0:
     dependencies:
       slice-ansi: 5.0.0
-      string-width: 7.2.0
+      string-width: 7.1.0
 
   clipboardy@3.0.0:
     dependencies:
@@ -4706,8 +4825,8 @@ snapshots:
       conventional-commits-parser: 6.0.0
       git-raw-commits: 5.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.0.0)
       git-semver-tags: 8.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.0.0)
-      hosted-git-info: 7.0.2
-      normalize-package-data: 6.0.2
+      hosted-git-info: 7.0.1
+      normalize-package-data: 6.0.0
       read-package-up: 11.0.0
       read-pkg: 9.0.1
     transitivePeerDependencies:
@@ -4873,7 +4992,7 @@ snapshots:
 
   es-errors@1.3.0: {}
 
-  es-module-lexer@1.5.4: {}
+  es-module-lexer@1.5.0: {}
 
   esbuild-plugin-polyfill-node@0.3.0(esbuild@0.24.0):
     dependencies:
@@ -5017,7 +5136,7 @@ snapshots:
       lodash.merge: 4.6.2
       minimatch: 3.1.2
       natural-compare: 1.4.0
-      optionator: 0.9.4
+      optionator: 0.9.3
       text-table: 0.2.0
     transitivePeerDependencies:
       - supports-color
@@ -5160,7 +5279,7 @@ snapshots:
 
   generic-names@4.0.0:
     dependencies:
-      loader-utils: 3.3.1
+      loader-utils: 3.2.1
 
   get-caller-file@2.0.5: {}
 
@@ -5280,7 +5399,7 @@ snapshots:
     dependencies:
       function-bind: 1.1.2
 
-  hosted-git-info@7.0.2:
+  hosted-git-info@7.0.1:
     dependencies:
       lru-cache: 10.1.0
 
@@ -5297,6 +5416,13 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  https-proxy-agent@7.0.4:
+    dependencies:
+      agent-base: 7.1.1
+      debug: 4.3.6
+    transitivePeerDependencies:
+      - supports-color
+
   https-proxy-agent@7.0.5:
     dependencies:
       agent-base: 7.1.1
@@ -5548,7 +5674,7 @@ snapshots:
       rfdc: 1.4.1
       wrap-ansi: 9.0.0
 
-  loader-utils@3.3.1: {}
+  loader-utils@3.2.1: {}
 
   locate-path@6.0.0:
     dependencies:
@@ -5580,10 +5706,6 @@ snapshots:
 
   lru-cache@7.18.3: {}
 
-  magic-string@0.30.11:
-    dependencies:
-      '@jridgewell/sourcemap-codec': 1.5.0
-
   magic-string@0.30.12:
     dependencies:
       '@jridgewell/sourcemap-codec': 1.5.0
@@ -5678,9 +5800,10 @@ snapshots:
   node-addon-api@7.1.1:
     optional: true
 
-  normalize-package-data@6.0.2:
+  normalize-package-data@6.0.0:
     dependencies:
-      hosted-git-info: 7.0.2
+      hosted-git-info: 7.0.1
+      is-core-module: 2.15.0
       semver: 7.6.3
       validate-npm-package-license: 3.0.4
 
@@ -5727,14 +5850,38 @@ snapshots:
     dependencies:
       mimic-function: 5.0.1
 
-  optionator@0.9.4:
+  optionator@0.9.3:
     dependencies:
+      '@aashutoshrathi/word-wrap': 1.2.6
       deep-is: 0.1.4
       fast-levenshtein: 2.0.6
       levn: 0.4.1
       prelude-ls: 1.2.1
       type-check: 0.4.0
-      word-wrap: 1.2.5
+
+  oxc-parser@0.35.0:
+    dependencies:
+      '@oxc-project/types': 0.35.0
+    optionalDependencies:
+      '@oxc-parser/binding-darwin-arm64': 0.35.0
+      '@oxc-parser/binding-darwin-x64': 0.35.0
+      '@oxc-parser/binding-linux-arm64-gnu': 0.35.0
+      '@oxc-parser/binding-linux-arm64-musl': 0.35.0
+      '@oxc-parser/binding-linux-x64-gnu': 0.35.0
+      '@oxc-parser/binding-linux-x64-musl': 0.35.0
+      '@oxc-parser/binding-win32-arm64-msvc': 0.35.0
+      '@oxc-parser/binding-win32-x64-msvc': 0.35.0
+
+  oxc-transform@0.35.0:
+    optionalDependencies:
+      '@oxc-transform/binding-darwin-arm64': 0.35.0
+      '@oxc-transform/binding-darwin-x64': 0.35.0
+      '@oxc-transform/binding-linux-arm64-gnu': 0.35.0
+      '@oxc-transform/binding-linux-arm64-musl': 0.35.0
+      '@oxc-transform/binding-linux-x64-gnu': 0.35.0
+      '@oxc-transform/binding-linux-x64-musl': 0.35.0
+      '@oxc-transform/binding-win32-arm64-msvc': 0.35.0
+      '@oxc-transform/binding-win32-x64-msvc': 0.35.0
 
   p-limit@3.1.0:
     dependencies:
@@ -5744,16 +5891,16 @@ snapshots:
     dependencies:
       p-limit: 3.1.0
 
-  pac-proxy-agent@7.0.2:
+  pac-proxy-agent@7.0.1:
     dependencies:
       '@tootallnate/quickjs-emscripten': 0.23.0
       agent-base: 7.1.1
       debug: 4.3.6
       get-uri: 6.0.3
       http-proxy-agent: 7.0.2
-      https-proxy-agent: 7.0.5
+      https-proxy-agent: 7.0.4
       pac-resolver: 7.0.1
-      socks-proxy-agent: 8.0.4
+      socks-proxy-agent: 8.0.3
     transitivePeerDependencies:
       - supports-color
 
@@ -5772,14 +5919,14 @@ snapshots:
 
   parse-json@5.2.0:
     dependencies:
-      '@babel/code-frame': 7.24.7
+      '@babel/code-frame': 7.24.2
       error-ex: 1.3.2
       json-parse-even-better-errors: 2.3.1
       lines-and-columns: 1.2.4
 
   parse-json@8.1.0:
     dependencies:
-      '@babel/code-frame': 7.24.7
+      '@babel/code-frame': 7.24.2
       index-to-position: 0.1.2
       type-fest: 4.24.0
 
@@ -5863,12 +6010,6 @@ snapshots:
 
   postcss-value-parser@4.2.0: {}
 
-  postcss@8.4.41:
-    dependencies:
-      nanoid: 3.3.7
-      picocolors: 1.1.1
-      source-map-js: 1.2.1
-
   postcss@8.4.48:
     dependencies:
       nanoid: 3.3.7
@@ -5894,11 +6035,11 @@ snapshots:
       agent-base: 7.1.1
       debug: 4.3.6
       http-proxy-agent: 7.0.2
-      https-proxy-agent: 7.0.5
+      https-proxy-agent: 7.0.4
       lru-cache: 7.18.3
-      pac-proxy-agent: 7.0.2
+      pac-proxy-agent: 7.0.1
       proxy-from-env: 1.1.0
-      socks-proxy-agent: 8.0.4
+      socks-proxy-agent: 8.0.3
     transitivePeerDependencies:
       - supports-color
 
@@ -5923,13 +6064,15 @@ snapshots:
       void-elements: 3.1.0
       with: 7.0.2
 
+  pug-error@2.0.0: {}
+
   pug-error@2.1.0: {}
 
   pug-filters@4.0.0:
     dependencies:
       constantinople: 4.0.1
       jstransformer: 1.0.0
-      pug-error: 2.1.0
+      pug-error: 2.0.0
       pug-walk: 2.0.0
       resolve: 1.22.8
 
@@ -5937,11 +6080,11 @@ snapshots:
     dependencies:
       character-parser: 2.2.0
       is-expression: 4.0.0
-      pug-error: 2.1.0
+      pug-error: 2.0.0
 
   pug-linker@4.0.0:
     dependencies:
-      pug-error: 2.1.0
+      pug-error: 2.0.0
       pug-walk: 2.0.0
 
   pug-load@3.0.0:
@@ -5951,14 +6094,14 @@ snapshots:
 
   pug-parser@6.0.0:
     dependencies:
-      pug-error: 2.1.0
+      pug-error: 2.0.0
       token-stream: 1.0.0
 
   pug-runtime@3.0.1: {}
 
   pug-strip-comments@2.0.0:
     dependencies:
-      pug-error: 2.1.0
+      pug-error: 2.0.0
 
   pug-walk@2.0.0: {}
 
@@ -6036,7 +6179,7 @@ snapshots:
   read-pkg@9.0.1:
     dependencies:
       '@types/normalize-package-data': 2.4.4
-      normalize-package-data: 6.0.2
+      normalize-package-data: 6.0.0
       parse-json: 8.1.0
       type-fest: 4.24.0
       unicorn-magic: 0.1.0
@@ -6092,19 +6235,36 @@ snapshots:
       glob: 11.0.0
       package-json-from-dist: 1.0.0
 
+  rolldown@0.14.0-snapshot-d5e797b-20241114003621:
+    dependencies:
+      zod: 3.23.8
+    optionalDependencies:
+      '@rolldown/binding-darwin-arm64': 0.14.0-snapshot-d5e797b-20241114003621
+      '@rolldown/binding-darwin-x64': 0.14.0-snapshot-d5e797b-20241114003621
+      '@rolldown/binding-freebsd-x64': 0.14.0-snapshot-d5e797b-20241114003621
+      '@rolldown/binding-linux-arm-gnueabihf': 0.14.0-snapshot-d5e797b-20241114003621
+      '@rolldown/binding-linux-arm64-gnu': 0.14.0-snapshot-d5e797b-20241114003621
+      '@rolldown/binding-linux-arm64-musl': 0.14.0-snapshot-d5e797b-20241114003621
+      '@rolldown/binding-linux-x64-gnu': 0.14.0-snapshot-d5e797b-20241114003621
+      '@rolldown/binding-linux-x64-musl': 0.14.0-snapshot-d5e797b-20241114003621
+      '@rolldown/binding-wasm32-wasi': 0.14.0-snapshot-d5e797b-20241114003621
+      '@rolldown/binding-win32-arm64-msvc': 0.14.0-snapshot-d5e797b-20241114003621
+      '@rolldown/binding-win32-ia32-msvc': 0.14.0-snapshot-d5e797b-20241114003621
+      '@rolldown/binding-win32-x64-msvc': 0.14.0-snapshot-d5e797b-20241114003621
+
   rollup-plugin-dts@6.1.1(rollup@4.25.0)(typescript@5.6.2):
     dependencies:
       magic-string: 0.30.12
       rollup: 4.25.0
       typescript: 5.6.2
     optionalDependencies:
-      '@babel/code-frame': 7.24.7
+      '@babel/code-frame': 7.24.2
 
   rollup-plugin-esbuild@6.1.1(esbuild@0.24.0)(rollup@4.25.0):
     dependencies:
       '@rollup/pluginutils': 5.1.0(rollup@4.25.0)
       debug: 4.3.6
-      es-module-lexer: 1.5.4
+      es-module-lexer: 1.5.0
       esbuild: 0.24.0
       get-tsconfig: 4.7.6
       rollup: 4.25.0
@@ -6116,28 +6276,6 @@ snapshots:
       '@rollup/plugin-inject': 5.0.5(rollup@4.25.0)
       rollup: 4.25.0
 
-  rollup@4.20.0:
-    dependencies:
-      '@types/estree': 1.0.5
-    optionalDependencies:
-      '@rollup/rollup-android-arm-eabi': 4.20.0
-      '@rollup/rollup-android-arm64': 4.20.0
-      '@rollup/rollup-darwin-arm64': 4.20.0
-      '@rollup/rollup-darwin-x64': 4.20.0
-      '@rollup/rollup-linux-arm-gnueabihf': 4.20.0
-      '@rollup/rollup-linux-arm-musleabihf': 4.20.0
-      '@rollup/rollup-linux-arm64-gnu': 4.20.0
-      '@rollup/rollup-linux-arm64-musl': 4.20.0
-      '@rollup/rollup-linux-powerpc64le-gnu': 4.20.0
-      '@rollup/rollup-linux-riscv64-gnu': 4.20.0
-      '@rollup/rollup-linux-s390x-gnu': 4.20.0
-      '@rollup/rollup-linux-x64-gnu': 4.20.0
-      '@rollup/rollup-linux-x64-musl': 4.20.0
-      '@rollup/rollup-win32-arm64-msvc': 4.20.0
-      '@rollup/rollup-win32-ia32-msvc': 4.20.0
-      '@rollup/rollup-win32-x64-msvc': 4.20.0
-      fsevents: 2.3.3
-
   rollup@4.25.0:
     dependencies:
       '@types/estree': 1.0.6
@@ -6255,7 +6393,7 @@ snapshots:
 
   smart-buffer@4.2.0: {}
 
-  socks-proxy-agent@8.0.4:
+  socks-proxy-agent@8.0.3:
     dependencies:
       agent-base: 7.1.1
       debug: 4.3.6
@@ -6268,8 +6406,6 @@ snapshots:
       ip-address: 9.0.5
       smart-buffer: 4.2.0
 
-  source-map-js@1.2.0: {}
-
   source-map-js@1.2.1: {}
 
   source-map@0.6.1: {}
@@ -6277,16 +6413,16 @@ snapshots:
   spdx-correct@3.2.0:
     dependencies:
       spdx-expression-parse: 3.0.1
-      spdx-license-ids: 3.0.18
+      spdx-license-ids: 3.0.17
 
   spdx-exceptions@2.5.0: {}
 
   spdx-expression-parse@3.0.1:
     dependencies:
       spdx-exceptions: 2.5.0
-      spdx-license-ids: 3.0.18
+      spdx-license-ids: 3.0.17
 
-  spdx-license-ids@3.0.18: {}
+  spdx-license-ids@3.0.17: {}
 
   sprintf-js@1.1.3: {}
 
@@ -6296,13 +6432,12 @@ snapshots:
 
   std-env@3.7.0: {}
 
-  streamx@2.18.0:
+  streamx@2.16.1:
     dependencies:
       fast-fifo: 1.3.2
       queue-tick: 1.0.1
-      text-decoder: 1.1.1
     optionalDependencies:
-      bare-events: 2.4.2
+      bare-events: 2.2.2
 
   string-argv@0.3.2: {}
 
@@ -6320,7 +6455,7 @@ snapshots:
       emoji-regex: 9.2.2
       strip-ansi: 7.1.0
 
-  string-width@7.2.0:
+  string-width@7.1.0:
     dependencies:
       emoji-regex: 10.3.0
       get-east-asian-width: 1.2.0
@@ -6363,14 +6498,14 @@ snapshots:
       pump: 3.0.0
       tar-stream: 3.1.7
     optionalDependencies:
-      bare-fs: 2.3.1
-      bare-path: 2.1.3
+      bare-fs: 2.2.3
+      bare-path: 2.1.1
 
   tar-stream@3.1.7:
     dependencies:
       b4a: 1.6.6
       fast-fifo: 1.3.2
-      streamx: 2.18.0
+      streamx: 2.16.1
 
   temp-dir@3.0.0: {}
 
@@ -6384,10 +6519,6 @@ snapshots:
       glob: 10.4.5
       minimatch: 9.0.5
 
-  text-decoder@1.1.1:
-    dependencies:
-      b4a: 1.6.6
-
   text-table@0.2.0: {}
 
   through@2.3.8: {}
@@ -6512,16 +6643,6 @@ snapshots:
       - supports-color
       - terser
 
-  vite@5.4.0(@types/node@22.8.7)(sass@1.80.6):
-    dependencies:
-      esbuild: 0.21.5
-      postcss: 8.4.41
-      rollup: 4.20.0
-    optionalDependencies:
-      '@types/node': 22.8.7
-      fsevents: 2.3.3
-      sass: 1.80.6
-
   vite@5.4.8(@types/node@22.8.7)(sass@1.80.6):
     dependencies:
       esbuild: 0.21.5
@@ -6607,11 +6728,9 @@ snapshots:
     dependencies:
       '@babel/parser': 7.25.3
       '@babel/types': 7.25.2
-      assert-never: 1.3.0
+      assert-never: 1.2.1
       babel-walk: 3.0.0-canary-5
 
-  word-wrap@1.2.5: {}
-
   wordwrap@1.0.0: {}
 
   wrap-ansi@7.0.0:
@@ -6629,7 +6748,7 @@ snapshots:
   wrap-ansi@9.0.0:
     dependencies:
       ansi-styles: 6.2.1
-      string-width: 7.2.0
+      string-width: 7.1.0
       strip-ansi: 7.1.0
 
   wrappy@1.0.2: {}
index d9af98f130663974e3a4baa30fa8dcbd4683ceb5..6c2e26f4495f67aadda376bb88bb39e915e51b4d 100644 (file)
@@ -1,6 +1,6 @@
 // @ts-check
 import assert from 'node:assert/strict'
-import { parse } from '@babel/parser'
+import { parseSync } from 'oxc-parser'
 import { existsSync, readFileSync, readdirSync, writeFileSync } from 'node:fs'
 import MagicString from 'magic-string'
 import dts from 'rollup-plugin-dts'
@@ -58,11 +58,15 @@ function patchTypes(pkg) {
     name: 'patch-types',
     renderChunk(code, chunk) {
       const s = new MagicString(code)
-      const ast = parse(code, {
-        plugins: ['typescript'],
+      const { program: ast, errors } = parseSync(code, {
+        sourceFilename: 'x.d.ts',
         sourceType: 'module',
       })
 
+      if (errors.length) {
+        throw new Error(errors.join('\n'))
+      }
+
       /**
        * @param {import('@babel/types').VariableDeclarator | import('@babel/types').TSTypeAliasDeclaration | import('@babel/types').TSInterfaceDeclaration | import('@babel/types').TSDeclareFunction | import('@babel/types').TSInterfaceDeclaration | import('@babel/types').TSEnumDeclaration | import('@babel/types').ClassDeclaration} node
        * @param {import('@babel/types').VariableDeclaration} [parentDecl]
@@ -88,20 +92,23 @@ function patchTypes(pkg) {
       const shouldRemoveExport = new Set()
 
       // pass 0: check all exported types
-      for (const node of ast.program.body) {
+      for (const node of ast.body) {
         if (node.type === 'ExportNamedDeclaration' && !node.source) {
           for (let i = 0; i < node.specifiers.length; i++) {
             const spec = node.specifiers[i]
             if (spec.type === 'ExportSpecifier') {
-              isExported.add(spec.local.name)
+              isExported.add(
+                'name' in spec.local ? spec.local.name : spec.local.value,
+              )
             }
           }
         }
       }
 
       // pass 1: add exports
-      for (const node of ast.program.body) {
+      for (const node of ast.body) {
         if (node.type === 'VariableDeclaration') {
+          // @ts-expect-error waiting for oxc-parser to expose types
           processDeclaration(node.declarations[0], node)
           if (node.declarations.length > 1) {
             assert(typeof node.start === 'number')
@@ -120,23 +127,26 @@ function patchTypes(pkg) {
           node.type === 'TSEnumDeclaration' ||
           node.type === 'ClassDeclaration'
         ) {
+          // @ts-expect-error waiting for oxc-parser to expose types
           processDeclaration(node)
         }
       }
 
       // pass 2: remove exports
-      for (const node of ast.program.body) {
+      for (const node of ast.body) {
         if (node.type === 'ExportNamedDeclaration' && !node.source) {
           let removed = 0
           for (let i = 0; i < node.specifiers.length; i++) {
             const spec = node.specifiers[i]
+            const localName =
+              'name' in spec.local ? spec.local.name : spec.local.value
             if (
               spec.type === 'ExportSpecifier' &&
-              shouldRemoveExport.has(spec.local.name)
+              shouldRemoveExport.has(localName)
             ) {
               assert(spec.exported.type === 'Identifier')
               const exported = spec.exported.name
-              if (exported !== spec.local.name) {
+              if (exported !== localName) {
                 // this only happens if we have something like
                 //   type Foo
                 //   export { Foo as Bar }
diff --git a/scripts/build-types.js b/scripts/build-types.js
new file mode 100644 (file)
index 0000000..5019460
--- /dev/null
@@ -0,0 +1,71 @@
+import fs from 'node:fs'
+import path from 'node:path'
+import glob from 'fast-glob'
+import { isolatedDeclaration } from 'oxc-transform'
+import { rollup } from 'rollup'
+import picocolors from 'picocolors'
+
+if (fs.existsSync('temp/packages')) {
+  fs.rmSync('temp/packages', { recursive: true })
+}
+
+let errs = ''
+let start = performance.now()
+let count = 0
+
+for (const file of await glob('packages/*/src/**/*.ts')) {
+  if (file.includes('runtime-test')) continue
+
+  const ts = fs.readFileSync(file, 'utf-8')
+  const dts = isolatedDeclaration(file, ts, {
+    sourcemap: false,
+    stripInternal: true,
+  })
+  if (dts.errors.length) {
+    dts.errors.forEach(err => {
+      // temporary workaround for https://github.com/oxc-project/oxc/issues/5668
+      if (!err.includes('set value(_: S)')) {
+        console.error(err)
+      }
+      errs += err + '\n'
+    })
+  }
+
+  write(path.join('temp', file.replace(/\.ts$/, '.d.ts')), dts.code)
+  count++
+}
+
+console.log(
+  `\n${count} isolated dts files generated in ${(performance.now() - start).toFixed(2)}ms.`,
+)
+
+if (errs) {
+  write(path.join('temp', 'oxc-iso-decl-errors.txt'), errs)
+}
+
+console.log('bundling dts with rollup-plugin-dts...')
+
+// bundle with rollup-plugin-dts
+const rollupConfigs = (await import('../rollup.dts.config.js')).default
+
+start = performance.now()
+
+await Promise.all(
+  rollupConfigs.map(c =>
+    rollup(c).then(bundle => {
+      return bundle.write(c.output).then(() => {
+        console.log(picocolors.gray('built: ') + picocolors.blue(c.output.file))
+      })
+    }),
+  ),
+)
+
+console.log(
+  `bundled dts generated in ${(performance.now() - start).toFixed(2)}ms.`,
+)
+
+function write(file, content) {
+  const dir = path.dirname(file)
+  if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true })
+  fs.writeFileSync(file, content)
+}
diff --git a/scripts/build-with-rollup.js b/scripts/build-with-rollup.js
new file mode 100644 (file)
index 0000000..2687c26
--- /dev/null
@@ -0,0 +1,259 @@
+// @ts-check
+
+/*
+Produces production builds and stitches together d.ts files.
+
+To specify the package to build, simply pass its name and the desired build
+formats to output (defaults to `buildOptions.formats` specified in that package,
+or "esm,cjs"):
+
+```
+# name supports fuzzy match. will build all packages with name containing "dom":
+nr build dom
+
+# specify the format to output
+nr build core --formats cjs
+```
+*/
+
+import fs from 'node:fs'
+import { parseArgs } from 'node:util'
+import { existsSync, readFileSync } from 'node:fs'
+import path from 'node:path'
+import { brotliCompressSync, gzipSync } from 'node:zlib'
+import pico from 'picocolors'
+import { cpus } from 'node:os'
+import { targets as allTargets, exec, fuzzyMatchTarget } from './utils.js'
+import { scanEnums } from './inline-enums.js'
+import prettyBytes from 'pretty-bytes'
+import { spawnSync } from 'node:child_process'
+
+const commit = spawnSync('git', ['rev-parse', '--short=7', 'HEAD'])
+  .stdout.toString()
+  .trim()
+
+const { values, positionals: targets } = parseArgs({
+  allowPositionals: true,
+  options: {
+    formats: {
+      type: 'string',
+      short: 'f',
+    },
+    devOnly: {
+      type: 'boolean',
+      short: 'd',
+    },
+    prodOnly: {
+      type: 'boolean',
+      short: 'p',
+    },
+    withTypes: {
+      type: 'boolean',
+      short: 't',
+    },
+    sourceMap: {
+      type: 'boolean',
+      short: 's',
+    },
+    release: {
+      type: 'boolean',
+    },
+    all: {
+      type: 'boolean',
+      short: 'a',
+    },
+    size: {
+      type: 'boolean',
+    },
+  },
+})
+
+const {
+  formats,
+  all: buildAllMatching,
+  devOnly,
+  prodOnly,
+  withTypes: buildTypes,
+  sourceMap,
+  release: isRelease,
+  size: writeSize,
+} = values
+
+const sizeDir = path.resolve('temp/size')
+
+run()
+
+async function run() {
+  if (writeSize) fs.mkdirSync(sizeDir, { recursive: true })
+  const removeCache = scanEnums()
+  try {
+    const resolvedTargets = targets.length
+      ? fuzzyMatchTarget(targets, buildAllMatching)
+      : allTargets
+    await buildAll(resolvedTargets)
+    await checkAllSizes(resolvedTargets)
+    if (buildTypes) {
+      await exec(
+        'pnpm',
+        [
+          'run',
+          'build-dts',
+          ...(targets.length
+            ? ['--environment', `TARGETS:${resolvedTargets.join(',')}`]
+            : []),
+        ],
+        {
+          stdio: 'inherit',
+        },
+      )
+    }
+  } finally {
+    removeCache()
+  }
+}
+
+/**
+ * Builds all the targets in parallel.
+ * @param {Array<string>} targets - An array of targets to build.
+ * @returns {Promise<void>} - A promise representing the build process.
+ */
+async function buildAll(targets) {
+  await runParallel(cpus().length, targets, build)
+}
+
+/**
+ * Runs iterator function in parallel.
+ * @template T - The type of items in the data source
+ * @param {number} maxConcurrency - The maximum concurrency.
+ * @param {Array<T>} source - The data source
+ * @param {(item: T) => Promise<void>} iteratorFn - The iteratorFn
+ * @returns {Promise<void[]>} - A Promise array containing all iteration results.
+ */
+async function runParallel(maxConcurrency, source, iteratorFn) {
+  /**@type {Promise<void>[]} */
+  const ret = []
+  /**@type {Promise<void>[]} */
+  const executing = []
+  for (const item of source) {
+    const p = Promise.resolve().then(() => iteratorFn(item))
+    ret.push(p)
+
+    if (maxConcurrency <= source.length) {
+      const e = p.then(() => {
+        executing.splice(executing.indexOf(e), 1)
+      })
+      executing.push(e)
+      if (executing.length >= maxConcurrency) {
+        await Promise.race(executing)
+      }
+    }
+  }
+  return Promise.all(ret)
+}
+
+const privatePackages = fs.readdirSync('packages-private')
+
+/**
+ * Builds the target.
+ * @param {string} target - The target to build.
+ * @returns {Promise<void>} - A promise representing the build process.
+ */
+async function build(target) {
+  const pkgBase = privatePackages.includes(target)
+    ? `packages-private`
+    : `packages`
+  const pkgDir = path.resolve(`${pkgBase}/${target}`)
+  const pkg = JSON.parse(readFileSync(`${pkgDir}/package.json`, 'utf-8'))
+
+  // if this is a full build (no specific targets), ignore private packages
+  if ((isRelease || !targets.length) && pkg.private) {
+    return
+  }
+
+  // if building a specific format, do not remove dist.
+  if (!formats && existsSync(`${pkgDir}/dist`)) {
+    fs.rmSync(`${pkgDir}/dist`, { recursive: true })
+  }
+
+  const env = {
+    ...process.env,
+    TARGET: target,
+    COMMIT: commit,
+    NODE_ENV:
+      (pkg.buildOptions && pkg.buildOptions.env) ||
+      (devOnly ? 'development' : 'production'),
+    ...(formats ? { FORMATS: formats } : null),
+    ...(prodOnly ? { PROD_ONLY: true } : null),
+    ...(sourceMap ? { SOURCE_MAP: true } : null),
+  }
+
+  await exec('rollup', ['-c'], {
+    stdio: 'inherit',
+    env,
+  })
+}
+
+/**
+ * Checks the sizes of all targets.
+ * @param {string[]} targets - The targets to check sizes for.
+ * @returns {Promise<void>}
+ */
+async function checkAllSizes(targets) {
+  if (devOnly || (formats && !formats.includes('global'))) {
+    return
+  }
+  console.log()
+  for (const target of targets) {
+    await checkSize(target)
+  }
+  console.log()
+}
+
+/**
+ * Checks the size of a target.
+ * @param {string} target - The target to check the size for.
+ * @returns {Promise<void>}
+ */
+async function checkSize(target) {
+  const pkgDir = path.resolve(`packages/${target}`)
+  await checkFileSize(`${pkgDir}/dist/${target}.global.prod.js`)
+  if (!formats || formats.includes('global-runtime')) {
+    await checkFileSize(`${pkgDir}/dist/${target}.runtime.global.prod.js`)
+  }
+}
+
+/**
+ * Checks the file size.
+ * @param {string} filePath - The path of the file to check the size for.
+ * @returns {Promise<void>}
+ */
+async function checkFileSize(filePath) {
+  if (!existsSync(filePath)) {
+    return
+  }
+  const file = fs.readFileSync(filePath)
+  const fileName = path.basename(filePath)
+
+  const gzipped = gzipSync(file)
+  const brotli = brotliCompressSync(file)
+
+  console.log(
+    `${pico.gray(pico.bold(fileName))} min:${prettyBytes(
+      file.length,
+    )} / gzip:${prettyBytes(gzipped.length)} / brotli:${prettyBytes(
+      brotli.length,
+    )}`,
+  )
+
+  if (writeSize)
+    fs.writeFileSync(
+      path.resolve(sizeDir, `${fileName}.json`),
+      JSON.stringify({
+        file: fileName,
+        size: file.length,
+        gzip: gzipped.length,
+        brotli: brotli.length,
+      }),
+      'utf-8',
+    )
+}
index 4a0aef645438ce227edfacf7bb05b177d01b0a63..a1b23ed6a901936d13c56dca0368f9b87976c417 100644 (file)
@@ -22,12 +22,16 @@ import { existsSync, readFileSync } from 'node:fs'
 import path from 'node:path'
 import { brotliCompressSync, gzipSync } from 'node:zlib'
 import pico from 'picocolors'
-import { cpus } from 'node:os'
-import { targets as allTargets, exec, fuzzyMatchTarget } from './utils.js'
-import { scanEnums } from './inline-enums.js'
+import { targets as allTargets, fuzzyMatchTarget } from './utils.js'
 import prettyBytes from 'pretty-bytes'
 import { spawnSync } from 'node:child_process'
+import { createConfigsForPackage } from './create-rolldown-config.js'
+import { rolldown } from 'rolldown'
+import { scanEnums } from './inline-enums.js'
+import { fileURLToPath } from 'node:url'
 
+const __dirname = fileURLToPath(new URL('.', import.meta.url))
+const privatePackages = fs.readdirSync('packages-private')
 const commit = spawnSync('git', ['rev-parse', '--short=7', 'HEAD'])
   .stdout.toString()
   .trim()
@@ -69,43 +73,32 @@ const { values, positionals: targets } = parseArgs({
 })
 
 const {
-  formats,
+  formats: rawFormats,
   all: buildAllMatching,
   devOnly,
   prodOnly,
   withTypes: buildTypes,
   sourceMap,
   release: isRelease,
-  size: writeSize,
+  size,
 } = values
 
+const formats = rawFormats?.split(',')
 const sizeDir = path.resolve('temp/size')
 
 run()
 
 async function run() {
-  if (writeSize) fs.mkdirSync(sizeDir, { recursive: true })
+  if (size) fs.mkdirSync(sizeDir, { recursive: true })
   const removeCache = scanEnums()
   try {
     const resolvedTargets = targets.length
       ? fuzzyMatchTarget(targets, buildAllMatching)
       : allTargets
     await buildAll(resolvedTargets)
-    await checkAllSizes(resolvedTargets)
+    if (size) await checkAllSizes(resolvedTargets)
     if (buildTypes) {
-      await exec(
-        'pnpm',
-        [
-          'run',
-          'build-dts',
-          ...(targets.length
-            ? ['--environment', `TARGETS:${resolvedTargets.join(',')}`]
-            : []),
-        ],
-        {
-          stdio: 'inherit',
-        },
-      )
+      await import('./build-types.js')
     }
   } finally {
     removeCache()
@@ -118,51 +111,47 @@ async function run() {
  * @returns {Promise<void>} - A promise representing the build process.
  */
 async function buildAll(targets) {
-  await runParallel(cpus().length, targets, build)
-}
-
-/**
- * Runs iterator function in parallel.
- * @template T - The type of items in the data source
- * @param {number} maxConcurrency - The maximum concurrency.
- * @param {Array<T>} source - The data source
- * @param {(item: T) => Promise<void>} iteratorFn - The iteratorFn
- * @returns {Promise<void[]>} - A Promise array containing all iteration results.
- */
-async function runParallel(maxConcurrency, source, iteratorFn) {
-  /**@type {Promise<void>[]} */
-  const ret = []
-  /**@type {Promise<void>[]} */
-  const executing = []
-  for (const item of source) {
-    const p = Promise.resolve().then(() => iteratorFn(item))
-    ret.push(p)
-
-    if (maxConcurrency <= source.length) {
-      const e = p.then(() => {
-        executing.splice(executing.indexOf(e), 1)
-      })
-      executing.push(e)
-      if (executing.length >= maxConcurrency) {
-        await Promise.race(executing)
-      }
+  const start = performance.now()
+  const all = []
+  let count = 0
+  for (const t of targets) {
+    const configs = createConfigsForTarget(t)
+    if (configs) {
+      all.push(
+        Promise.all(
+          configs.map(c =>
+            rolldown(c).then(bundle => {
+              return bundle.write(c.output).then(() => {
+                // @ts-expect-error
+                return path.join('packages', t, 'dist', c.output.entryFileNames)
+              })
+            }),
+          ),
+        ).then(files => {
+          files.forEach(f => {
+            count++
+            console.log(pico.gray('built: ') + pico.green(f))
+          })
+        }),
+      )
     }
   }
-  return Promise.all(ret)
+  await Promise.all(all)
+  console.log(
+    `\n${count} files built in ${(performance.now() - start).toFixed(2)}ms.`,
+  )
 }
 
-const privatePackages = fs.readdirSync('packages-private')
-
 /**
  * Builds the target.
  * @param {string} target - The target to build.
- * @returns {Promise<void>} - A promise representing the build process.
+ * @returns {import('rolldown').RolldownOptions[] | void} - A promise representing the build process.
  */
-async function build(target) {
+function createConfigsForTarget(target) {
   const pkgBase = privatePackages.includes(target)
     ? `packages-private`
     : `packages`
-  const pkgDir = path.resolve(`${pkgBase}/${target}`)
+  const pkgDir = path.resolve(__dirname, `../${pkgBase}/${target}`)
   const pkg = JSON.parse(readFileSync(`${pkgDir}/package.json`, 'utf-8'))
 
   // if this is a full build (no specific targets), ignore private packages
@@ -175,28 +164,16 @@ async function build(target) {
     fs.rmSync(`${pkgDir}/dist`, { recursive: true })
   }
 
-  const env =
-    (pkg.buildOptions && pkg.buildOptions.env) ||
-    (devOnly ? 'development' : 'production')
-
-  await exec(
-    'rollup',
-    [
-      '-c',
-      '--environment',
-      [
-        `COMMIT:${commit}`,
-        `NODE_ENV:${env}`,
-        `TARGET:${target}`,
-        formats ? `FORMATS:${formats}` : ``,
-        prodOnly ? `PROD_ONLY:true` : ``,
-        sourceMap ? `SOURCE_MAP:true` : ``,
-      ]
-        .filter(Boolean)
-        .join(','),
-    ],
-    { stdio: 'inherit' },
-  )
+  return createConfigsForPackage({
+    target,
+    commit,
+    // @ts-expect-error
+    formats,
+    prodOnly,
+    devOnly:
+      (pkg.buildOptions && pkg.buildOptions.env === 'development') || devOnly,
+    sourceMap,
+  })
 }
 
 /**
@@ -221,7 +198,7 @@ async function checkAllSizes(targets) {
  * @returns {Promise<void>}
  */
 async function checkSize(target) {
-  const pkgDir = path.resolve(`packages/${target}`)
+  const pkgDir = path.resolve(__dirname, `../packages/${target}`)
   await checkFileSize(`${pkgDir}/dist/${target}.global.prod.js`)
   if (!formats || formats.includes('global-runtime')) {
     await checkFileSize(`${pkgDir}/dist/${target}.runtime.global.prod.js`)
@@ -251,7 +228,7 @@ async function checkFileSize(filePath) {
     )}`,
   )
 
-  if (writeSize)
+  if (size)
     fs.writeFileSync(
       path.resolve(sizeDir, `${fileName}.json`),
       JSON.stringify({
diff --git a/scripts/create-rolldown-config.js b/scripts/create-rolldown-config.js
new file mode 100644 (file)
index 0000000..b5a5d80
--- /dev/null
@@ -0,0 +1,387 @@
+// @ts-check
+import assert from 'node:assert/strict'
+import { createRequire } from 'node:module'
+import { fileURLToPath } from 'node:url'
+import path from 'node:path'
+import { replacePlugin } from 'rolldown/experimental'
+import pico from 'picocolors'
+import polyfillNode from '@rolldown/plugin-node-polyfills'
+import { entries } from './aliases.js'
+import { inlineEnums } from './inline-enums.js'
+import { minify as minifySwc } from '@swc/core'
+
+const require = createRequire(import.meta.url)
+const __dirname = fileURLToPath(new URL('.', import.meta.url))
+
+const masterVersion = require('../package.json').version
+const consolidatePkg = require('@vue/consolidate/package.json')
+
+const packagesDir = path.resolve(__dirname, '../packages')
+
+/** @typedef {'cjs' | 'esm-bundler' | 'global' | 'global-runtime' | 'esm-browser' | 'esm-bundler-runtime' | 'esm-browser-runtime'} PackageFormat */
+
+/**
+ * @param {{
+ *   target: string
+ *   commit: string
+ *   formats?: PackageFormat[]
+ *   devOnly?: boolean
+ *   prodOnly?: boolean
+ *   sourceMap?: boolean
+ * }} options
+ */
+export function createConfigsForPackage({
+  target,
+  commit,
+  formats,
+  devOnly = false,
+  prodOnly = false,
+  sourceMap = false,
+}) {
+  const [enumPlugin, enumDefines] = inlineEnums()
+
+  const packageDir = path.resolve(packagesDir, target)
+  const resolve = (/** @type {string} */ p) => path.resolve(packageDir, p)
+  const pkg = require(resolve(`package.json`))
+  const packageOptions = pkg.buildOptions || {}
+  const name = packageOptions.filename || path.basename(packageDir)
+
+  /** @type {Record<PackageFormat, import('rolldown').OutputOptions>} */
+  const outputConfigs = {
+    'esm-bundler': {
+      entryFileNames: `${name}.esm-bundler.js`,
+      format: 'es',
+    },
+    'esm-browser': {
+      entryFileNames: `${name}.esm-browser.js`,
+      format: 'es',
+    },
+    cjs: {
+      entryFileNames: `${name}.cjs.js`,
+      format: 'cjs',
+    },
+    global: {
+      entryFileNames: `${name}.global.js`,
+      format: 'iife',
+    },
+    // runtime-only builds, for main "vue" package only
+    'esm-bundler-runtime': {
+      entryFileNames: `${name}.runtime.esm-bundler.js`,
+      format: 'es',
+    },
+    'esm-browser-runtime': {
+      entryFileNames: `${name}.runtime.esm-browser.js`,
+      format: 'es',
+    },
+    'global-runtime': {
+      entryFileNames: `${name}.runtime.global.js`,
+      format: 'iife',
+    },
+  }
+
+  const resolvedFormats = (
+    formats ||
+    packageOptions.formats || ['esm-bundler', 'cjs']
+  ).filter(format => outputConfigs[format])
+
+  const packageConfigs = prodOnly
+    ? []
+    : resolvedFormats.map(format => createConfig(format, outputConfigs[format]))
+
+  if (!devOnly) {
+    resolvedFormats.forEach(format => {
+      if (packageOptions.prod === false) {
+        return
+      }
+      if (format === 'cjs') {
+        packageConfigs.push(createProductionConfig(format))
+      }
+      if (/^(global|esm-browser)(-runtime)?/.test(format)) {
+        packageConfigs.push(createMinifiedConfig(format))
+      }
+    })
+  }
+
+  /**
+   *
+   * @param {PackageFormat} format
+   * @param {import('rolldown').OutputOptions} output
+   * @param {import('rolldown').Plugin[]} plugins
+   * @returns {import('rolldown').RolldownOptions}
+   */
+  function createConfig(format, output, plugins = []) {
+    if (!output) {
+      console.error(pico.yellow(`invalid format: "${format}"`))
+      process.exit(1)
+    }
+
+    output.dir = resolve('dist')
+
+    const isProductionBuild = /\.prod\.js$/.test(
+      String(output.entryFileNames) || '',
+    )
+    const isBundlerESMBuild = /esm-bundler/.test(format)
+    const isBrowserESMBuild = /esm-browser/.test(format)
+    const isServerRenderer = name === 'server-renderer'
+    const isCJSBuild = format === 'cjs'
+    const isGlobalBuild = /global/.test(format)
+    const isCompatPackage =
+      pkg.name === '@vue/compat' || pkg.name === '@vue/compat-canary'
+    const isCompatBuild = !!packageOptions.compat
+    const isBrowserBuild =
+      (isGlobalBuild || isBrowserESMBuild || isBundlerESMBuild) &&
+      !packageOptions.enableNonBrowserBranches
+
+    output.banner = `/**
+  * ${pkg.name} v${masterVersion}
+  * (c) 2018-present Yuxi (Evan) You and Vue contributors
+  * @license MIT
+  **/`
+
+    output.exports = isCompatPackage ? 'auto' : 'named'
+    if (isCJSBuild) {
+      output.esModule = true
+    }
+    output.sourcemap = sourceMap
+
+    output.externalLiveBindings = false
+
+    // https://github.com/rollup/rollup/pull/5380
+    // @ts-expect-error Not supported yet
+    output.reexportProtoFromExternal = false
+
+    if (isGlobalBuild) {
+      output.name = packageOptions.name
+    }
+
+    let entryFile = /runtime$/.test(format) ? `src/runtime.ts` : `src/index.ts`
+
+    // the compat build needs both default AND named exports. This will cause
+    // Rollup to complain for non-ESM targets, so we use separate entries for
+    // esm vs. non-esm builds.
+    if (isCompatPackage && (isBrowserESMBuild || isBundlerESMBuild)) {
+      entryFile = /runtime$/.test(format)
+        ? `src/esm-runtime.ts`
+        : `src/esm-index.ts`
+    }
+
+    function resolveDefine() {
+      /** @type {Record<string, string>} */
+      const defines = {
+        __COMMIT__: `"${commit}"`,
+        __VERSION__: `"${masterVersion}"`,
+        // this is only used during Vue's internal tests
+        __TEST__: `false`,
+        // If the build is expected to run directly in the browser (global / esm builds)
+        __BROWSER__: String(isBrowserBuild),
+        __GLOBAL__: String(isGlobalBuild),
+        __ESM_BUNDLER__: String(isBundlerESMBuild),
+        __ESM_BROWSER__: String(isBrowserESMBuild),
+        // is targeting Node (SSR)?
+        __CJS__: String(isCJSBuild),
+        // need SSR-specific branches?
+        __SSR__: String(isCJSBuild || isBundlerESMBuild || isServerRenderer),
+
+        // 2.x compat build
+        __COMPAT__: String(isCompatBuild),
+
+        // feature flags
+        __FEATURE_SUSPENSE__: `true`,
+        __FEATURE_OPTIONS_API__: isBundlerESMBuild
+          ? `__VUE_OPTIONS_API__`
+          : `true`,
+        __FEATURE_PROD_DEVTOOLS__: isBundlerESMBuild
+          ? `__VUE_PROD_DEVTOOLS__`
+          : `false`,
+        __FEATURE_PROD_HYDRATION_MISMATCH_DETAILS__: isBundlerESMBuild
+          ? `__VUE_PROD_HYDRATION_MISMATCH_DETAILS__`
+          : `false`,
+      }
+
+      if (!isBundlerESMBuild) {
+        // hard coded dev/prod builds
+        defines.__DEV__ = String(!isProductionBuild)
+      }
+
+      // allow inline overrides like
+      //__RUNTIME_COMPILE__=true pnpm build runtime-core
+      Object.keys(defines).forEach(key => {
+        if (key in process.env) {
+          const value = process.env[key]
+          assert(typeof value === 'string')
+          defines[key] = value
+        }
+      })
+
+      return defines
+    }
+
+    // esbuild define is a bit strict and only allows literal json or identifiers
+    // so we still need replace plugin in some cases
+    function resolveReplace() {
+      /** @type {Record<string, string>} */
+      const replacements = { ...enumDefines }
+
+      if (isBundlerESMBuild) {
+        Object.assign(replacements, {
+          // preserve to be handled by bundlers
+          __DEV__: `!!(process.env.NODE_ENV !== 'production')`,
+        })
+      }
+
+      // for compiler-sfc browser build inlined deps
+      if (isBrowserESMBuild && name === 'compiler-sfc') {
+        Object.assign(replacements, {
+          'process.env': '({})',
+          'process.platform': '""',
+          'process.stdout': 'null',
+        })
+      }
+
+      if (Object.keys(replacements).length) {
+        return [replacePlugin(replacements)]
+      } else {
+        return []
+      }
+    }
+
+    function resolveExternal() {
+      const treeShakenDeps = [
+        'source-map-js',
+        '@babel/parser',
+        'estree-walker',
+        'entities/lib/decode.js',
+      ]
+
+      // we are bundling forked consolidate.js in compiler-sfc which dynamically
+      // requires a ton of template engines which should be ignored.
+      let cjsIgnores = []
+      if (
+        pkg.name === '@vue/compiler-sfc' ||
+        pkg.name === '@vue/compiler-sfc-canary'
+      ) {
+        cjsIgnores = [
+          ...Object.keys(consolidatePkg.devDependencies),
+          'vm',
+          'crypto',
+          'react-dom/server',
+          'teacup/lib/express',
+          'arc-templates/dist/es5',
+          'then-pug',
+          'then-jade',
+        ]
+      }
+
+      if (isGlobalBuild || isBrowserESMBuild || isCompatPackage) {
+        if (!packageOptions.enableNonBrowserBranches) {
+          // normal browser builds - non-browser only imports are tree-shaken,
+          // they are only listed here to suppress warnings.
+          return treeShakenDeps
+        } else {
+          return cjsIgnores
+        }
+      } else {
+        // Node / esm-bundler builds.
+        // externalize all direct deps unless it's the compat build.
+        return [
+          ...Object.keys(pkg.dependencies || {}),
+          ...Object.keys(pkg.peerDependencies || {}),
+          // for @vue/compiler-sfc / server-renderer
+          ...['path', 'url', 'stream'],
+          // somehow these throw warnings for runtime-* package builds
+          ...treeShakenDeps,
+          ...cjsIgnores,
+        ]
+      }
+    }
+
+    function resolveNodePlugins() {
+      const nodePlugins =
+        (format === 'cjs' && Object.keys(pkg.devDependencies || {}).length) ||
+        packageOptions.enableNonBrowserBranches
+          ? [...(format === 'cjs' ? [] : [polyfillNode()])]
+          : []
+      return nodePlugins
+    }
+
+    return {
+      input: resolve(entryFile),
+      // Global and Browser ESM builds inlines everything so that they can be
+      // used alone.
+      external: resolveExternal(),
+      define: resolveDefine(),
+      platform: format === 'cjs' ? 'node' : 'browser',
+      resolve: {
+        alias: entries,
+      },
+      plugins: [
+        // @ts-expect-error rollup's Plugin type incompatible w/ rolldown's vendored Plugin type
+        enumPlugin,
+        ...resolveReplace(),
+        ...resolveNodePlugins(),
+        ...plugins,
+      ],
+      output,
+      onwarn: (msg, warn) => {
+        if (msg.code !== 'CIRCULAR_DEPENDENCY') {
+          warn(msg)
+        }
+      },
+      treeshake: {
+        // https://github.com/rolldown/rolldown/issues/1917
+        moduleSideEffects: false,
+      },
+    }
+  }
+
+  function createProductionConfig(/** @type {PackageFormat} */ format) {
+    return createConfig(format, {
+      entryFileNames: `${name}.${format}.prod.js`,
+      format: outputConfigs[format].format,
+    })
+  }
+
+  function createMinifiedConfig(/** @type {PackageFormat} */ format) {
+    return createConfig(
+      format,
+      {
+        entryFileNames: String(outputConfigs[format].entryFileNames).replace(
+          /\.js$/,
+          '.prod.js',
+        ),
+        format: outputConfigs[format].format,
+        // minify: true,
+      },
+      [
+        {
+          name: 'swc-minify',
+          async renderChunk(
+            contents,
+            _,
+            {
+              format,
+              sourcemap,
+              // @ts-expect-error not supported yet
+              sourcemapExcludeSources,
+            },
+          ) {
+            const { code, map } = await minifySwc(contents, {
+              module: format === 'es',
+              compress: {
+                ecma: 2016,
+                pure_getters: true,
+              },
+              safari10: true,
+              mangle: true,
+              sourceMap: !!sourcemap,
+              inlineSourcesContent: !sourcemapExcludeSources,
+            })
+            return { code, map: map || null }
+          },
+        },
+      ],
+    )
+  }
+
+  return packageConfigs
+}
index b1baaa6c5c33afb2816f3c4652f2eb5459f2a1a6..55583c10b4110418d85fed2d8bb4e6322deea3c8 100644 (file)
@@ -20,7 +20,7 @@ import {
   writeFileSync,
 } from 'node:fs'
 import * as path from 'node:path'
-import { parse } from '@babel/parser'
+import { parseSync } from 'oxc-parser'
 import { spawnSync } from 'node:child_process'
 import MagicString from 'magic-string'
 
@@ -61,17 +61,19 @@ export function scanEnums() {
   ]
 
   // 2. parse matched files to collect enum info
+  let i = 0
   for (const relativeFile of files) {
     const file = path.resolve(process.cwd(), relativeFile)
     const content = readFileSync(file, 'utf-8')
-    const ast = parse(content, {
-      plugins: ['typescript'],
+    const res = parseSync(content, {
+      // plugins: ['typescript'],
+      sourceFilename: file,
       sourceType: 'module',
     })
 
     /** @type {Set<string>} */
     const enumIds = new Set()
-    for (const node of ast.program.body) {
+    for (const node of res.program.body) {
       if (
         node.type === 'ExportNamedDeclaration' &&
         node.declaration &&
@@ -129,7 +131,11 @@ export function scanEnums() {
                   node.type === 'StringLiteral'
                 ) {
                   return node.value
-                } else if (node.type === 'MemberExpression') {
+                } else if (
+                  node.type === 'MemberExpression' ||
+                  // @ts-expect-error oxc only type
+                  node.type === 'StaticMemberExpression'
+                ) {
                   const exp = /** @type {`${string}.${string}`} */ (
                     content.slice(node.start, node.end)
                   )
diff --git a/scripts/test.js b/scripts/test.js
new file mode 100644 (file)
index 0000000..e69de29