diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..1b5725a
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,29 @@
+version: 2
+updates:
+ - package-ecosystem: npm
+ directory: /
+ schedule:
+ interval: weekly
+ day: monday
+ time: "09:00"
+ timezone: Europe/Moscow
+ open-pull-requests-limit: 1
+ versioning-strategy: auto
+ labels:
+ - dependencies
+ ignore:
+ - dependency-name: "*"
+ update-types:
+ - version-update:semver-major
+ groups:
+ npm-minor-and-patch:
+ applies-to: version-updates
+ patterns:
+ - "*"
+ update-types:
+ - minor
+ - patch
+ npm-security:
+ applies-to: security-updates
+ patterns:
+ - "*"
diff --git a/.github/workflows/dependency-audit.yml b/.github/workflows/dependency-audit.yml
new file mode 100644
index 0000000..bac41b6
--- /dev/null
+++ b/.github/workflows/dependency-audit.yml
@@ -0,0 +1,29 @@
+name: 🔐 Dependency Audit
+
+on:
+ schedule:
+ - cron: "0 5 * * 1"
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+jobs:
+ audit:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version-file: package.json
+ cache: npm
+
+ - name: Install dependencies
+ run: npm ci
+
+ - name: Run npm audit
+ run: npm audit --audit-level=moderate
diff --git a/.github/workflows/wreq-upstream.yml b/.github/workflows/wreq-upstream.yml
new file mode 100644
index 0000000..6da3591
--- /dev/null
+++ b/.github/workflows/wreq-upstream.yml
@@ -0,0 +1,73 @@
+name: 📦 Sync wreq Upstream
+
+on:
+ schedule:
+ - cron: "15 5 * * 1"
+ workflow_dispatch:
+
+permissions:
+ contents: write
+ pull-requests: write
+
+concurrency:
+ group: monitor-wreq-upstream
+ cancel-in-progress: false
+
+jobs:
+ bump-wreq:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version-file: package.json
+ cache: npm
+
+ - name: Setup Rust
+ uses: dtolnay/rust-toolchain@stable
+
+ - name: Check crates.io for upstream wreq releases
+ run: node ./scripts/update-wreq-upstream.mjs
+
+ - name: Detect dependency changes
+ id: changes
+ run: |
+ if git diff --quiet -- rust/Cargo.toml rust/Cargo.lock; then
+ echo "changed=false" >> "$GITHUB_OUTPUT"
+ else
+ echo "changed=true" >> "$GITHUB_OUTPUT"
+ fi
+
+ - name: Install dependencies
+ if: steps.changes.outputs.changed == 'true'
+ run: npm ci
+
+ - name: Run test suite
+ if: steps.changes.outputs.changed == 'true'
+ run: npm test
+
+ - name: Create pull request
+ if: steps.changes.outputs.changed == 'true'
+ uses: peter-evans/create-pull-request@v7
+ with:
+ branch: chore/update-wreq-upstream
+ delete-branch: true
+ commit-message: "chore: bump upstream wreq crates"
+ title: "chore: bump upstream wreq crates"
+ body: |
+ Automated upstream bump for the Rust crates.
+
+ This workflow checks `crates.io` for the latest published `max_version` of:
+ - `wreq`
+ - `wreq-util`
+ labels: |
+ dependencies
+ add-paths: |
+ rust/Cargo.toml
+ rust/Cargo.lock
diff --git a/README.md b/README.md
index e5702c6..50425ab 100644
--- a/README.md
+++ b/README.md
@@ -45,6 +45,8 @@ TLS and HTTP/2 fingerprinting is actively used by major bot protection and WAF p
npm install node-wreq
```
+Node.js 20+ is required.
+
## contents
#### ⚡ **[quick start](#quick-start)**
@@ -57,7 +59,7 @@ npm install node-wreq
#### 📊 **[observability](#observability)**
#### 🚨 **[error handling](#errors)**
#### 🔌 **[websockets](#websockets)**
-#### 🧪 **[networking / transport knobs](#networking)** — TLS, HTTP/1, HTTP/2 options; header ordering.
+#### 🧪 **[networking / transport knobs](#networking)** — TLS, HTTP/1, HTTP/2 options; header ordering, mTLS and custom CAs; DNS controls.
## ⚡ quick start
@@ -137,6 +139,24 @@ const response = await fetch('https://api.example.com/items', {
console.log(await response.json());
```
+### upload `FormData`
+
+`FormData` request bodies work like `fetch`: the multipart boundary and `content-type` header are generated automatically.
+
+```ts
+const formData = new FormData();
+
+formData.append('alpha', '1');
+formData.append('upload', new File(['hello'], 'hello.txt', { type: 'text/plain' }));
+
+const response = await fetch('https://api.example.com/upload', {
+ method: 'POST',
+ body: formData,
+});
+
+console.log(await response.json());
+```
+
### build a `Request` first
```ts
@@ -697,10 +717,44 @@ const response = await fetch('https://httpbin.org/anything', {
});
```
+If you want to bypass env/system proxy detection for a specific request, use `proxy: false`:
+
+```ts
+await fetch('https://example.com', {
+ proxy: false,
+});
+```
+
### disable default browser-like headers
By default, `node-wreq` may apply profile-appropriate default headers.
+`disableDefaultHeaders: true` disables those browser/profile preset headers only.
+
+That means it turns off headers injected by the selected browser emulation, such as:
+
+- `user-agent`
+- `accept`
+- `accept-language`
+- `sec-ch-ua`
+- `sec-ch-ua-mobile`
+- `sec-ch-ua-platform`
+- `sec-fetch-dest`
+- `sec-fetch-mode`
+- `sec-fetch-site`
+- `priority`
+
+The exact set varies by profile.
+
+It does **not** disable protocol or transport-level headers that may still appear automatically, such as:
+
+- `host`
+- `accept-encoding` when `compress` is enabled
+- `content-length` when the request body requires it
+- `content-type` generated by the runtime for bodies like `FormData`
+
+It also does not remove headers you set explicitly yourself.
+
If you want full manual control:
```ts
@@ -713,27 +767,16 @@ await fetch('https://example.com', {
});
```
-### exact header order
-
-Use tuples when header order matters:
+For example, with `browser: 'chrome_137'`, the default request would normally include Chrome-like `sec-ch-*`, `sec-fetch-*`, `user-agent`, `accept`, and `accept-language` headers. With `disableDefaultHeaders: true`, those browser preset headers are skipped, while transport headers like `host` and `accept-encoding` may still be present.
-```ts
-await fetch('https://example.com', {
- headers: [
- ['x-lower', 'one'],
- ['X-Mixed', 'two'],
- ],
-});
-```
+### exact header order
-### exact original header names on the wire
+Use tuples when header order matters.
-Use this only if you really need exact casing / spelling preservation:
+Tuple headers also preserve the original header names exactly as you wrote them on the wire:
```ts
await fetch('https://example.com', {
- disableDefaultHeaders: true,
- keepOriginalHeaderNames: true,
headers: [
['x-lower', 'one'],
['X-Mixed', 'two'],
@@ -741,6 +784,8 @@ await fetch('https://example.com', {
});
```
+For example, this will preserve both the tuple order and the exact `x-lower` / `X-Mixed` casing you passed.
+
### lower-level transport tuning
If a browser preset gets you close but not all the way there:
@@ -767,10 +812,47 @@ Use these only when:
- you are comparing transport behavior
- you want to debug fingerprint mismatches
+### mTLS and custom CAs
+
+Use `tlsIdentity` for client certificate authentication and `ca` for a custom trust store:
+
+```ts
+import { fetch } from 'node-wreq';
+import { readFileSync } from 'node:fs';
+
+await fetch('https://mtls.example.com', {
+ tlsIdentity: {
+ cert: readFileSync('./client-cert.pem'),
+ key: readFileSync('./client-key.pem'),
+ },
+ ca: {
+ cert: readFileSync('./ca.pem'),
+ includeDefaultRoots: false,
+ },
+});
+```
+
+PKCS#12 / PFX identities are also supported:
+
+```ts
+await fetch('https://mtls.example.com', {
+ tlsIdentity: {
+ pfx: readFileSync('./client-identity.p12'),
+ passphrase: 'secret',
+ },
+ ca: {
+ cert: readFileSync('./ca.pem'),
+ includeDefaultRoots: false,
+ },
+});
+```
+
### compression
Compression is enabled by default.
+That includes `gzip`, `br`, `deflate`, and `zstd` response decoding when the server supports them.
+
Disable it if you need stricter control over response handling:
```ts
@@ -778,3 +860,18 @@ await fetch('https://example.com/archive', {
compress: false,
});
```
+
+### DNS controls
+
+Use `dns.hosts` to pin hostnames to specific IPs, or `dns.servers` to send lookups through specific nameservers:
+
+```ts
+await fetch('https://api.internal.test/health', {
+ dns: {
+ servers: ['1.1.1.1', '8.8.8.8'],
+ hosts: {
+ 'api.internal.test': ['127.0.0.1'],
+ },
+ },
+});
+```
diff --git a/package-lock.json b/package-lock.json
index c638e9d..db030de 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,15 +20,15 @@
"devDependencies": {
"@napi-rs/cli": "^2.18.0",
"@stylistic/eslint-plugin": "^5.10.0",
- "@types/node": "^20.0.0",
+ "@types/node": "^20.19.39",
"@types/ws": "^8.18.1",
- "oxfmt": "^0.41.0",
- "oxlint": "^1.56.0",
+ "oxfmt": "^0.45.0",
+ "oxlint": "^1.60.0",
"typescript": "^5.0.0",
- "ws": "^8.18.3"
+ "ws": "^8.20.0"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@eslint-community/eslint-utils": {
@@ -216,9 +216,9 @@
}
},
"node_modules/@oxfmt/binding-android-arm-eabi": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.41.0.tgz",
- "integrity": "sha512-REfrqeMKGkfMP+m/ScX4f5jJBSmVNYcpoDF8vP8f8eYPDuPGZmzp56NIUsYmx3h7f6NzC6cE3gqh8GDWrJHCKw==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.45.0.tgz",
+ "integrity": "sha512-A/UMxFob1fefCuMeGxQBulGfFE38g2Gm23ynr3u6b+b7fY7/ajGbNsa3ikMIkGMLJW/TRoQaMoP1kME7S+815w==",
"cpu": [
"arm"
],
@@ -233,9 +233,9 @@
}
},
"node_modules/@oxfmt/binding-android-arm64": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.41.0.tgz",
- "integrity": "sha512-s0b1dxNgb2KomspFV2LfogC2XtSJB42POXF4bMCLJyvQmAGos4ZtjGPfQreToQEaY0FQFjz3030ggI36rF1q5g==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.45.0.tgz",
+ "integrity": "sha512-L63z4uZmHjgvvqvMJD7mwff8aSBkM0+X4uFr6l6U5t6+Qc9DCLVZWIunJ7Gm4fn4zHPdSq6FFQnhu9yqqobxIg==",
"cpu": [
"arm64"
],
@@ -250,9 +250,9 @@
}
},
"node_modules/@oxfmt/binding-darwin-arm64": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.41.0.tgz",
- "integrity": "sha512-EGXGualADbv/ZmamE7/2DbsrYmjoPlAmHEpTL4vapLF4EfVD6fr8/uQDFnPJkUBjiSWFJZtFNsGeN1B6V3owmA==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.45.0.tgz",
+ "integrity": "sha512-UV34dd623FzqT+outIGndsCA/RBB+qgB3XVQhgmmJ9PJwa37NzPC9qzgKeOhPKxVk2HW+JKldQrVL54zs4Noww==",
"cpu": [
"arm64"
],
@@ -267,9 +267,9 @@
}
},
"node_modules/@oxfmt/binding-darwin-x64": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.41.0.tgz",
- "integrity": "sha512-WxySJEvdQQYMmyvISH3qDpTvoS0ebnIP63IMxLLWowJyPp/AAH0hdWtlo+iGNK5y3eVfa5jZguwNaQkDKWpGSw==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.45.0.tgz",
+ "integrity": "sha512-pMNJv0CMa1pDefVPeNbuQxibh8ITpWDFEhMC/IBB9Zlu76EbgzYwrzI4Cb11mqX2+rIYN70UTrh3z06TM59ptQ==",
"cpu": [
"x64"
],
@@ -284,9 +284,9 @@
}
},
"node_modules/@oxfmt/binding-freebsd-x64": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.41.0.tgz",
- "integrity": "sha512-Y2kzMkv3U3oyuYaR4wTfGjOTYTXiFC/hXmG0yVASKkbh02BJkvD98Ij8bIevr45hNZ0DmZEgqiXF+9buD4yMYQ==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.45.0.tgz",
+ "integrity": "sha512-xTcRoxbbo61sW2+ZRPeH+vp/o9G8gkdhiVumFU+TpneiPm14c79l6GFlxPXlCE9bNWikigbsrvJw46zCVAQFfg==",
"cpu": [
"x64"
],
@@ -301,9 +301,9 @@
}
},
"node_modules/@oxfmt/binding-linux-arm-gnueabihf": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.41.0.tgz",
- "integrity": "sha512-ptazDjdUyhket01IjPTT6ULS1KFuBfTUU97osTP96X5y/0oso+AgAaJzuH81oP0+XXyrWIHbRzozSAuQm4p48g==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.45.0.tgz",
+ "integrity": "sha512-hWL8Hdni+3U1mPFx1UtWeGp3tNb6EhBAUHRMbKUxVkOp3WwoJbpVO2bfUVbS4PfpledviXXNHSTl1veTa6FhkQ==",
"cpu": [
"arm"
],
@@ -318,9 +318,9 @@
}
},
"node_modules/@oxfmt/binding-linux-arm-musleabihf": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.41.0.tgz",
- "integrity": "sha512-UkoL2OKxFD+56bPEBcdGn+4juTW4HRv/T6w1dIDLnvKKWr6DbarB/mtHXlADKlFiJubJz8pRkttOR7qjYR6lTA==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.45.0.tgz",
+ "integrity": "sha512-6Blt/0OBT7vvfQpqYuYbpbFLPqSiaYpEJzUUWhinPEuADypDbtV1+LdjM0vYBNGPvnj85ex7lTerEX6JGcPt9w==",
"cpu": [
"arm"
],
@@ -335,9 +335,9 @@
}
},
"node_modules/@oxfmt/binding-linux-arm64-gnu": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.41.0.tgz",
- "integrity": "sha512-gofu0PuumSOHYczD8p62CPY4UF6ee+rSLZJdUXkpwxg6pILiwSDBIouPskjF/5nF3A7QZTz2O9KFNkNxxFN9tA==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.45.0.tgz",
+ "integrity": "sha512-jLjoLfe+hGfjhA8hNBSdw85yCA8ePKq7ME4T+g6P9caQXvmt6IhE2X7iVjnVdkmYUWEzZrxlh4p6RkDmAMJY/A==",
"cpu": [
"arm64"
],
@@ -352,9 +352,9 @@
}
},
"node_modules/@oxfmt/binding-linux-arm64-musl": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.41.0.tgz",
- "integrity": "sha512-VfVZxL0+6RU86T8F8vKiDBa+iHsr8PAjQmKGBzSCAX70b6x+UOMFl+2dNihmKmUwqkCazCPfYjt6SuAPOeQJ3g==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.45.0.tgz",
+ "integrity": "sha512-XQKXZIKYJC3GQJ8FnD3iMntpw69Wd9kDDK/Xt79p6xnFYlGGxSNv2vIBvRTDg5CKByWFWWZLCRDOXoP/m6YN4g==",
"cpu": [
"arm64"
],
@@ -369,9 +369,9 @@
}
},
"node_modules/@oxfmt/binding-linux-ppc64-gnu": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.41.0.tgz",
- "integrity": "sha512-bwzokz2eGvdfJbc0i+zXMJ4BBjQPqg13jyWpEEZDOrBCQ91r8KeY2Mi2kUeuMTZNFXju+jcAbAbpyJxRGla0eg==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.45.0.tgz",
+ "integrity": "sha512-+g5RiG+xOkdrCWkKodv407nTvMq4vYM18Uox2MhZBm/YoqFxxJpWKsloskFFG5NU13HGPw1wzYjjOVcyd9moCA==",
"cpu": [
"ppc64"
],
@@ -386,9 +386,9 @@
}
},
"node_modules/@oxfmt/binding-linux-riscv64-gnu": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.41.0.tgz",
- "integrity": "sha512-POLM//PCH9uqDeNDwWL3b3DkMmI3oI2cU6hwc2lnztD1o7dzrQs3R9nq555BZ6wI7t2lyhT9CS+CRaz5X0XqLA==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.45.0.tgz",
+ "integrity": "sha512-V7dXKoSyEbWAkkSF4JJNtF+NJZDmJoSarSoP30WCsB3X636Rehd3CvxBj49FIJxEBFWhvcUjGSHVeU8Erck1bQ==",
"cpu": [
"riscv64"
],
@@ -403,9 +403,9 @@
}
},
"node_modules/@oxfmt/binding-linux-riscv64-musl": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.41.0.tgz",
- "integrity": "sha512-NNK7PzhFqLUwx/G12Xtm6scGv7UITvyGdAR5Y+TlqsG+essnuRWR4jRNODWRjzLZod0T3SayRbnkSIWMBov33w==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.45.0.tgz",
+ "integrity": "sha512-Vdelft1sAEYojVGgcODEFXSWYQYlIvoyIGWebKCuUibd1tvS1TjTx413xG2ZLuHpYj45CkN/ztMLMX6jrgqpgg==",
"cpu": [
"riscv64"
],
@@ -420,9 +420,9 @@
}
},
"node_modules/@oxfmt/binding-linux-s390x-gnu": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.41.0.tgz",
- "integrity": "sha512-qVf/zDC5cN9eKe4qI/O/m445er1IRl6swsSl7jHkqmOSVfknwCe5JXitYjZca+V/cNJSU/xPlC5EFMabMMFDpw==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.45.0.tgz",
+ "integrity": "sha512-RR7xKgNpqwENnK0aYCGYg0JycY2n93J0reNjHyes+I9Gq52dH95x+CBlnlAQHCPfz6FGnKA9HirgUl14WO6o7w==",
"cpu": [
"s390x"
],
@@ -437,9 +437,9 @@
}
},
"node_modules/@oxfmt/binding-linux-x64-gnu": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.41.0.tgz",
- "integrity": "sha512-ojxYWu7vUb6ysYqVCPHuAPVZHAI40gfZ0PDtZAMwVmh2f0V8ExpPIKoAKr7/8sNbAXJBBpZhs2coypIo2jJX4w==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.45.0.tgz",
+ "integrity": "sha512-U/QQ0+BQNSHxjuXR/utvXnQ50Vu5kUuqEomZvQ1/3mhgbBiMc2WU9q5kZ5WwLp3gnFIx9ibkveoRSe2EZubkqg==",
"cpu": [
"x64"
],
@@ -454,9 +454,9 @@
}
},
"node_modules/@oxfmt/binding-linux-x64-musl": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.41.0.tgz",
- "integrity": "sha512-O2exZLBxoCMIv2vlvcbkdedazJPTdG0VSup+0QUCfYQtx751zCZNboX2ZUOiQ/gDTdhtXvSiot0h6GEGkOyalA==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.45.0.tgz",
+ "integrity": "sha512-o5TLOUCF0RWQjsIS06yVC+kFgp092/yLe6qBGSUvtnmTVw9gxjpdQSXc3VN5Cnive4K11HNstEZF8ROKHfDFSw==",
"cpu": [
"x64"
],
@@ -471,9 +471,9 @@
}
},
"node_modules/@oxfmt/binding-openharmony-arm64": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.41.0.tgz",
- "integrity": "sha512-N+31/VoL+z+NNBt8viy3I4NaIdPbiYeOnB884LKqvXldaE2dRztdPv3q5ipfZYv0RwFp7JfqS4I27K/DSHCakg==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.45.0.tgz",
+ "integrity": "sha512-RnGcV3HgPuOjsGx/k9oyRNKmOp+NBLGzZTdPDYbc19r7NGeYPplnUU/BfU35bX2Y/O4ejvHxcfkvW2WoYL/gsg==",
"cpu": [
"arm64"
],
@@ -488,9 +488,9 @@
}
},
"node_modules/@oxfmt/binding-win32-arm64-msvc": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.41.0.tgz",
- "integrity": "sha512-Z7NAtu/RN8kjCQ1y5oDD0nTAeRswh3GJ93qwcW51srmidP7XPBmZbLlwERu1W5veCevQJtPS9xmkpcDTYsGIwQ==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.45.0.tgz",
+ "integrity": "sha512-v3Vj7iKKsUFwt9w5hsqIIoErKVoENC6LoqfDlteOQ5QMDCXihlqLoxpmviUhXnNncg4zV6U9BPwlBbwa+qm4wg==",
"cpu": [
"arm64"
],
@@ -505,9 +505,9 @@
}
},
"node_modules/@oxfmt/binding-win32-ia32-msvc": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.41.0.tgz",
- "integrity": "sha512-uNxxP3l4bJ6VyzIeRqCmBU2Q0SkCFgIhvx9/9dJ9V8t/v+jP1IBsuaLwCXGR8JPHtkj4tFp+RHtUmU2ZYAUpMA==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.45.0.tgz",
+ "integrity": "sha512-N8yotPBX6ph0H3toF4AEpdCeVPrdcSetj+8eGiZGsrLsng3bs/Q5HPu4bbSxip5GBPx5hGbGHrZwH4+rcrjhHA==",
"cpu": [
"ia32"
],
@@ -522,9 +522,9 @@
}
},
"node_modules/@oxfmt/binding-win32-x64-msvc": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.41.0.tgz",
- "integrity": "sha512-49ZSpbZ1noozyPapE8SUOSm3IN0Ze4b5nkO+4+7fq6oEYQQJFhE0saj5k/Gg4oewVPdjn0L3ZFeWk2Vehjcw7A==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.45.0.tgz",
+ "integrity": "sha512-w5MMTRCK1dpQeRA+HHqXQXyN33DlG/N2LOYxJmaT4fJjcmZrbNnqw7SmIk7I2/a2493PPLZ+2E/Ar6t2iKVMug==",
"cpu": [
"x64"
],
@@ -539,9 +539,9 @@
}
},
"node_modules/@oxlint/binding-android-arm-eabi": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.56.0.tgz",
- "integrity": "sha512-IyfYPthZyiSKwAv/dLjeO18SaK8MxLI9Yss2JrRDyweQAkuL3LhEy7pwIwI7uA3KQc1Vdn20kdmj3q0oUIQL6A==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.60.0.tgz",
+ "integrity": "sha512-YdeJKaZckDQL1qa62a1aKq/goyq48aX3yOxaaWqWb4sau4Ee4IiLbamftNLU3zbePky6QsDj6thnSSzHRBjDfA==",
"cpu": [
"arm"
],
@@ -556,9 +556,9 @@
}
},
"node_modules/@oxlint/binding-android-arm64": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.56.0.tgz",
- "integrity": "sha512-Ga5zYrzH6vc/VFxhn6MmyUnYEfy9vRpwTIks99mY3j6Nz30yYpIkWryI0QKPCgvGUtDSXVLEaMum5nA+WrNOSg==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.60.0.tgz",
+ "integrity": "sha512-7ANS7PpXCfq84xZQ8E5WPs14gwcuPcl+/8TFNXfpSu0CQBXz3cUo2fDpHT8v8HJN+Ut02eacvMAzTnc9s6X4tw==",
"cpu": [
"arm64"
],
@@ -573,9 +573,9 @@
}
},
"node_modules/@oxlint/binding-darwin-arm64": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.56.0.tgz",
- "integrity": "sha512-ogmbdJysnw/D4bDcpf1sPLpFThZ48lYp4aKYm10Z/6Nh1SON6NtnNhTNOlhEY296tDFItsZUz+2tgcSYqh8Eyw==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.60.0.tgz",
+ "integrity": "sha512-pJsgd9AfplLGBm1fIr25V6V14vMrayhx4uIQvlfH7jWs2SZwSrvi3TfgfJySB8T+hvyEH8K2zXljQiUnkgUnfQ==",
"cpu": [
"arm64"
],
@@ -590,9 +590,9 @@
}
},
"node_modules/@oxlint/binding-darwin-x64": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.56.0.tgz",
- "integrity": "sha512-x8QE1h+RAtQ2g+3KPsP6Fk/tdz6zJQUv5c7fTrJxXV3GHOo+Ry5p/PsogU4U+iUZg0rj6hS+E4xi+mnwwlDCWQ==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.60.0.tgz",
+ "integrity": "sha512-Ue1aXHX49ivwflKqGJc7zcd/LeLgbhaTcDCQStgx5x06AXgjEAZmvrlMuIkWd4AL4FHQe6QJ9f33z04Cg448VQ==",
"cpu": [
"x64"
],
@@ -607,9 +607,9 @@
}
},
"node_modules/@oxlint/binding-freebsd-x64": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.56.0.tgz",
- "integrity": "sha512-6G+WMZvwJpMvY7my+/SHEjb7BTk/PFbePqLpmVmUJRIsJMy/UlyYqjpuh0RCgYYkPLcnXm1rUM04kbTk8yS1Yg==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.60.0.tgz",
+ "integrity": "sha512-YCyQzsQtusQw+gNRW9rRTifSO+Dt/+dtCl2NHoDMZqJlRTEZ/Oht9YnuporI9yiTx7+cB+eqzX3MtHHVHGIWhg==",
"cpu": [
"x64"
],
@@ -624,9 +624,9 @@
}
},
"node_modules/@oxlint/binding-linux-arm-gnueabihf": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.56.0.tgz",
- "integrity": "sha512-YYHBsk/sl7fYwQOok+6W5lBPeUEvisznV/HZD2IfZmF3Bns6cPC3Z0vCtSEOaAWTjYWN3jVsdu55jMxKlsdlhg==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.60.0.tgz",
+ "integrity": "sha512-c7dxM2Zksa45Qw16i2iGY3Fti2NirJ38FrsBsKw+qcJ0OtqTsBgKJLF0xV+yLG56UH01Z8WRPgsw31e0MoRoGQ==",
"cpu": [
"arm"
],
@@ -641,9 +641,9 @@
}
},
"node_modules/@oxlint/binding-linux-arm-musleabihf": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.56.0.tgz",
- "integrity": "sha512-+AZK8rOUr78y8WT6XkDb04IbMRqauNV+vgT6f8ZLOH8wnpQ9i7Nol0XLxAu+Cq7Sb+J9wC0j6Km5hG8rj47/yQ==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.60.0.tgz",
+ "integrity": "sha512-ZWALoA42UYqBEP1Tbw9OWURgFGS1nWj2AAvLdY6ZcGx/Gj93qVCBKjcvwXMupZibYwFbi9s/rzqkZseb/6gVtQ==",
"cpu": [
"arm"
],
@@ -658,9 +658,9 @@
}
},
"node_modules/@oxlint/binding-linux-arm64-gnu": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.56.0.tgz",
- "integrity": "sha512-urse2SnugwJRojUkGSSeH2LPMaje5Q50yQtvtL9HFckiyeqXzoFwOAZqD5TR29R2lq7UHidfFDM9EGcchcbb8A==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.60.0.tgz",
+ "integrity": "sha512-tpy+1w4p9hN5CicMCxqNy6ymfRtV5ayE573vFNjp1k1TN/qhLFgflveZoE/0++RlkHikBz2vY545NWm/hp7big==",
"cpu": [
"arm64"
],
@@ -675,9 +675,9 @@
}
},
"node_modules/@oxlint/binding-linux-arm64-musl": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.56.0.tgz",
- "integrity": "sha512-rkTZkBfJ4TYLjansjSzL6mgZOdN5IvUnSq3oNJSLwBcNvy3dlgQtpHPrRxrCEbbcp7oQ6If0tkNaqfOsphYZ9g==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.60.0.tgz",
+ "integrity": "sha512-eDYDXZGhQAXyn6GwtwiX/qcLS0HlOLPJ/+iiIY8RYr+3P8oKBmgKxADLlniL6FtWfE7pPk7IGN9/xvDEvDvFeg==",
"cpu": [
"arm64"
],
@@ -692,9 +692,9 @@
}
},
"node_modules/@oxlint/binding-linux-ppc64-gnu": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.56.0.tgz",
- "integrity": "sha512-uqL1kMH3u69/e1CH2EJhP3CP28jw2ExLsku4o8RVAZ7fySo9zOyI2fy9pVlTAp4voBLVgzndXi3SgtdyCTa2aA==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.60.0.tgz",
+ "integrity": "sha512-nxehly5XYBHUWI9VJX1bqCf9j/B43DaK/aS/T1fcxCpX3PA4Rm9BB54nPD1CKayT8xg6REN1ao+01hSRNgy8OA==",
"cpu": [
"ppc64"
],
@@ -709,9 +709,9 @@
}
},
"node_modules/@oxlint/binding-linux-riscv64-gnu": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.56.0.tgz",
- "integrity": "sha512-j0CcMBOgV6KsRaBdsebIeiy7hCjEvq2KdEsiULf2LZqAq0v1M1lWjelhCV57LxsqaIGChXFuFJ0RiFrSRHPhSg==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.60.0.tgz",
+ "integrity": "sha512-j1qf/NaUfOWQutjeoooNG1Q0zsK0XGmSu1uDLq3cctquRF3j7t9Hxqf/76ehCc5GEUAanth2W4Fa+XT1RFg/nw==",
"cpu": [
"riscv64"
],
@@ -726,9 +726,9 @@
}
},
"node_modules/@oxlint/binding-linux-riscv64-musl": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.56.0.tgz",
- "integrity": "sha512-7VDOiL8cDG3DQ/CY3yKjbV1c4YPvc4vH8qW09Vv+5ukq3l/Kcyr6XGCd5NvxUmxqDb2vjMpM+eW/4JrEEsUetA==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.60.0.tgz",
+ "integrity": "sha512-YELKPRefQ/q/h3RUmeRfPCUhh2wBvgV1RyZ/F9M9u8cDyXsQW2ojv1DeWQTt466yczDITjZnIOg/s05pk7Ve2A==",
"cpu": [
"riscv64"
],
@@ -743,9 +743,9 @@
}
},
"node_modules/@oxlint/binding-linux-s390x-gnu": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.56.0.tgz",
- "integrity": "sha512-JGRpX0M+ikD3WpwJ7vKcHKV6Kg0dT52BW2Eu2BupXotYeqGXBrbY+QPkAyKO6MNgKozyTNaRh3r7g+VWgyAQYQ==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.60.0.tgz",
+ "integrity": "sha512-JkO3C6Gki7Y6h/MiIkFKvHFOz98/YWvQ4WYbK9DLXACMP2rjULzkeGyAzorJE5S1dzLQGFgeqvN779kSFwoV1g==",
"cpu": [
"s390x"
],
@@ -760,9 +760,9 @@
}
},
"node_modules/@oxlint/binding-linux-x64-gnu": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.56.0.tgz",
- "integrity": "sha512-dNaICPvtmuxFP/VbqdofrLqdS3bM/AKJN3LMJD52si44ea7Be1cBk6NpfIahaysG9Uo+L98QKddU9CD5L8UHnQ==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.60.0.tgz",
+ "integrity": "sha512-XjKHdFVCpZZZSWBCKyyqCq65s2AKXykMXkjLoKYODrD+f5toLhlwsMESscu8FbgnJQ4Y/dpR/zdazsahmgBJIA==",
"cpu": [
"x64"
],
@@ -777,9 +777,9 @@
}
},
"node_modules/@oxlint/binding-linux-x64-musl": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.56.0.tgz",
- "integrity": "sha512-pF1vOtM+GuXmbklM1hV8WMsn6tCNPvkUzklj/Ej98JhlanbmA2RB1BILgOpwSuCTRTIYx2MXssmEyQQ90QF5aA==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.60.0.tgz",
+ "integrity": "sha512-js29ZWIuPhNWzY8NC7KoffEMEeWG105vbmm+8EOJsC+T/jHBiKIJEUF78+F/IrgEWMMP9N0kRND4Pp75+xAhKg==",
"cpu": [
"x64"
],
@@ -794,9 +794,9 @@
}
},
"node_modules/@oxlint/binding-openharmony-arm64": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.56.0.tgz",
- "integrity": "sha512-bp8NQ4RE6fDIFLa4bdBiOA+TAvkNkg+rslR+AvvjlLTYXLy9/uKAYLQudaQouWihLD/hgkrXIKKzXi5IXOewwg==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.60.0.tgz",
+ "integrity": "sha512-H+PUITKHk04stFpWj3x3Kg08Afp/bcXSBi0EhasR5a0Vw7StXHTzdl655PUI0fB4qdh2Wsu6Dsi+3ACxPoyQnA==",
"cpu": [
"arm64"
],
@@ -811,9 +811,9 @@
}
},
"node_modules/@oxlint/binding-win32-arm64-msvc": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.56.0.tgz",
- "integrity": "sha512-PxT4OJDfMOQBzo3OlzFb9gkoSD+n8qSBxyVq2wQSZIHFQYGEqIRTo9M0ZStvZm5fdhMqaVYpOnJvH2hUMEDk/g==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.60.0.tgz",
+ "integrity": "sha512-WA/yc7f7ZfCefBXVzNHn1Ztulb1EFwNBb4jMZ6pjML0zz6pHujlF3Q3jySluz3XHl/GNeMTntG1seUBWVMlMag==",
"cpu": [
"arm64"
],
@@ -828,9 +828,9 @@
}
},
"node_modules/@oxlint/binding-win32-ia32-msvc": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.56.0.tgz",
- "integrity": "sha512-PTRy6sIEPqy2x8PTP1baBNReN/BNEFmde0L+mYeHmjXE1Vlcc9+I5nsqENsB2yAm5wLkzPoTNCMY/7AnabT4/A==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.60.0.tgz",
+ "integrity": "sha512-33YxL1sqwYNZXtn3MD/4dno6s0xeedXOJlT1WohkVD565WvohClZUr7vwKdAk954n4xiEWJkewiCr+zLeq7AeA==",
"cpu": [
"ia32"
],
@@ -845,9 +845,9 @@
}
},
"node_modules/@oxlint/binding-win32-x64-msvc": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.56.0.tgz",
- "integrity": "sha512-ZHa0clocjLmIDr+1LwoWtxRcoYniAvERotvwKUYKhH41NVfl0Y4LNbyQkwMZzwDvKklKGvGZ5+DAG58/Ik47tQ==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.60.0.tgz",
+ "integrity": "sha512-JOro4ZcfBLamJCyfURQmOQByoorgOdx3ZjAkSqnb/CyG/i+lN3KoV5LAgk5ZAW6DPq7/Cx7n23f8DuTWXTWgyQ==",
"cpu": [
"x64"
],
@@ -907,7 +907,9 @@
"peer": true
},
"node_modules/@types/node": {
- "version": "20.19.21",
+ "version": "20.19.39",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.39.tgz",
+ "integrity": "sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1519,9 +1521,9 @@
}
},
"node_modules/oxfmt": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.41.0.tgz",
- "integrity": "sha512-sKLdJZdQ3bw6x9qKiT7+eID4MNEXlDHf5ZacfIircrq6Qwjk0L6t2/JQlZZrVHTXJawK3KaMuBoJnEJPcqCEdg==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.45.0.tgz",
+ "integrity": "sha512-0o/COoN9fY50bjVeM7PQsNgbhndKurBIeTIcspW033OumksjJJmIVDKjAk5HMwU/GHTxSOdGDdhJ6BRzGPmsHg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1537,31 +1539,31 @@
"url": "https://github.com/sponsors/Boshen"
},
"optionalDependencies": {
- "@oxfmt/binding-android-arm-eabi": "0.41.0",
- "@oxfmt/binding-android-arm64": "0.41.0",
- "@oxfmt/binding-darwin-arm64": "0.41.0",
- "@oxfmt/binding-darwin-x64": "0.41.0",
- "@oxfmt/binding-freebsd-x64": "0.41.0",
- "@oxfmt/binding-linux-arm-gnueabihf": "0.41.0",
- "@oxfmt/binding-linux-arm-musleabihf": "0.41.0",
- "@oxfmt/binding-linux-arm64-gnu": "0.41.0",
- "@oxfmt/binding-linux-arm64-musl": "0.41.0",
- "@oxfmt/binding-linux-ppc64-gnu": "0.41.0",
- "@oxfmt/binding-linux-riscv64-gnu": "0.41.0",
- "@oxfmt/binding-linux-riscv64-musl": "0.41.0",
- "@oxfmt/binding-linux-s390x-gnu": "0.41.0",
- "@oxfmt/binding-linux-x64-gnu": "0.41.0",
- "@oxfmt/binding-linux-x64-musl": "0.41.0",
- "@oxfmt/binding-openharmony-arm64": "0.41.0",
- "@oxfmt/binding-win32-arm64-msvc": "0.41.0",
- "@oxfmt/binding-win32-ia32-msvc": "0.41.0",
- "@oxfmt/binding-win32-x64-msvc": "0.41.0"
+ "@oxfmt/binding-android-arm-eabi": "0.45.0",
+ "@oxfmt/binding-android-arm64": "0.45.0",
+ "@oxfmt/binding-darwin-arm64": "0.45.0",
+ "@oxfmt/binding-darwin-x64": "0.45.0",
+ "@oxfmt/binding-freebsd-x64": "0.45.0",
+ "@oxfmt/binding-linux-arm-gnueabihf": "0.45.0",
+ "@oxfmt/binding-linux-arm-musleabihf": "0.45.0",
+ "@oxfmt/binding-linux-arm64-gnu": "0.45.0",
+ "@oxfmt/binding-linux-arm64-musl": "0.45.0",
+ "@oxfmt/binding-linux-ppc64-gnu": "0.45.0",
+ "@oxfmt/binding-linux-riscv64-gnu": "0.45.0",
+ "@oxfmt/binding-linux-riscv64-musl": "0.45.0",
+ "@oxfmt/binding-linux-s390x-gnu": "0.45.0",
+ "@oxfmt/binding-linux-x64-gnu": "0.45.0",
+ "@oxfmt/binding-linux-x64-musl": "0.45.0",
+ "@oxfmt/binding-openharmony-arm64": "0.45.0",
+ "@oxfmt/binding-win32-arm64-msvc": "0.45.0",
+ "@oxfmt/binding-win32-ia32-msvc": "0.45.0",
+ "@oxfmt/binding-win32-x64-msvc": "0.45.0"
}
},
"node_modules/oxlint": {
- "version": "1.56.0",
- "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.56.0.tgz",
- "integrity": "sha512-Q+5Mj5PVaH/R6/fhMMFzw4dT+KPB+kQW4kaL8FOIq7tfhlnEVp6+3lcWqFruuTNlUo9srZUW3qH7Id4pskeR6g==",
+ "version": "1.60.0",
+ "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.60.0.tgz",
+ "integrity": "sha512-tnRzTWiWJ9pg3ftRWnD0+Oqh78L6ZSwcEudvCZaER0PIqiAnNyXj5N1dPwjmNpDalkKS9m/WMLN1CTPUBPmsgw==",
"dev": true,
"license": "MIT",
"bin": {
@@ -1574,28 +1576,28 @@
"url": "https://github.com/sponsors/Boshen"
},
"optionalDependencies": {
- "@oxlint/binding-android-arm-eabi": "1.56.0",
- "@oxlint/binding-android-arm64": "1.56.0",
- "@oxlint/binding-darwin-arm64": "1.56.0",
- "@oxlint/binding-darwin-x64": "1.56.0",
- "@oxlint/binding-freebsd-x64": "1.56.0",
- "@oxlint/binding-linux-arm-gnueabihf": "1.56.0",
- "@oxlint/binding-linux-arm-musleabihf": "1.56.0",
- "@oxlint/binding-linux-arm64-gnu": "1.56.0",
- "@oxlint/binding-linux-arm64-musl": "1.56.0",
- "@oxlint/binding-linux-ppc64-gnu": "1.56.0",
- "@oxlint/binding-linux-riscv64-gnu": "1.56.0",
- "@oxlint/binding-linux-riscv64-musl": "1.56.0",
- "@oxlint/binding-linux-s390x-gnu": "1.56.0",
- "@oxlint/binding-linux-x64-gnu": "1.56.0",
- "@oxlint/binding-linux-x64-musl": "1.56.0",
- "@oxlint/binding-openharmony-arm64": "1.56.0",
- "@oxlint/binding-win32-arm64-msvc": "1.56.0",
- "@oxlint/binding-win32-ia32-msvc": "1.56.0",
- "@oxlint/binding-win32-x64-msvc": "1.56.0"
+ "@oxlint/binding-android-arm-eabi": "1.60.0",
+ "@oxlint/binding-android-arm64": "1.60.0",
+ "@oxlint/binding-darwin-arm64": "1.60.0",
+ "@oxlint/binding-darwin-x64": "1.60.0",
+ "@oxlint/binding-freebsd-x64": "1.60.0",
+ "@oxlint/binding-linux-arm-gnueabihf": "1.60.0",
+ "@oxlint/binding-linux-arm-musleabihf": "1.60.0",
+ "@oxlint/binding-linux-arm64-gnu": "1.60.0",
+ "@oxlint/binding-linux-arm64-musl": "1.60.0",
+ "@oxlint/binding-linux-ppc64-gnu": "1.60.0",
+ "@oxlint/binding-linux-riscv64-gnu": "1.60.0",
+ "@oxlint/binding-linux-riscv64-musl": "1.60.0",
+ "@oxlint/binding-linux-s390x-gnu": "1.60.0",
+ "@oxlint/binding-linux-x64-gnu": "1.60.0",
+ "@oxlint/binding-linux-x64-musl": "1.60.0",
+ "@oxlint/binding-openharmony-arm64": "1.60.0",
+ "@oxlint/binding-win32-arm64-msvc": "1.60.0",
+ "@oxlint/binding-win32-ia32-msvc": "1.60.0",
+ "@oxlint/binding-win32-x64-msvc": "1.60.0"
},
"peerDependencies": {
- "oxlint-tsgolint": ">=0.15.0"
+ "oxlint-tsgolint": ">=0.18.0"
},
"peerDependenciesMeta": {
"oxlint-tsgolint": {
@@ -1800,9 +1802,9 @@
}
},
"node_modules/ws": {
- "version": "8.19.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz",
- "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==",
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz",
+ "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==",
"dev": true,
"license": "MIT",
"engines": {
diff --git a/package.json b/package.json
index 7a644bf..f756e65 100644
--- a/package.json
+++ b/package.json
@@ -18,6 +18,7 @@
"build": "npm run build:rust && npm run build:ts",
"build:rust": "napi build --platform --release --cargo-cwd rust rust",
"build:ts": "node ./scripts/generate-browser-profiles.mjs && tsc && node ./scripts/postbuild.mjs",
+ "deps:wreq": "node ./scripts/update-wreq-upstream.mjs",
"prepare": "node ./scripts/install-git-hooks.mjs",
"prepare:publish:main": "node ./scripts/prepare-main-package.mjs",
"prepare:publish:platform": "node ./scripts/prepare-platform-package.mjs",
@@ -67,15 +68,15 @@
"devDependencies": {
"@napi-rs/cli": "^2.18.0",
"@stylistic/eslint-plugin": "^5.10.0",
- "@types/node": "^20.0.0",
+ "@types/node": "^20.19.39",
"@types/ws": "^8.18.1",
- "oxfmt": "^0.41.0",
- "oxlint": "^1.56.0",
+ "oxfmt": "^0.45.0",
+ "oxlint": "^1.60.0",
"typescript": "^5.0.0",
- "ws": "^8.18.3"
+ "ws": "^8.20.0"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
},
"os": [
"darwin",
diff --git a/rust/Cargo.lock b/rust/Cargo.lock
index 5805c06..8bbc49b 100644
--- a/rust/Cargo.lock
+++ b/rust/Cargo.lock
@@ -63,6 +63,17 @@ dependencies = [
"tokio",
]
+[[package]]
+name = "async-trait"
+version = "0.1.89"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
[[package]]
name = "atomic-waker"
version = "1.1.2"
@@ -148,6 +159,12 @@ dependencies = [
"alloc-stdlib",
]
+[[package]]
+name = "bumpalo"
+version = "3.20.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb"
+
[[package]]
name = "bytes"
version = "1.10.1"
@@ -211,6 +228,8 @@ dependencies = [
"compression-core",
"flate2",
"memchr",
+ "zstd",
+ "zstd-safe",
]
[[package]]
@@ -229,6 +248,22 @@ dependencies = [
"version_check",
]
+[[package]]
+name = "core-foundation"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
[[package]]
name = "cpufeatures"
version = "0.2.17"
@@ -247,6 +282,36 @@ dependencies = [
"cfg-if",
]
+[[package]]
+name = "critical-section"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b"
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
+
[[package]]
name = "crypto-common"
version = "0.1.6"
@@ -299,6 +364,27 @@ version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
+[[package]]
+name = "encoding_rs"
+version = "0.8.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "enum-as-inner"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
[[package]]
name = "equivalent"
version = "1.0.2"
@@ -327,6 +413,12 @@ version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+[[package]]
+name = "foldhash"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
+
[[package]]
name = "foreign-types"
version = "0.5.0"
@@ -394,6 +486,12 @@ version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
+[[package]]
+name = "futures-io"
+version = "0.3.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718"
+
[[package]]
name = "futures-sink"
version = "0.3.31"
@@ -430,6 +528,17 @@ dependencies = [
"version_check",
]
+[[package]]
+name = "getrandom"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi 0.11.1+wasi-snapshot-preview1",
+]
+
[[package]]
name = "getrandom"
version = "0.3.3"
@@ -438,10 +547,23 @@ checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
dependencies = [
"cfg-if",
"libc",
- "r-efi",
+ "r-efi 5.3.0",
"wasi 0.14.7+wasi-0.2.4",
]
+[[package]]
+name = "getrandom"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "r-efi 6.0.0",
+ "wasip2",
+ "wasip3",
+]
+
[[package]]
name = "glob"
version = "0.3.3"
@@ -454,6 +576,15 @@ version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
+[[package]]
+name = "hashbrown"
+version = "0.15.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
+dependencies = [
+ "foldhash",
+]
+
[[package]]
name = "hashbrown"
version = "0.16.0"
@@ -466,6 +597,52 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+[[package]]
+name = "hickory-proto"
+version = "0.25.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502"
+dependencies = [
+ "async-trait",
+ "cfg-if",
+ "data-encoding",
+ "enum-as-inner",
+ "futures-channel",
+ "futures-io",
+ "futures-util",
+ "idna",
+ "ipnet",
+ "once_cell",
+ "rand",
+ "ring",
+ "thiserror 2.0.17",
+ "tinyvec",
+ "tokio",
+ "tracing",
+ "url",
+]
+
+[[package]]
+name = "hickory-resolver"
+version = "0.25.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a"
+dependencies = [
+ "cfg-if",
+ "futures-util",
+ "hickory-proto",
+ "ipconfig",
+ "moka",
+ "once_cell",
+ "parking_lot",
+ "rand",
+ "resolv-conf",
+ "smallvec",
+ "thiserror 2.0.17",
+ "tokio",
+ "tracing",
+]
+
[[package]]
name = "http"
version = "1.3.1"
@@ -608,6 +785,12 @@ dependencies = [
"zerovec",
]
+[[package]]
+name = "id-arena"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
+
[[package]]
name = "idna"
version = "1.1.0"
@@ -637,6 +820,21 @@ checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5"
dependencies = [
"equivalent",
"hashbrown 0.16.0",
+ "serde",
+ "serde_core",
+]
+
+[[package]]
+name = "ipconfig"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4d40460c0ce33d6ce4b0630ad68ff63d6661961c48b6dba35e5a4d81cfb48222"
+dependencies = [
+ "socket2",
+ "widestring",
+ "windows-registry",
+ "windows-result",
+ "windows-sys 0.61.2",
]
[[package]]
@@ -666,10 +864,26 @@ version = "0.1.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33"
dependencies = [
- "getrandom",
+ "getrandom 0.3.3",
"libc",
]
+[[package]]
+name = "js-sys"
+version = "0.3.95"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "leb128fmt"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
+
[[package]]
name = "libc"
version = "0.2.184"
@@ -733,6 +947,22 @@ version = "2.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
+[[package]]
+name = "mime"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
+[[package]]
+name = "mime_guess"
+version = "2.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e"
+dependencies = [
+ "mime",
+ "unicase",
+]
+
[[package]]
name = "minimal-lexical"
version = "0.2.1"
@@ -757,7 +987,24 @@ checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1"
dependencies = [
"libc",
"wasi 0.11.1+wasi-snapshot-preview1",
- "windows-sys",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "moka"
+version = "0.12.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+ "equivalent",
+ "parking_lot",
+ "portable-atomic",
+ "smallvec",
+ "tagptr",
+ "uuid",
]
[[package]]
@@ -792,12 +1039,14 @@ name = "node-wreq"
version = "0.1.0"
dependencies = [
"anyhow",
+ "hickory-resolver",
"neon",
"serde",
"serde_json",
"strum",
"thiserror 1.0.69",
"tokio",
+ "webpki-root-certs",
"wreq",
"wreq-util",
]
@@ -823,6 +1072,10 @@ name = "once_cell"
version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
+dependencies = [
+ "critical-section",
+ "portable-atomic",
+]
[[package]]
name = "openssl-macros"
@@ -882,6 +1135,12 @@ version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
+[[package]]
+name = "portable-atomic"
+version = "1.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
+
[[package]]
name = "potential_utf"
version = "0.1.5"
@@ -906,6 +1165,16 @@ dependencies = [
"zerocopy",
]
+[[package]]
+name = "prettyplease"
+version = "0.2.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
+dependencies = [
+ "proc-macro2",
+ "syn",
+]
+
[[package]]
name = "proc-macro2"
version = "1.0.101"
@@ -930,6 +1199,12 @@ version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
+[[package]]
+name = "r-efi"
+version = "6.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
+
[[package]]
name = "rand"
version = "0.9.2"
@@ -956,7 +1231,7 @@ version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
dependencies = [
- "getrandom",
+ "getrandom 0.3.3",
]
[[package]]
@@ -997,6 +1272,26 @@ version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3160422bbd54dd5ecfdca71e5fd59b7b8fe2b1697ab2baf64f6d05dcc66d298"
+[[package]]
+name = "resolv-conf"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7"
+
+[[package]]
+name = "ring"
+version = "0.17.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
+dependencies = [
+ "cc",
+ "cfg-if",
+ "getrandom 0.2.17",
+ "libc",
+ "untrusted",
+ "windows-sys 0.52.0",
+]
+
[[package]]
name = "rustc-hash"
version = "2.1.1"
@@ -1009,6 +1304,12 @@ version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79"
+[[package]]
+name = "rustversion"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
+
[[package]]
name = "ryu"
version = "1.0.20"
@@ -1138,7 +1439,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e"
dependencies = [
"libc",
- "windows-sys",
+ "windows-sys 0.61.2",
]
[[package]]
@@ -1181,6 +1482,9 @@ name = "sync_wrapper"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
+dependencies = [
+ "futures-core",
+]
[[package]]
name = "synstructure"
@@ -1193,6 +1497,33 @@ dependencies = [
"syn",
]
+[[package]]
+name = "system-configuration"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b"
+dependencies = [
+ "bitflags",
+ "core-foundation",
+ "system-configuration-sys",
+]
+
+[[package]]
+name = "system-configuration-sys"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "tagptr"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417"
+
[[package]]
name = "thiserror"
version = "1.0.69"
@@ -1274,6 +1605,21 @@ dependencies = [
"zerovec",
]
+[[package]]
+name = "tinyvec"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+
[[package]]
name = "tokio"
version = "1.51.1"
@@ -1288,7 +1634,7 @@ dependencies = [
"signal-hook-registry",
"socket2",
"tokio-macros",
- "windows-sys",
+ "windows-sys 0.61.2",
]
[[package]]
@@ -1396,6 +1742,25 @@ version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
+[[package]]
+name = "tracing"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
+dependencies = [
+ "pin-project-lite",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
+dependencies = [
+ "once_cell",
+]
+
[[package]]
name = "try-lock"
version = "0.2.5"
@@ -1445,12 +1810,30 @@ version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb"
+[[package]]
+name = "unicase"
+version = "2.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142"
+
[[package]]
name = "unicode-ident"
version = "1.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d"
+[[package]]
+name = "unicode-xid"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
+
+[[package]]
+name = "untrusted"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
+
[[package]]
name = "url"
version = "2.5.8"
@@ -1475,6 +1858,17 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
+[[package]]
+name = "uuid"
+version = "1.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9"
+dependencies = [
+ "getrandom 0.4.2",
+ "js-sys",
+ "wasm-bindgen",
+]
+
[[package]]
name = "version_check"
version = "0.9.5"
@@ -1511,7 +1905,95 @@ version = "1.0.1+wasi-0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7"
dependencies = [
- "wit-bindgen",
+ "wit-bindgen 0.46.0",
+]
+
+[[package]]
+name = "wasip3"
+version = "0.4.0+wasi-0.3.0-rc-2026-01-06"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5"
+dependencies = [
+ "wit-bindgen 0.51.0",
+]
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.118"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.118"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.118"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904"
+dependencies = [
+ "bumpalo",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.118"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "wasm-encoder"
+version = "0.244.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319"
+dependencies = [
+ "leb128fmt",
+ "wasmparser",
+]
+
+[[package]]
+name = "wasm-metadata"
+version = "0.244.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"
+dependencies = [
+ "anyhow",
+ "indexmap",
+ "wasm-encoder",
+ "wasmparser",
+]
+
+[[package]]
+name = "wasmparser"
+version = "0.244.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
+dependencies = [
+ "bitflags",
+ "hashbrown 0.15.5",
+ "indexmap",
+ "semver",
]
[[package]]
@@ -1523,6 +2005,12 @@ dependencies = [
"rustls-pki-types",
]
+[[package]]
+name = "widestring"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471"
+
[[package]]
name = "winapi"
version = "0.3.9"
@@ -1551,6 +2039,44 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
+[[package]]
+name = "windows-registry"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720"
+dependencies = [
+ "windows-link",
+ "windows-result",
+ "windows-strings",
+]
+
+[[package]]
+name = "windows-result"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
+dependencies = [
+ "windows-link",
+]
+
+[[package]]
+name = "windows-strings"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
+dependencies = [
+ "windows-link",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+dependencies = [
+ "windows-targets",
+]
+
[[package]]
name = "windows-sys"
version = "0.61.2"
@@ -1560,12 +2086,164 @@ dependencies = [
"windows-link",
]
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
[[package]]
name = "wit-bindgen"
version = "0.46.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
+[[package]]
+name = "wit-bindgen"
+version = "0.51.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
+dependencies = [
+ "wit-bindgen-rust-macro",
+]
+
+[[package]]
+name = "wit-bindgen-core"
+version = "0.51.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc"
+dependencies = [
+ "anyhow",
+ "heck",
+ "wit-parser",
+]
+
+[[package]]
+name = "wit-bindgen-rust"
+version = "0.51.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21"
+dependencies = [
+ "anyhow",
+ "heck",
+ "indexmap",
+ "prettyplease",
+ "syn",
+ "wasm-metadata",
+ "wit-bindgen-core",
+ "wit-component",
+]
+
+[[package]]
+name = "wit-bindgen-rust-macro"
+version = "0.51.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a"
+dependencies = [
+ "anyhow",
+ "prettyplease",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wit-bindgen-core",
+ "wit-bindgen-rust",
+]
+
+[[package]]
+name = "wit-component"
+version = "0.244.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
+dependencies = [
+ "anyhow",
+ "bitflags",
+ "indexmap",
+ "log",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "wasm-encoder",
+ "wasm-metadata",
+ "wasmparser",
+ "wit-parser",
+]
+
+[[package]]
+name = "wit-parser"
+version = "0.244.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
+dependencies = [
+ "anyhow",
+ "id-arena",
+ "indexmap",
+ "log",
+ "semver",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "unicode-xid",
+ "wasmparser",
+]
+
[[package]]
name = "wreq"
version = "6.0.0-rc.28"
@@ -1577,9 +2255,11 @@ dependencies = [
"brotli",
"bytes",
"cookie",
+ "encoding_rs",
"flate2",
"futures-channel",
"futures-util",
+ "hickory-resolver",
"http",
"http-body",
"http-body-util",
@@ -1587,6 +2267,8 @@ dependencies = [
"httparse",
"ipnet",
"libc",
+ "mime",
+ "mime_guess",
"percent-encoding",
"pin-project-lite",
"schnellru",
@@ -1594,6 +2276,8 @@ dependencies = [
"serde_json",
"smallvec",
"socket2",
+ "sync_wrapper",
+ "system-configuration",
"tokio",
"tokio-boring2",
"tokio-socks",
@@ -1603,6 +2287,7 @@ dependencies = [
"url",
"want",
"webpki-root-certs",
+ "windows-registry",
"zstd",
]
diff --git a/rust/Cargo.toml b/rust/Cargo.toml
index 0977cc6..0ec6ca9 100644
--- a/rust/Cargo.toml
+++ b/rust/Cargo.toml
@@ -9,7 +9,7 @@ crate-type = ["cdylib"]
[dependencies]
# HTTP client with browser impersonation
-wreq = { version = "6.0.0-rc.28", default-features = false, features = ["gzip", "brotli", "deflate", "socks", "cookies", "json", "webpki-roots", "ws"] }
+wreq = { version = "6.0.0-rc.28", default-features = false, features = ["gzip", "brotli", "deflate", "zstd", "socks", "cookies", "json", "charset", "multipart", "hickory-dns", "system-proxy", "webpki-roots", "ws"] }
wreq-util = { version = "3.0.0-rc.10", features = ["emulation-rand", "emulation-serde"] }
strum = "0.27.2"
@@ -26,6 +26,8 @@ thiserror = "1.0"
# Async runtime (if needed)
tokio = { version = "1.0", features = ["full"] }
+webpki-root-certs = "1.0.3"
+hickory-resolver = { version = "0.25.2", features = ["system-config"] }
[profile.release]
opt-level = 3
diff --git a/rust/src/napi/convert.rs b/rust/src/napi/convert.rs
index 45fd8df..552f6a4 100644
--- a/rust/src/napi/convert.rs
+++ b/rust/src/napi/convert.rs
@@ -1,9 +1,12 @@
use crate::emulation::resolve_emulation;
use crate::napi::profiles::parse_browser_emulation;
use crate::transport::types::{
- RequestOptions, Response, WebSocketConnectOptions, WebSocketConnection,
+ CertificateAuthorityOptions, DnsOptions, RequestOptions, Response, TlsIdentityOptions,
+ WebSocketConnectOptions, WebSocketConnection,
};
use neon::prelude::*;
+use neon::types::JsBuffer;
+use neon::types::buffer::TypedArray;
pub(crate) fn js_value_to_string_array(
cx: &mut FunctionContext,
@@ -85,13 +88,19 @@ pub(crate) fn js_object_to_request_options(
let body = obj
.get_opt(cx, "body")?
- .and_then(|v: Handle| v.downcast::(cx).ok())
- .map(|v| v.value(cx));
+ .map(|value| js_value_to_bytes(cx, value))
+ .transpose()?;
let proxy = obj
.get_opt(cx, "proxy")?
.and_then(|v: Handle| v.downcast::(cx).ok())
.map(|v| v.value(cx));
+ let disable_system_proxy = obj
+ .get_opt(cx, "disableSystemProxy")?
+ .and_then(|v: Handle| v.downcast::(cx).ok())
+ .map(|v| v.value(cx))
+ .unwrap_or(false);
+ let dns = js_object_to_dns_options(cx, obj)?;
let timeout = obj
.get_opt(cx, "timeout")?
@@ -110,6 +119,8 @@ pub(crate) fn js_object_to_request_options(
.and_then(|v: Handle| v.downcast::(cx).ok())
.map(|v| v.value(cx))
.unwrap_or(true);
+ let tls_identity = js_object_to_tls_identity_options(cx, obj)?;
+ let certificate_authority = js_object_to_certificate_authority_options(cx, obj)?;
Ok(RequestOptions {
url,
@@ -119,9 +130,13 @@ pub(crate) fn js_object_to_request_options(
method,
body,
proxy,
+ disable_system_proxy,
+ dns,
timeout,
disable_default_headers,
compress,
+ tls_identity,
+ certificate_authority,
})
}
@@ -165,6 +180,12 @@ pub(crate) fn js_object_to_websocket_options(
.get_opt(cx, "proxy")?
.and_then(|v: Handle| v.downcast::(cx).ok())
.map(|v| v.value(cx));
+ let disable_system_proxy = obj
+ .get_opt(cx, "disableSystemProxy")?
+ .and_then(|v: Handle| v.downcast::(cx).ok())
+ .map(|v| v.value(cx))
+ .unwrap_or(false);
+ let dns = js_object_to_dns_options(cx, obj)?;
let timeout = obj
.get_opt(cx, "timeout")?
@@ -186,6 +207,8 @@ pub(crate) fn js_object_to_websocket_options(
}
}
}
+ let tls_identity = js_object_to_tls_identity_options(cx, obj)?;
+ let certificate_authority = js_object_to_certificate_authority_options(cx, obj)?;
Ok(WebSocketConnectOptions {
url,
@@ -193,12 +216,152 @@ pub(crate) fn js_object_to_websocket_options(
headers,
orig_headers,
proxy,
+ disable_system_proxy,
+ dns,
timeout,
disable_default_headers,
protocols,
+ tls_identity,
+ certificate_authority,
})
}
+fn js_value_to_bytes(cx: &mut FunctionContext, value: Handle) -> NeonResult> {
+ let buffer = value.downcast::(cx).or_throw(cx)?;
+ Ok(buffer.as_slice(cx).to_vec())
+}
+
+fn js_object_to_tls_identity_options(
+ cx: &mut FunctionContext,
+ obj: Handle,
+) -> NeonResult