Summary
Following #51 / #52 (navigator.credentials is non-configurable on WebKit, so
the Object.defineProperty() call added in 3.2.1 threw and loadOnce()
rejected on all iOS browsers and desktop Safari), two gaps remain that let the
regression both ship and linger in dependents:
- No browser test exercised
load(). CI runs lint only — there was no
automated assertion that load() succeeds in any browser, so the WebKit
breakage shipped undetected from 3.2.1 onward.
- No signal pushed the fix downstream. Consumers pin
^4.0.x and would
resolve the patched version on a fresh install, but lockfiles stayed pinned
to the broken version and nothing prompted a bump + redeploy.
This issue proposes monitoring/guardrails across three layers. Decisions below
reflect maintainer feedback in the comments.
Layer 1 — Browser-API regression detection
1a. Cross-browser smoke test in CI (highest leverage).
1a-ext. Password-manager extension interference.
- Browser password-manager extensions (Dashlane, 1Password, etc.) have
previously manipulated navigator.credentials and caused breakage. Track
known-problematic extensions and exercise the smoke test with them installed,
so extension-induced regressions are caught alongside browser ones.
1b. External browser-release feed (optional second layer).
- Watch WebKit/Chromium release notes and web-platform-tests deltas for
Credential Management API / navigator.credentials changes, to flag upcoming
behavior changes before they reach stable. Noisier; does not prove our code
breaks (1a does).
- Decision: deferred — prove 1a first, then reassess.
Layer 2 — Downstream propagation
2a. Dependabot.
- Add
.github/dependabot.yml (npm) so a new release auto-opens a
lockfile-bump PR.
- Decision: scope to this repo only for now.
2b. Staleness check.
- A small script reporting, per consumer: pinned range, resolved (lockfile)
version, and latest published — flagging anyone behind. Runnable on demand or
on a schedule.
- Decision: scheduling/ownership deferred (follows from the 1b/2a answers).
Layer 3 — External consumers
- Publish release notes / advisory for the fix.
npm deprecate the affected version range with a message pointing at the
WebKit breakage, so installers see a warning.
- Decision: yes, do the
npm deprecate.
Open questions
All resolved in the comments:
- WebKit in CI → bundled WebKit on Linux to start.
- Layer 1b → prove 1a first.
- Dependabot rollout → this repo only.
- Scheduling/ownership of 1b/2b → deferred.
npm deprecate → yes.
Next step
Implement 1a (cross-browser Playwright smoke test, bundled WebKit) — the
single change that would have caught #51 pre-publish — plus the 1a-ext
password-manager-extension coverage.
Summary
Following #51 / #52 (
navigator.credentialsis non-configurable on WebKit, sothe
Object.defineProperty()call added in 3.2.1 threw andloadOnce()rejected on all iOS browsers and desktop Safari), two gaps remain that let the
regression both ship and linger in dependents:
load(). CI runs lint only — there was noautomated assertion that
load()succeeds in any browser, so the WebKitbreakage shipped undetected from 3.2.1 onward.
^4.0.xand wouldresolve the patched version on a fresh install, but lockfiles stayed pinned
to the broken version and nothing prompted a bump + redeploy.
This issue proposes monitoring/guardrails across three layers. Decisions below
reflect maintainer feedback in the comments.
Layer 1 — Browser-API regression detection
1a. Cross-browser smoke test in CI (highest leverage).
chromium,firefox, andwebkitprojects.loadOnce(), and asserts: itresolves without throwing;
window.WebCredentialis defined; andnavigator.credentials.get/.storeare functions (patched).webkitproject reproduces loadOnce() throws on iOS (WebKit) since 3.2.1: cannot redefine navigator.credentials #51 directly (red before Do not throw when navigator.credentials cannot be redefined #52, green after).testscript and atestCI job as a sibling oflint(noneeds:,runs in parallel). This makes the regression class fail pre-publish.
macOS/Safari runner only if needed.
1a-ext. Password-manager extension interference.
previously manipulated
navigator.credentialsand caused breakage. Trackknown-problematic extensions and exercise the smoke test with them installed,
so extension-induced regressions are caught alongside browser ones.
1b. External browser-release feed (optional second layer).
Credential Management API /
navigator.credentialschanges, to flag upcomingbehavior changes before they reach stable. Noisier; does not prove our code
breaks (1a does).
Layer 2 — Downstream propagation
2a. Dependabot.
.github/dependabot.yml(npm) so a new release auto-opens alockfile-bump PR.
2b. Staleness check.
version, and latest published — flagging anyone behind. Runnable on demand or
on a schedule.
Layer 3 — External consumers
npm deprecatethe affected version range with a message pointing at theWebKit breakage, so installers see a warning.
npm deprecate.Open questions
All resolved in the comments:
npm deprecate→ yes.Next step
Implement 1a (cross-browser Playwright smoke test, bundled WebKit) — the
single change that would have caught #51 pre-publish — plus the 1a-ext
password-manager-extension coverage.