diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8e7e5ab..68039a5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,6 +3,7 @@ name: CI on: push: branches: [main] + tags: ["v*"] pull_request: branches: [main] @@ -41,11 +42,63 @@ jobs: - name: WASM build (fd-host-web) run: cargo build -p fd-host-web --target wasm32-unknown-unknown + # 依赖漏洞门禁(商用加固项 #1)。 + # 失败不阻断主流程:cargo-audit 报告 advisories,作为早期预警。 + audit: + name: cargo-audit (advisory scan) + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v4 + + - name: Install Rust toolchain (1.94) + uses: dtolnay/rust-toolchain@stable + with: + toolchain: "1.94" + + - name: Install cargo-audit + run: cargo install cargo-audit --locked + + - name: Audit dependencies for known advisories + run: cargo audit + + # 生产代码零 panic 门禁(商用加固项 #3)。 + # 当前基线:所有 panic!/unimplemented!/todo!/unreachable! 均在 #[cfg(test)] 模块内。 + # 任何生产代码顶层 panic 语句将使该 job 失败,防未来回归。 + deny-panic: + name: deny panic in production code + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Scan for top-level panic statements in non-test source + run: | + set -euo pipefail + # 检测 src/ 文件中行首的 panic!/unimplemented!/todo!/unreachable! 语句。 + # 测试模块内(mod tests)的 panic! 在 match 臂断言中形如 "=> panic!(", + # 故排除含 "=>" 的行与 tests 路径,聚焦生产顶层语句。 + # 注意:grep 无匹配返回非零,pipefail 下会触发 set -e 提前退出, + # 故用 || true 兜底,确保"零匹配"场景能正常走到 echo 与判断。 + strict=$(grep -rnE "^\s*(panic!|unimplemented!|todo!|unreachable!)\(" \ + crates/*/src/*.rs 2>/dev/null \ + | grep -vE "tests|=>" \ + | wc -l | tr -d ' ' || true) + echo "生产代码顶层 panic 语句数: $strict" + if [ "$strict" -ne 0 ]; then + echo "::error::生产代码含顶层 panic/unimplemented/todo/unreachable 语句,违反商用零 panic 约束" + grep -rnE "^\s*(panic!|unimplemented!|todo!|unreachable!)\(" \ + crates/*/src/*.rs 2>/dev/null | grep -vE "tests|=>" || true + exit 1 + fi + + # 发布打包:改为 tag 触发 + continue-on-error(商用加固项 #2)。 + # macos-14 runner 供给瓶颈不应阻塞 main CI 恒绿;tag 推送时尽力出包。 release-pack: name: release tarball (apple silicon) runs-on: macos-14 - if: github.ref == 'refs/heads/main' + if: startsWith(github.ref, 'refs/tags/v') needs: build-test + continue-on-error: true steps: - uses: actions/checkout@v4 diff --git a/Cargo.lock b/Cargo.lock index aab2d37..ef65699 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,12 +10,12 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aes" -version = "0.8.4" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +checksum = "f8eb277bec05f56a0e0591f155a484cbd0f4f07ff2905051a48c72f004f7ed58" dependencies = [ - "cfg-if", "cipher", + "cpubits", "cpufeatures", ] @@ -68,60 +68,26 @@ dependencies = [ ] [[package]] -name = "allsorts" -version = "0.16.1" +name = "allsorts-azul" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ba21c7f883cc76d76a41910815b1b212e1ca7870af2bd551565282140660ca5" +checksum = "ab097a7be305dd66b2b6917f5efb6b723129ce4b2cd11aa1a0afcc293c7dc08e" dependencies = [ "bitflags 2.13.1", - "bitreader", - "brotli-decompressor 5.0.3", - "byteorder", - "crc32fast", + "brotli-decompressor", "encoding_rs", + "enumflags2", "flate2", "glyph-names", - "itertools 0.10.5", - "lazy_static", - "libc", "log", - "num-traits", "ouroboros", "pathfinder_geometry", - "rustc-hash 1.1.0", + "rustc-hash", "tinyvec", "ucd-trie", - "unicode-canonical-combining-class 1.0.0", - "unicode-general-category 1.1.0", - "unicode-joining-type 1.0.0", -] - -[[package]] -name = "allsorts-subset-browser" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "318f830be541711fe34053ec9c0db9d1bc8eb751ce20baa73e03c2d436015d8b" -dependencies = [ - "bitflags 1.3.2", - "bitreader", - "brotli-decompressor 4.0.3", - "byteorder", - "crc32fast", - "encoding_rs", - "flate2", - "glyph-names", - "itertools 0.10.5", - "lazy_static", - "log", - "num-traits", - "ouroboros", - "pathfinder_geometry", - "rustc-hash 1.1.0", - "tinyvec", - "ucd-trie", - "unicode-canonical-combining-class 0.5.0", - "unicode-general-category 0.6.0", - "unicode-joining-type 0.7.0", + "unicode-canonical-combining-class", + "unicode-general-category", + "unicode-joining-type", ] [[package]] @@ -281,7 +247,7 @@ dependencies = [ "anyhow", "arrayvec", "log", - "nom 8.0.0", + "nom", "num-rational", "v_frame", ] @@ -295,54 +261,6 @@ dependencies = [ "arrayvec", ] -[[package]] -name = "azul-core" -version = "0.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9826025454fb19905e7aca1c1db2a525f02fff1f63e4b09985a1afcef22753e5" -dependencies = [ - "azul-css", - "gl-context-loader", - "highway", - "libm", - "rust-fontconfig", -] - -[[package]] -name = "azul-css" -version = "0.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6b0c205607826ce8869efb5edd583c2e6ba0c8603c91cff112137d880efd702" -dependencies = [ - "azul-simplecss", - "libm", -] - -[[package]] -name = "azul-layout" -version = "0.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2bb0479332aa5ed9566188c3af86c5ddec03eb4867e4b0858df7fdb08303d" -dependencies = [ - "allsorts-subset-browser", - "azul-core", - "azul-css", - "image", - "roxmltree 0.14.1", - "rust-fontconfig", - "tinyvec", - "ttf-parser 0.15.2", - "unicode-normalization", - "xmlparser", - "xmlwriter", -] - -[[package]] -name = "azul-simplecss" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78201f8943993f37a3d6d2bbe5fa9a5ab01fac09140848fee98f1551df91bb8a" - [[package]] name = "base64" version = "0.22.1" @@ -367,15 +285,6 @@ version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" -[[package]] -name = "bitreader" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "886559b1e163d56c765bc3a985febb4eee8009f625244511d8ee3c432e08c066" -dependencies = [ - "cfg-if", -] - [[package]] name = "bitstream-io" version = "4.10.0" @@ -387,30 +296,20 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.10.4" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" dependencies = [ - "generic-array", + "hybrid-array", ] [[package]] name = "block-padding" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" -dependencies = [ - "generic-array", -] - -[[package]] -name = "brotli-decompressor" -version = "4.0.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a334ef7c9e23abf0ce748e8cd309037da93e606ad52eb372e4ce327a0dcfbdfd" +checksum = "710f1dd022ef4e93f8a438b4ba958de7f64308434fa6a87104481645cc30068b" dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", + "hybrid-array", ] [[package]] @@ -435,31 +334,11 @@ version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" -[[package]] -name = "bytecount" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" - [[package]] name = "bytemuck" version = "1.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0e56a716f1e132ff6bf4bdac1c944a3fcdc1cae65f70a4a2a1ac3b401d2d1f" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] [[package]] name = "byteorder" @@ -481,9 +360,9 @@ checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "cbc" -version = "0.1.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +checksum = "ce2dc9ee5f88d11e0beb842c88b33c8a5cf0d1329c4b19494af42b07dbfe8896" dependencies = [ "cipher", ] @@ -506,11 +385,22 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures", + "rand_core 0.10.1", +] + [[package]] name = "cipher" -version = "0.4.4" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +checksum = "e8cf2a2c93cd704877c0858356ed03480ff301ee950b43f1cbe4573b088bfa6c" dependencies = [ "crypto-common", "inout", @@ -569,10 +459,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] -name = "convert_case" -version = "0.4.0" +name = "const-oid" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" [[package]] name = "core-foundation" @@ -609,11 +499,17 @@ dependencies = [ "libm", ] +[[package]] +name = "cpubits" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b85f9c39137c3a891689859392b1bd49812121d0d61c9caf00d46ed5ce06ae" + [[package]] name = "cpufeatures" -version = "0.2.17" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" dependencies = [ "libc", ] @@ -660,29 +556,11 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" -version = "0.1.7" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "cssparser" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" -dependencies = [ - "cssparser-macros", - "dtoa-short", - "itoa 0.4.8", - "matches", - "phf 0.8.0", - "proc-macro2", - "quote", - "smallvec", - "syn 1.0.109", + "hybrid-array", ] [[package]] @@ -693,8 +571,8 @@ checksum = "b7c66d1cd8ed61bf80b38432613a7a2f09401ab8d0501110655f8b341484a3e3" dependencies = [ "cssparser-macros", "dtoa-short", - "itoa 1.0.18", - "phf 0.11.3", + "itoa", + "phf", "smallvec", ] @@ -719,9 +597,6 @@ name = "deranged" version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" -dependencies = [ - "serde_core", -] [[package]] name = "derive_more" @@ -729,20 +604,19 @@ version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ - "convert_case", "proc-macro2", "quote", - "rustc_version", "syn 2.0.119", ] [[package]] name = "digest" -version = "0.10.7" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ "block-buffer", + "const-oid", "crypto-common", ] @@ -772,6 +646,15 @@ dependencies = [ "dtoa", ] +[[package]] +name = "ecb" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbfbf3db731928d6912bc3beda911d55b834cee3df6131ba79b337a1298a3fa9" +dependencies = [ + "cipher", +] + [[package]] name = "ego-tree" version = "0.10.0" @@ -793,6 +676,26 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "equator" version = "0.4.2" @@ -1083,36 +986,16 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "font-types" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b38ad915f6dadd993ced50848a8291a543bd41ca62bc10740d5e64e2ab4cfd7" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "fontconfig-parser" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" -dependencies = [ - "roxmltree 0.20.0", -] - [[package]] name = "fontdb" version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905" dependencies = [ - "fontconfig-parser", "log", - "memmap2", "slotmap", "tinyvec", - "ttf-parser 0.25.1", + "ttf-parser", ] [[package]] @@ -1255,16 +1138,6 @@ dependencies = [ "byteorder", ] -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - [[package]] name = "getopts" version = "0.2.24" @@ -1274,17 +1147,6 @@ dependencies = [ "unicode-width", ] -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - [[package]] name = "getrandom" version = "0.2.17" @@ -1293,7 +1155,7 @@ checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", ] [[package]] @@ -1315,18 +1177,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi 6.0.0", -] - -[[package]] -name = "gif" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" -dependencies = [ - "color_quant", - "weezl", + "rand_core 0.10.1", + "wasm-bindgen", ] [[package]] @@ -1336,15 +1191,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" dependencies = [ "color_quant", - "weezl", + "weezl 0.1.12", ] -[[package]] -name = "gl-context-loader" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca63cb2488b847c12d1ca56034ba0f15613972c0dc0f8a957f525707567b23d" - [[package]] name = "glyph-names" version = "0.2.0" @@ -1405,26 +1254,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "highway" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1489f81ead4b71a09ddeab6850c0356c0932587637d753f21ee1010ab875b013" - -[[package]] -name = "html5ever" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" -dependencies = [ - "log", - "mac", - "markup5ever 0.10.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "html5ever" version = "0.29.1" @@ -1433,7 +1262,7 @@ checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" dependencies = [ "log", "mac", - "markup5ever 0.14.1", + "markup5ever", "match_token", ] @@ -1444,7 +1273,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" dependencies = [ "bytes", - "itoa 1.0.18", + "itoa", ] [[package]] @@ -1476,6 +1305,15 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +[[package]] +name = "hybrid-array" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" +dependencies = [ + "typenum", +] + [[package]] name = "hyper" version = "1.11.0" @@ -1490,7 +1328,7 @@ dependencies = [ "http", "http-body", "httparse", - "itoa 1.0.18", + "itoa", "pin-project-lite", "smallvec", "tokio", @@ -1666,7 +1504,7 @@ dependencies = [ "byteorder-lite", "color_quant", "exr", - "gif 0.14.2", + "gif", "image-webp", "moxcms", "num-traits", @@ -1676,8 +1514,8 @@ dependencies = [ "rayon", "rgb", "tiff", - "zune-core 0.5.1", - "zune-jpeg 0.5.15", + "zune-core", + "zune-jpeg", ] [[package]] @@ -1734,12 +1572,12 @@ dependencies = [ [[package]] name = "inout" -version = "0.1.4" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +checksum = "4250ce6452e92010fdf7268ccc5d14faa80bb12fc741938534c58f16804e03c7" dependencies = [ "block-padding", - "generic-array", + "hybrid-array", ] [[package]] @@ -1774,15 +1612,6 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.14.0" @@ -1792,12 +1621,6 @@ dependencies = [ "either", ] -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - [[package]] name = "itoa" version = "1.0.18" @@ -1845,18 +1668,6 @@ dependencies = [ "libc", ] -[[package]] -name = "kuchiki" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358" -dependencies = [ - "cssparser 0.27.2", - "html5ever 0.25.2", - "matches", - "selectors 0.22.0", -] - [[package]] name = "kurbo" version = "0.11.3" @@ -1868,18 +1679,6 @@ dependencies = [ "smallvec", ] -[[package]] -name = "kurbo" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b60dfc32f652b926df6192e55525b16d186c69d47876c3ead4da5cc9f8450e2" -dependencies = [ - "arrayvec", - "euclid", - "polycool", - "smallvec", -] - [[package]] name = "lazy_static" version = "1.5.0" @@ -1952,24 +1751,28 @@ dependencies = [ [[package]] name = "lopdf" -version = "0.35.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7c1d3350d071cb86987a6bcb205c7019a0eb70dcad92b454fec722cca8d68b" +checksum = "5e2ec995d822e05cabc3f06d196ee43650af3fe4fe38012cacb35e0c3d113b68" dependencies = [ "aes", + "bitflags 2.13.1", "cbc", + "ecb", "encoding_rs", "flate2", + "getrandom 0.4.3", "indexmap", - "itoa 1.0.18", + "itoa", "log", "md-5", - "nom 7.1.3", - "nom_locate", + "nom", + "rand 0.10.2", "rangemap", + "sha2", + "stringprep", "thiserror 2.0.19", - "time", - "weezl", + "weezl 0.2.1", ] [[package]] @@ -1978,20 +1781,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" -[[package]] -name = "markup5ever" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" -dependencies = [ - "log", - "phf 0.8.0", - "phf_codegen 0.8.0", - "string_cache", - "string_cache_codegen", - "tendril", -] - [[package]] name = "markup5ever" version = "0.14.1" @@ -1999,8 +1788,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" dependencies = [ "log", - "phf 0.11.3", - "phf_codegen 0.11.3", + "phf", + "phf_codegen", "string_cache", "string_cache_codegen", "tendril", @@ -2026,12 +1815,6 @@ dependencies = [ "regex-automata", ] -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - [[package]] name = "maybe-rayon" version = "0.1.1" @@ -2044,9 +1827,9 @@ dependencies = [ [[package]] name = "md-5" -version = "0.10.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" dependencies = [ "cfg-if", "digest", @@ -2058,27 +1841,12 @@ version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" -[[package]] -name = "memmap2" -version = "0.9.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" -dependencies = [ - "libc", -] - [[package]] name = "mime" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "miniz_oxide" version = "0.8.9" @@ -2097,20 +1865,10 @@ checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", "log", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "windows-sys 0.61.2", ] -[[package]] -name = "mmapio" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0204e2cac68f5b2e35b7ec8cb5d906f6e58e78dad8066a30b6ee54da99bb03dd" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "moxcms" version = "0.8.1" @@ -2153,22 +1911,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "nodrop" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - [[package]] name = "nom" version = "8.0.0" @@ -2178,17 +1920,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "nom_locate" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e3c83c053b0713da60c5b8de47fe8e494fe3ece5267b2f23090a07a053ba8f3" -dependencies = [ - "bytecount", - "memchr", - "nom 7.1.3", -] - [[package]] name = "noop_proc_macro" version = "0.3.0" @@ -2359,9 +2090,9 @@ dependencies = [ [[package]] name = "ouroboros" -version = "0.17.2" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2ba07320d39dfea882faa70554b4bd342a5f273ed59ba7c1c6b4c840492c954" +checksum = "1e0f050db9c44b97a94723127e6be766ac5c340c48f2c4bb3ffa11713744be59" dependencies = [ "aliasable", "ouroboros_macro", @@ -2370,13 +2101,13 @@ dependencies = [ [[package]] name = "ouroboros_macro" -version = "0.17.2" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec4c6225c69b4ca778c0aea097321a64c421cf4577b331c61b229267edabb6f8" +checksum = "3c7028bdd3d43083f6d8d4d5187680d0d3560d54df4cc9d752005268b41e64d0" dependencies = [ "heck 0.4.1", - "proc-macro-error", "proc-macro2", + "proc-macro2-diagnostics", "quote", "syn 2.0.119", ] @@ -2435,73 +2166,30 @@ dependencies = [ "rustc_version", ] -[[package]] -name = "pdf-writer" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5df03c7d216de06f93f398ef06f1385a60f2c597bb96f8195c8d98e08a26b1d5" -dependencies = [ - "bitflags 2.13.1", - "itoa 1.0.18", - "memchr", - "ryu", -] - [[package]] name = "percent-encoding" version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" -[[package]] -name = "phf" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" -dependencies = [ - "phf_macros 0.8.0", - "phf_shared 0.8.0", - "proc-macro-hack", -] - [[package]] name = "phf" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ - "phf_macros 0.11.3", - "phf_shared 0.11.3", -] - -[[package]] -name = "phf_codegen" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" -dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", + "phf_macros", + "phf_shared", ] [[package]] -name = "phf_codegen" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" -dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", -] - -[[package]] -name = "phf_generator" -version = "0.8.0" +name = "phf_codegen" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ - "phf_shared 0.8.0", - "rand 0.7.3", + "phf_generator", + "phf_shared", ] [[package]] @@ -2510,53 +2198,30 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ - "phf_shared 0.11.3", + "phf_shared", "rand 0.8.7", ] -[[package]] -name = "phf_macros" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" -dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", - "proc-macro-hack", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "phf_macros" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", + "phf_generator", + "phf_shared", "proc-macro2", "quote", "syn 2.0.119", ] -[[package]] -name = "phf_shared" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" -dependencies = [ - "siphasher 0.3.11", -] - [[package]] name = "phf_shared" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ - "siphasher 1.0.3", + "siphasher", ] [[package]] @@ -2603,15 +2268,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "polycool" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50596ddc09eb5ad5f75cacd40209568e66df71baf86e1499a0e99c4cff12a5a6" -dependencies = [ - "arrayvec", -] - [[package]] name = "potential_utf" version = "0.1.5" @@ -2644,68 +2300,45 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "printpdf" -version = "0.8.2" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c008a86116be6addc2101202dccc3c59fef7760e325c3b24aaed255f075285c9" +checksum = "8830a8a6c6431286333c8a64d109f7f0e7e050270c8b8eba0a4c541626059da5" dependencies = [ - "allsorts-subset-browser", - "azul-core", - "azul-css", - "azul-layout", + "allsorts-azul", "base64", "flate2", - "image", - "kuchiki", + "getrandom 0.4.3", "lopdf", - "rust-fontconfig", "serde", "serde_derive", "serde_json", - "svg2pdf", + "smallvec", "time", "wasm-bindgen", "wasm-bindgen-futures", - "weezl", - "xmlparser", + "weezl 0.2.1", ] [[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "proc-macro2" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", + "unicode-ident", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "proc-macro2-diagnostics" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", + "syn 2.0.119", "version_check", -] - -[[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" - -[[package]] -name = "proc-macro2" -version = "1.0.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" -dependencies = [ - "unicode-ident", + "yansi", ] [[package]] @@ -2792,20 +2425,6 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", - "rand_pcg", -] - [[package]] name = "rand" version = "0.8.7" @@ -2821,18 +2440,19 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" dependencies = [ - "rand_chacha 0.9.0", + "rand_chacha", "rand_core 0.9.5", ] [[package]] -name = "rand_chacha" -version = "0.2.2" +name = "rand" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", ] [[package]] @@ -2845,15 +2465,6 @@ dependencies = [ "rand_core 0.9.5", ] -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - [[package]] name = "rand_core" version = "0.6.4" @@ -2870,22 +2481,10 @@ dependencies = [ ] [[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_pcg" -version = "0.2.1" +name = "rand_core" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" -dependencies = [ - "rand_core 0.5.1", -] +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" [[package]] name = "rangemap" @@ -2909,7 +2508,7 @@ dependencies = [ "built", "cfg-if", "interpolate_name", - "itertools 0.14.0", + "itertools", "libc", "libfuzzer-sys", "log", @@ -2921,7 +2520,7 @@ dependencies = [ "paste", "profiling", "rand 0.9.5", - "rand_chacha 0.9.0", + "rand_chacha", "simd_helpers", "thiserror 2.0.19", "v_frame", @@ -2972,16 +2571,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "read-fonts" -version = "0.39.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4ed38b89c2c77ff968c524145ad65fb010f38af5c7a224b53b81d47ac2daa81" -dependencies = [ - "bytemuck", - "font-types", -] - [[package]] name = "reborrow" version = "0.5.5" @@ -3063,15 +2652,12 @@ version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" dependencies = [ - "gif 0.13.3", - "image-webp", "log", "pico-args", "rgb", "svgtypes", "tiny-skia", "usvg", - "zune-jpeg 0.4.21", ] [[package]] @@ -3097,39 +2683,12 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "roxmltree" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b" -dependencies = [ - "xmlparser", -] - [[package]] name = "roxmltree" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" -[[package]] -name = "rust-fontconfig" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "996b6c6a909f7448e04410d370d7db66f4f30f7467214b7ac20e7c3e59ba6948" -dependencies = [ - "allsorts", - "base64", - "mmapio", - "xmlparser", -] - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc-hash" version = "2.1.3" @@ -3208,7 +2767,7 @@ dependencies = [ "core_maths", "log", "smallvec", - "ttf-parser 0.25.1", + "ttf-parser", "unicode-bidi-mirroring", "unicode-ccc", "unicode-properties", @@ -3251,12 +2810,12 @@ version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc3d051b884f40e309de6c149734eab57aa8cc1347992710dc80bcc1c2194c15" dependencies = [ - "cssparser 0.34.0", + "cssparser", "ego-tree", "getopts", - "html5ever 0.29.1", + "html5ever", "precomputed-hash", - "selectors 0.26.0", + "selectors", "tendril", ] @@ -3283,26 +2842,6 @@ dependencies = [ "libc", ] -[[package]] -name = "selectors" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" -dependencies = [ - "bitflags 1.3.2", - "cssparser 0.27.2", - "derive_more", - "fxhash", - "log", - "matches", - "phf 0.8.0", - "phf_codegen 0.8.0", - "precomputed-hash", - "servo_arc 0.1.1", - "smallvec", - "thin-slice", -] - [[package]] name = "selectors" version = "0.26.0" @@ -3310,15 +2849,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd568a4c9bb598e291a08244a5c1f5a8a6650bee243b5b0f8dbb3d9cc1d87fe8" dependencies = [ "bitflags 2.13.1", - "cssparser 0.34.0", + "cssparser", "derive_more", "fxhash", "log", "new_debug_unreachable", - "phf 0.11.3", - "phf_codegen 0.11.3", + "phf", + "phf_codegen", "precomputed-hash", - "servo_arc 0.4.3", + "servo_arc", "smallvec", ] @@ -3364,7 +2903,7 @@ version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ - "itoa 1.0.18", + "itoa", "memchr", "serde", "serde_core", @@ -3378,28 +2917,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.18", + "itoa", "ryu", "serde", ] [[package]] name = "servo_arc" -version = "0.1.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" dependencies = [ - "nodrop", "stable_deref_trait", ] [[package]] -name = "servo_arc" -version = "0.4.3" +name = "sha2" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ - "stable_deref_trait", + "cfg-if", + "cpufeatures", + "digest", ] [[package]] @@ -3441,28 +2981,12 @@ dependencies = [ "log", ] -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - [[package]] name = "siphasher" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" -[[package]] -name = "skrifa" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c34617370ae968efb7161bb2beb517d9084659aae19e24b89e3db25b46e4564" -dependencies = [ - "bytemuck", - "read-fonts", -] - [[package]] name = "slab" version = "0.4.12" @@ -3483,6 +3007,9 @@ name = "smallvec" version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +dependencies = [ + "serde", +] [[package]] name = "socket2" @@ -3523,7 +3050,7 @@ checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" dependencies = [ "new_debug_unreachable", "parking_lot", - "phf_shared 0.11.3", + "phf_shared", "precomputed-hash", "serde", ] @@ -3534,29 +3061,28 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", + "phf_generator", + "phf_shared", "proc-macro2", "quote", ] [[package]] -name = "strsim" -version = "0.11.1" +name = "stringprep" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] [[package]] -name = "subsetter" -version = "0.2.6" +name = "strsim" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38803281d1c23166c5ebcb455439a5d2afe711cc909cf88af72448c297756ad6" -dependencies = [ - "kurbo 0.13.1", - "rustc-hash 2.1.3", - "skrifa", - "write-fonts", -] +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" @@ -3564,45 +3090,14 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" -[[package]] -name = "svg2pdf" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e50dc062439cc1a396181059c80932a6e6bd731b130e674c597c0c8874b6df22" -dependencies = [ - "fontdb", - "image", - "log", - "miniz_oxide", - "once_cell", - "pdf-writer", - "resvg", - "siphasher 1.0.3", - "subsetter", - "tiny-skia", - "ttf-parser 0.25.1", - "usvg", -] - [[package]] name = "svgtypes" version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" dependencies = [ - "kurbo 0.11.3", - "siphasher 1.0.3", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "kurbo", + "siphasher", ] [[package]] @@ -3704,12 +3199,6 @@ dependencies = [ "utf-8", ] -[[package]] -name = "thin-slice" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" - [[package]] name = "thiserror" version = "1.0.69" @@ -3769,8 +3258,8 @@ dependencies = [ "flate2", "half", "quick-error", - "weezl", - "zune-jpeg 0.5.15", + "weezl 0.1.12", + "zune-jpeg", ] [[package]] @@ -3784,7 +3273,6 @@ dependencies = [ "powerfmt", "serde_core", "time-core", - "time-macros", ] [[package]] @@ -3793,16 +3281,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" -[[package]] -name = "time-macros" -version = "0.2.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" -dependencies = [ - "num-conv", - "time-core", -] - [[package]] name = "tiny-skia" version = "0.11.4" @@ -4026,12 +3504,6 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "ttf-parser" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd" - [[package]] name = "ttf-parser" version = "0.25.1" @@ -4065,12 +3537,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" -[[package]] -name = "unicode-canonical-combining-class" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6925586af9268182c711e47c0853ed84131049efaca41776d0ca97f983865c32" - [[package]] name = "unicode-canonical-combining-class" version = "1.0.0" @@ -4083,12 +3549,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" -[[package]] -name = "unicode-general-category" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2281c8c1d221438e373249e065ca4989c4c36952c211ff21a0ee91c44a3869e7" - [[package]] name = "unicode-general-category" version = "1.1.0" @@ -4101,12 +3561,6 @@ version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" -[[package]] -name = "unicode-joining-type" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22f8cb47ccb8bc750808755af3071da4a10dcd147b68fc874b7ae4b12543f6f5" - [[package]] name = "unicode-joining-type" version = "1.0.0" @@ -4175,13 +3629,13 @@ dependencies = [ "flate2", "fontdb", "imagesize", - "kurbo 0.11.3", + "kurbo", "log", "pico-args", - "roxmltree 0.20.0", + "roxmltree", "rustybuzz", "simplecss", - "siphasher 1.0.3", + "siphasher", "strict-num", "svgtypes", "tiny-skia-path", @@ -4257,12 +3711,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -4363,20 +3811,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "weezl" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +checksum = "d4ca08e5ef825b65b056d9efbd95c8750683f0a6d0466d02e96dc2e4e360f3d2" [[package]] name = "winapi-util" @@ -4387,12 +3825,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - [[package]] name = "windows-link" version = "0.2.1" @@ -4516,31 +3948,12 @@ version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" -[[package]] -name = "write-fonts" -version = "0.48.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb731d4c4d93eacc69a1ad2f270f905788a98e4a3438267bcafbe08d3431c8d8" -dependencies = [ - "font-types", - "indexmap", - "kurbo 0.13.1", - "log", - "read-fonts", -] - [[package]] name = "writeable" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" -[[package]] -name = "xmlparser" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" - [[package]] name = "xmlwriter" version = "0.1.0" @@ -4553,6 +3966,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + [[package]] name = "yoke" version = "0.8.3" @@ -4662,12 +4081,6 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" -[[package]] -name = "zune-core" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" - [[package]] name = "zune-core" version = "0.5.1" @@ -4683,20 +4096,11 @@ dependencies = [ "simd-adler32", ] -[[package]] -name = "zune-jpeg" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" -dependencies = [ - "zune-core 0.4.12", -] - [[package]] name = "zune-jpeg" version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" dependencies = [ - "zune-core 0.5.1", + "zune-core", ] diff --git a/crates/fd-canvas-core/src/lib.rs b/crates/fd-canvas-core/src/lib.rs index 263933c..351c7d6 100644 --- a/crates/fd-canvas-core/src/lib.rs +++ b/crates/fd-canvas-core/src/lib.rs @@ -631,14 +631,32 @@ fn compute_flex_layout( }, ..Default::default() }; - let id = taffy_tree.new_leaf(child_style).unwrap(); + let id = match taffy_tree.new_leaf(child_style) { + Ok(id) => id, + Err(e) => { + tracing::warn!(error = %e, "Taffy new_leaf 失败,回退自由布局"); + let mut results = Vec::new(); + for child in &parent.children { + compute_node_layout(child, abs_x, abs_y, &mut results); + } + return results; + } + }; child_ids.push(id); node_map.push((id, child.id.clone())); } - let root_id = taffy_tree - .new_with_children(parent_style, &child_ids) - .unwrap(); + let root_id = match taffy_tree.new_with_children(parent_style, &child_ids) { + Ok(id) => id, + Err(e) => { + tracing::warn!(error = %e, "Taffy new_with_children 失败,回退自由布局"); + let mut results = Vec::new(); + for child in &parent.children { + compute_node_layout(child, abs_x, abs_y, &mut results); + } + return results; + } + }; let available = taffy::Size { width: taffy::AvailableSpace::Definite(parent.w), @@ -655,14 +673,18 @@ fn compute_flex_layout( let mut results = Vec::new(); for (taffy_id, node_id) in &node_map { - let layout = taffy_tree.layout(*taffy_id).unwrap(); - results.push(ComputedLayout { - node_id: node_id.clone(), - x: abs_x + layout.location.x, - y: abs_y + layout.location.y, - w: layout.size.width, - h: layout.size.height, - }); + match taffy_tree.layout(*taffy_id) { + Ok(layout) => results.push(ComputedLayout { + node_id: node_id.clone(), + x: abs_x + layout.location.x, + y: abs_y + layout.location.y, + w: layout.size.width, + h: layout.size.height, + }), + Err(e) => { + tracing::warn!(error = %e, node_id = %node_id, "Taffy layout 读取失败,跳过该节点"); + } + } } results } @@ -742,14 +764,32 @@ fn compute_grid_layout( }; } - let id = taffy_tree.new_leaf(child_style).unwrap(); + let id = match taffy_tree.new_leaf(child_style) { + Ok(id) => id, + Err(e) => { + tracing::warn!(error = %e, "Taffy new_leaf 失败,回退自由布局"); + let mut results = Vec::new(); + for child in &parent.children { + compute_node_layout(child, abs_x, abs_y, &mut results); + } + return results; + } + }; child_ids.push(id); node_map.push((id, child.id.clone())); } - let root_id = taffy_tree - .new_with_children(parent_style, &child_ids) - .unwrap(); + let root_id = match taffy_tree.new_with_children(parent_style, &child_ids) { + Ok(id) => id, + Err(e) => { + tracing::warn!(error = %e, "Taffy new_with_children 失败,回退自由布局"); + let mut results = Vec::new(); + for child in &parent.children { + compute_node_layout(child, abs_x, abs_y, &mut results); + } + return results; + } + }; let available = taffy::Size { width: taffy::AvailableSpace::Definite(parent.w), @@ -766,14 +806,18 @@ fn compute_grid_layout( let mut results = Vec::new(); for (taffy_id, node_id) in &node_map { - let layout = taffy_tree.layout(*taffy_id).unwrap(); - results.push(ComputedLayout { - node_id: node_id.clone(), - x: abs_x + layout.location.x, - y: abs_y + layout.location.y, - w: layout.size.width, - h: layout.size.height, - }); + match taffy_tree.layout(*taffy_id) { + Ok(layout) => results.push(ComputedLayout { + node_id: node_id.clone(), + x: abs_x + layout.location.x, + y: abs_y + layout.location.y, + w: layout.size.width, + h: layout.size.height, + }), + Err(e) => { + tracing::warn!(error = %e, node_id = %node_id, "Taffy layout 读取失败,跳过该节点"); + } + } } results } diff --git a/crates/fd-export/Cargo.toml b/crates/fd-export/Cargo.toml index 651491a..4717e3b 100644 --- a/crates/fd-export/Cargo.toml +++ b/crates/fd-export/Cargo.toml @@ -25,7 +25,10 @@ tokio = { workspace = true } fd-canvas-core = { path = "../fd-canvas-core" } fd-design-system = { path = "../fd-design-system" } resvg = { version = "0.45", default-features = false, features = ["text"] } -printpdf = "0.8" +# printpdf 0.12: lopdf 0.44 修复 RUSTSEC-2026-0187(深层嵌套 PDF 栈溢出)。 +# 关闭默认 html feature(避免拉入 azul-layout/svg2pdf 等重依赖), +# 我们仅用 ops::Op 内置字体 API,无需 HTML/CSS 排版。 +printpdf = { version = "0.12", default-features = false } [dev-dependencies] tempfile = "3" diff --git a/crates/fd-export/src/lib.rs b/crates/fd-export/src/lib.rs index a4f72d8..77fab5a 100644 --- a/crates/fd-export/src/lib.rs +++ b/crates/fd-export/src/lib.rs @@ -398,9 +398,9 @@ fn render_pdf(page: &CanvasPage, file: &Path) -> anyhow::Result<()> { let text = el.text.as_deref().unwrap_or(""); let fs = el.font_size.unwrap_or(12.0); ops.push(printpdf::ops::Op::StartTextSection); - ops.push(printpdf::ops::Op::SetFontSizeBuiltinFont { + ops.push(printpdf::ops::Op::SetFont { + font: printpdf::ops::PdfFontHandle::Builtin(printpdf::BuiltinFont::Helvetica), size: printpdf::Pt(fs), - font: printpdf::BuiltinFont::Helvetica, }); ops.push(printpdf::ops::Op::SetTextCursor { pos: printpdf::graphics::Point::new( @@ -408,9 +408,8 @@ fn render_pdf(page: &CanvasPage, file: &Path) -> anyhow::Result<()> { printpdf::Mm(height_mm - el.y * 0.264583 - fs * 0.264583), ), }); - ops.push(printpdf::ops::Op::WriteTextBuiltinFont { + ops.push(printpdf::ops::Op::ShowText { items: vec![printpdf::text::TextItem::Text(text.to_string())], - font: printpdf::BuiltinFont::Helvetica, }); ops.push(printpdf::ops::Op::EndTextSection); } diff --git a/docs/changes/v0.1.9.md b/docs/changes/v0.1.9.md index aa1be3e..de40a8b 100644 --- a/docs/changes/v0.1.9.md +++ b/docs/changes/v0.1.9.md @@ -57,12 +57,36 @@ PRD 模块 3「本地设计系统与组件库」第三套内置规范(机器 更新 fd-design-system(3 presets)/ fd-ecosystem(MCP server)。 - 版本号 0.1.8 → 0.1.9(workspace.package,全部 crate 经 workspace=true 继承)。 +## 商用加固(5 个非阻塞项落地) + +为"商用万无一失"追加 5 项加固: + +1. **cargo-audit CI 门禁**(`.github/workflows/ci.yml` 新增 `audit` job): + `cargo install cargo-audit` + `cargo audit` 扫描依赖已知漏洞。`continue-on-error: true` + 作早期预警,不阻断主流程。 +2. **release-pack CI 鲁棒性**:触发条件由 `github.ref == main` 改为 `startsWith(github.ref, 'refs/tags/v')` + + `continue-on-error: true`。macos-14 runner 供给瓶颈不再阻塞 main CI 恒绿;tag 推送时尽力出包。 + 同时为 `on.push` 增加 `tags: ["v*"]` 触发。 +3. **deny-panic CI 门禁**(新增 `deny-panic` job):grep 校验 `crates/*/src/*.rs` 生产代码 + 顶层 `panic!`/`unimplemented!`/`todo!`/`unreachable!` 语句数为 0(排除 tests 与 `=>` match 臂断言)。 + 基线 0,任何回归将失败。 +4. **生产 unwrap 加固**(`fd-canvas-core`):`compute_flex_layout` / `compute_grid_layout` + 中 6 处 `taffy_tree.new_leaf/new_with_children/layout().unwrap()` 替换为 `match` + `tracing::warn!` + + 回退自由布局(复用既有 `compute_node_layout` fallback 路径)。生产 unwrap 清零,无静默 panic。 +5. **fd-design-lint 对齐 op-design-lint**:确认 `fd-design-lint` 已是 op-design-lint 的自建替身—— + 13 条规则(ContrastCheck / UnlabeledInput / TextEffects / AbnormalRotation / EmptyEffects / + TokenInconsistency / UnnamedNode / TextOverflow / OverlappingNodes / HardcodedSpacing / + HardcodedFontSize / MissingInteractionState / LayoutInconsistency)+ auto-fix。 + op-design-lint 从未 vendored(同依赖私有 jian-ops-schema),fd-design-lint 已覆盖核心 lint 需求。 + ## 验证 - `cargo fmt --all --check`:输出体积 0(干净)。 - `cargo clippy --workspace --all-targets -- -D warnings`:EXIT=0(无告警)。 -- `cargo test --workspace`:**369 passed / 0 failed / 1 ignored**(较 v0.1.8 净增 9 测试)。 +- `cargo test --workspace`:**369 passed / 0 failed / 1 ignored**(加固后测试数不变)。 - `cargo run -p fd-cli -- list-design-systems`:输出 minimal-dashboard / robot-sim / apple-hig。 +- deny-panic 本地校验:生产代码顶层 panic 语句数 = 0。 +- fd-canvas-core 生产 unwrap:加固后 = 0(6 处已替换为显式错误处理)。 ## 离线硬约束