diff --git a/package.json b/package.json
index 3b787004fabb3fe4fa8b0b647985f494f7ca5cf2..96ca073dcd8ac677ea026312552078e1b6151d40 100644
--- a/package.json
+++ b/package.json
@@ -1,65 +1,50 @@
{
- "license": "ISC",
- "files": [
- "dist"
- ],
+ "name": "@clo/react-markdown",
"type": "module",
+ "scripts": {
+ "demo": "vite dev",
+ "all": "pnpm --parallel fmt && pnpm --stream '/check|test$/'",
+ "test": "vitest",
+ "check": "oxlint --react-plugin --vitest-plugin --type-aware --type-check .",
+ "check:publish": "deno publish --dry-run --allow-dirty",
+ "fmt": "oxfmt --write ."
+ },
"exports": {
".": "./src/Markdown.ts",
"./Predict": "./src/Predict.ts"
},
- "publishConfig": {
- "access": "public"
- },
- "scripts": {
- "build": "vp pack",
- "dev": "vp dev",
- "test": "vp test",
- "check": "vp check",
- "prepublishOnly": "vp run build"
- },
"dependencies": {
- "@clo/lib": "jsr:^3.0.0",
- "@types/hast": "^3.0.4",
- "dequal": "^2.0.3"
+ "@clo/lib": "npm:@jsr/clo__lib@3.0.0",
+ "@types/react": "^19",
+ "dequal": "^2",
+ "hast-util-to-jsx-runtime": "^2",
+ "react": "^19",
+ "rehype-react": "^8",
+ "remark-parse": "^11",
+ "remark-rehype": "^11",
+ "unified": "^11"
},
"devDependencies": {
"@tailwindcss/typography": "^0.5.19",
"@tailwindcss/vite": "^4.2.2",
"@testing-library/react": "^16.3.2",
+ "@types/hast": "^3.0.4",
"@types/node": "^25.5.0",
- "@types/react": "^19.2.14",
- "@types/react-dom": "^19.2.3",
+ "@types/react-dom": "~19",
"@types/unist": "^3.0.3",
- "@typescript/native-preview": "7.0.0-dev.20260318.1",
"@vitejs/plugin-react": "^6.0.1",
- "hast-util-to-jsx-runtime": "2.3.6",
- "react": "^19.2.4",
+ "happy-dom": "^20.8.4",
+ "oxfmt": "^0.40.0",
+ "oxlint": "^1.55.0",
"react-dom": "^19.2.4",
"react-markdown": "^10.1.0",
"react-scan": "^0.5.3",
- "rehype-react": "^8.0.0",
"remark-gfm": "^4.0.1",
- "remark-parse": "^11.0.0",
- "remark-rehype": "^11.1.2",
"streamdown": "^2.5.0",
"tailwindcss": "^4.2.2",
"typescript": "^5.9.3",
- "unified": "^11.0.5",
- "vite-plus": "^0.1.11"
+ "vite": "^8.0.0",
+ "vitest": "^4.0.0"
},
- "peerDependencies": {
- "react": "*",
- "rehype-react": "^8.0.0",
- "remark-parse": "^11.0.0",
- "remark-rehype": "^11.0.0",
- "unified": "^11.0.0"
- },
- "packageManager": "pnpm@10.26.1",
- "pnpm": {
- "overrides": {
- "vite": "npm:@voidzero-dev/vite-plus-core@latest",
- "vitest": "npm:@voidzero-dev/vite-plus-test@latest"
- }
- }
+ "packageManager": "pnpm@10.26.1"
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d3947033f856f0d471901ec6d3a9930d5d0a28cb..e8e612f45a64967e09f299c8204e9af2435e80ab 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -4,57 +4,71 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
-overrides:
- vite: npm:@voidzero-dev/vite-plus-core@latest
- vitest: npm:@voidzero-dev/vite-plus-test@latest
-
importers:
.:
dependencies:
'@clo/lib':
- specifier: jsr:^3.0.0
+ specifier: npm:@jsr/clo__lib@3.0.0
version: '@jsr/clo__lib@3.0.0'
- '@types/hast':
- specifier: ^3.0.4
- version: 3.0.4
+ '@types/react':
+ specifier: ^19
+ version: 19.2.14
dequal:
- specifier: ^2.0.3
+ specifier: ^2
version: 2.0.3
+ hast-util-to-jsx-runtime:
+ specifier: ^2
+ version: 2.3.6
+ react:
+ specifier: ^19
+ version: 19.2.4
+ rehype-react:
+ specifier: ^8
+ version: 8.0.0
+ remark-parse:
+ specifier: ^11
+ version: 11.0.0
+ remark-rehype:
+ specifier: ^11
+ version: 11.1.2
+ unified:
+ specifier: ^11
+ version: 11.0.5
devDependencies:
'@tailwindcss/typography':
specifier: ^0.5.19
version: 0.5.19(tailwindcss@4.2.2)
'@tailwindcss/vite':
specifier: ^4.2.2
- version: 4.2.2(vite@8.0.0(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2))
+ version: 4.2.2(vite@8.0.1(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2))
'@testing-library/react':
specifier: ^16.3.2
version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@types/hast':
+ specifier: ^3.0.4
+ version: 3.0.4
'@types/node':
specifier: ^25.5.0
version: 25.5.0
- '@types/react':
- specifier: ^19.2.14
- version: 19.2.14
'@types/react-dom':
- specifier: ^19.2.3
+ specifier: ~19
version: 19.2.3(@types/react@19.2.14)
'@types/unist':
specifier: ^3.0.3
version: 3.0.3
- '@typescript/native-preview':
- specifier: 7.0.0-dev.20260318.1
- version: 7.0.0-dev.20260318.1
'@vitejs/plugin-react':
specifier: ^6.0.1
- version: 6.0.1(vite@8.0.0(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2))
- hast-util-to-jsx-runtime:
- specifier: 2.3.6
- version: 2.3.6
- react:
- specifier: ^19.2.4
- version: 19.2.4
+ version: 6.0.1(vite@8.0.1(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2))
+ happy-dom:
+ specifier: ^20.8.4
+ version: 20.8.4
+ oxfmt:
+ specifier: ^0.40.0
+ version: 0.40.0
+ oxlint:
+ specifier: ^1.55.0
+ version: 1.56.0(oxlint-tsgolint@0.17.0)
react-dom:
specifier: ^19.2.4
version: 19.2.4(react@19.2.4)
@@ -64,18 +78,9 @@ importers:
react-scan:
specifier: ^0.5.3
version: 0.5.3(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
- rehype-react:
- specifier: ^8.0.0
- version: 8.0.0
remark-gfm:
specifier: ^4.0.1
version: 4.0.1
- remark-parse:
- specifier: ^11.0.0
- version: 11.0.0
- remark-rehype:
- specifier: ^11.1.2
- version: 11.1.2
streamdown:
specifier: ^2.5.0
version: 2.5.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
@@ -85,12 +90,12 @@ importers:
typescript:
specifier: ^5.9.3
version: 5.9.3
- unified:
- specifier: ^11.0.5
- version: 11.0.5
- vite-plus:
- specifier: ^0.1.11
- version: 0.1.12(@types/node@25.5.0)(happy-dom@20.8.4)(jiti@2.6.1)(typescript@5.9.3)(vite@8.0.0(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2))(yaml@2.8.2)
+ vite:
+ specifier: ^8.0.0
+ version: 8.0.1(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2)
+ vitest:
+ specifier: ^4.0.0
+ version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(vite@8.0.1(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2))
packages:
@@ -186,11 +191,11 @@ packages:
'@chevrotain/utils@11.1.2':
resolution: {integrity: sha512-4mudFAQ6H+MqBTfqLmU7G1ZwRzCLfJEooL/fsF6rCX5eePMbGhoy5n4g+G4vlh2muDcsCTJtL+uKbOzWxs5LHA==}
- '@emnapi/core@1.9.0':
- resolution: {integrity: sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==}
+ '@emnapi/core@1.9.1':
+ resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==}
- '@emnapi/runtime@1.9.0':
- resolution: {integrity: sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==}
+ '@emnapi/runtime@1.9.1':
+ resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==}
'@emnapi/wasi-threads@1.2.0':
resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==}
@@ -382,12 +387,8 @@ packages:
'@napi-rs/wasm-runtime@1.1.1':
resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==}
- '@oxc-project/runtime@0.115.0':
- resolution: {integrity: sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ==}
- engines: {node: ^20.19.0 || >=22.12.0}
-
- '@oxc-project/types@0.115.0':
- resolution: {integrity: sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==}
+ '@oxc-project/types@0.120.0':
+ resolution: {integrity: sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg==}
'@oxfmt/binding-android-arm-eabi@0.40.0':
resolution: {integrity: sha512-S6zd5r1w/HmqR8t0CTnGjFTBLDq2QKORPwriCHxo4xFNuhmOTABGjPaNvCJJVnrKBLsohOeiDX3YqQfJPF+FXw==}
@@ -533,123 +534,120 @@ packages:
cpu: [x64]
os: [win32]
- '@oxlint/binding-android-arm-eabi@1.55.0':
- resolution: {integrity: sha512-NhvgAhncTSOhRahQSCnkK/4YIGPjTmhPurQQ2dwt2IvwCMTvZRW5vF2K10UBOxFve4GZDMw6LtXZdC2qeuYIVQ==}
+ '@oxlint/binding-android-arm-eabi@1.56.0':
+ resolution: {integrity: sha512-IyfYPthZyiSKwAv/dLjeO18SaK8MxLI9Yss2JrRDyweQAkuL3LhEy7pwIwI7uA3KQc1Vdn20kdmj3q0oUIQL6A==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [android]
- '@oxlint/binding-android-arm64@1.55.0':
- resolution: {integrity: sha512-P9iWRh+Ugqhg+D7rkc7boHX8o3H2h7YPcZHQIgvVBgnua5tk4LR2L+IBlreZs58/95cd2x3/004p5VsQM9z4SA==}
+ '@oxlint/binding-android-arm64@1.56.0':
+ resolution: {integrity: sha512-Ga5zYrzH6vc/VFxhn6MmyUnYEfy9vRpwTIks99mY3j6Nz30yYpIkWryI0QKPCgvGUtDSXVLEaMum5nA+WrNOSg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
- '@oxlint/binding-darwin-arm64@1.55.0':
- resolution: {integrity: sha512-esakkJIt7WFAhT30P/Qzn96ehFpzdZ1mNuzpOb8SCW7lI4oB8VsyQnkSHREM671jfpuBb/o2ppzBCx5l0jpgMA==}
+ '@oxlint/binding-darwin-arm64@1.56.0':
+ resolution: {integrity: sha512-ogmbdJysnw/D4bDcpf1sPLpFThZ48lYp4aKYm10Z/6Nh1SON6NtnNhTNOlhEY296tDFItsZUz+2tgcSYqh8Eyw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
- '@oxlint/binding-darwin-x64@1.55.0':
- resolution: {integrity: sha512-xDMFRCCAEK9fOH6As2z8ELsC+VDGSFRHwIKVSilw+xhgLwTDFu37rtmRbmUlx8rRGS6cWKQPTc47AVxAZEVVPQ==}
+ '@oxlint/binding-darwin-x64@1.56.0':
+ resolution: {integrity: sha512-x8QE1h+RAtQ2g+3KPsP6Fk/tdz6zJQUv5c7fTrJxXV3GHOo+Ry5p/PsogU4U+iUZg0rj6hS+E4xi+mnwwlDCWQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
- '@oxlint/binding-freebsd-x64@1.55.0':
- resolution: {integrity: sha512-mYZqnwUD7ALCRxGenyLd1uuG+rHCL+OTT6S8FcAbVm/ZT2AZMGjvibp3F6k1SKOb2aeqFATmwRykrE41Q0GWVw==}
+ '@oxlint/binding-freebsd-x64@1.56.0':
+ resolution: {integrity: sha512-6G+WMZvwJpMvY7my+/SHEjb7BTk/PFbePqLpmVmUJRIsJMy/UlyYqjpuh0RCgYYkPLcnXm1rUM04kbTk8yS1Yg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
- '@oxlint/binding-linux-arm-gnueabihf@1.55.0':
- resolution: {integrity: sha512-LcX6RYcF9vL9ESGwJW3yyIZ/d/ouzdOKXxCdey1q0XJOW1asrHsIg5MmyKdEBR4plQx+shvYeQne7AzW5f3T1w==}
+ '@oxlint/binding-linux-arm-gnueabihf@1.56.0':
+ resolution: {integrity: sha512-YYHBsk/sl7fYwQOok+6W5lBPeUEvisznV/HZD2IfZmF3Bns6cPC3Z0vCtSEOaAWTjYWN3jVsdu55jMxKlsdlhg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
- '@oxlint/binding-linux-arm-musleabihf@1.55.0':
- resolution: {integrity: sha512-C+8GS1rPtK+dI7mJFkqoRBkDuqbrNihnyYQsJPS9ez+8zF9JzfvU19lawqt4l/Y23o5uQswE/DORa8aiXUih3w==}
+ '@oxlint/binding-linux-arm-musleabihf@1.56.0':
+ resolution: {integrity: sha512-+AZK8rOUr78y8WT6XkDb04IbMRqauNV+vgT6f8ZLOH8wnpQ9i7Nol0XLxAu+Cq7Sb+J9wC0j6Km5hG8rj47/yQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
- '@oxlint/binding-linux-arm64-gnu@1.55.0':
- resolution: {integrity: sha512-ErLE4XbmcCopA4/CIDiH6J1IAaDOMnf/KSx/aFObs4/OjAAM3sFKWGZ57pNOMxhhyBdcmcXwYymph9GwcpcqgQ==}
+ '@oxlint/binding-linux-arm64-gnu@1.56.0':
+ resolution: {integrity: sha512-urse2SnugwJRojUkGSSeH2LPMaje5Q50yQtvtL9HFckiyeqXzoFwOAZqD5TR29R2lq7UHidfFDM9EGcchcbb8A==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
- '@oxlint/binding-linux-arm64-musl@1.55.0':
- resolution: {integrity: sha512-/kp65avi6zZfqEng56TTuhiy3P/3pgklKIdf38yvYeJ9/PgEeRA2A2AqKAKbZBNAqUzrzHhz9jF6j/PZvhJzTQ==}
+ '@oxlint/binding-linux-arm64-musl@1.56.0':
+ resolution: {integrity: sha512-rkTZkBfJ4TYLjansjSzL6mgZOdN5IvUnSq3oNJSLwBcNvy3dlgQtpHPrRxrCEbbcp7oQ6If0tkNaqfOsphYZ9g==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
- '@oxlint/binding-linux-ppc64-gnu@1.55.0':
- resolution: {integrity: sha512-A6pTdXwcEEwL/nmz0eUJ6WxmxcoIS+97GbH96gikAyre3s5deC7sts38ZVVowjS2QQFuSWkpA4ZmQC0jZSNvJQ==}
+ '@oxlint/binding-linux-ppc64-gnu@1.56.0':
+ resolution: {integrity: sha512-uqL1kMH3u69/e1CH2EJhP3CP28jw2ExLsku4o8RVAZ7fySo9zOyI2fy9pVlTAp4voBLVgzndXi3SgtdyCTa2aA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ppc64]
os: [linux]
- '@oxlint/binding-linux-riscv64-gnu@1.55.0':
- resolution: {integrity: sha512-clj0lnIN+V52G9tdtZl0LbdTSurnZ1NZj92Je5X4lC7gP5jiCSW+Y/oiDiSauBAD4wrHt2S7nN3pA0zfKYK/6Q==}
+ '@oxlint/binding-linux-riscv64-gnu@1.56.0':
+ resolution: {integrity: sha512-j0CcMBOgV6KsRaBdsebIeiy7hCjEvq2KdEsiULf2LZqAq0v1M1lWjelhCV57LxsqaIGChXFuFJ0RiFrSRHPhSg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [riscv64]
os: [linux]
- '@oxlint/binding-linux-riscv64-musl@1.55.0':
- resolution: {integrity: sha512-NNu08pllN5x/O94/sgR3DA8lbrGBnTHsINZZR0hcav1sj79ksTiKKm1mRzvZvacwQ0hUnGinFo+JO75ok2PxYg==}
+ '@oxlint/binding-linux-riscv64-musl@1.56.0':
+ resolution: {integrity: sha512-7VDOiL8cDG3DQ/CY3yKjbV1c4YPvc4vH8qW09Vv+5ukq3l/Kcyr6XGCd5NvxUmxqDb2vjMpM+eW/4JrEEsUetA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [riscv64]
os: [linux]
- '@oxlint/binding-linux-s390x-gnu@1.55.0':
- resolution: {integrity: sha512-BvfQz3PRlWZRoEZ17dZCqgQsMRdpzGZomJkVATwCIGhHVVeHJMQdmdXPSjcT1DCNUrOjXnVyj1RGDj5+/Je2+Q==}
+ '@oxlint/binding-linux-s390x-gnu@1.56.0':
+ resolution: {integrity: sha512-JGRpX0M+ikD3WpwJ7vKcHKV6Kg0dT52BW2Eu2BupXotYeqGXBrbY+QPkAyKO6MNgKozyTNaRh3r7g+VWgyAQYQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [s390x]
os: [linux]
- '@oxlint/binding-linux-x64-gnu@1.55.0':
- resolution: {integrity: sha512-ngSOoFCSBMKVQd24H8zkbcBNc7EHhjnF1sv3mC9NNXQ/4rRjI/4Dj9+9XoDZeFEkF1SX1COSBXF1b2Pr9rqdEw==}
+ '@oxlint/binding-linux-x64-gnu@1.56.0':
+ resolution: {integrity: sha512-dNaICPvtmuxFP/VbqdofrLqdS3bM/AKJN3LMJD52si44ea7Be1cBk6NpfIahaysG9Uo+L98QKddU9CD5L8UHnQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
- '@oxlint/binding-linux-x64-musl@1.55.0':
- resolution: {integrity: sha512-BDpP7W8GlaG7BR6QjGZAleYzxoyKc/D24spZIF2mB3XsfALQJJT/OBmP8YpeTb1rveFSBHzl8T7l0aqwkWNdGA==}
+ '@oxlint/binding-linux-x64-musl@1.56.0':
+ resolution: {integrity: sha512-pF1vOtM+GuXmbklM1hV8WMsn6tCNPvkUzklj/Ej98JhlanbmA2RB1BILgOpwSuCTRTIYx2MXssmEyQQ90QF5aA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
- '@oxlint/binding-openharmony-arm64@1.55.0':
- resolution: {integrity: sha512-PS6GFvmde/pc3fCA2Srt51glr8Lcxhpf6WIBFfLphndjRrD34NEcses4TSxQrEcxYo6qVywGfylM0ZhSCF2gGA==}
+ '@oxlint/binding-openharmony-arm64@1.56.0':
+ resolution: {integrity: sha512-bp8NQ4RE6fDIFLa4bdBiOA+TAvkNkg+rslR+AvvjlLTYXLy9/uKAYLQudaQouWihLD/hgkrXIKKzXi5IXOewwg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
- '@oxlint/binding-win32-arm64-msvc@1.55.0':
- resolution: {integrity: sha512-P6JcLJGs/q1UOvDLzN8otd9JsH4tsuuPDv+p7aHqHM3PrKmYdmUvkNj4K327PTd35AYcznOCN+l4ZOaq76QzSw==}
+ '@oxlint/binding-win32-arm64-msvc@1.56.0':
+ resolution: {integrity: sha512-PxT4OJDfMOQBzo3OlzFb9gkoSD+n8qSBxyVq2wQSZIHFQYGEqIRTo9M0ZStvZm5fdhMqaVYpOnJvH2hUMEDk/g==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
- '@oxlint/binding-win32-ia32-msvc@1.55.0':
- resolution: {integrity: sha512-gzkk4zE2zsE+WmRxFOiAZHpCpUNDFytEakqNXoNHW+PnYEOTPKDdW6nrzgSeTbGKVPXNAKQnRnMgrh7+n3Xueg==}
+ '@oxlint/binding-win32-ia32-msvc@1.56.0':
+ resolution: {integrity: sha512-PTRy6sIEPqy2x8PTP1baBNReN/BNEFmde0L+mYeHmjXE1Vlcc9+I5nsqENsB2yAm5wLkzPoTNCMY/7AnabT4/A==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ia32]
os: [win32]
- '@oxlint/binding-win32-x64-msvc@1.55.0':
- resolution: {integrity: sha512-ZFALNow2/og75gvYzNP7qe+rREQ5xunktwA+lgykoozHZ6hw9bqg4fn5j2UvG4gIn1FXqrZHkOAXuPf5+GOYTQ==}
+ '@oxlint/binding-win32-x64-msvc@1.56.0':
+ resolution: {integrity: sha512-ZHa0clocjLmIDr+1LwoWtxRcoYniAvERotvwKUYKhH41NVfl0Y4LNbyQkwMZzwDvKklKGvGZ5+DAG58/Ik47tQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
- '@polka/url@1.0.0-next.29':
- resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
-
'@preact/signals-core@1.14.0':
resolution: {integrity: sha512-AowtCcCU/33lFlh1zRFf/u+12rfrhtNakj7UpaGEsmMwUKpKWMVvcktOGcwBBNiB4lWrZWc01LhiyyzVklJyaQ==}
@@ -658,101 +656,101 @@ packages:
peerDependencies:
preact: 10.x
- '@rolldown/binding-android-arm64@1.0.0-rc.9':
- resolution: {integrity: sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg==}
+ '@rolldown/binding-android-arm64@1.0.0-rc.10':
+ resolution: {integrity: sha512-jOHxwXhxmFKuXztiu1ORieJeTbx5vrTkcOkkkn2d35726+iwhrY1w/+nYY/AGgF12thg33qC3R1LMBF5tHTZHg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
- '@rolldown/binding-darwin-arm64@1.0.0-rc.9':
- resolution: {integrity: sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==}
+ '@rolldown/binding-darwin-arm64@1.0.0-rc.10':
+ resolution: {integrity: sha512-gED05Teg/vtTZbIJBc4VNMAxAFDUPkuO/rAIyyxZjTj1a1/s6z5TII/5yMGZ0uLRCifEtwUQn8OlYzuYc0m70w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
- '@rolldown/binding-darwin-x64@1.0.0-rc.9':
- resolution: {integrity: sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg==}
+ '@rolldown/binding-darwin-x64@1.0.0-rc.10':
+ resolution: {integrity: sha512-rI15NcM1mA48lqrIxVkHfAqcyFLcQwyXWThy+BQ5+mkKKPvSO26ir+ZDp36AgYoYVkqvMcdS8zOE6SeBsR9e8A==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
- '@rolldown/binding-freebsd-x64@1.0.0-rc.9':
- resolution: {integrity: sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q==}
+ '@rolldown/binding-freebsd-x64@1.0.0-rc.10':
+ resolution: {integrity: sha512-XZRXHdTa+4ME1MuDVp021+doQ+z6Ei4CCFmNc5/sKbqb8YmkiJdj8QKlV3rCI0AJtAeSB5n0WGPuJWNL9p/L2w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
- '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.9':
- resolution: {integrity: sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ==}
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.10':
+ resolution: {integrity: sha512-R0SQMRluISSLzFE20sPWYHVmJdDQnRyc/FzSCN72BqQmh2SOZUFG+N3/vBZpR4C6WpEUVYJLrYUXaj43sJsNLA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
- '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.9':
- resolution: {integrity: sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==}
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.10':
+ resolution: {integrity: sha512-Y1reMrV/o+cwpduYhJuOE3OMKx32RMYCidf14y+HssARRmhDuWXJ4yVguDg2R/8SyyGNo+auzz64LnPK9Hq6jg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
- '@rolldown/binding-linux-arm64-musl@1.0.0-rc.9':
- resolution: {integrity: sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==}
+ '@rolldown/binding-linux-arm64-musl@1.0.0-rc.10':
+ resolution: {integrity: sha512-vELN+HNb2IzuzSBUOD4NHmP9yrGwl1DVM29wlQvx1OLSclL0NgVWnVDKl/8tEks79EFek/kebQKnNJkIAA4W2g==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
- '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.9':
- resolution: {integrity: sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==}
+ '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.10':
+ resolution: {integrity: sha512-ZqrufYTgzxbHwpqOjzSsb0UV/aV2TFIY5rP8HdsiPTv/CuAgCRjM6s9cYFwQ4CNH+hf9Y4erHW1GjZuZ7WoI7w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ppc64]
os: [linux]
- '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.9':
- resolution: {integrity: sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==}
+ '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.10':
+ resolution: {integrity: sha512-gSlmVS1FZJSRicA6IyjoRoKAFK7IIHBs7xJuHRSmjImqk3mPPWbR7RhbnfH2G6bcmMEllCt2vQ/7u9e6bBnByg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [s390x]
os: [linux]
- '@rolldown/binding-linux-x64-gnu@1.0.0-rc.9':
- resolution: {integrity: sha512-cVEl1vZtBsBZna3YMjGXNvnYYrOJ7RzuWvZU0ffvJUexWkukMaDuGhUXn0rjnV0ptzGVkvc+vW9Yqy6h8YX4pg==}
+ '@rolldown/binding-linux-x64-gnu@1.0.0-rc.10':
+ resolution: {integrity: sha512-eOCKUpluKgfObT2pHjztnaWEIbUabWzk3qPZ5PuacuPmr4+JtQG4k2vGTY0H15edaTnicgU428XW/IH6AimcQw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
- '@rolldown/binding-linux-x64-musl@1.0.0-rc.9':
- resolution: {integrity: sha512-UzYnKCIIc4heAKgI4PZ3dfBGUZefGCJ1TPDuLHoCzgrMYPb5Rv6TLFuYtyM4rWyHM7hymNdsg5ik2C+UD9VDbA==}
+ '@rolldown/binding-linux-x64-musl@1.0.0-rc.10':
+ resolution: {integrity: sha512-Xdf2jQbfQowJnLcgYfD/m0Uu0Qj5OdxKallD78/IPPfzaiaI4KRAwZzHcKQ4ig1gtg1SuzC7jovNiM2TzQsBXA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
- '@rolldown/binding-openharmony-arm64@1.0.0-rc.9':
- resolution: {integrity: sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog==}
+ '@rolldown/binding-openharmony-arm64@1.0.0-rc.10':
+ resolution: {integrity: sha512-o1hYe8hLi1EY6jgPFyxQgQ1wcycX+qz8eEbVmot2hFkgUzPxy9+kF0u0NIQBeDq+Mko47AkaFFaChcvZa9UX9Q==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
- '@rolldown/binding-wasm32-wasi@1.0.0-rc.9':
- resolution: {integrity: sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g==}
+ '@rolldown/binding-wasm32-wasi@1.0.0-rc.10':
+ resolution: {integrity: sha512-Ugv9o7qYJudqQO5Y5y2N2SOo6S4WiqiNOpuQyoPInnhVzCY+wi/GHltcLHypG9DEUYMB0iTB/huJrpadiAcNcA==}
engines: {node: '>=14.0.0'}
cpu: [wasm32]
- '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.9':
- resolution: {integrity: sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA==}
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.10':
+ resolution: {integrity: sha512-7UODQb4fQUNT/vmgDZBl3XOBAIOutP5R3O/rkxg0aLfEGQ4opbCgU5vOw/scPe4xOqBwL9fw7/RP1vAMZ6QlAQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
- '@rolldown/binding-win32-x64-msvc@1.0.0-rc.9':
- resolution: {integrity: sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ==}
+ '@rolldown/binding-win32-x64-msvc@1.0.0-rc.10':
+ resolution: {integrity: sha512-PYxKHMVHOb5NJuDL53vBUl1VwUjymDcYI6rzpIni0C9+9mTiJedvUxSk7/RPp7OOAm3v+EjgMu9bIy3N6b408w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
+ '@rolldown/pluginutils@1.0.0-rc.10':
+ resolution: {integrity: sha512-UkVDEFk1w3mveXeKgaTuYfKWtPbvgck1dT8TUG3bnccrH0XtLTuAyfCoks4Q/M5ZGToSVJTIQYCzy2g/atAOeg==}
+
'@rolldown/pluginutils@1.0.0-rc.7':
resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==}
- '@rolldown/pluginutils@1.0.0-rc.9':
- resolution: {integrity: sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw==}
-
'@rollup/pluginutils@5.3.0':
resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==}
engines: {node: '>=14.0.0'}
@@ -981,8 +979,8 @@ packages:
'@types/d3@7.4.3':
resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==}
- '@types/debug@4.1.12':
- resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+ '@types/debug@4.1.13':
+ resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==}
'@types/deep-eql@4.0.2':
resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
@@ -1039,45 +1037,6 @@ packages:
'@types/ws@8.18.1':
resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==}
- '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260318.1':
- resolution: {integrity: sha512-hsXZC0M5N2F/KdX/wjRywZPovdGBgWw9ARy0GWCw1dAynqdfDcuceKbUw+QwMSdvvsFbUjSomTlyFdT09p1mcA==}
- cpu: [arm64]
- os: [darwin]
-
- '@typescript/native-preview-darwin-x64@7.0.0-dev.20260318.1':
- resolution: {integrity: sha512-lQl7DQkROqPZrx4C1MpFP0WNxdqv+9r4lErhd+57M2Kmxx1BmX3K5VMLJT9FZQFRtgntnYbwQAQ774Z17fv8rA==}
- cpu: [x64]
- os: [darwin]
-
- '@typescript/native-preview-linux-arm64@7.0.0-dev.20260318.1':
- resolution: {integrity: sha512-1wv0qpJW4okKadShemVi4s7zGuiIRI7zTInRYDV/FfyQVyKrkTOzMtZXB6CF3Reus1HmRpGp5ADyc4MI7CCeJg==}
- cpu: [arm64]
- os: [linux]
-
- '@typescript/native-preview-linux-arm@7.0.0-dev.20260318.1':
- resolution: {integrity: sha512-tE7uN00Po/oBg5VYaYM0C/QXroo6gdIRmFVZl543o46ihl0YKEZBMnyStRKKgPCI9oeYXyCNT6WR4MxSMz6ndA==}
- cpu: [arm]
- os: [linux]
-
- '@typescript/native-preview-linux-x64@7.0.0-dev.20260318.1':
- resolution: {integrity: sha512-aSE7xAKYTOrxsFrIgmcaHjgXSSOnWrZ6ozNBeNxpGzd/gl2Ho3FCIwQb0NCXrDwF9AhpFRtHMWPpAPaJk24+rg==}
- cpu: [x64]
- os: [linux]
-
- '@typescript/native-preview-win32-arm64@7.0.0-dev.20260318.1':
- resolution: {integrity: sha512-TV/Tn8cgWamb+6mvY45X2wF0vrTkQmRFCiN1pRRehEwxslDkqLVlpGAFpZndLaPlMb/wzwVpz1e/926xdAoO1w==}
- cpu: [arm64]
- os: [win32]
-
- '@typescript/native-preview-win32-x64@7.0.0-dev.20260318.1':
- resolution: {integrity: sha512-AgOZODSYeTlQWVTioRG3AxHzIBSLbZZhyK19WPzjHW0LtxCcFi59G/Gn1uIshVL3sp1ESRg9SZ5mSiFdgvfK4g==}
- cpu: [x64]
- os: [win32]
-
- '@typescript/native-preview@7.0.0-dev.20260318.1':
- resolution: {integrity: sha512-/7LF/2x29K++k147445omxNixPANTmwJl9p/IIzK8NbOeqVOFv1Gj1GQyOQqRdT4j/X6YDwO/p400/JKE+cBOw==}
- hasBin: true
-
'@ungap/structured-clone@1.3.0':
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
@@ -1097,126 +1056,34 @@ packages:
babel-plugin-react-compiler:
optional: true
- '@voidzero-dev/vite-plus-core@0.1.12':
- resolution: {integrity: sha512-j8YNe7A+8JcSoddztf5whvom/yJ7OKUO3Y5a3UoLIUmOL8YEKVv5nPANrxJ7eaFfHJoMnBEwzBpq1YVZ+H3uPA==}
- engines: {node: ^20.19.0 || >=22.12.0}
- peerDependencies:
- '@arethetypeswrong/core': ^0.18.1
- '@tsdown/css': 0.21.3
- '@tsdown/exe': 0.21.3
- '@types/node': ^20.19.0 || >=22.12.0
- '@vitejs/devtools': ^0.0.0-alpha.31
- esbuild: ^0.27.0
- jiti: '>=1.21.0'
- less: ^4.0.0
- publint: ^0.3.0
- sass: ^1.70.0
- sass-embedded: ^1.70.0
- stylus: '>=0.54.8'
- sugarss: ^5.0.0
- terser: ^5.16.0
- tsx: ^4.8.1
- typescript: ^5.0.0
- unplugin-unused: ^0.5.0
- yaml: ^2.4.2
- peerDependenciesMeta:
- '@arethetypeswrong/core':
- optional: true
- '@tsdown/css':
- optional: true
- '@tsdown/exe':
- optional: true
- '@types/node':
- optional: true
- '@vitejs/devtools':
- optional: true
- esbuild:
- optional: true
- jiti:
- optional: true
- less:
- optional: true
- publint:
- optional: true
- sass:
- optional: true
- sass-embedded:
- optional: true
- stylus:
- optional: true
- sugarss:
- optional: true
- terser:
- optional: true
- tsx:
- optional: true
- typescript:
- optional: true
- unplugin-unused:
- optional: true
- yaml:
- optional: true
-
- '@voidzero-dev/vite-plus-darwin-arm64@0.1.12':
- resolution: {integrity: sha512-tYQrfmcLxIqqr/de00oN7ayu+rYobEOjyR9AxoeJoNUqRyNQCdT0A5vg78kJNPaQCyL6ctgRRvpEKr0WHVmduQ==}
- engines: {node: ^20.19.0 || >=22.12.0}
- cpu: [arm64]
- os: [darwin]
-
- '@voidzero-dev/vite-plus-darwin-x64@0.1.12':
- resolution: {integrity: sha512-852hO/Onx9Z5u0tOYOVEUVzYJUmWdlHeqYnNT6pj0IClgVp0+KSabxr7A2paTWEFWp6XbKWvqw5Y5cVwUV3A6Q==}
- engines: {node: ^20.19.0 || >=22.12.0}
- cpu: [x64]
- os: [darwin]
-
- '@voidzero-dev/vite-plus-linux-arm64-gnu@0.1.12':
- resolution: {integrity: sha512-/gTh4tGyJKCNBn9SZUs3sq9QVRUmyuyseZefBgS223QRxdwFaxc7tIKaw91X59WXXYOzUYZOD5zsTcaIF4hc9A==}
- engines: {node: ^20.19.0 || >=22.12.0}
- cpu: [arm64]
- os: [linux]
-
- '@voidzero-dev/vite-plus-linux-x64-gnu@0.1.12':
- resolution: {integrity: sha512-9oN9ITjK/Xq9Werx+6G6jnI3+F1S3g9lB36J1VAHyRlAEtuiCDV0E3YMoW2O7KzM/PlodZIZ8LStVkH7aA5ZCw==}
- engines: {node: ^20.19.0 || >=22.12.0}
- cpu: [x64]
- os: [linux]
+ '@vitest/expect@4.1.0':
+ resolution: {integrity: sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==}
- '@voidzero-dev/vite-plus-test@0.1.12':
- resolution: {integrity: sha512-EE8Y2vQvqS4c/1qSa7qlhUY9koAG6wYev0NFAtDZsijQCHUqE7nYXGJYnyUInAE6GX4zlQDGg7tf2DAl+CISYw==}
- engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@vitest/mocker@4.1.0':
+ resolution: {integrity: sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==}
peerDependencies:
- '@edge-runtime/vm': '*'
- '@opentelemetry/api': ^1.9.0
- '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0
- '@vitest/ui': 4.1.0
- happy-dom: '*'
- jsdom: '*'
+ msw: ^2.4.9
vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0
peerDependenciesMeta:
- '@edge-runtime/vm':
+ msw:
optional: true
- '@opentelemetry/api':
- optional: true
- '@types/node':
- optional: true
- '@vitest/ui':
- optional: true
- happy-dom:
- optional: true
- jsdom:
+ vite:
optional: true
- '@voidzero-dev/vite-plus-win32-arm64-msvc@0.1.12':
- resolution: {integrity: sha512-JanAb6Y+6BmPhKNLvpZB/syeyY99bt7EPJCaLlbaCt3V0Y2Iw7c7dWBM4Sg4GZ7szGYdGw385fRz0n2M32f1rg==}
- engines: {node: ^20.19.0 || >=22.12.0}
- cpu: [arm64]
- os: [win32]
+ '@vitest/pretty-format@4.1.0':
+ resolution: {integrity: sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==}
+
+ '@vitest/runner@4.1.0':
+ resolution: {integrity: sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==}
+
+ '@vitest/snapshot@4.1.0':
+ resolution: {integrity: sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==}
+
+ '@vitest/spy@4.1.0':
+ resolution: {integrity: sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==}
- '@voidzero-dev/vite-plus-win32-x64-msvc@0.1.12':
- resolution: {integrity: sha512-Ei/UtTTp7UgeEGyV83jhDpSMXhwaZZzfS7Xiaj+zj80GGOwsBre0i+oHGZ7+TuVsZ7Im0sD8IZ9enCpKpV//AQ==}
- engines: {node: ^20.19.0 || >=22.12.0}
- cpu: [x64]
- os: [win32]
+ '@vitest/utils@4.1.0':
+ resolution: {integrity: sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==}
acorn@8.16.0:
resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==}
@@ -1241,8 +1108,8 @@ packages:
bail@2.0.2:
resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
- baseline-browser-mapping@2.10.8:
- resolution: {integrity: sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==}
+ baseline-browser-mapping@2.10.9:
+ resolution: {integrity: sha512-OZd0e2mU11ClX8+IdXe3r0dbqMEznRiT4TfbhYIbcRPZkqJ7Qwer8ij3GZAmLsRKa+II9V1v5czCkvmHH3XZBg==}
engines: {node: '>=6.0.0'}
hasBin: true
@@ -1256,16 +1123,16 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
- cac@6.7.14:
- resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
- engines: {node: '>=8'}
-
caniuse-lite@1.0.30001780:
resolution: {integrity: sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==}
ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+ chai@6.2.2:
+ resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==}
+ engines: {node: '>=18'}
+
character-entities-html4@2.1.0:
resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
@@ -1317,10 +1184,6 @@ packages:
cose-base@2.2.0:
resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==}
- cross-spawn@7.0.6:
- resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
- engines: {node: '>= 8'}
-
cssesc@3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
engines: {node: '>=4'}
@@ -1535,8 +1398,8 @@ packages:
resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
engines: {node: '>=0.12'}
- es-module-lexer@1.7.0:
- resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
+ es-module-lexer@2.0.0:
+ resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==}
esbuild@0.25.12:
resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==}
@@ -1560,6 +1423,10 @@ packages:
estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+ expect-type@1.3.0:
+ resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==}
+ engines: {node: '>=12.0.0'}
+
extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
@@ -1651,9 +1518,6 @@ packages:
resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
engines: {node: '>=12'}
- isexe@2.0.0:
- resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
-
jiti@2.6.1:
resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
hasBin: true
@@ -1671,8 +1535,8 @@ packages:
engines: {node: '>=6'}
hasBin: true
- katex@0.16.38:
- resolution: {integrity: sha512-cjHooZUmIAUmDsHBN+1n8LaZdpmbj03LtYeYPyuYB7OuloiaeaV6N4LcfjcnHVzGWjVQmKrxxTrpDcmSzEZQwQ==}
+ katex@0.16.39:
+ resolution: {integrity: sha512-FR2f6y85+81ZLO0GPhyQ+EJl/E5ILNWltJhpAeOTzRny952Z13x2867lTFDmvMZix//Ux3CuMQ2VkLXRbUwOFg==}
hasBin: true
khroma@2.1.0:
@@ -1923,12 +1787,8 @@ packages:
micromark@4.0.2:
resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==}
- mlly@1.8.1:
- resolution: {integrity: sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==}
-
- mrmime@2.0.1:
- resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
- engines: {node: '>=10'}
+ mlly@1.8.2:
+ resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==}
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
@@ -1953,8 +1813,8 @@ packages:
resolution: {integrity: sha512-TdrKhDZCgEYqONFo/j+KvGan7/k3tP5Ouz88wCqpOvJtI2QmcLfGsm1fcMvDnTik48Jj6z83IJBqlkmK9DnY1A==}
hasBin: true
- oxlint@1.55.0:
- resolution: {integrity: sha512-T+FjepiyWpaZMhekqRpH8Z3I4vNM610p6w+Vjfqgj5TZUxHXl7N8N5IPvmOU8U4XdTRxqtNNTh9Y4hLtr7yvFg==}
+ oxlint@1.56.0:
+ resolution: {integrity: sha512-Q+5Mj5PVaH/R6/fhMMFzw4dT+KPB+kQW4kaL8FOIq7tfhlnEVp6+3lcWqFruuTNlUo9srZUW3qH7Id4pskeR6g==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
@@ -1975,10 +1835,6 @@ packages:
path-data-parser@0.1.0:
resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==}
- path-key@3.1.1:
- resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
- engines: {node: '>=8'}
-
pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
@@ -1989,17 +1845,9 @@ packages:
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
engines: {node: '>=12'}
- pixelmatch@7.1.0:
- resolution: {integrity: sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==}
- hasBin: true
-
pkg-types@1.3.1:
resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
- pngjs@7.0.0:
- resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==}
- engines: {node: '>=14.19.0'}
-
points-on-curve@0.2.0:
resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==}
@@ -2083,8 +1931,8 @@ packages:
robust-predicates@3.0.2:
resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==}
- rolldown@1.0.0-rc.9:
- resolution: {integrity: sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q==}
+ rolldown@1.0.0-rc.10:
+ resolution: {integrity: sha512-q7j6vvarRFmKpgJUT8HCAUljkgzEp4LAhPlJUvQhA5LA1SUL36s5QCysMutErzL3EbNOZOkoziSx9iZC4FddKA==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
@@ -2104,17 +1952,8 @@ packages:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
- shebang-command@2.0.0:
- resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
- engines: {node: '>=8'}
-
- shebang-regex@3.0.0:
- resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
- engines: {node: '>=8'}
-
- sirv@3.0.2:
- resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==}
- engines: {node: '>=18'}
+ siginfo@2.0.0:
+ resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
sisteransi@1.0.5:
resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
@@ -2126,6 +1965,9 @@ packages:
space-separated-tokens@2.0.2:
resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
+ stackback@0.0.2:
+ resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+
std-env@4.0.0:
resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==}
@@ -2172,9 +2014,9 @@ packages:
resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==}
engines: {node: ^20.0.0 || >=22.0.0}
- totalist@3.0.1:
- resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
- engines: {node: '>=6'}
+ tinyrainbow@3.1.0:
+ resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==}
+ engines: {node: '>=14.0.0'}
trim-lines@3.0.1:
resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
@@ -2247,18 +2089,13 @@ packages:
vfile@6.0.3:
resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
- vite-plus@0.1.12:
- resolution: {integrity: sha512-8s1RzomZkgrJRiwiYWGq3R0txFPYfBBJGp73XNHQnme0KTTVH5dNm/E2GNyBSMFJbeeF7eh1OSgqWVc2FpR6eA==}
- engines: {node: ^20.19.0 || >=22.12.0}
- hasBin: true
-
- vite@8.0.0:
- resolution: {integrity: sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==}
+ vite@8.0.1:
+ resolution: {integrity: sha512-wt+Z2qIhfFt85uiyRt5LPU4oVEJBXj8hZNWKeqFG4gRG/0RaRGJ7njQCwzFVjO+v4+Ipmf5CY7VdmZRAYYBPHw==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
'@types/node': ^20.19.0 || >=22.12.0
- '@vitejs/devtools': ^0.0.0-alpha.31
+ '@vitejs/devtools': ^0.1.0
esbuild: ^0.27.0
jiti: '>=1.21.0'
less: ^4.0.0
@@ -2295,6 +2132,41 @@ packages:
yaml:
optional: true
+ vitest@4.1.0:
+ resolution: {integrity: sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==}
+ engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
+ hasBin: true
+ peerDependencies:
+ '@edge-runtime/vm': '*'
+ '@opentelemetry/api': ^1.9.0
+ '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0
+ '@vitest/browser-playwright': 4.1.0
+ '@vitest/browser-preview': 4.1.0
+ '@vitest/browser-webdriverio': 4.1.0
+ '@vitest/ui': 4.1.0
+ happy-dom: '*'
+ jsdom: '*'
+ vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0
+ peerDependenciesMeta:
+ '@edge-runtime/vm':
+ optional: true
+ '@opentelemetry/api':
+ optional: true
+ '@types/node':
+ optional: true
+ '@vitest/browser-playwright':
+ optional: true
+ '@vitest/browser-preview':
+ optional: true
+ '@vitest/browser-webdriverio':
+ optional: true
+ '@vitest/ui':
+ optional: true
+ happy-dom:
+ optional: true
+ jsdom:
+ optional: true
+
vscode-jsonrpc@8.2.0:
resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==}
engines: {node: '>=14.0.0'}
@@ -2325,9 +2197,9 @@ packages:
resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
engines: {node: '>=12'}
- which@2.0.2:
- resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
- engines: {node: '>= 8'}
+ why-is-node-running@2.3.0:
+ resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
+ engines: {node: '>=8'}
hasBin: true
ws@8.19.0:
@@ -2481,13 +2353,13 @@ snapshots:
'@chevrotain/utils@11.1.2': {}
- '@emnapi/core@1.9.0':
+ '@emnapi/core@1.9.1':
dependencies:
'@emnapi/wasi-threads': 1.2.0
tslib: 2.8.1
optional: true
- '@emnapi/runtime@1.9.0':
+ '@emnapi/runtime@1.9.1':
dependencies:
tslib: 2.8.1
optional: true
@@ -2581,7 +2453,7 @@ snapshots:
dependencies:
'@antfu/install-pkg': 1.1.0
'@iconify/types': 2.0.0
- mlly: 1.8.1
+ mlly: 1.8.2
'@jridgewell/gen-mapping@0.3.13':
dependencies:
@@ -2610,14 +2482,12 @@ snapshots:
'@napi-rs/wasm-runtime@1.1.1':
dependencies:
- '@emnapi/core': 1.9.0
- '@emnapi/runtime': 1.9.0
+ '@emnapi/core': 1.9.1
+ '@emnapi/runtime': 1.9.1
'@tybys/wasm-util': 0.10.1
optional: true
- '@oxc-project/runtime@0.115.0': {}
-
- '@oxc-project/types@0.115.0': {}
+ '@oxc-project/types@0.120.0': {}
'@oxfmt/binding-android-arm-eabi@0.40.0':
optional: true
@@ -2694,65 +2564,63 @@ snapshots:
'@oxlint-tsgolint/win32-x64@0.17.0':
optional: true
- '@oxlint/binding-android-arm-eabi@1.55.0':
+ '@oxlint/binding-android-arm-eabi@1.56.0':
optional: true
- '@oxlint/binding-android-arm64@1.55.0':
+ '@oxlint/binding-android-arm64@1.56.0':
optional: true
- '@oxlint/binding-darwin-arm64@1.55.0':
+ '@oxlint/binding-darwin-arm64@1.56.0':
optional: true
- '@oxlint/binding-darwin-x64@1.55.0':
+ '@oxlint/binding-darwin-x64@1.56.0':
optional: true
- '@oxlint/binding-freebsd-x64@1.55.0':
+ '@oxlint/binding-freebsd-x64@1.56.0':
optional: true
- '@oxlint/binding-linux-arm-gnueabihf@1.55.0':
+ '@oxlint/binding-linux-arm-gnueabihf@1.56.0':
optional: true
- '@oxlint/binding-linux-arm-musleabihf@1.55.0':
+ '@oxlint/binding-linux-arm-musleabihf@1.56.0':
optional: true
- '@oxlint/binding-linux-arm64-gnu@1.55.0':
+ '@oxlint/binding-linux-arm64-gnu@1.56.0':
optional: true
- '@oxlint/binding-linux-arm64-musl@1.55.0':
+ '@oxlint/binding-linux-arm64-musl@1.56.0':
optional: true
- '@oxlint/binding-linux-ppc64-gnu@1.55.0':
+ '@oxlint/binding-linux-ppc64-gnu@1.56.0':
optional: true
- '@oxlint/binding-linux-riscv64-gnu@1.55.0':
+ '@oxlint/binding-linux-riscv64-gnu@1.56.0':
optional: true
- '@oxlint/binding-linux-riscv64-musl@1.55.0':
+ '@oxlint/binding-linux-riscv64-musl@1.56.0':
optional: true
- '@oxlint/binding-linux-s390x-gnu@1.55.0':
+ '@oxlint/binding-linux-s390x-gnu@1.56.0':
optional: true
- '@oxlint/binding-linux-x64-gnu@1.55.0':
+ '@oxlint/binding-linux-x64-gnu@1.56.0':
optional: true
- '@oxlint/binding-linux-x64-musl@1.55.0':
+ '@oxlint/binding-linux-x64-musl@1.56.0':
optional: true
- '@oxlint/binding-openharmony-arm64@1.55.0':
+ '@oxlint/binding-openharmony-arm64@1.56.0':
optional: true
- '@oxlint/binding-win32-arm64-msvc@1.55.0':
+ '@oxlint/binding-win32-arm64-msvc@1.56.0':
optional: true
- '@oxlint/binding-win32-ia32-msvc@1.55.0':
+ '@oxlint/binding-win32-ia32-msvc@1.56.0':
optional: true
- '@oxlint/binding-win32-x64-msvc@1.55.0':
+ '@oxlint/binding-win32-x64-msvc@1.56.0':
optional: true
- '@polka/url@1.0.0-next.29': {}
-
'@preact/signals-core@1.14.0': {}
'@preact/signals@1.3.4(preact@10.29.0)':
@@ -2760,57 +2628,57 @@ snapshots:
'@preact/signals-core': 1.14.0
preact: 10.29.0
- '@rolldown/binding-android-arm64@1.0.0-rc.9':
+ '@rolldown/binding-android-arm64@1.0.0-rc.10':
optional: true
- '@rolldown/binding-darwin-arm64@1.0.0-rc.9':
+ '@rolldown/binding-darwin-arm64@1.0.0-rc.10':
optional: true
- '@rolldown/binding-darwin-x64@1.0.0-rc.9':
+ '@rolldown/binding-darwin-x64@1.0.0-rc.10':
optional: true
- '@rolldown/binding-freebsd-x64@1.0.0-rc.9':
+ '@rolldown/binding-freebsd-x64@1.0.0-rc.10':
optional: true
- '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.9':
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.10':
optional: true
- '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.9':
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.10':
optional: true
- '@rolldown/binding-linux-arm64-musl@1.0.0-rc.9':
+ '@rolldown/binding-linux-arm64-musl@1.0.0-rc.10':
optional: true
- '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.9':
+ '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.10':
optional: true
- '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.9':
+ '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.10':
optional: true
- '@rolldown/binding-linux-x64-gnu@1.0.0-rc.9':
+ '@rolldown/binding-linux-x64-gnu@1.0.0-rc.10':
optional: true
- '@rolldown/binding-linux-x64-musl@1.0.0-rc.9':
+ '@rolldown/binding-linux-x64-musl@1.0.0-rc.10':
optional: true
- '@rolldown/binding-openharmony-arm64@1.0.0-rc.9':
+ '@rolldown/binding-openharmony-arm64@1.0.0-rc.10':
optional: true
- '@rolldown/binding-wasm32-wasi@1.0.0-rc.9':
+ '@rolldown/binding-wasm32-wasi@1.0.0-rc.10':
dependencies:
'@napi-rs/wasm-runtime': 1.1.1
optional: true
- '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.9':
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.10':
optional: true
- '@rolldown/binding-win32-x64-msvc@1.0.0-rc.9':
+ '@rolldown/binding-win32-x64-msvc@1.0.0-rc.10':
optional: true
+ '@rolldown/pluginutils@1.0.0-rc.10': {}
+
'@rolldown/pluginutils@1.0.0-rc.7': {}
- '@rolldown/pluginutils@1.0.0-rc.9': {}
-
'@rollup/pluginutils@5.3.0':
dependencies:
'@types/estree': 1.0.8
@@ -2885,12 +2753,12 @@ snapshots:
postcss-selector-parser: 6.0.10
tailwindcss: 4.2.2
- '@tailwindcss/vite@4.2.2(vite@8.0.0(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2))':
+ '@tailwindcss/vite@4.2.2(vite@8.0.1(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2))':
dependencies:
'@tailwindcss/node': 4.2.2
'@tailwindcss/oxide': 4.2.2
tailwindcss: 4.2.2
- vite: 8.0.0(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2)
+ vite: 8.0.1(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2)
'@testing-library/dom@10.4.1':
dependencies:
@@ -3042,7 +2910,7 @@ snapshots:
'@types/d3-transition': 3.0.9
'@types/d3-zoom': 3.0.8
- '@types/debug@4.1.12':
+ '@types/debug@4.1.13':
dependencies:
'@types/ms': 2.1.0
@@ -3093,44 +2961,11 @@ snapshots:
'@types/unist@3.0.3': {}
- '@types/whatwg-mimetype@3.0.2':
- optional: true
+ '@types/whatwg-mimetype@3.0.2': {}
'@types/ws@8.18.1':
dependencies:
'@types/node': 25.5.0
- optional: true
-
- '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260318.1':
- optional: true
-
- '@typescript/native-preview-darwin-x64@7.0.0-dev.20260318.1':
- optional: true
-
- '@typescript/native-preview-linux-arm64@7.0.0-dev.20260318.1':
- optional: true
-
- '@typescript/native-preview-linux-arm@7.0.0-dev.20260318.1':
- optional: true
-
- '@typescript/native-preview-linux-x64@7.0.0-dev.20260318.1':
- optional: true
-
- '@typescript/native-preview-win32-arm64@7.0.0-dev.20260318.1':
- optional: true
-
- '@typescript/native-preview-win32-x64@7.0.0-dev.20260318.1':
- optional: true
-
- '@typescript/native-preview@7.0.0-dev.20260318.1':
- optionalDependencies:
- '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260318.1
- '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260318.1
- '@typescript/native-preview-linux-arm': 7.0.0-dev.20260318.1
- '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260318.1
- '@typescript/native-preview-linux-x64': 7.0.0-dev.20260318.1
- '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260318.1
- '@typescript/native-preview-win32-x64': 7.0.0-dev.20260318.1
'@ungap/structured-clone@1.3.0': {}
@@ -3139,81 +2974,51 @@ snapshots:
d3-selection: 3.0.0
d3-transition: 3.0.1(d3-selection@3.0.0)
- '@vitejs/plugin-react@6.0.1(vite@8.0.0(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2))':
+ '@vitejs/plugin-react@6.0.1(vite@8.0.1(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2))':
dependencies:
'@rolldown/pluginutils': 1.0.0-rc.7
- vite: 8.0.0(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2)
+ vite: 8.0.1(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2)
- '@voidzero-dev/vite-plus-core@0.1.12(@types/node@25.5.0)(jiti@2.6.1)(typescript@5.9.3)(yaml@2.8.2)':
- dependencies:
- '@oxc-project/runtime': 0.115.0
- '@oxc-project/types': 0.115.0
- lightningcss: 1.32.0
- postcss: 8.5.8
- optionalDependencies:
- '@types/node': 25.5.0
- fsevents: 2.3.3
- jiti: 2.6.1
- typescript: 5.9.3
- yaml: 2.8.2
-
- '@voidzero-dev/vite-plus-darwin-arm64@0.1.12':
- optional: true
-
- '@voidzero-dev/vite-plus-darwin-x64@0.1.12':
- optional: true
-
- '@voidzero-dev/vite-plus-linux-arm64-gnu@0.1.12':
- optional: true
-
- '@voidzero-dev/vite-plus-linux-x64-gnu@0.1.12':
- optional: true
-
- '@voidzero-dev/vite-plus-test@0.1.12(@types/node@25.5.0)(happy-dom@20.8.4)(jiti@2.6.1)(typescript@5.9.3)(vite@8.0.0(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2))(yaml@2.8.2)':
+ '@vitest/expect@4.1.0':
dependencies:
'@standard-schema/spec': 1.1.0
'@types/chai': 5.2.3
- '@voidzero-dev/vite-plus-core': 0.1.12(@types/node@25.5.0)(jiti@2.6.1)(typescript@5.9.3)(yaml@2.8.2)
- es-module-lexer: 1.7.0
- obug: 2.1.1
- pixelmatch: 7.1.0
- pngjs: 7.0.0
- sirv: 3.0.2
- std-env: 4.0.0
- tinybench: 2.9.0
- tinyexec: 1.0.4
- tinyglobby: 0.2.15
- vite: 8.0.0(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2)
- ws: 8.19.0
+ '@vitest/spy': 4.1.0
+ '@vitest/utils': 4.1.0
+ chai: 6.2.2
+ tinyrainbow: 3.1.0
+
+ '@vitest/mocker@4.1.0(vite@8.0.1(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2))':
+ dependencies:
+ '@vitest/spy': 4.1.0
+ estree-walker: 3.0.3
+ magic-string: 0.30.21
optionalDependencies:
- '@types/node': 25.5.0
- happy-dom: 20.8.4
- transitivePeerDependencies:
- - '@arethetypeswrong/core'
- - '@tsdown/css'
- - '@tsdown/exe'
- - '@vitejs/devtools'
- - bufferutil
- - esbuild
- - jiti
- - less
- - publint
- - sass
- - sass-embedded
- - stylus
- - sugarss
- - terser
- - tsx
- - typescript
- - unplugin-unused
- - utf-8-validate
- - yaml
+ vite: 8.0.1(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2)
- '@voidzero-dev/vite-plus-win32-arm64-msvc@0.1.12':
- optional: true
+ '@vitest/pretty-format@4.1.0':
+ dependencies:
+ tinyrainbow: 3.1.0
- '@voidzero-dev/vite-plus-win32-x64-msvc@0.1.12':
- optional: true
+ '@vitest/runner@4.1.0':
+ dependencies:
+ '@vitest/utils': 4.1.0
+ pathe: 2.0.3
+
+ '@vitest/snapshot@4.1.0':
+ dependencies:
+ '@vitest/pretty-format': 4.1.0
+ '@vitest/utils': 4.1.0
+ magic-string: 0.30.21
+ pathe: 2.0.3
+
+ '@vitest/spy@4.1.0': {}
+
+ '@vitest/utils@4.1.0':
+ dependencies:
+ '@vitest/pretty-format': 4.1.0
+ convert-source-map: 2.0.0
+ tinyrainbow: 3.1.0
acorn@8.16.0: {}
@@ -3229,7 +3034,7 @@ snapshots:
bail@2.0.2: {}
- baseline-browser-mapping@2.10.8: {}
+ baseline-browser-mapping@2.10.9: {}
bippy@0.5.32(@types/react@19.2.14)(react@19.2.4):
dependencies:
@@ -3240,18 +3045,18 @@ snapshots:
browserslist@4.28.1:
dependencies:
- baseline-browser-mapping: 2.10.8
+ baseline-browser-mapping: 2.10.9
caniuse-lite: 1.0.30001780
electron-to-chromium: 1.5.321
node-releases: 2.0.36
update-browserslist-db: 1.2.3(browserslist@4.28.1)
- cac@6.7.14: {}
-
caniuse-lite@1.0.30001780: {}
ccount@2.0.1: {}
+ chai@6.2.2: {}
+
character-entities-html4@2.1.0: {}
character-entities-legacy@3.0.0: {}
@@ -3296,12 +3101,6 @@ snapshots:
dependencies:
layout-base: 2.0.1
- cross-spawn@7.0.6:
- dependencies:
- path-key: 3.1.1
- shebang-command: 2.0.0
- which: 2.0.2
-
cssesc@3.0.0: {}
csstype@3.2.3: {}
@@ -3527,10 +3326,9 @@ snapshots:
entities@6.0.1: {}
- entities@7.0.1:
- optional: true
+ entities@7.0.1: {}
- es-module-lexer@1.7.0: {}
+ es-module-lexer@2.0.0: {}
esbuild@0.25.12:
optionalDependencies:
@@ -3573,6 +3371,8 @@ snapshots:
dependencies:
'@types/estree': 1.0.8
+ expect-type@1.3.0: {}
+
extend@3.0.2: {}
fdir@6.5.0(picomatch@4.0.3):
@@ -3599,7 +3399,6 @@ snapshots:
transitivePeerDependencies:
- bufferutil
- utf-8-validate
- optional: true
hast-util-from-parse5@8.0.3:
dependencies:
@@ -3707,8 +3506,6 @@ snapshots:
is-plain-obj@4.1.0: {}
- isexe@2.0.0: {}
-
jiti@2.6.1: {}
js-tokens@4.0.0: {}
@@ -3717,7 +3514,7 @@ snapshots:
json5@2.2.3: {}
- katex@0.16.38:
+ katex@0.16.39:
dependencies:
commander: 8.3.0
@@ -3974,7 +3771,7 @@ snapshots:
dagre-d3-es: 7.0.14
dayjs: 1.11.20
dompurify: 3.3.3
- katex: 0.16.38
+ katex: 0.16.39
khroma: 2.1.0
lodash-es: 4.17.23
marked: 16.4.2
@@ -4154,7 +3951,7 @@ snapshots:
micromark@4.0.2:
dependencies:
- '@types/debug': 4.1.12
+ '@types/debug': 4.1.13
debug: 4.4.3
decode-named-character-reference: 1.3.0
devlop: 1.1.0
@@ -4174,15 +3971,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
- mlly@1.8.1:
+ mlly@1.8.2:
dependencies:
acorn: 8.16.0
pathe: 2.0.3
pkg-types: 1.3.1
ufo: 1.6.3
- mrmime@2.0.1: {}
-
ms@2.1.3: {}
nanoid@3.3.11: {}
@@ -4223,28 +4018,29 @@ snapshots:
'@oxlint-tsgolint/linux-x64': 0.17.0
'@oxlint-tsgolint/win32-arm64': 0.17.0
'@oxlint-tsgolint/win32-x64': 0.17.0
+ optional: true
- oxlint@1.55.0(oxlint-tsgolint@0.17.0):
+ oxlint@1.56.0(oxlint-tsgolint@0.17.0):
optionalDependencies:
- '@oxlint/binding-android-arm-eabi': 1.55.0
- '@oxlint/binding-android-arm64': 1.55.0
- '@oxlint/binding-darwin-arm64': 1.55.0
- '@oxlint/binding-darwin-x64': 1.55.0
- '@oxlint/binding-freebsd-x64': 1.55.0
- '@oxlint/binding-linux-arm-gnueabihf': 1.55.0
- '@oxlint/binding-linux-arm-musleabihf': 1.55.0
- '@oxlint/binding-linux-arm64-gnu': 1.55.0
- '@oxlint/binding-linux-arm64-musl': 1.55.0
- '@oxlint/binding-linux-ppc64-gnu': 1.55.0
- '@oxlint/binding-linux-riscv64-gnu': 1.55.0
- '@oxlint/binding-linux-riscv64-musl': 1.55.0
- '@oxlint/binding-linux-s390x-gnu': 1.55.0
- '@oxlint/binding-linux-x64-gnu': 1.55.0
- '@oxlint/binding-linux-x64-musl': 1.55.0
- '@oxlint/binding-openharmony-arm64': 1.55.0
- '@oxlint/binding-win32-arm64-msvc': 1.55.0
- '@oxlint/binding-win32-ia32-msvc': 1.55.0
- '@oxlint/binding-win32-x64-msvc': 1.55.0
+ '@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-tsgolint: 0.17.0
package-manager-detector@1.6.0: {}
@@ -4265,26 +4061,18 @@ snapshots:
path-data-parser@0.1.0: {}
- path-key@3.1.1: {}
-
pathe@2.0.3: {}
picocolors@1.1.1: {}
picomatch@4.0.3: {}
- pixelmatch@7.1.0:
- dependencies:
- pngjs: 7.0.0
-
pkg-types@1.3.1:
dependencies:
confbox: 0.1.8
- mlly: 1.8.1
+ mlly: 1.8.2
pathe: 2.0.3
- pngjs@7.0.0: {}
-
points-on-curve@0.2.0: {}
points-on-path@0.2.1:
@@ -4430,26 +4218,26 @@ snapshots:
robust-predicates@3.0.2: {}
- rolldown@1.0.0-rc.9:
+ rolldown@1.0.0-rc.10:
dependencies:
- '@oxc-project/types': 0.115.0
- '@rolldown/pluginutils': 1.0.0-rc.9
+ '@oxc-project/types': 0.120.0
+ '@rolldown/pluginutils': 1.0.0-rc.10
optionalDependencies:
- '@rolldown/binding-android-arm64': 1.0.0-rc.9
- '@rolldown/binding-darwin-arm64': 1.0.0-rc.9
- '@rolldown/binding-darwin-x64': 1.0.0-rc.9
- '@rolldown/binding-freebsd-x64': 1.0.0-rc.9
- '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.9
- '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.9
- '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.9
- '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.9
- '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.9
- '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.9
- '@rolldown/binding-linux-x64-musl': 1.0.0-rc.9
- '@rolldown/binding-openharmony-arm64': 1.0.0-rc.9
- '@rolldown/binding-wasm32-wasi': 1.0.0-rc.9
- '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.9
- '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.9
+ '@rolldown/binding-android-arm64': 1.0.0-rc.10
+ '@rolldown/binding-darwin-arm64': 1.0.0-rc.10
+ '@rolldown/binding-darwin-x64': 1.0.0-rc.10
+ '@rolldown/binding-freebsd-x64': 1.0.0-rc.10
+ '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.10
+ '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.10
+ '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.10
+ '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.10
+ '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.10
+ '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.10
+ '@rolldown/binding-linux-x64-musl': 1.0.0-rc.10
+ '@rolldown/binding-openharmony-arm64': 1.0.0-rc.10
+ '@rolldown/binding-wasm32-wasi': 1.0.0-rc.10
+ '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.10
+ '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.10
roughjs@4.6.6:
dependencies:
@@ -4466,17 +4254,7 @@ snapshots:
semver@6.3.1: {}
- shebang-command@2.0.0:
- dependencies:
- shebang-regex: 3.0.0
-
- shebang-regex@3.0.0: {}
-
- sirv@3.0.2:
- dependencies:
- '@polka/url': 1.0.0-next.29
- mrmime: 2.0.1
- totalist: 3.0.1
+ siginfo@2.0.0: {}
sisteransi@1.0.5: {}
@@ -4484,6 +4262,8 @@ snapshots:
space-separated-tokens@2.0.2: {}
+ stackback@0.0.2: {}
+
std-env@4.0.0: {}
streamdown@2.5.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
@@ -4541,7 +4321,7 @@ snapshots:
tinypool@2.1.0: {}
- totalist@3.0.1: {}
+ tinyrainbow@3.1.0: {}
trim-lines@3.0.1: {}
@@ -4624,59 +4404,12 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.3
- vite-plus@0.1.12(@types/node@25.5.0)(happy-dom@20.8.4)(jiti@2.6.1)(typescript@5.9.3)(vite@8.0.0(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2))(yaml@2.8.2):
+ vite@8.0.1(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2):
dependencies:
- '@oxc-project/types': 0.115.0
- '@voidzero-dev/vite-plus-core': 0.1.12(@types/node@25.5.0)(jiti@2.6.1)(typescript@5.9.3)(yaml@2.8.2)
- '@voidzero-dev/vite-plus-test': 0.1.12(@types/node@25.5.0)(happy-dom@20.8.4)(jiti@2.6.1)(typescript@5.9.3)(vite@8.0.0(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2))(yaml@2.8.2)
- cac: 6.7.14
- cross-spawn: 7.0.6
- oxfmt: 0.40.0
- oxlint: 1.55.0(oxlint-tsgolint@0.17.0)
- oxlint-tsgolint: 0.17.0
- picocolors: 1.1.1
- optionalDependencies:
- '@voidzero-dev/vite-plus-darwin-arm64': 0.1.12
- '@voidzero-dev/vite-plus-darwin-x64': 0.1.12
- '@voidzero-dev/vite-plus-linux-arm64-gnu': 0.1.12
- '@voidzero-dev/vite-plus-linux-x64-gnu': 0.1.12
- '@voidzero-dev/vite-plus-win32-arm64-msvc': 0.1.12
- '@voidzero-dev/vite-plus-win32-x64-msvc': 0.1.12
- transitivePeerDependencies:
- - '@arethetypeswrong/core'
- - '@edge-runtime/vm'
- - '@opentelemetry/api'
- - '@tsdown/css'
- - '@tsdown/exe'
- - '@types/node'
- - '@vitejs/devtools'
- - '@vitest/ui'
- - bufferutil
- - esbuild
- - happy-dom
- - jiti
- - jsdom
- - less
- - publint
- - sass
- - sass-embedded
- - stylus
- - sugarss
- - terser
- - tsx
- - typescript
- - unplugin-unused
- - utf-8-validate
- - vite
- - yaml
-
- vite@8.0.0(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2):
- dependencies:
- '@oxc-project/runtime': 0.115.0
lightningcss: 1.32.0
picomatch: 4.0.3
postcss: 8.5.8
- rolldown: 1.0.0-rc.9
+ rolldown: 1.0.0-rc.10
tinyglobby: 0.2.15
optionalDependencies:
'@types/node': 25.5.0
@@ -4684,6 +4417,34 @@ snapshots:
jiti: 2.6.1
yaml: 2.8.2
+ vitest@4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(vite@8.0.1(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2)):
+ dependencies:
+ '@vitest/expect': 4.1.0
+ '@vitest/mocker': 4.1.0(vite@8.0.1(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2))
+ '@vitest/pretty-format': 4.1.0
+ '@vitest/runner': 4.1.0
+ '@vitest/snapshot': 4.1.0
+ '@vitest/spy': 4.1.0
+ '@vitest/utils': 4.1.0
+ es-module-lexer: 2.0.0
+ expect-type: 1.3.0
+ magic-string: 0.30.21
+ obug: 2.1.1
+ pathe: 2.0.3
+ picomatch: 4.0.3
+ std-env: 4.0.0
+ tinybench: 2.9.0
+ tinyexec: 1.0.4
+ tinyglobby: 0.2.15
+ tinyrainbow: 3.1.0
+ vite: 8.0.1(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.2)
+ why-is-node-running: 2.3.0
+ optionalDependencies:
+ '@types/node': 25.5.0
+ happy-dom: 20.8.4
+ transitivePeerDependencies:
+ - msw
+
vscode-jsonrpc@8.2.0: {}
vscode-languageserver-protocol@3.17.5:
@@ -4706,12 +4467,12 @@ snapshots:
webpack-virtual-modules@0.6.2:
optional: true
- whatwg-mimetype@3.0.0:
- optional: true
+ whatwg-mimetype@3.0.0: {}
- which@2.0.2:
+ why-is-node-running@2.3.0:
dependencies:
- isexe: 2.0.0
+ siginfo: 2.0.0
+ stackback: 0.0.2
ws@8.19.0: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..c5739b7433373b954e38dba07a74be9b5d28c7f0
--- /dev/null
+++ b/pnpm-workspace.yaml
@@ -0,0 +1,2 @@
+ignoredBuiltDependencies:
+ - esbuild
diff --git a/src/Markdown.ts b/src/Markdown.ts
index 9edfe3f7e636e4662c991a767e0af2d0fed57107..f1e959a9c4ba93f708e349068ca1e752104869fb 100644
--- a/src/Markdown.ts
+++ b/src/Markdown.ts
@@ -1,6 +1,12 @@
-import { createContext, memo, type PropsWithChildren, useContext, useMemo, useRef } from "react";
-import { componentsAreEqual, defaultProcessor, Memoizer } from "./Memoizer";
-import { type Processor } from "unified";
+import {
+ createContext,
+ type ExoticComponent,
+ memo,
+ type PropsWithChildren,
+ useContext,
+ useRef,
+} from "react";
+import { componentsAreEqual, defaultProcessor, Memoizer, type BaseProcessor } from "./Memoizer";
import { type Components } from "rehype-react";
import { jsx } from "react/jsx-runtime";
@@ -9,7 +15,7 @@ export interface MarkdownOptions {
/** Markdown source content. */
content: string;
/** Add any other markdown processors. */
- processor?: Processor
| null | undefined;
+ processor?: BaseProcessor | null | undefined;
/** Customize component rendering. */
components?: Partial | null | undefined;
/** Automatically predict closing tags, useful for LLM streaming. */
@@ -22,48 +28,55 @@ export interface MarkdownOptions {
* processor pipeline through the `processor` prop or a
* {@linkcode MarkdownOptionsProvider}.
*/
-export const Markdown = memo(function Markdown({
+export const Markdown: ExoticComponent = memo(function Markdown({
content,
processor,
components,
predict,
}: MarkdownOptions) {
- const context = useContext(Context);
+ const context = useContext(OptionsContext);
const ref = useRef(null);
const memoizer = (ref.current ??= new Memoizer());
memoizer.reconfigure(
processor ?? context.processor ?? defaultProcessor,
predict ?? context.predict ?? false,
- {
- ...components,
- ...context.components,
- },
+ { ...context.components, ...components },
);
return memoizer.update(content);
-}, propsAreEqual);
-
-// @ts-expect-error vite integration
-!import.meta.env.PROD && (Markdown.displayName = "Markdown");
+}, markdownPropsAreEqual);
type Context = Omit;
-const Context = createContext({});
+const OptionsContext = createContext({});
/** Configure default options for {@linkcode Markdown} */
-export const MarkdownOptionsProvider = memo(function MarkdownOptionsProvider({
- processor,
- components,
- children,
- predict,
-}: PropsWithChildren) {
- const value = useMemo(
- () => ({ processor, components, predict }),
- [processor, components, predict],
- );
- return jsx(Context.Provider, { value, children });
-}, propsAreEqual);
+export const MarkdownOptionsProvider: ExoticComponent> = memo(
+ function MarkdownOptionsProvider({
+ processor,
+ components,
+ children,
+ predict,
+ }: PropsWithChildren) {
+ const valueRef = useRef(null);
+ const nextValue: Context = { processor, components, predict };
+ if (!valueRef.current || !contextIsEqual(valueRef.current, nextValue)) {
+ valueRef.current = nextValue;
+ }
+ return jsx(OptionsContext.Provider, { value: valueRef.current, children });
+ },
+ providerPropsAreEqual,
+);
-function propsAreEqual(prev: T, next: T) {
+function markdownPropsAreEqual(prev: MarkdownOptions, next: MarkdownOptions) {
if (prev.content !== next.content) return false;
+ return contextIsEqual(prev, next);
+}
+
+function providerPropsAreEqual(prev: PropsWithChildren, next: PropsWithChildren) {
+ if (prev.children !== next.children) return false;
+ return contextIsEqual(prev, next);
+}
+
+function contextIsEqual(prev: Context, next: Context) {
if (prev.processor !== next.processor) return false;
if (prev.predict !== next.predict) return false;
if (prev.components === next.components) return true;
diff --git a/src/Memoizer.ts b/src/Memoizer.ts
index e2c909324961a28b86832e8afbc21a3684715709..dfb22269f8a33ff634497743c24f2c209c22dcd8 100644
--- a/src/Memoizer.ts
+++ b/src/Memoizer.ts
@@ -8,7 +8,7 @@ import type { Root as HastRoot } from "hast";
import type { Literal, Node, Parent } from "unist";
import { memoizedHastToReact, type RenderState } from "./hast.ts";
import remarkParse from "remark-parse";
-import { Predict } from "./Prediction.ts";
+import { Predict } from "./Predict.ts";
export const defaultProcessor = unified().use(remarkParse);
@@ -29,7 +29,7 @@ type AstProcessor = Processor;
*/
export class Memoizer {
// options incrementally updated via `reconfigure`
- #baseProcessor: BaseProcessor = defaultProcessor;
+ #baseProcessor: BaseProcessor = defaultProcessor as BaseProcessor;
#astProcessor: AstProcessor | null = null;
#components: Partial = {};
#previousComponents: Partial = {};
diff --git a/src/Predict.ts b/src/Predict.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bf845ca9d2028c11ccb0c297339e1bc9fa384bc7
--- /dev/null
+++ b/src/Predict.ts
@@ -0,0 +1,379 @@
+/**
+ * Incremental parser for predicting closing tags in Markdown text. Works best
+ * when continuously appending text to the end of the string; this behavior
+ * specifically triggers a fast parsing path.
+ */
+export class Predict {
+ #stable = "";
+
+ /** Incrementally reparses the tail. */
+ update(text: string): string {
+ if (!text.startsWith(this.#stable)) this.#stable = "";
+ let tail = text.slice(this.#stable.length);
+ let state = parseTail(tail);
+ if (state.commitIndex > 0) {
+ this.#stable += tail.slice(0, state.commitIndex);
+ tail = tail.slice(state.commitIndex);
+ state = parseTail(tail);
+ }
+ return this.#stable + renderTail(tail, state);
+ }
+}
+
+type DelimToken = "***" | "**" | "__" | "~~" | "*" | "_";
+type DelimState = { start: number; token: DelimToken };
+type LinkState =
+ | { phase: "text"; start: number }
+ | { phase: "url_wait"; start: number; textEnd: number }
+ | { phase: "url"; start: number; textEnd: number; parenDepth: number };
+type ExclusiveState =
+ | { kind: "code"; start: number; token: string }
+ | { kind: "fence"; start: number; token: string }
+ | { kind: "math"; start: number; token: "$" | "$$" };
+interface TailState {
+ commitIndex: number;
+ delims: DelimState[];
+ exclusive: ExclusiveState | null;
+ links: LinkState[];
+}
+
+const NESTABLE_DELIMS = new Set(["*", "**", "_", "__"]);
+
+function parseTail(tail: string): TailState {
+ const state: TailState = {
+ commitIndex: 0,
+ delims: [],
+ exclusive: null,
+ links: [],
+ };
+
+ for (let i = 0; i < tail.length; i++) {
+ const char = tail[i]!;
+
+ if (char === "\n" && tail[i - 1] === "\n") {
+ resetParagraphState(state);
+ if (!state.exclusive) state.commitIndex = i + 1;
+ continue;
+ }
+
+ const exclusiveEnd = consumeExclusive(state, tail, i);
+ if (exclusiveEnd > i) {
+ i = exclusiveEnd - 1;
+ continue;
+ }
+
+ if (state.exclusive) continue;
+
+ if (inLinkUrlMode(state)) {
+ updateLink(state, i, char);
+ continue;
+ }
+
+ const delimEnd = consumeDelim(state, tail, i);
+ if (delimEnd > i) {
+ i = delimEnd - 1;
+ continue;
+ }
+
+ if (isEscapedAt(tail, i)) continue;
+
+ updateLink(state, i, char);
+ }
+
+ return state;
+}
+
+function consumeExclusive(state: TailState, tail: string, start: number) {
+ const char = tail[start];
+ if (char === "`") return consumeBackticks(state, tail, start);
+ if (char === "$") return consumeMath(state, tail, start);
+ if (char === "~") return consumeTildes(state, tail, start);
+ return start;
+}
+
+function consumeBackticks(state: TailState, tail: string, start: number) {
+ const length = runLengthAt(tail, start);
+ const token = "`".repeat(length);
+ const exclusive = state.exclusive;
+
+ if (exclusive?.kind === "fence") {
+ if (
+ exclusive.token[0] === "`" &&
+ isLineStart(tail, start) &&
+ !isEscapedAt(tail, start) &&
+ length >= exclusive.token.length
+ ) {
+ state.exclusive = null;
+ }
+ return start + length;
+ }
+
+ if (exclusive?.kind === "code") {
+ if (!isEscapedAt(tail, start) && length >= exclusive.token.length) {
+ state.exclusive = null;
+ }
+ return start + length;
+ }
+
+ if (exclusive) return start + length;
+ if (isEscapedAt(tail, start)) return start + length;
+
+ if (length >= 3 && isLineStart(tail, start)) {
+ state.exclusive = { kind: "fence", start, token };
+ return start + length;
+ }
+
+ state.exclusive = { kind: "code", start, token };
+ return start + length;
+}
+
+function consumeMath(state: TailState, tail: string, start: number) {
+ const length = runLengthAt(tail, start);
+ const exclusive = state.exclusive;
+
+ if (exclusive?.kind === "math") {
+ if (!isEscapedAt(tail, start) && length >= exclusive.token.length) {
+ state.exclusive = null;
+ }
+ return start + length;
+ }
+
+ if (exclusive) return start + length;
+ if (isEscapedAt(tail, start)) return start + length;
+
+ state.exclusive = {
+ kind: "math",
+ start,
+ token: length >= 2 ? "$$" : "$",
+ };
+ return start + length;
+}
+
+function consumeTildes(state: TailState, tail: string, start: number) {
+ const length = runLengthAt(tail, start);
+ const exclusive = state.exclusive;
+
+ if (exclusive?.kind === "fence" && exclusive.token[0] === "~") {
+ if (isLineStart(tail, start) && !isEscapedAt(tail, start) && length >= exclusive.token.length) {
+ state.exclusive = null;
+ }
+ return start + length;
+ }
+
+ if (exclusive) return start;
+ if (length < 3 || !isLineStart(tail, start) || isEscapedAt(tail, start)) return start;
+
+ state.exclusive = { kind: "fence", start, token: "~".repeat(length) };
+ return start + length;
+}
+
+function consumeDelim(state: TailState, tail: string, start: number) {
+ const token = matchDelim(tail, start);
+ if (!token) return start;
+
+ if (isEscapedAt(tail, start)) return start + token.length;
+
+ const existingIndex = state.delims.findLastIndex((delim) => delim.token === token);
+ if (existingIndex !== -1) {
+ state.delims.splice(existingIndex, 1);
+ return start + token.length;
+ }
+
+ if (!canOpenDelim(tail, start, token)) return start + token.length;
+
+ state.delims.push({ start, token });
+ return start + token.length;
+}
+
+function matchDelim(tail: string, start: number): DelimToken | undefined {
+ const char = tail[start];
+
+ if (char === "*") {
+ if (tail.startsWith("***", start)) return "***";
+ if (tail.startsWith("**", start)) return "**";
+ return "*";
+ }
+
+ if (char === "_") {
+ if (tail.startsWith("__", start)) return "__";
+ return "_";
+ }
+
+ if (char === "~" && tail.startsWith("~~", start)) {
+ return "~~";
+ }
+}
+
+function canOpenDelim(tail: string, start: number, token: DelimToken) {
+ const next = tail[start + token.length];
+ if (!next || /\s/.test(next)) return false;
+
+ const prev = tail[start - 1];
+ return !isWordChar(prev) || !isWordChar(next);
+}
+
+function updateLink(state: TailState, index: number, char: string) {
+ const top = state.links.at(-1);
+
+ if (char === "[") {
+ state.links.push({ phase: "text", start: index });
+ return;
+ }
+
+ if (char === "]" && top?.phase === "text") {
+ state.links[state.links.length - 1] = {
+ phase: "url_wait",
+ start: top.start,
+ textEnd: index,
+ };
+ return;
+ }
+
+ if (char === "(" && top?.phase === "url_wait") {
+ state.links[state.links.length - 1] = {
+ phase: "url",
+ start: top.start,
+ textEnd: top.textEnd,
+ parenDepth: 0,
+ };
+ return;
+ }
+
+ if (char === "(" && top?.phase === "url") {
+ top.parenDepth += 1;
+ return;
+ }
+
+ if (char === ")" && top?.phase === "url") {
+ if (top.parenDepth > 0) {
+ top.parenDepth -= 1;
+ return;
+ }
+
+ state.links.pop();
+ }
+}
+
+function resetParagraphState(state: TailState) {
+ state.delims.length = 0;
+ state.links.length = 0;
+
+ if (state.exclusive?.kind === "fence") return;
+ if (state.exclusive?.kind === "math" && state.exclusive.token === "$$") return;
+
+ state.exclusive = null;
+}
+
+function inLinkUrlMode(state: TailState) {
+ const phase = state.links.at(-1)?.phase;
+ return phase === "url_wait" || phase === "url";
+}
+
+function renderTail(tail: string, state: TailState) {
+ const link = state.links.at(-1);
+ if (link) return renderOpenLink(tail, link);
+
+ const nestedClosers = renderNestedClosers(state);
+ if (nestedClosers) return appendCloser(tail, nestedClosers);
+
+ const open = findLastOpen(state);
+ if (!open) return tail;
+
+ if (open.kind === "delim") {
+ if (!hasContentAfter(tail, open.start, open.token.length)) return tail;
+ return appendCloserBeforeTrailingInlineWhitespace(tail, open.token);
+ }
+
+ if (!hasContentAfter(tail, open.start, open.token.length)) return tail;
+ if (open.kind === "fence") return tail;
+ if (open.kind === "code") return appendCloser(tail, open.token);
+ if (open.token === "$$") return appendCloser(tail, (tail.endsWith("\n") ? "" : "\n") + "$$");
+ if (/\s/.test(tail[tail.length - 1] ?? "")) return tail;
+ return appendCloser(tail, "$");
+}
+
+function renderOpenLink(tail: string, state: LinkState) {
+ const before = tail.slice(0, state.start);
+
+ if (state.phase === "text") {
+ if (!hasContentAfter(tail, state.start, 1)) return tail;
+ return before + tail.slice(state.start + 1);
+ }
+
+ const text = tail.slice(state.start + 1, state.textEnd);
+ if (state.phase === "url_wait") return before + text + tail.slice(state.textEnd + 1);
+ return before + text;
+}
+
+function renderNestedClosers(state: TailState) {
+ const closers: string[] = [];
+
+ if (state.exclusive) {
+ if (state.exclusive.kind !== "code") return undefined;
+ closers.push(state.exclusive.token);
+ }
+
+ for (let i = state.delims.length - 1; i >= 0; i--) {
+ const token = state.delims[i]!.token;
+ if (!NESTABLE_DELIMS.has(token)) return undefined;
+ closers.push(token);
+ }
+
+ if (closers.length < 2) return undefined;
+ return closers.join("");
+}
+
+function appendCloser(tail: string, closer: string) {
+ return tail + closer.slice(overlapLength(tail, closer));
+}
+
+function appendCloserBeforeTrailingInlineWhitespace(tail: string, closer: string) {
+ const trailingWhitespace = tail.match(/[^\S\n]+$/)?.[0];
+ if (!trailingWhitespace) return appendCloser(tail, closer);
+
+ const body = tail.slice(0, -trailingWhitespace.length);
+ return appendCloser(body, closer) + trailingWhitespace;
+}
+
+function overlapLength(tail: string, closer: string) {
+ for (let length = Math.min(tail.length, closer.length); length > 0; length -= 1) {
+ if (tail.endsWith(closer.slice(0, length))) return length;
+ }
+ return 0;
+}
+
+function findLastOpen(state: TailState) {
+ const delim = state.delims.at(-1);
+ if (state.exclusive && (!delim || state.exclusive.start > delim.start)) return state.exclusive;
+ if (delim) return { kind: "delim" as const, start: delim.start, token: delim.token };
+ return state.exclusive;
+}
+
+function runLengthAt(text: string, start: number) {
+ let end = start + 1;
+ while (end < text.length && text[end] === text[start]) end += 1;
+ return end - start;
+}
+
+function hasContentAfter(text: string, start: number, tokenLength: number) {
+ return text.length > start + tokenLength;
+}
+
+function isLineStart(text: string, index: number) {
+ return index === 0 || text[index - 1] === "\n";
+}
+
+function isEscapedAt(text: string, index: number) {
+ let count = 0;
+
+ for (let i = index - 1; i >= 0; i--) {
+ if (text[i] !== "\\") break;
+ count += 1;
+ }
+
+ return count % 2 === 1;
+}
+
+function isWordChar(char?: string) {
+ return !!char && /[A-Za-z0-9]/.test(char);
+}
diff --git a/src/Prediction.ts b/src/Prediction.ts
deleted file mode 100644
index 8ab28aeab2a6d55b9498980c4248841813457bce..0000000000000000000000000000000000000000
--- a/src/Prediction.ts
+++ /dev/null
@@ -1,376 +0,0 @@
-/**
- * Incremental parser for predicting closing tags in Markdown text. Works best
- * when continuously appending text to the end of the string; this behavior
- * specifically triggers a fast parsing path.
- */
-export class Predict {
- #stable = "";
-
- /** Incrementally reparses the tail. */
- update(text: string) {
- if (!text.startsWith(this.#stable)) this.#stable = "";
- let tail = text.slice(this.#stable.length);
- let state = parseTail(tail);
- if (state.commitIndex > 0) {
- this.#stable += tail.slice(0, state.commitIndex);
- tail = tail.slice(state.commitIndex);
- state = parseTail(tail);
- }
- return this.#stable + renderTail(tail, state);
- }
-}
-
-type DelimToken = "***" | "**" | "__" | "~~" | "*" | "_";
-type DelimState = { start: number; token: DelimToken };
-type LinkState =
- | { phase: "text"; start: number }
- | { phase: "url_wait"; start: number; textEnd: number }
- | { phase: "url"; start: number; textEnd: number; parenDepth: number };
-type ExclusiveState =
- | { kind: "code"; start: number; token: string }
- | { kind: "fence"; start: number; token: string }
- | { kind: "math"; start: number; token: "$" | "$$" };
-interface TailState {
- commitIndex: number;
- delims: DelimState[];
- exclusive: ExclusiveState | null;
- links: LinkState[];
-};
-
-const NESTABLE_DELIMS = new Set(["*", "**", "_", "__"]);
-
-function parseTail(tail: string): TailState {
- const state: TailState = {
- commitIndex: 0,
- delims: [],
- exclusive: null,
- links: [],
- };
-
- for (let i = 0; i < tail.length; i++) {
- const char = tail[i]!;
-
- if (char === "\n" && tail[i - 1] === "\n") {
- resetParagraphState(state);
- if (!state.exclusive) state.commitIndex = i + 1;
- continue;
- }
-
- const exclusiveEnd = consumeExclusive(state, tail, i);
- if (exclusiveEnd > i) {
- i = exclusiveEnd - 1;
- continue;
- }
-
- if (state.exclusive) continue;
-
- if (inLinkUrlMode(state)) {
- updateLink(state, i, char);
- continue;
- }
-
- const delimEnd = consumeDelim(state, tail, i);
- if (delimEnd > i) {
- i = delimEnd - 1;
- continue;
- }
-
- if (isEscapedAt(tail, i)) continue;
-
- updateLink(state, i, char);
- }
-
- return state;
-}
-
-function consumeExclusive(state: TailState, tail: string, start: number) {
- const char = tail[start];
- if (char === "`") return consumeBackticks(state, tail, start);
- if (char === "$") return consumeMath(state, tail, start);
- if (char === "~") return consumeTildes(state, tail, start);
- return start;
-}
-
-function consumeBackticks(state: TailState, tail: string, start: number) {
- const length = runLengthAt(tail, start);
- const token = "`".repeat(length);
- const exclusive = state.exclusive;
-
- if (exclusive?.kind === "fence") {
- if (
- exclusive.token[0] === "`" &&
- isLineStart(tail, start) &&
- !isEscapedAt(tail, start) &&
- length >= exclusive.token.length
- ) {
- state.exclusive = null;
- }
- return start + length;
- }
-
- if (exclusive?.kind === "code") {
- if (!isEscapedAt(tail, start) && length >= exclusive.token.length) {
- state.exclusive = null;
- }
- return start + length;
- }
-
- if (exclusive) return start + length;
- if (isEscapedAt(tail, start)) return start + length;
-
- if (length >= 3 && isLineStart(tail, start)) {
- state.exclusive = { kind: "fence", start, token };
- return start + length;
- }
-
- state.exclusive = { kind: "code", start, token };
- return start + length;
-}
-
-function consumeMath(state: TailState, tail: string, start: number) {
- const length = runLengthAt(tail, start);
- const exclusive = state.exclusive;
-
- if (exclusive?.kind === "math") {
- if (!isEscapedAt(tail, start) && length >= exclusive.token.length) {
- state.exclusive = null;
- }
- return start + length;
- }
-
- if (exclusive) return start + length;
- if (isEscapedAt(tail, start)) return start + length;
-
- state.exclusive = {
- kind: "math",
- start,
- token: length >= 2 ? "$$" : "$",
- };
- return start + length;
-}
-
-function consumeTildes(state: TailState, tail: string, start: number) {
- const length = runLengthAt(tail, start);
- const exclusive = state.exclusive;
-
- if (exclusive?.kind === "fence" && exclusive.token[0] === "~") {
- if (
- isLineStart(tail, start) &&
- !isEscapedAt(tail, start) &&
- length >= exclusive.token.length
- ) {
- state.exclusive = null;
- }
- return start + length;
- }
-
- if (exclusive) return start;
- if (length < 3 || !isLineStart(tail, start) || isEscapedAt(tail, start)) return start;
-
- state.exclusive = { kind: "fence", start, token: "~".repeat(length) };
- return start + length;
-}
-
-function consumeDelim(state: TailState, tail: string, start: number) {
- const token = matchDelim(tail, start);
- if (!token) return start;
-
- if (isEscapedAt(tail, start)) return start + token.length;
-
- const existingIndex = state.delims.findLastIndex((delim) => delim.token === token);
- if (existingIndex !== -1) {
- state.delims.splice(existingIndex, 1);
- return start + token.length;
- }
-
- if (!canOpenDelim(tail, start, token)) return start + token.length;
-
- state.delims.push({ start, token });
- return start + token.length;
-}
-
-function matchDelim(tail: string, start: number): DelimToken | undefined {
- const char = tail[start];
-
- if (char === "*") {
- if (tail.startsWith("***", start)) return "***";
- if (tail.startsWith("**", start)) return "**";
- return "*";
- }
-
- if (char === "_") {
- if (tail.startsWith("__", start)) return "__";
- return "_";
- }
-
- if (char === "~" && tail.startsWith("~~", start)) {
- return "~~";
- }
-}
-
-function canOpenDelim(tail: string, start: number, token: DelimToken) {
- const next = tail[start + token.length];
- if (!next || /\s/.test(next)) return false;
-
- const prev = tail[start - 1];
- return !isWordChar(prev) || !isWordChar(next);
-}
-
-function updateLink(state: TailState, index: number, char: string) {
- const top = state.links.at(-1);
-
- if (char === "[") {
- state.links.push({ phase: "text", start: index });
- return;
- }
-
- if (char === "]" && top?.phase === "text") {
- state.links[state.links.length - 1] = {
- phase: "url_wait",
- start: top.start,
- textEnd: index,
- };
- return;
- }
-
- if (char === "(" && top?.phase === "url_wait") {
- state.links[state.links.length - 1] = {
- phase: "url",
- start: top.start,
- textEnd: top.textEnd,
- parenDepth: 0,
- };
- return;
- }
-
- if (char === "(" && top?.phase === "url") {
- top.parenDepth += 1;
- return;
- }
-
- if (char === ")" && top?.phase === "url") {
- if (top.parenDepth > 0) {
- top.parenDepth -= 1;
- return;
- }
-
- state.links.pop();
- }
-}
-
-function resetParagraphState(state: TailState) {
- state.delims.length = 0;
- state.links.length = 0;
-
- if (state.exclusive?.kind === "fence") return;
- if (state.exclusive?.kind === "math" && state.exclusive.token === "$$") return;
-
- state.exclusive = null;
-}
-
-function inLinkUrlMode(state: TailState) {
- const phase = state.links.at(-1)?.phase;
- return phase === "url_wait" || phase === "url";
-}
-
-function renderTail(tail: string, state: TailState) {
- const link = state.links.at(-1);
- if (link) return renderOpenLink(tail, link);
-
- const nestedClosers = renderNestedClosers(state);
- if (nestedClosers) return appendCloser(tail, nestedClosers);
-
- const open = findLastOpen(state);
- if (!open) return tail;
-
- if (open.kind === "delim") {
- if (!hasContentAfter(tail, open.start, open.token.length)) return tail;
- if (/\s/.test(tail[tail.length - 1] ?? "")) return tail;
- return appendCloser(tail, open.token);
- }
-
- if (!hasContentAfter(tail, open.start, open.token.length)) return tail;
- if (open.kind === "fence") return tail;
- if (open.kind === "code") return appendCloser(tail, open.token);
- if (open.token === "$$") return appendCloser(tail, (tail.endsWith("\n") ? "" : "\n") + "$$");
- if (/\s/.test(tail[tail.length - 1] ?? "")) return tail;
- return appendCloser(tail, "$");
-}
-
-function renderOpenLink(tail: string, state: LinkState) {
- const before = tail.slice(0, state.start);
-
- if (state.phase === "text") {
- if (!hasContentAfter(tail, state.start, 1)) return tail;
- return before + tail.slice(state.start + 1);
- }
-
- const text = tail.slice(state.start + 1, state.textEnd);
- if (state.phase === "url_wait") return before + text + tail.slice(state.textEnd + 1);
- return before + text;
-}
-
-function renderNestedClosers(state: TailState) {
- const closers: string[] = [];
-
- if (state.exclusive) {
- if (state.exclusive.kind !== "code") return undefined;
- closers.push(state.exclusive.token);
- }
-
- for (let i = state.delims.length - 1; i >= 0; i--) {
- const token = state.delims[i]!.token;
- if (!NESTABLE_DELIMS.has(token)) return undefined;
- closers.push(token);
- }
-
- if (closers.length < 2) return undefined;
- return closers.join("");
-}
-
-function appendCloser(tail: string, closer: string) {
- return tail + closer.slice(overlapLength(tail, closer));
-}
-
-function overlapLength(tail: string, closer: string) {
- for (let length = Math.min(tail.length, closer.length); length > 0; length -= 1) {
- if (tail.endsWith(closer.slice(0, length))) return length;
- }
- return 0;
-}
-
-function findLastOpen(state: TailState) {
- const delim = state.delims.at(-1);
- if (state.exclusive && (!delim || state.exclusive.start > delim.start)) return state.exclusive;
- if (delim) return { kind: "delim" as const, start: delim.start, token: delim.token };
- return state.exclusive;
-}
-
-function runLengthAt(text: string, start: number) {
- let end = start + 1;
- while (end < text.length && text[end] === text[start]) end += 1;
- return end - start;
-}
-
-function hasContentAfter(text: string, start: number, tokenLength: number) {
- return text.length > start + tokenLength;
-}
-
-function isLineStart(text: string, index: number) {
- return index === 0 || text[index - 1] === "\n";
-}
-
-function isEscapedAt(text: string, index: number) {
- let count = 0;
-
- for (let i = index - 1; i >= 0; i--) {
- if (text[i] !== "\\") break;
- count += 1;
- }
-
- return count % 2 === 1;
-}
-
-function isWordChar(char?: string) {
- return !!char && /[A-Za-z0-9]/.test(char);
-}
diff --git a/tests/Markdown.memoization.test.tsx b/tests/Markdown.memoization.test.tsx
index 47bf06fdf50ea290879c84bef9fe6ce7a2f2f85b..a9831dc2604f3da725917b96bfdce316343fb9ef 100644
--- a/tests/Markdown.memoization.test.tsx
+++ b/tests/Markdown.memoization.test.tsx
@@ -1,7 +1,7 @@
import { cleanup, render, screen } from "@testing-library/react";
import type { Components } from "rehype-react";
import type { ComponentPropsWithoutRef, JSX } from "react";
-import { afterEach, expect, it, vi } from "vite-plus/test";
+import { afterEach, expect, it, vi } from "vitest";
import { Markdown, MarkdownOptionsProvider } from "../src/Markdown.ts";
import { Memoizer } from "../src/Memoizer.ts";
diff --git a/tests/memoizedHastToReact.test.tsx b/tests/memoizedHastToReact.test.tsx
index c825f28f77120b3451cbbfc0cd2940c08d4a4b2d..fcffe5d1898fcb69f62f2759f902f04e559296a5 100644
--- a/tests/memoizedHastToReact.test.tsx
+++ b/tests/memoizedHastToReact.test.tsx
@@ -5,10 +5,16 @@ import remarkParse from "remark-parse";
import remarkRehype from "remark-rehype";
import { unified } from "unified";
import type { Position } from "unist";
-import { describe, expect, it } from "vite-plus/test";
+import { expect, it } from "vitest";
import { memoizedHastToReact, type RenderState } from "../src/hast.ts";
const markdownProcessor = unified().use(remarkParse).use(remarkRehype);
+type TestElementProps = Record & {
+ children?: ReactNode;
+ className?: string;
+ href?: string;
+ style?: Record;
+};
it("bails out before rereading children when given the same parent node object", () => {
const children = [element("p", [text("hello")])];
@@ -340,7 +346,8 @@ function parseMarkdown(markdown: string) {
return markdownProcessor.runSync(markdownProcessor.parse(markdown)) as Root;
}
-function getElement(node: RootContent | ElementContent) {
+function getElement(node: RootContent | ElementContent | undefined) {
+ if (!node) throw new TypeError("Expected element, got `undefined`");
if (node.type !== "element") throw new TypeError(`Expected element, got \`${node.type}\``);
return node;
}
@@ -357,9 +364,9 @@ function childrenOf(node: ReactNode) {
return Array.isArray(children) ? children : [children];
}
-function asElement(node: ReactNode): ReactElement {
+function asElement(node: ReactNode): ReactElement {
if (!node || typeof node !== "object" || !("props" in node)) {
throw new TypeError("Expected a React element");
}
- return node as ReactElement;
+ return node as ReactElement;
}
diff --git a/tests/prediction.test.ts b/tests/prediction.test.ts
index ddec48eab62e7b8d0f095b5aa18ab030255df8ca..54208f3682d19d90365084d66a86d501eb9ded64 100644
--- a/tests/prediction.test.ts
+++ b/tests/prediction.test.ts
@@ -1,5 +1,6 @@
-import { test, describe, expect } from "vite-plus/test";
-import { Predict } from "../src/Prediction.ts";
+/* oxlint-disable jest/expect-expect, jest/no-conditional-expect */
+import { describe, expect, test } from "vitest";
+import { Predict } from "../src/Predict.ts";
describe.each(["stateless", "stateful"] as const)("%s processing", (mode) => {
function stateless(text: string) {
@@ -145,7 +146,6 @@ describe.each(["stateless", "stateful"] as const)("%s processing", (mode) => {
["strike", "a ~~hello world", "a ~~hello world~~"],
["katex", "something\n\n$$\nE =", "something\n\n$$\nE =\n$$"],
-
["bold partial close", "a **hello world*", "a **hello world**"],
["bold italic partial close 1", "a ***hello world*", "a ***hello world***"],
["bold italic partial close 2", "a ***hello world**", "a ***hello world***"],
@@ -202,10 +202,14 @@ describe.each(["stateless", "stateful"] as const)("%s processing", (mode) => {
(input) => check(input, input),
);
- // TODO: these are dubious
- test.each(["hello *world ", "hello **world ", "hello _world ", "hello __world "])(
- "does not add a closer after trailing whitespace for %j",
- (input) => check(input, input),
+ test.each([
+ ["hello *world ", "hello *world* "],
+ ["hello **world ", "hello **world** "],
+ ["hello _world ", "hello _world_ "],
+ ["hello __world ", "hello __world__ "],
+ ])(
+ "closes before trailing whitespace for %j",
+ (input, expected) => check(input, expected),
);
});
diff --git a/tsconfig.json b/tsconfig.json
index 13eedbb71fce47c30fc1b2f07b0878502fb53089..60c7e67bafa67bcc43515e61b42a352d947c3ca9 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -12,7 +12,6 @@
"allowImportingTsExtensions": true,
"noUncheckedIndexedAccess": true,
"noUnusedLocals": true,
- "declaration": true,
"noEmit": true,
"esModuleInterop": true,
"isolatedModules": true,
@@ -20,5 +19,5 @@
"skipLibCheck": true,
"jsx": "react-jsx"
},
- "include": ["src"]
+ "include": ["src", "tests", "example", "vite.config.ts"]
}
diff --git a/vite.config.ts b/vite.config.ts
index 64d99c62b02db84125c17217b9f573692e019971..65f8522f24debc6997f297b444be8d6e520eaf90 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,23 +1,10 @@
import react from "@vitejs/plugin-react";
import tailwindcss from "@tailwindcss/vite";
-import { defineConfig } from "vite-plus";
+import { defineConfig } from "vitest/config";
export default defineConfig({
plugins: [react(), tailwindcss()],
- pack: {
- dts: {
- tsgo: true,
- },
- exports: true,
- },
- lint: {
- options: {
- typeAware: true,
- typeCheck: true,
- },
- },
test: {
environment: "happy-dom",
},
- fmt: {},
});