diff --git a/README.md b/README.md index df3a603..9f53325 100644 --- a/README.md +++ b/README.md @@ -30,8 +30,6 @@ corepack enable pnpm install # Development Mode -# This command creates a typescript runtime using jiti, -# and the modified code does not need to be built again. pnpm run dev # link local scaffold to your plugin diff --git a/bin/zotero-plugin.mjs b/bin/zotero-plugin.mjs index a721090..faedc16 100644 --- a/bin/zotero-plugin.mjs +++ b/bin/zotero-plugin.mjs @@ -1,5 +1,5 @@ #!/usr/bin/env node -import cli from "../dist/cli.mjs"; +import cli from "../dist/cli.js"; cli(); diff --git a/build.config.ts b/build.config.ts deleted file mode 100644 index 13327ca..0000000 --- a/build.config.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { defineBuildConfig } from "unbuild"; - -export default defineBuildConfig({ - declaration: "node16", - rollup: { - inlineDependencies: ["node-style-text", "changelogen"], - }, - stubOptions: { - jiti: { - // debug: true, - // // https://github.com/fisker/node-style-text/issues/27 - // interopDefault: false, - // nativeModules: ["node-style-text"], - }, - }, - failOnWarn: false, -}); diff --git a/package.json b/package.json index 482b1f9..e36bdbb 100644 --- a/package.json +++ b/package.json @@ -23,20 +23,20 @@ ], "exports": { ".": { - "types": "./dist/index.d.mts", - "import": "./dist/index.mjs" + "types": "./dist/index.d.ts", + "import": "./dist/index.js" }, "./cli": { - "import": "./dist/cli.mjs" + "import": "./dist/cli.js" }, "./vendor": { - "types": "./dist/vendor/index.d.mts", - "import": "./dist/vendor/index.mjs" + "types": "./dist/vendor.d.ts", + "import": "./dist/vendor.js" } }, - "main": "./dist/index.mjs", - "module": "./dist/index.mjs", - "types": "./dist/index.d.mts", + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", "bin": { "zotero-plugin": "./bin/zotero-plugin.mjs" }, @@ -48,8 +48,10 @@ "node": ">=22.8.0" }, "scripts": { - "dev": "unbuild --stub", - "build": "tsc --noEmit && unbuild", + "dev": "tsdown --watch", + "build": "pnpm build:tsdown && pnpm build:tsc", + "build:tsdown": "tsdown", + "build:tsc": "tsc --noEmit", "lint:check": "eslint .", "lint:fix": "eslint . --fix", "docs:dev": "pnpm -C docs run dev", @@ -96,6 +98,7 @@ "eslint-plugin-format": "^1.3.1", "husky": "^9.1.7", "lint-staged": "^16.2.7", + "tsdown": "^0.16.6", "tsx": "^4.21.0", "typescript": "^5.9.3", "unbuild": "^3.6.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e6770e3..a8f4886 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -87,6 +87,9 @@ importers: lint-staged: specifier: ^16.2.7 version: 16.2.7 + tsdown: + specifier: ^0.16.6 + version: 0.16.8(synckit@0.11.12)(typescript@5.9.3) tsx: specifier: ^4.21.0 version: 4.21.0 @@ -248,6 +251,10 @@ packages: resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} @@ -260,15 +267,33 @@ packages: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/parser@7.28.5': resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + engines: {node: '>=6.9.0'} + '@babel/types@7.28.5': resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + '@clack/core@0.5.0': resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==} @@ -312,6 +337,15 @@ packages: '@dprint/toml@0.7.0': resolution: {integrity: sha512-eFaQTcfxKHB+YyTh83x7GEv+gDPuj9q5NFOTaoj5rZmQTbj6OgjjMxUicmS1R8zYcx8YAq5oA9J3YFa5U6x2gA==} + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@es-joy/jsdoccomment@0.78.0': resolution: {integrity: sha512-rQkU5u8hNAq2NVRzHnIUUvR6arbO0b6AOlvpTNS48CkiKSn/xtNfOzBK23JE4SiW89DgvU7GtxLVgV4Vn2HBAw==} engines: {node: '>=20.11.0'} @@ -882,12 +916,25 @@ packages: '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@octokit/app@16.1.2': resolution: {integrity: sha512-8j7sEpUYVj18dxvh0KWj6W/l6uAiVRBl1JBDVRqH1VHKAO/G5eRVl4yEoYACjakWers1DjUkcCHyJNQK47JqyQ==} engines: {node: '>= 20'} @@ -995,6 +1042,12 @@ packages: resolution: {integrity: sha512-IZV4vg/s1pqIpCs86a0tp5FQ/O94DUaqksMdNrXFSaE037TXsB+fIhr8OVig09oEx3WazVgE6B2U+u7/Fvdlsw==} engines: {node: '>= 20'} + '@oxc-project/types@0.112.0': + resolution: {integrity: sha512-m6RebKHIRsax2iCwVpYW2ErQwa4ywHJrE4sCK3/8JK8ZZAWOKXaRJFl/uP51gaVyyXlaS4+chU1nSCdzYf6QqQ==} + + '@oxc-project/types@0.99.0': + resolution: {integrity: sha512-LLDEhXB7g1m5J+woRSgfKsFPS3LhR9xRhTeIoEBm5WrkwMxn6eZ0Ld0c0K5eHB57ChZX6I3uSmmLjZ8pcjlRcw==} + '@pkgr/core@0.2.4': resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -1003,6 +1056,183 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@quansync/fs@1.0.0': + resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + + '@rolldown/binding-android-arm64@1.0.0-beta.52': + resolution: {integrity: sha512-MBGIgysimZPqTDcLXI+i9VveijkP5C3EAncEogXhqfax6YXj1Tr2LY3DVuEOMIjWfMPMhtQSPup4fSTAmgjqIw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-android-arm64@1.0.0-rc.3': + resolution: {integrity: sha512-0T1k9FinuBZ/t7rZ8jN6OpUKPnUjNdYHoj/cESWrQ3ZraAJ4OMm6z7QjSfCxqj8mOp9kTKc1zHK3kGz5vMu+nQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.52': + resolution: {integrity: sha512-MmKeoLnKu1d9j6r19K8B+prJnIZ7u+zQ+zGQ3YHXGnr41rzE3eqQLovlkvoZnRoxDGPA4ps0pGiwXy6YE3lJyg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.3': + resolution: {integrity: sha512-JWWLzvcmc/3pe7qdJqPpuPk91SoE/N+f3PcWx/6ZwuyDVyungAEJPvKm/eEldiDdwTmaEzWfIR+HORxYWrCi1A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.52': + resolution: {integrity: sha512-qpHedvQBmIjT8zdnjN3nWPR2qjQyJttbXniCEKKdHeAbZG9HyNPBUzQF7AZZGwmS9coQKL+hWg9FhWzh2dZ2IA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.3': + resolution: {integrity: sha512-MTakBxfx3tde5WSmbHxuqlDsIW0EzQym+PJYGF4P6lG2NmKzi128OGynoFUqoD5ryCySEY85dug4v+LWGBElIw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.52': + resolution: {integrity: sha512-dDp7WbPapj/NVW0LSiH/CLwMhmLwwKb3R7mh2kWX+QW85X1DGVnIEyKh9PmNJjB/+suG1dJygdtdNPVXK1hylg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.3': + resolution: {integrity: sha512-jje3oopyOLs7IwfvXoS6Lxnmie5JJO7vW29fdGFu5YGY1EDbVDhD+P9vDihqS5X6fFiqL3ZQZCMBg6jyHkSVww==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.52': + resolution: {integrity: sha512-9e4l6vy5qNSliDPqNfR6CkBOAx6PH7iDV4OJiEJzajajGrVy8gc/IKKJUsoE52G8ud8MX6r3PMl97NfwgOzB7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.3': + resolution: {integrity: sha512-A0n8P3hdLAaqzSFrQoA42p23ZKBYQOw+8EH5r15Sa9X1kD9/JXe0YT2gph2QTWvdr0CVK2BOXiK6ENfy6DXOag==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.52': + resolution: {integrity: sha512-V48oDR84feRU2KRuzpALp594Uqlx27+zFsT6+BgTcXOtu7dWy350J1G28ydoCwKB+oxwsRPx2e7aeQnmd3YJbQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.3': + resolution: {integrity: sha512-kWXkoxxarYISBJ4bLNf5vFkEbb4JvccOwxWDxuK9yee8lg5XA7OpvlTptfRuwEvYcOZf+7VS69Uenpmpyo5Bjw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.52': + resolution: {integrity: sha512-ENLmSQCWqSA/+YN45V2FqTIemg7QspaiTjlm327eUAMeOLdqmSOVVyrQexJGNTQ5M8sDYCgVAig2Kk01Ggmqaw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.3': + resolution: {integrity: sha512-Z03/wrqau9Bicfgb3Dbs6SYTHliELk2PM2LpG2nFd+cGupTMF5kanLEcj2vuuJLLhptNyS61rtk7SOZ+lPsTUA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.52': + resolution: {integrity: sha512-klahlb2EIFltSUubn/VLjuc3qxp1E7th8ukayPfdkcKvvYcQ5rJztgx8JsJSuAKVzKtNTqUGOhy4On71BuyV8g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.3': + resolution: {integrity: sha512-iSXXZsQp08CSilff/DCTFZHSVEpEwdicV3W8idHyrByrcsRDVh9sGC3sev6d8BygSGj3vt8GvUKBPCoyMA4tgQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.52': + resolution: {integrity: sha512-UuA+JqQIgqtkgGN2c/AQ5wi8M6mJHrahz/wciENPTeI6zEIbbLGoth5XN+sQe2pJDejEVofN9aOAp0kaazwnVg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.3': + resolution: {integrity: sha512-qaj+MFudtdCv9xZo9znFvkgoajLdc+vwf0Kz5N44g+LU5XMe+IsACgn3UG7uTRlCCvhMAGXm1XlpEA5bZBrOcw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.52': + resolution: {integrity: sha512-1BNQW8u4ro8bsN1+tgKENJiqmvc+WfuaUhXzMImOVSMw28pkBKdfZtX2qJPADV3terx+vNJtlsgSGeb3+W6Jiw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.3': + resolution: {integrity: sha512-U662UnMETyjT65gFmG9ma+XziENrs7BBnENi/27swZPYagubfHRirXHG2oMl+pEax2WvO7Kb9gHZmMakpYqBHQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.52': + resolution: {integrity: sha512-K/p7clhCqJOQpXGykrFaBX2Dp9AUVIDHGc+PtFGBwg7V+mvBTv/tsm3LC3aUmH02H2y3gz4y+nUTQ0MLpofEEg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.3': + resolution: {integrity: sha512-gekrQ3Q2HiC1T5njGyuUJoGpK/l6B/TNXKed3fZXNf9YRTJn3L5MOZsFBn4bN2+UX+8+7hgdlTcEsexX988G4g==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.52': + resolution: {integrity: sha512-a4EkXBtnYYsKipjS7QOhEBM4bU5IlR9N1hU+JcVEVeuTiaslIyhWVKsvf7K2YkQHyVAJ+7/A9BtrGqORFcTgng==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.3': + resolution: {integrity: sha512-85y5JifyMgs8m5K2XzR/VDsapKbiFiohl7s5lEj7nmNGO0pkTXE7q6TQScei96BNAsoK7JC3pA7ukA8WRHVJpg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.52': + resolution: {integrity: sha512-5ZXcYyd4GxPA6QfbGrNcQjmjbuLGvfz6728pZMsQvGHI+06LT06M6TPtXvFvLgXtexc+OqvFe1yAIXJU1gob/w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.52': + resolution: {integrity: sha512-tzpnRQXJrSzb8Z9sm97UD3cY0toKOImx+xRKsDLX4zHaAlRXWh7jbaKBePJXEN7gNw7Nm03PBNwphdtA8KSUYQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.3': + resolution: {integrity: sha512-a4VUQZH7LxGbUJ3qJ/TzQG8HxdHvf+jOnqf7B7oFx1TEBm+j2KNL2zr5SQ7wHkNAcaPevF6gf9tQnVBnC4mD+A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.52': + resolution: {integrity: sha512-/L0htLJZbaZFL1g9OHOblTxbCYIGefErJjtYOwgl9ZqNx27P3L0SDfjhhHIss32gu5NWgnxuT2a2Hnnv6QGHKA==} + + '@rolldown/pluginutils@1.0.0-rc.3': + resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} + '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} engines: {node: '>=14.0.0'} @@ -1314,6 +1544,9 @@ packages: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/adm-zip@0.5.7': resolution: {integrity: sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw==} @@ -1696,6 +1929,10 @@ packages: args-tokenizer@0.3.0: resolution: {integrity: sha512-xXAd7G2Mll5W8uo37GETpQ2VrE84M181Z7ugHFGQnJZ50M2mbOv0osSZ9VsSgPfJQ+LVG0prSi0th+ELMsno7Q==} + ast-kit@2.2.0: + resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==} + engines: {node: '>=20.19.0'} + autoprefixer@10.4.21: resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} engines: {node: ^10 || ^12 || >=14} @@ -1716,6 +1953,9 @@ packages: birpc@2.3.0: resolution: {integrity: sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==} + birpc@4.0.0: + resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -1998,6 +2238,10 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@8.0.3: + resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} + engines: {node: '>=0.3.1'} + dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -2015,6 +2259,15 @@ packages: resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} + dts-resolver@2.1.3: + resolution: {integrity: sha512-bihc7jPC90VrosXNzK0LTE2cuLP6jr0Ro8jk+kMugHReJVLIpHz/xadeq3MhuwyO4TD4OA3L1Q8pBBFRc08Tsw==} + engines: {node: '>=20.19.0'} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + electron-to-chromium@1.5.194: resolution: {integrity: sha512-SdnWJwSUot04UR51I2oPD8kuP2VI37/CADR1OHsFOUzZIvfWJBO6q11k5P/uKNyTT3cdOsnyjkrZ+DDShqYqJA==} @@ -2410,6 +2663,9 @@ packages: get-tsconfig@4.10.1: resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + get-tsconfig@4.13.6: + resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} + giget@2.0.0: resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} hasBin: true @@ -3234,6 +3490,9 @@ packages: quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + quansync@1.0.0: + resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} @@ -3289,6 +3548,35 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rolldown-plugin-dts@0.18.4: + resolution: {integrity: sha512-7UpdiICFd/BhdjKtDPeakCFRk6pbkTGFe0Z6u01egt4c8aoO+JoPGF1Smc+JRuCH2s5j5hBdteBi0e10G0xQdQ==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@ts-macro/tsc': ^0.3.6 + '@typescript/native-preview': '>=7.0.0-dev.20250601.1' + rolldown: ^1.0.0-beta.51 + typescript: ^5.0.0 + vue-tsc: ~3.1.0 + peerDependenciesMeta: + '@ts-macro/tsc': + optional: true + '@typescript/native-preview': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown@1.0.0-beta.52: + resolution: {integrity: sha512-Hbnpljue+JhMJrlOjQ1ixp9me7sUec7OjFvS+A1Qm8k8Xyxmw3ZhxFu7LlSXW1s9AX3POE9W9o2oqCEeR5uDmg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rolldown@1.0.0-rc.3: + resolution: {integrity: sha512-Po/YZECDOqVXjIXrtC5h++a5NLvKAQNrd9ggrIG3sbDfGO5BqTUsrI6l8zdniKRp3r5Tp/2JTrXqx4GIguFCMw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup-plugin-dts@6.2.1: resolution: {integrity: sha512-sR3CxYUl7i2CHa0O7bA45mCrgADyAQ0tVtGSqi3yvH28M+eg1+g5d7kQ9hLvEz5dorK3XVsH5L2jwHLQf72DzA==} engines: {node: '>=16'} @@ -3484,6 +3772,10 @@ packages: resolution: {integrity: sha512-A5F0cM6+mDleacLIEUkmfpkBbnHJFV1d2rprHU2MXNk7mlxHq2zGojA+SRvQD1RoMo9gqjZPWEaKG4v1BQ48lw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -3498,6 +3790,34 @@ packages: peerDependencies: typescript: '>=4.0.0' + tsdown@0.16.8: + resolution: {integrity: sha512-6ANw9mgU9kk7SvTBKvpDu/DVJeAFECiLUSeL5M7f5Nm5H97E7ybxmXT4PQ23FySYn32y6OzjoAH/lsWCbGzfLA==} + engines: {node: '>=20.19.0'} + hasBin: true + peerDependencies: + '@arethetypeswrong/core': ^0.18.1 + '@vitejs/devtools': ^0.0.0-alpha.18 + publint: ^0.3.0 + typescript: ^5.0.0 + unplugin-lightningcss: ^0.4.0 + unplugin-unused: ^0.5.0 + peerDependenciesMeta: + '@arethetypeswrong/core': + optional: true + '@vitejs/devtools': + optional: true + publint: + optional: true + typescript: + optional: true + unplugin-lightningcss: + optional: true + unplugin-unused: + optional: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.21.0: resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} engines: {node: '>=18.0.0'} @@ -3540,6 +3860,9 @@ packages: typescript: optional: true + unconfig-core@7.4.2: + resolution: {integrity: sha512-VgPCvLWugINbXvMQDf8Jh0mlbvNjNC6eSUziHsBCMpxR05OPrNrvDnyatdMjRgcHaaNsCqz+wjNXxNw1kRLHUg==} + undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} @@ -3568,6 +3891,16 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} + unrun@0.2.27: + resolution: {integrity: sha512-Mmur1UJpIbfxasLOhPRvox/QS4xBiDii71hMP7smfRthGcwFL2OAmYRgduLANOAU4LUkvVamuP+02U+c90jlrw==} + engines: {node: '>=20.19.0'} + hasBin: true + peerDependencies: + synckit: ^0.11.11 + peerDependenciesMeta: + synckit: + optional: true + untyped@2.0.0: resolution: {integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==} hasBin: true @@ -3962,22 +4295,47 @@ snapshots: picocolors: 1.1.1 optional: true + '@babel/generator@7.29.1': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.27.1': - optional: true + '@babel/helper-validator-identifier@7.27.1': {} '@babel/helper-validator-identifier@7.28.5': {} + '@babel/parser@7.28.0': + dependencies: + '@babel/types': 7.28.2 + '@babel/parser@7.28.5': dependencies: '@babel/types': 7.28.5 + '@babel/parser@7.29.0': + dependencies: + '@babel/types': 7.29.0 + + '@babel/types@7.28.2': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@clack/core@0.5.0': dependencies: picocolors: 1.1.1 @@ -4023,6 +4381,22 @@ snapshots: '@dprint/toml@0.7.0': {} + '@emnapi/core@1.8.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + '@es-joy/jsdoccomment@0.78.0': dependencies: '@types/estree': 1.0.8 @@ -4380,10 +4754,29 @@ snapshots: '@iconify/types@2.0.0': {} + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@napi-rs/wasm-runtime@1.1.1': + dependencies: + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 + optional: true + '@octokit/app@16.1.2': dependencies: '@octokit/auth-app': 8.1.2 @@ -4531,10 +4924,107 @@ snapshots: '@octokit/request-error': 7.0.2 '@octokit/webhooks-methods': 6.0.0 + '@oxc-project/types@0.112.0': {} + + '@oxc-project/types@0.99.0': {} + '@pkgr/core@0.2.4': {} '@pkgr/core@0.2.9': {} + '@quansync/fs@1.0.0': + dependencies: + quansync: 1.0.0 + + '@rolldown/binding-android-arm64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-android-arm64@1.0.0-rc.3': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-rc.3': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-rc.3': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-rc.3': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.3': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.3': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.3': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.3': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.3': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.3': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.52': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.3': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.52': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.3': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.52': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.52': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.3': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.52': {} + + '@rolldown/pluginutils@1.0.0-rc.3': {} + '@rollup/plugin-alias@5.1.1(rollup@4.46.2)': optionalDependencies: rollup: 4.46.2 @@ -4810,6 +5300,11 @@ snapshots: '@trysound/sax@0.2.0': {} + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + '@types/adm-zip@0.5.7': dependencies: '@types/node': 24.10.9 @@ -5031,7 +5526,7 @@ snapshots: '@vue/compiler-core@3.5.18': dependencies: - '@babel/parser': 7.28.5 + '@babel/parser': 7.28.0 '@vue/shared': 3.5.18 entities: 4.5.0 estree-walker: 2.0.2 @@ -5039,7 +5534,7 @@ snapshots: '@vue/compiler-core@3.5.25': dependencies: - '@babel/parser': 7.28.5 + '@babel/parser': 7.29.0 '@vue/shared': 3.5.25 entities: 4.5.0 estree-walker: 2.0.2 @@ -5300,6 +5795,11 @@ snapshots: args-tokenizer@0.3.0: {} + ast-kit@2.2.0: + dependencies: + '@babel/parser': 7.29.0 + pathe: 2.0.3 + autoprefixer@10.4.21(postcss@8.5.6): dependencies: browserslist: 4.25.1 @@ -5318,6 +5818,8 @@ snapshots: birpc@2.3.0: {} + birpc@4.0.0: {} + boolbase@1.0.0: {} bottleneck@2.19.5: {} @@ -5619,6 +6121,8 @@ snapshots: diff-sequences@29.6.3: {} + diff@8.0.3: {} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -5639,6 +6143,8 @@ snapshots: dotenv@17.2.3: {} + dts-resolver@2.1.3: {} + electron-to-chromium@1.5.194: {} electron-to-chromium@1.5.244: {} @@ -6153,6 +6659,10 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-tsconfig@4.13.6: + dependencies: + resolve-pkg-maps: 1.0.0 + giget@2.0.0: dependencies: citty: 0.1.6 @@ -7124,6 +7634,8 @@ snapshots: quansync@0.2.11: {} + quansync@1.0.0: {} + rc9@2.1.2: dependencies: defu: 6.1.4 @@ -7175,6 +7687,62 @@ snapshots: rfdc@1.4.1: {} + rolldown-plugin-dts@0.18.4(rolldown@1.0.0-beta.52)(typescript@5.9.3): + dependencies: + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + ast-kit: 2.2.0 + birpc: 4.0.0 + dts-resolver: 2.1.3 + get-tsconfig: 4.13.6 + magic-string: 0.30.21 + obug: 2.1.1 + rolldown: 1.0.0-beta.52 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - oxc-resolver + + rolldown@1.0.0-beta.52: + dependencies: + '@oxc-project/types': 0.99.0 + '@rolldown/pluginutils': 1.0.0-beta.52 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.52 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.52 + '@rolldown/binding-darwin-x64': 1.0.0-beta.52 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.52 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.52 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.52 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.52 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.52 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.52 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.52 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.52 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.52 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.52 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.52 + + rolldown@1.0.0-rc.3: + dependencies: + '@oxc-project/types': 0.112.0 + '@rolldown/pluginutils': 1.0.0-rc.3 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.3 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.3 + '@rolldown/binding-darwin-x64': 1.0.0-rc.3 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.3 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.3 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.3 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.3 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.3 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.3 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.3 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.3 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.3 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.3 + rollup-plugin-dts@6.2.1(rollup@4.46.2)(typescript@5.9.3): dependencies: magic-string: 0.30.21 @@ -7381,6 +7949,8 @@ snapshots: dependencies: eslint-visitor-keys: 5.0.0 + tree-kill@1.2.2: {} + trim-lines@3.0.1: {} ts-api-utils@2.4.0(typescript@5.9.3): @@ -7392,6 +7962,35 @@ snapshots: picomatch: 4.0.3 typescript: 5.9.3 + tsdown@0.16.8(synckit@0.11.12)(typescript@5.9.3): + dependencies: + ansis: 4.2.0 + cac: 6.7.14 + chokidar: 5.0.0 + diff: 8.0.3 + empathic: 2.0.0 + hookable: 5.5.3 + obug: 2.1.1 + rolldown: 1.0.0-beta.52 + rolldown-plugin-dts: 0.18.4(rolldown@1.0.0-beta.52)(typescript@5.9.3) + semver: 7.7.3 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tree-kill: 1.2.2 + unconfig-core: 7.4.2 + unrun: 0.2.27(synckit@0.11.12) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@ts-macro/tsc' + - '@typescript/native-preview' + - oxc-resolver + - synckit + - vue-tsc + + tslib@2.8.1: + optional: true + tsx@4.21.0: dependencies: esbuild: 0.27.2 @@ -7462,6 +8061,11 @@ snapshots: - vue-sfc-transformer - vue-tsc + unconfig-core@7.4.2: + dependencies: + '@quansync/fs': 1.0.0 + quansync: 1.0.0 + undici-types@7.16.0: {} unist-util-is@6.0.0: @@ -7493,6 +8097,12 @@ snapshots: universalify@2.0.1: {} + unrun@0.2.27(synckit@0.11.12): + dependencies: + rolldown: 1.0.0-rc.3 + optionalDependencies: + synckit: 0.11.12 + untyped@2.0.0: dependencies: citty: 0.1.6 diff --git a/src/cli.ts b/src/cli.ts index 1ffc6b6..9231ed2 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -2,14 +2,13 @@ import type { Base } from "./core/base.js"; import type { Context, OverrideConfig } from "./types/index.js"; import process from "node:process"; import { Command } from "commander"; -import pkg from "../package.json" with { type: "json" }; +import { name, version } from "../package.json" with { type: "json" }; import { Build, Config, Release, Serve, Test } from "./index.js"; import { checkGitIgnore } from "./utils/gitignore.js"; import { logger } from "./utils/logger.js"; import { updateNotifier } from "./utils/updater.js"; async function main() { - const { name, version } = pkg; updateNotifier(name, version); // Env variables are initialized to dev, but can be overridden by each command @@ -106,14 +105,14 @@ type Constructor = new (ctx: Context) => T; export async function runCommand( CommandClass: Constructor, config: OverrideConfig, -) { +): Promise { const ctx = await Config.loadConfig(config); const instance = new CommandClass(ctx); process.on("SIGINT", instance.exit.bind(instance)); await instance.run(); } -export default async function mainWithErrorHandler() { +export default async function mainWithErrorHandler(): Promise { main() .then(() => { checkGitIgnore(); diff --git a/src/constant.ts b/src/constant.ts index 8d7c082..085fe20 100644 --- a/src/constant.ts +++ b/src/constant.ts @@ -1,5 +1,5 @@ export const BASE_DIR = ".scaffold"; -export const CACHE_DIR = `${BASE_DIR}/cache`; +export const CACHE_DIR = `.scaffold/cache`; export const DEFAULT_PROFILE_DIR = ""; export const DEFAULT_DATA_DIR = ""; @@ -7,10 +7,10 @@ export const DEFAULT_DATA_DIR = ""; export const DEFAULT_DIST_TEMP_DIR = "addon"; // Testser -export const TESTER_BASE_PATH = `${BASE_DIR}/test`; -export const TESTER_PROFILE_DIR = `${TESTER_BASE_PATH}/profile`; -export const TESTER_DATA_DIR = `${TESTER_BASE_PATH}/data`; -export const TESTER_PLUGIN_DIR = `${TESTER_BASE_PATH}/resource`; -export const TESTER_PLUGIN_TESTS_DIR = `${TESTER_PLUGIN_DIR}/content/units`; +export const TESTER_BASE_PATH = `.scaffold/test`; +export const TESTER_PROFILE_DIR = `.scaffold/test/profile`; +export const TESTER_DATA_DIR = `.scaffold/test/data`; +export const TESTER_PLUGIN_DIR = `.scaffold/test/resource`; +export const TESTER_PLUGIN_TESTS_DIR = `.scaffold/test/resource/content/units`; export const TESTER_PLUGIN_REF = "zotero-plugin-scaffold-test-runner"; -export const TESTER_PLUGIN_ID = "scaffold-test@northword.cn"; +export const TESTER_PLUGIN_ID = "scaffold-test@northword.cn" as const; diff --git a/src/core/base.ts b/src/core/base.ts index 647757e..0777e52 100644 --- a/src/core/base.ts +++ b/src/core/base.ts @@ -1,4 +1,5 @@ import type { Context } from "../types/index.js"; +import type { Logger } from "../utils/logger.js"; export abstract class Base { ctx: Context; @@ -10,7 +11,7 @@ export abstract class Base { abstract exit(): void; - get logger() { + get logger(): Logger { return this.ctx.logger; } } diff --git a/src/core/builder/assets.ts b/src/core/builder/assets.ts index 97e15f4..a16b554 100644 --- a/src/core/builder/assets.ts +++ b/src/core/builder/assets.ts @@ -11,7 +11,7 @@ export default async function copyAssets( source: string | string[], dist: string, assets: string | string[], -) { +): Promise { const sourceArr = toArray(source); const paths = await glob(assets, { ignore: [...DEFAULT_IGNORE, dist], diff --git a/src/core/builder/clean.ts b/src/core/builder/clean.ts index 8a2d58f..30627af 100644 --- a/src/core/builder/clean.ts +++ b/src/core/builder/clean.ts @@ -1,3 +1,3 @@ -export default async function clean() { +export default async function clean(): Promise { // } diff --git a/src/core/builder/esbuild.ts b/src/core/builder/esbuild.ts index e800ca5..0c806f2 100644 --- a/src/core/builder/esbuild.ts +++ b/src/core/builder/esbuild.ts @@ -1,9 +1,10 @@ +import type { BuildOptions, BuildResult } from "esbuild"; import type { BuildConfig } from "../../types/config.js"; import { resolve } from "node:path"; import { build as buildAsync } from "esbuild"; import { logger } from "../../utils/logger.js"; -export function resolveConfig(dist: string, esbuildOptions: BuildConfig["esbuildOptions"]) { +export function resolveConfig(dist: string, esbuildOptions: BuildConfig["esbuildOptions"]): BuildOptions[] { const distAbsolute = resolve(dist); // ensure outfile and outdir are in dist folder @@ -20,7 +21,7 @@ export function resolveConfig(dist: string, esbuildOptions: BuildConfig["esbuild }); } -export default async function esbuild(dist: string, esbuildOptions: BuildConfig["esbuildOptions"]) { +export default async function esbuild(dist: string, esbuildOptions: BuildConfig["esbuildOptions"]): Promise[] | undefined> { if (esbuildOptions.length === 0) return; diff --git a/src/core/builder/fluent.ts b/src/core/builder/fluent.ts index 8573ee0..e6ef25e 100644 --- a/src/core/builder/fluent.ts +++ b/src/core/builder/fluent.ts @@ -13,7 +13,7 @@ export default async function buildLocale( dist: string, namespace: string, options: BuildConfig["fluent"], -) { +): Promise { const ignores = toArray(options.ignore); const localeNames = await getLocales(dist); const messageManager = new MessageManager(ignores); @@ -81,13 +81,13 @@ export class FluentManager { constructor() {} // Parse Fluent source into an AST and extract messages - public parse(source: string) { + public parse(source: string): void { this.source = source; this.resource = parse(source, {}); } // Read a file, parse its content, and extract messages - public async read(path: string) { + public async read(path: string): Promise { const content = await readFile(path, "utf-8"); this.parse(content); } @@ -106,7 +106,7 @@ export class FluentManager { } // Apply namespace prefix to message IDs in the resource - public prefixMessages(namespace: string) { + public prefixMessages(namespace: string): void { if (!this.resource) { throw new Error("Resource must be parsed before applying prefix."); } @@ -122,7 +122,7 @@ export class FluentManager { } // Write the serialized resource to a file - public async write(path: string) { + public async write(path: string): Promise { const result = this.serialize(); if (result !== this.source) await writeFile(path, this.serialize()); @@ -163,7 +163,7 @@ export class MessageManager { } // Add a set of messages (FTL or HTML) for a specific locale or for HTML globally - addMessages(target: string | "html", messages: string[]) { + addMessages(target: string | "html", messages: string[]): void { if (target === "html") { messages.forEach(msg => this.htmlMessages.add(msg)); } @@ -177,7 +177,7 @@ export class MessageManager { } } - validateMessages() { + validateMessages(): void { // Check miss 1: Cross check in diff locale - seems no need // messagesByLocale.forEach((messageInThisLang, lang) => { // // Needs Nodejs 22 @@ -223,7 +223,10 @@ export function processHTMLFile( allMessages: Set, ignores: string[], filePath: string, -) { +): { + processedContent: string; + foundMessages: string[]; +} { const foundMessages = new Set(); const L10N_PATTERN = new RegExp(`(data-l10n-id)="((?!${namespace})\\S*)"`, "g"); diff --git a/src/core/builder/index.ts b/src/core/builder/index.ts index ffcdc75..ccc515e 100644 --- a/src/core/builder/index.ts +++ b/src/core/builder/index.ts @@ -25,7 +25,7 @@ export default class Build extends Base { /** * Default build runner */ - async run() { + async run(): Promise { const { dist, version } = this.ctx; const t = new Date(); this.buildTime = dateFormat("YYYY-mm-dd HH:MM:SS", t); @@ -71,13 +71,13 @@ export default class Build extends Base { await buildPrefs(dist, build.prefs); } - async bundle() { + async bundle(): Promise { const { dist, build: { esbuildOptions } } = this.ctx; await esbuild(dist, esbuildOptions); await this.ctx.hooks.callHook("build:bundle", this.ctx); } - async buildInProduction() { + async buildInProduction(): Promise { const { dist, xpiName } = this.ctx; await pack(dist, xpiName); @@ -87,5 +87,5 @@ export default class Build extends Base { await this.ctx.hooks.callHook("build:makeUpdateJSON", this.ctx); } - exit() {} + exit(): void {} } diff --git a/src/core/builder/manifest.ts b/src/core/builder/manifest.ts index f04fc10..5cc6588 100644 --- a/src/core/builder/manifest.ts +++ b/src/core/builder/manifest.ts @@ -4,7 +4,7 @@ import { toMerged } from "es-toolkit"; import { outputJSON, readJSON } from "fs-extra/esm"; import { logger } from "../../utils/logger.js"; -export default async function buildManifest(ctx: Context) { +export default async function buildManifest(ctx: Context): Promise { if (!ctx.build.makeManifest.enable) return; @@ -33,6 +33,6 @@ export default async function buildManifest(ctx: Context) { } // TODO: process i10n in manifest.json -export function locale() { +export function locale(): void { // } diff --git a/src/core/builder/prefs.ts b/src/core/builder/prefs.ts index ad1bfab..9570775 100644 --- a/src/core/builder/prefs.ts +++ b/src/core/builder/prefs.ts @@ -10,7 +10,7 @@ import { logger } from "../../utils/logger.js"; import { is32BitNumber } from "../../utils/number.js"; import { PrefsManager } from "../../utils/prefs-manager.js"; -export default async function buildPrefs(dist: string, options: BuildConfig["prefs"]) { +export default async function buildPrefs(dist: string, options: BuildConfig["prefs"]): Promise { const { dts, prefixPrefKeys, prefix } = options; // Skip if not enable this builder diff --git a/src/core/builder/replace.ts b/src/core/builder/replace.ts index 667b6f0..0ac0046 100644 --- a/src/core/builder/replace.ts +++ b/src/core/builder/replace.ts @@ -4,7 +4,7 @@ import { glob } from "tinyglobby"; import { logger } from "../../utils/logger.js"; import { toArray } from "../../utils/string.js"; -export function replace(contents: string, from: RegExp | RegExp[], to: string | string[]) { +export function replace(contents: string, from: RegExp | RegExp[], to: string | string[]): string { const froms = Array.isArray(from) ? from : [from]; const tos = Array.isArray(to) ? to @@ -22,7 +22,7 @@ export async function replaceInFile({ files, from, to, isGlob = true }: { from: RegExp | RegExp[]; to: string | string[]; isGlob?: boolean; -}) { +}): Promise { const paths = isGlob ? await glob(files) : toArray(files); await Promise.all(paths.map(async (path) => { const contents = await readFile(path, "utf-8"); @@ -32,7 +32,7 @@ export async function replaceInFile({ files, from, to, isGlob = true }: { })); } -export default async function replaceDefine(dist: string, define: BuildConfig["define"]) { +export default async function replaceDefine(dist: string, define: BuildConfig["define"]): Promise { // Replace all `placeholder.key` to `placeholder.value` for all files in `dist` const replaceMap = new Map( Object.keys(define).map(key => [ diff --git a/src/core/builder/update-json.ts b/src/core/builder/update-json.ts index 8f9a88e..3cce252 100644 --- a/src/core/builder/update-json.ts +++ b/src/core/builder/update-json.ts @@ -38,7 +38,7 @@ export function generateHashSync( return `${algorithm}:${hash}`; } -export default async function buildUpdateJson(ctx: Context) { +export default async function buildUpdateJson(ctx: Context): Promise { const { dist, xpiName, id, version, xpiDownloadLink, build } = ctx; const manifest = await readJSON( diff --git a/src/core/builder/zip.ts b/src/core/builder/zip.ts index 152fe3d..ed5957f 100644 --- a/src/core/builder/zip.ts +++ b/src/core/builder/zip.ts @@ -1,6 +1,6 @@ import AdmZip from "adm-zip"; -export default async function pack(dist: string, xpiName: string) { +export default async function pack(dist: string, xpiName: string): Promise { const zip = new AdmZip(); zip.addLocalFolder(`${dist}/addon`); zip.writeZip(`${dist}/${xpiName}.xpi`); diff --git a/src/core/linter.ts b/src/core/linter.ts index 6a92acb..b30029c 100644 --- a/src/core/linter.ts +++ b/src/core/linter.ts @@ -7,9 +7,9 @@ export default class Lint extends Base { super(ctx); } - run() { + run(): void { // webext.cmd.lint({}); } - exit() {} + exit(): void {} } diff --git a/src/core/releaser/base.ts b/src/core/releaser/base.ts index 8a83ffe..c071f8c 100644 --- a/src/core/releaser/base.ts +++ b/src/core/releaser/base.ts @@ -1,4 +1,5 @@ import type { Context } from "../../types/index.js"; +import type { Logger } from "../../utils/logger.js"; import { isCI } from "std-env"; import { globSync } from "tinyglobby"; @@ -12,7 +13,7 @@ export abstract class ReleaseBase { abstract run(): Context | Promise | void | Promise; - checkFiles() { + checkFiles(): void { const { dist } = this.ctx; if (globSync(`${dist}/*.xpi`).length === 0) { @@ -20,7 +21,7 @@ export abstract class ReleaseBase { } } - get logger() { + get logger(): Logger { return this.ctx.logger; } } diff --git a/src/core/releaser/bump.ts b/src/core/releaser/bump.ts index 22f93ca..3a8237b 100644 --- a/src/core/releaser/bump.ts +++ b/src/core/releaser/bump.ts @@ -8,7 +8,7 @@ export default class Bump extends ReleaseBase { super(ctx); } - async run() { + async run(): Promise { const bumppConfig: VersionBumpOptions = { ...this.ctx.release.bumpp, push: true, diff --git a/src/core/releaser/changelog.ts b/src/core/releaser/changelog.ts index 0aa7d45..7b9b8ed 100644 --- a/src/core/releaser/changelog.ts +++ b/src/core/releaser/changelog.ts @@ -4,7 +4,7 @@ import process from "node:process"; import { generateMarkDown, getGitDiff, loadChangelogConfig, parseCommits } from "changelogen"; import { escapeRegExp } from "es-toolkit"; -export async function getConventionalChangelog(commits: GitCommit[]) { +export async function getConventionalChangelog(commits: GitCommit[]): Promise { // If user do not use Conventional Commit, // return commit messages directly. if (!commits[0].type) { diff --git a/src/core/releaser/github.ts b/src/core/releaser/github.ts index 556b104..fd2703c 100644 --- a/src/core/releaser/github.ts +++ b/src/core/releaser/github.ts @@ -14,7 +14,7 @@ export default class GitHub extends ReleaseBase { this.client = this.getClient(); } - async run() { + async run(): Promise { this.checkFiles(); this.logger.info("Uploading XPI to GitHub..."); @@ -29,7 +29,7 @@ export default class GitHub extends ReleaseBase { /** * Create new release and upload XPI to asset */ - async uploadXPI() { + async uploadXPI(): Promise { const { version, dist, xpiName } = this.ctx; const release = await this.createRelease({ @@ -52,7 +52,7 @@ export default class GitHub extends ReleaseBase { await this.uploadAsset(release.id, join(dist, `${xpiName}.xpi`)); } - async getReleaseByTag(tag: string) { + async getReleaseByTag(tag: string): Promise<{ id: number } | undefined> { return await this.client.rest.repos .getReleaseByTag({ ...this.remote, @@ -72,7 +72,7 @@ export default class GitHub extends ReleaseBase { async createRelease( options: Parameters[0], - ) { + ): Promise<{ id: number } | undefined> { this.logger.debug("Creating release..."); this.logger.debug(options); return await this.client.rest.repos @@ -89,7 +89,7 @@ export default class GitHub extends ReleaseBase { }); } - async uploadAsset(releaseID: number, asset: string) { + async uploadAsset(releaseID: number, asset: string): Promise<{ id: number }> { this.logger.debug(`Uploading ${asset} to release ${releaseID}`); return await this.client.rest.repos .uploadReleaseAsset({ @@ -108,7 +108,7 @@ export default class GitHub extends ReleaseBase { }); } - async refreshUpdateManifest() { + async refreshUpdateManifest(): Promise { const updater = this.ctx.release.github.updater; if (!updater) { this.logger.debug(`Skip refresh update.json because release.github.updater = false`); @@ -167,7 +167,7 @@ export default class GitHub extends ReleaseBase { }); } - async getChangelog() { + async getChangelog(): Promise { const { release } = this.ctx; const { github } = release; const { releaseNote } = github; @@ -185,7 +185,10 @@ export default class GitHub extends ReleaseBase { return client; } - get remote() { + get remote(): { + owner: string; + repo: string; + } { const [owner, repo] = this.ctx.release.github.repository.split("/"); return { owner, diff --git a/src/core/releaser/index.ts b/src/core/releaser/index.ts index 9152122..5affc35 100644 --- a/src/core/releaser/index.ts +++ b/src/core/releaser/index.ts @@ -18,7 +18,7 @@ export default class Release extends Base { * if is CI, do not bump version, do not run git, create release (tag is `v${version}`) and upload xpi, * then, create or update release (tag is "release"), update `update.json`. */ - async run() { + async run(): Promise { const t = new Date(); const { release, version } = this.ctx; @@ -68,7 +68,7 @@ export default class Release extends Base { ); } - async getChangelog() { + async getChangelog(): Promise { const { commit, tag } = this.ctx.release.bumpp; let changelog: string; const rawCommit = await getGitCommits(tag, commit); @@ -100,9 +100,9 @@ export default class Release extends Base { return false; } - exit() {} + exit(): void {} - get resolvedCommitMessage() { + get resolvedCommitMessage(): string { return this.ctx.release.bumpp.commit.replace("%s", this.ctx.version); } } diff --git a/src/core/server.ts b/src/core/server.ts index d8208e7..e5202a6 100644 --- a/src/core/server.ts +++ b/src/core/server.ts @@ -19,7 +19,7 @@ export default class Serve extends Base { this.builder = new Build(ctx); } - async run() { + async run(): Promise { this.runner = new ZoteroRunner({ binary: { path: this.zoteroBinPath, @@ -62,7 +62,7 @@ export default class Serve extends Base { /** * watch source dir and build when file changed */ - async watch() { + async watch(): Promise { const { source, watchIgnore } = this.ctx; watch( @@ -88,14 +88,14 @@ export default class Serve extends Base { ); } - async reload() { + async reload(): Promise { this.logger.tip("Reloading..."); await this.runner?.reloadAllPlugins(); await this.ctx.hooks.callHook("serve:onReloaded", this.ctx); } // Use arrow functions to keep `this` - exit = () => { + exit = (): never => { this.logger.info("Server shutdown by user request."); this.runner?.exit(); this.ctx.hooks.callHook("serve:exit", this.ctx); @@ -107,7 +107,7 @@ export default class Serve extends Base { process.exit(); }; - get zoteroBinPath() { + get zoteroBinPath(): string { if (this._zoteroBinPath) return this._zoteroBinPath; @@ -118,11 +118,11 @@ export default class Serve extends Base { return this._zoteroBinPath; } - get profilePath() { + get profilePath(): string | undefined { return process.env.ZOTERO_PLUGIN_PROFILE_PATH; } - get dataDir() { + get dataDir(): string | undefined { return process.env.ZOTERO_PLUGIN_DATA_DIR; } } diff --git a/src/core/tester/headless.ts b/src/core/tester/headless.ts index 1985da0..80adb25 100644 --- a/src/core/tester/headless.ts +++ b/src/core/tester/headless.ts @@ -5,7 +5,7 @@ import { Xvfb } from "xvfb-ts"; import { CACHE_DIR } from "../../constant.js"; import { LOG_LEVEL, logger } from "../../utils/logger.js"; -export async function prepareHeadless() { +export async function prepareHeadless(): Promise { // Ensure xvfb installing await installXvfb(); await installDepsForUbuntu24(); @@ -53,7 +53,7 @@ function checkAndInstallDependencies(packages: string[]): void { }); } -export async function installXvfb() { +export async function installXvfb(): Promise { if (!isLinux) { logger.error("Unsupported platform. Please install Xvfb manually."); return; @@ -68,7 +68,7 @@ export async function installXvfb() { checkAndInstallDependencies(["xvfb", "x11-xkb-utils", "xkb-data"]); } -export async function installDepsForUbuntu24() { +export async function installDepsForUbuntu24(): Promise { const version = execSync("cat /etc/os-release | grep '^VERSION_ID='").toString(); if (!(version.includes("24"))) { logger.error("Skip to install deps due to version not 24.04."); @@ -78,7 +78,7 @@ export async function installDepsForUbuntu24() { checkAndInstallDependencies(["libasound2t64", "libdbus-glib-1-2"]); } -export async function installZoteroLinux() { +export async function installZoteroLinux(): Promise { if (process.env.ZOTERO_PLUGIN_ZOTERO_BIN_PATH) { logger.debug("Local Zotero found, skip to download."); return; diff --git a/src/core/tester/http-reporter.ts b/src/core/tester/http-reporter.ts index 1f30449..6ef3ca0 100644 --- a/src/core/tester/http-reporter.ts +++ b/src/core/tester/http-reporter.ts @@ -60,15 +60,15 @@ export class TestHttpReporter { constructor() { } - async getPort() { + async getPort(): Promise { this._port = await findFreeTcpPort(); } - get port() { + get port(): number { return this._port!; } - async start() { + async start(): Promise { if (!this._port) await this.getPort(); @@ -116,7 +116,7 @@ export class TestHttpReporter { } } - async onData(body: Result) { + async onData(body: Result): Promise { const { type, data } = body; const logger_option = { space: data.indents - 1 }; @@ -179,7 +179,7 @@ export class TestHttpReporter { } } - stop() { + stop(): void { this._server?.close(); } } diff --git a/src/core/tester/index.ts b/src/core/tester/index.ts index bd37557..cae4b66 100644 --- a/src/core/tester/index.ts +++ b/src/core/tester/index.ts @@ -31,7 +31,7 @@ export default class Test extends Base { } } - async run() { + async run(): Promise { // Empty dirs await emptyDir(TESTER_PROFILE_DIR); await emptyDir(TESTER_DATA_DIR); @@ -64,7 +64,7 @@ export default class Test extends Base { } } - async watch() { + async watch(): Promise { const source = toArray(this.ctx.source).map(p => resolve(p)); const tests = toArray(this.ctx.test.entries).map(p => resolve(p)); function isSource(_path: string) { @@ -104,7 +104,7 @@ export default class Test extends Base { ); } - async startZotero() { + async startZotero(): Promise { if (this.ctx.test.headless) { await prepareHeadless(); } @@ -146,7 +146,7 @@ export default class Test extends Base { process.exit(0); }; - exit = (code?: string | number) => { + exit = (code?: string | number): never => { if (code === "SIGINT") { this.logger.info("Tester shutdown by user request"); } diff --git a/src/core/tester/test-bundler-template/manifest.ts b/src/core/tester/test-bundler-template/manifest.ts index 348f32e..c03c11e 100644 --- a/src/core/tester/test-bundler-template/manifest.ts +++ b/src/core/tester/test-bundler-template/manifest.ts @@ -8,7 +8,7 @@ export function generateManifest() { description: "Test suite for the Zotero plugin. This is a runtime-generated plugin only for testing purposes.", applications: { zotero: { - id: TESTER_PLUGIN_ID, + id: TESTER_PLUGIN_ID as typeof TESTER_PLUGIN_ID, update_url: "https://example.com", // strict_min_version: "*.*.*", strict_max_version: "999.*.*", diff --git a/src/core/tester/test-bundler.ts b/src/core/tester/test-bundler.ts index 0a4c6f4..dfe6b84 100644 --- a/src/core/tester/test-bundler.ts +++ b/src/core/tester/test-bundler.ts @@ -19,7 +19,7 @@ export class TestBundler { // } - async generate() { + async generate(): Promise { // this.generatePluginRes // bootstrape // manifest @@ -33,7 +33,7 @@ export class TestBundler { await this.createTestHtml(); } - async regenerate(changedFile: string) { + async regenerate(changedFile: string): Promise { // re-bundle tests const esbuildResult = await this.esbuildContext?.rebuild(); diff --git a/src/index.ts b/src/index.ts index fb8807c..013465e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,10 @@ import Release from "./core/releaser/index.js"; import Serve from "./core/server.js"; import Test from "./core/tester/index.js"; -const Config = { +const Config: { + defineConfig: typeof defineConfig; + loadConfig: typeof loadConfig; +} = { defineConfig, loadConfig, }; diff --git a/src/types/index.ts b/src/types/index.ts index c86dfff..c27b823 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,8 +1,7 @@ import type { Hookable } from "hookable"; import type { Logger } from "../utils/logger.js"; -import type { Hooks } from "./config.js"; +import type { Config, Hooks } from "./config.js"; import type { RecursivePartial } from "./utils.js"; -import { Config } from "./config.js"; export { Config, Hooks }; diff --git a/src/utils/file.ts b/src/utils/file.ts index 677a954..724c5b2 100644 --- a/src/utils/file.ts +++ b/src/utils/file.ts @@ -1,6 +1,6 @@ import { outputFile } from "fs-extra/esm"; -export async function saveResource(url: string, path: string) { +export async function saveResource(url: string, path: string): Promise { const res = await fetch(url); await outputFile(path, await res.text()); } diff --git a/src/utils/gitignore.ts b/src/utils/gitignore.ts index 7c34aa9..509dd09 100644 --- a/src/utils/gitignore.ts +++ b/src/utils/gitignore.ts @@ -2,7 +2,7 @@ import { readFile } from "node:fs/promises"; import { pathExists } from "fs-extra"; import { logger } from "./logger.js"; -export async function checkGitIgnore() { +export async function checkGitIgnore(): Promise { if (!pathExists(".git")) return; diff --git a/src/utils/logger.ts b/src/utils/logger.ts index bc092c9..bc52ea8 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -224,4 +224,4 @@ export class Logger { } } -export const logger = Logger.getInstance(); +export const logger: Logger = Logger.getInstance(); diff --git a/src/utils/mime.ts b/src/utils/mime.ts index ce54f11..3b78755 100644 --- a/src/utils/mime.ts +++ b/src/utils/mime.ts @@ -5,7 +5,7 @@ const mimeTypes: { [key: string]: string } = { xpi: "application/x-xpinstall", }; -export function getMimeTypeByFileName(filename: string) { +export function getMimeTypeByFileName(filename: string): string | undefined { const ext = extname(filename); for (const type in mimeTypes) { diff --git a/src/utils/prefs-manager.ts b/src/utils/prefs-manager.ts index c141994..bf9831c 100644 --- a/src/utils/prefs-manager.ts +++ b/src/utils/prefs-manager.ts @@ -23,7 +23,7 @@ export class PrefsManager { /** * Parse Method 3 - Using AST */ - parse(content: string) { + parse(content: string): Prefs { const _map: Prefs = {}; const ast = parseSync(content, { syntax: "ecmascript" }); for (const node of ast.body) { @@ -113,7 +113,7 @@ export class PrefsManager { // return _map; // } - cleanValue(value: string) { + cleanValue(value: string): string | number | boolean { if (value === "true") return true; else if (value === "false") @@ -129,7 +129,7 @@ export class PrefsManager { /** * Render Method 2 - Using swc */ - render() { + render(): string { const span = { start: 0, end: 0, ctxt: 0 }; function getExpression(value: unknown) { @@ -213,19 +213,19 @@ export class PrefsManager { }).join("\n"); } - async read(path: string) { + async read(path: string): Promise { const content = await readFile(path, "utf-8"); const map = this.parse(content); this.setPrefs(map); } - async write(path: string) { + async write(path: string): Promise { const content = this.render(); await outputFile(path, content, "utf-8"); logger.debug("The prefs.js has been modified."); } - setPref(key: string, value: PrefValue | undefined | null) { + setPref(key: string, value: PrefValue | undefined | null): void { if (value === null || value === undefined) { if (key in this.prefs) delete this.prefs[key]; @@ -235,25 +235,25 @@ export class PrefsManager { this.prefs[key] = value; }; - setPrefs(prefs: Record) { + setPrefs(prefs: Record): void { Object.entries(prefs).forEach(([key, value]) => { this.setPref(key, value); }); } - getPref(key: string) { + getPref(key: string): PrefValue { return this.prefs[key] ?? undefined; } - getPrefs() { + getPrefs(): Prefs { return this.prefs; } - clearPrefs() { + clearPrefs(): void { this.prefs = {}; } - getPrefsWithPrefix(prefix: string) { + getPrefsWithPrefix(prefix: string): Prefs { const _prefs: Prefs = {}; for (const pref in this.prefs) { if (pref.startsWith(prefix)) @@ -264,7 +264,7 @@ export class PrefsManager { return _prefs; } - getPrefsWithoutPrefix(prefix: string) { + getPrefsWithoutPrefix(prefix: string): Prefs { const _prefs: Prefs = {}; for (const pref in this.prefs) { _prefs[pref.replace(`${prefix}.`, "")] = this.prefs[pref]; diff --git a/src/utils/process.ts b/src/utils/process.ts index 7fb9524..b3752fe 100644 --- a/src/utils/process.ts +++ b/src/utils/process.ts @@ -1,7 +1,7 @@ import { execSync } from "node:child_process"; import process from "node:process"; -export function isRunning(query: string) { +export function isRunning(query: string): boolean { let cmd = ""; switch (process.platform) { case "win32": @@ -26,9 +26,9 @@ export function isRunning(query: string) { } } -export const ExitSignals = ["exit", "SIGABRT", "SIGALRM", "SIGHUP", "SIGINT", "SIGTERM"]; +export const ExitSignals = ["exit", "SIGABRT", "SIGALRM", "SIGHUP", "SIGINT", "SIGTERM"] as const; -export function whenExit(cb: (_code: number, _signal: string) => any) { +export function whenExit(cb: (_code: number, _signal: string) => any): void { ExitSignals.forEach((signal) => { process.once( signal, diff --git a/src/utils/string.ts b/src/utils/string.ts index ffdd758..201ce05 100644 --- a/src/utils/string.ts +++ b/src/utils/string.ts @@ -1,4 +1,4 @@ -export function dateFormat(fmt: string, date: Date) { +export function dateFormat(fmt: string, date: Date): string { let ret; const opt: { [key: string]: string } = { "Y+": date.getFullYear().toString(), @@ -33,13 +33,16 @@ export function toArray(value: T | T[]): T[] { * * @see https://github.com/sodiray/radash/blob/069b26cdd7d62e6ac16a0ad3baa1c9abcca420bc/src/string.ts#L111-L126 */ -export function template(str: string, data: Record, regex = /\{\{(.+?)\}\}/g) { +export function template(str: string, data: Record, regex: RegExp = /\{\{(.+?)\}\}/g): string { return Array.from(str.matchAll(regex)).reduce((acc, match) => { return acc.replace(match[0], data[match[1]]); }, str); } -export function parseRepoUrl(url?: string) { +export function parseRepoUrl(url?: string): { + owner: string; + repo: string; +} { if (!url) throw new Error("Parse repository URL failed."); diff --git a/src/utils/updater.ts b/src/utils/updater.ts index c87bf7d..69cada5 100644 --- a/src/utils/updater.ts +++ b/src/utils/updater.ts @@ -3,7 +3,7 @@ import tinyUpdateNotifier from "tiny-update-notifier"; import { logger } from "./logger.js"; import { ExitSignals } from "./process.js"; -export function updateNotifier(name: string, version: string) { +export function updateNotifier(name: string, version: string): void { tinyUpdateNotifier({ pkg: { name, version } }).then((update) => { if (update) { const notify = () => { diff --git a/src/utils/watcher.ts b/src/utils/watcher.ts index a29a2a6..82ec776 100644 --- a/src/utils/watcher.ts +++ b/src/utils/watcher.ts @@ -13,7 +13,7 @@ export function watch( onAdd?: (path: string, stats: Stats) => any | Promise; onError?: (err: unknown) => any; }, -) { +): void { const watcher = chokidar.watch(source, { ignored: [ /(^|[/\\])\../, // ignore dotfiles diff --git a/src/utils/zotero-runner.ts b/src/utils/zotero-runner.ts index fc46f7e..9373787 100644 --- a/src/utils/zotero-runner.ts +++ b/src/utils/zotero-runner.ts @@ -84,11 +84,11 @@ export class ZoteroRunner { logger.debug(this.options); } - get default_profile_path() { + get default_profile_path(): string { return default_options.profile.path; } - async run() { + async run(): Promise { // Get a Zotero profile with the custom Prefs set (a new or a cloned one) // Pre-install extensions as proxy if needed (and disable auto-reload if you do) await this.setupProfile(); @@ -259,11 +259,14 @@ export class ZoteroRunner { } } - public async reloadTemporaryPluginById(id: string) { + public async reloadTemporaryPluginById(id: string): Promise { await this.remoteFirefox.reloadAddon(id); } - public async reloadTemporaryPluginBySourceDir(sourceDir: string) { + public async reloadTemporaryPluginBySourceDir(sourceDir: string): Promise<{ + sourceDir: string; + reloadError: unknown; + }> { const addonId = this.options.plugins.list.find(p => p.sourceDir === sourceDir)?.id; if (!addonId) { @@ -298,7 +301,7 @@ export class ZoteroRunner { } } - public async reloadProxyPluginByZToolkit(id: string, name: string, version: string) { + public async reloadProxyPluginByZToolkit(id: string, name: string, version: string): Promise { const reloadScript = ` (async () => { Services.obs.notifyObservers(null, "startupcache-invalidate", null); @@ -332,14 +335,14 @@ export class ZoteroRunner { } } - public async reloadAllPlugins() { + public async reloadAllPlugins(): Promise { if (this.options.plugins.asProxy) await this.reloadAllProxyPlugins(); else await this.reloadAllTemporaryPlugins(); } - public exit() { + public exit(): void { this.zotero?.kill(); // Sometimes `process.kill()` cannot kill the Zotero, // so we force kill it. @@ -347,7 +350,7 @@ export class ZoteroRunner { } } -export function killZotero() { +export function killZotero(): void { function kill() { try { if (process.env.ZOTERO_PLUGIN_KILL_COMMAND) { diff --git a/src/utils/zotero/preference.ts b/src/utils/zotero/preference.ts index 680524a..7bcac65 100644 --- a/src/utils/zotero/preference.ts +++ b/src/utils/zotero/preference.ts @@ -16,7 +16,7 @@ * For details, see the LICENSE file in the root of this project. */ -export const nonOverridablePreferences = [ +export const nonOverridablePreferences: string[] = [ "devtools.debugger.remote-enabled", "devtools.debugger.prompt-connection", "xpinstall.signatures.required", @@ -135,7 +135,7 @@ const prefsZotero = { "extensions.zoteroOpenOfficeIntegration.skipInstallation": true, }; -export const prefs = { +export const prefs: typeof prefsCommon & typeof prefsFirefox & typeof prefsZotero = { ...prefsCommon, ...prefsFirefox, ...prefsZotero, diff --git a/src/utils/zotero/remote-zotero.ts b/src/utils/zotero/remote-zotero.ts index 7a0d0e2..6261991 100644 --- a/src/utils/zotero/remote-zotero.ts +++ b/src/utils/zotero/remote-zotero.ts @@ -38,7 +38,7 @@ function requestErrorToMessage(err: any) { return `${err.error}: ${err.message}`; } -export function isErrorWithCode(codeWanted: any, error: any) { +export function isErrorWithCode(codeWanted: any, error: any): boolean { if (Array.isArray(codeWanted) && codeWanted.includes(error.code)) { return true; } @@ -50,8 +50,8 @@ export function isErrorWithCode(codeWanted: any, error: any) { } export class RemoteFirefox { - client; - checkedForAddonReloading; + client: MessagingClient; + checkedForAddonReloading: boolean; constructor() { this.client = new MessagingClient(); @@ -74,7 +74,7 @@ export class RemoteFirefox { }); } - async connect(port: number) { + async connect(port: number): Promise { let lastError; for (const _ of Array.from({ length: MAX_RETRIES })) { @@ -99,7 +99,7 @@ export class RemoteFirefox { throw lastError; } - disconnect() { + disconnect(): void { this.client.disconnect(); } @@ -162,7 +162,7 @@ export class RemoteFirefox { } } - async installTemporaryAddon(addonPath: string) { + async installTemporaryAddon(addonPath: string): Promise { const addonsActor = await this.getAddonsActor(); try { @@ -243,7 +243,7 @@ export class RemoteFirefox { } } - async reloadAddon(addonId: string) { + async reloadAddon(addonId: string): Promise { const addon = await this.getInstalledAddon(addonId); // logger.debug(`Reload addon: ${JSON.stringify(addon)}`); // Reload addon: {"actor":"server1.conn0.webExtensionDescriptor8","debuggable":true,"hidden":false,"iconURL":"file:///D:/Code/Zotero/zotero-format-metadata/build/addon/content/icons/favicon@0.5x.png","id":"zotero-format-metadata@northword.cn","isSystem":false,"isWebExtension":true,"manifestURL":"moz-extension://d6d93075-0004-4850-b421-30347a44928c/manifest.json","name":"Linter for Zotero","temporarilyInstalled":true,"traits":{"supportsReloadDescriptor":true,"watcher":true},"url":"file:///D:/Code/Zotero/zotero-format-metadata/build/addon/","warnings":[]} diff --git a/tsconfig.json b/tsconfig.json index 397eb40..88401e9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,14 +1,15 @@ { "compilerOptions": { "target": "ESNext", - "module": "NodeNext", - "moduleResolution": "nodenext", + "module": "esnext", + "moduleResolution": "bundler", "resolveJsonModule": true, "strict": true, "declaration": true, "outDir": "dist", "esModuleInterop": true, + "isolatedDeclarations": true, "skipLibCheck": true }, - "include": ["src", "test", "src/types"] + "include": ["src", "test"] } diff --git a/tsdown.config.ts b/tsdown.config.ts new file mode 100644 index 0000000..19d976e --- /dev/null +++ b/tsdown.config.ts @@ -0,0 +1,28 @@ +import Module from "node:module"; +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["./src/index.ts", "./src/vendor", "./src/cli.ts"], + clean: true, + // unbundle: true, + + // Since we bundled changelogen -> node-fetch-native, + // we expect these patches to reduce the bundle size. + // https://github.com/rolldown/tsdown/issues/611 + platform: "neutral", + external: [ + ...Module.builtinModules, + ...Module.builtinModules.map(m => `node:${m}`), + ], + noExternal: ["changelogen"], + dts: { + resolve: ["changelogen"], + }, + + // I think the default chunk naming in unbuild is very elegant, + // so we config for it in tsdown. + // https://github.com/rolldown/tsdown/discussions/612 + outputOptions: { + chunkFileNames: "shared/scaffold-[name]-[hash].mjs", + }, +});