Skip to content

v1.0.0 — first stable npm release

Choose a tag to compare

@Nizoka Nizoka released this 02 Sep 22:48
· 37 commits to main since this release

zipnative v1.0.0

Released 2026-09-02

The first stable release — and the first npm publication. zipnative 1.0.0 adds no engine behavior over v0.9.0: it is the freeze itself. Everything shipped across 0.1 → 0.9 — random-access reads, secure-by-default extraction, deterministic write, incremental modification, workers, forward streaming, the resumable inflater, one-call verification — becomes a semver commitment: the 77-export API surface, the 39-code error vocabulary and the deterministic: true output bytes are frozen (removing, renaming or changing any of them is semver-major; the promise is written down in SECURITY.md). 100% backward-compatible with v0.9.0. Zero runtime dependencies, 385+ tests, 93.9% statement coverage, published from CI with provenance.

Highlights

  • On npm at last — published via Trusted Publishing (OIDC): no long-lived token, the entire quality gate re-runs in the publish workflow, the package carries a provenance attestation (verify with npm audit signatures), and a CycloneDX SBOM is attached to the GitHub Release. A laptop npm publish fails by design.
  • The conformance authority gate ("veraZIP") — ZIP had no veraPDF (JHOVE never shipped a ZIP module; zip -T is an alias of unzip -tqq), so zipnative ships the first open clause-by-clause ISO/IEC 21320-1:2015 validator (npm run validate:zip — an independent raw parser, never the engine's own) plus the existing Archivematica-grade six-parser extraction matrix. Every archive zipnative writes conforms to the ISO profile, verified on Linux and Windows in CI and again before every publish; hostile-but-spec-valid archives (zip-slip et al.) are called out for what they are — conformance is not safety. Full story: the new conformance guide.
  • The freeze, made checkable — every one of the 77 exports carries TSDoc (a new verify rule fails the build on an undocumented export); the API registry (api.json), the error registry (errors.json) and the determinism contract are the machine-readable form of the promise.
  • A new face — the "zipper-cut Z" logo: the Z monogram's diagonal carries interlocking zipper teeth in negative space (reads "Z" at a glance, "zip" up close), declined across favicon, og-image and a new GitHub social preview.

Security

  • No parser or writer change — the security posture is exactly v0.9.0's.
  • feat(ci): supply-chain hardening around the release: OIDC Trusted Publishing (no NPM_TOKEN secret to steal), provenance attestations (SLSA-aligned, Sigstore), CycloneDX SBOM per release, SHA-pinned actions, and the full gate (audit included) re-run between the Release click and npm publish.
  • docs(security): SECURITY.md now states the supported-versions policy (1.0.x), how to verify release integrity, and the three-part compatibility promise.

Added

  • feat(conformance): validate:zip — the ISO/IEC 21320-1:2015 validator (the Table-1 structural clauses + APPNOTE well-formedness cross-checks, two-sided expectations, declared.iso21320 coverage canary, foreign integrity pass) — blocking in conformance.yml and publish.yml; new conformance guide.
  • feat(agents): docs/agent-brief.md (paste-ready coding-agent briefing + "Copy as prompt" on the landing) and the completed token budget in llms-index.json (errors.json + agent-brief now listed with byte/approx-token sizes); .github/prompts/quality-gate.prompt.md.
  • feat(ci): .github/workflows/publish.yml — Release-triggered, OIDC, full gate re-run, SBOM, npm publish --provenance --access public.
  • feat(docs): the tsdoc-complete verify rule (22 rules total); TSDoc for the five previously-undocumented exports.
  • feat(docs): the zipper-cut Z identity — logo.svg, favicon.svg, regenerated og-image, new social-preview.svg/png (1280×640).
  • feat(meta): release-notes/draft/PR-v1.0.0.md — the release PR with the measured verification table and the human go-live runbook.

Changed

  • docs(meta): documentation flipped to the stable-era stance — "through 1.0"/"pre-1.0" → "in 1.x" everywhere; README status is the semver freeze statement; satellites read "planned".
  • docs(meta): badges harmonised on the pdfnative set (CI, CodeQL, npm, bundle size, provenance, website; Scorecard on the landing — the npm-fed ones self-heal at first publication); persist-credentials: false on every CI checkout.
  • chore(meta): the npm package now ships CHANGELOG.md, SECURITY.md and THIRD-PARTY-NOTICES.md (21-file tarball, inspected); sourcemaps deliberately included; ecosystem.json records the freeze contracts.

Install

npm install zipnative@1.0.0

Upgrade

No breaking changes. Drop-in replacement for v0.9.0 — and for every 0.x tag: the API at 1.0.0 is the 0.9.0 API, frozen.

Known limitations

  • store+bit3, encrypted+bit3 and custom-codec+bit3 remain refused in forward reading — structurally undelimitable without the central directory.
  • Zip64 streaming (addStream > 4 GiB) remains a typed refusal — designed (roadmap ADR), implemented in a 1.x minor.
  • No encryption in 1.x by policy (ZipCrypto is broken); encrypted entries are detected and refused with a typed error.
  • A worker playground is deliberately absent (build-tooling changes; a 1.x docs item).

Downstream integration notes

The satellites can now exist: zipnative-cli and zipnative-mcp pin zipnative ^1.0.0. Their contract inputs are all machine-readable — docs/assets/api.json (surface), docs/data/errors.json (the --json envelope's err.code source of truth), and verifyZip's report shape for a future verify --json.

Links