- UnsupportedError, MalformedError, EncryptedError, ResourceLimitError,
and MissingPartError all subclass ConvertError, so an existing
`except anydoc.ConvertError` keeps catching every one of them
- the part or stream at fault rides on `part`, the limit crossed on
`limit`, which is detail the JS bindings cannot carry
- an unreadable file still raises the OSError subclass any other read
of it would
- the root, node, wasm, and python readmes each document the failure
model, a worked example, and a table, in the same slot and shape
- python's covers the exception types it already raises
- a js-sys Error with `code` set, thrown as a JsValue, replaces JsError,
which cannot carry properties
- ConvertErrorCode joins the typescript custom section, minus the crate's
`io` code: there is no filesystem to fail to read
- `code` on the rejection names the ConvertError variant, so callers
branch on it rather than on the message text
- napi fills `code` from the error's status, so the rejection is rebuilt
in Task::reject, the one place with an Env to build a JS error with
- ConvertErrorCode reaches index.d.ts through a dts header file, which
survives regeneration
`ConvertError::code()` is the machine-readable discriminant a caller
branches on, where the Display message carries the detail. The Node and
wasm bindings publish it as `error.code`.
- wasm/ crate with wasm-bindgen bindings mirroring the lib API
(formatFromBytes/Extension/Path, toMarkdownBytes, toDocument)
- static demo page under wasm/www, deployed to GitHub Pages on push
- @firecrawl/anydoc-wasm published from release.yml with provenance
- wasm job in CI: clippy on the wasm target plus a Node smoke test
- version guard now spans five locations (wasm/Cargo.toml added)
napi prepublish no longer creates the release as a side effect of the
npm publish (--no-gh-release, so that job drops contents: write). A final
job, gated on all three registry publishes, creates the release with
generated notes and uploads every built artifact.
JavaScript actions cannot run inside Alpine containers on arm64 runners,
so the aarch64-musl container: jobs failed before their first step. Run
all four Linux test flavors with docker run on the host instead.
Clean-room rewrite. The release gate moves to scripts/check-versions.sh
(also runnable locally), npm publishing runs on a GitHub-hosted runner so
every package gets a provenance attestation, workflow_dispatch on Release
is now a full no-publish dry run, and both workflows default to read-only
permissions.
The crates.io liveness probe hit the API without a User-Agent (403) and fell through to a doomed publish: probe the sparse index instead. npm rejects provenance from self-hosted runners: publish from a GitHub-hosted one. setup-python's universal2 macOS build launches as arm64 on Apple silicon, where pip rejects the x86_64 wheel: run the x64 test through Rosetta.
Declare rust-version 1.88, the floor zip and calamine already impose,
so an old toolchain gets an MSRV message instead of an edition-2024
parse error.
Run CI on pushes to main too. Everything lands directly on main, so the
pull_request trigger meant it never ran.
Record the benchmark machine in the readme, and drop github-slugger from
the bench harness, left behind when the differential harness went away.
Every public item in `model` and `ConvertError` now carries a doc
comment, so docs.rs shows more than a list of names. `#![warn(missing_docs)]`
holds the line: CI's `-D warnings` turns a new undocumented public item
into a failure.
GridBuilder becomes pub(crate) with it. Frontends build grids and
consumers read them off `Table::grid`, so it was public API that nobody
outside the crate could use and everybody would have been stuck with.