Skip to content

feat!: Release 5.0.0#79

Open
untemps wants to merge 9 commits into
mainfrom
release/5.0.0
Open

feat!: Release 5.0.0#79
untemps wants to merge 9 commits into
mainfrom
release/5.0.0

Conversation

@untemps
Copy link
Copy Markdown
Owner

@untemps untemps commented May 2, 2026

Summary

Promotes the beta branch to a stable 5.0.0 release. This PR contains all breaking changes accumulated across the beta cycle, with automation commits (chore(release): X.X.X-beta.Y) stripped from the history.

Changes

⚠️ Breaking changes

Typed errorsDOMObserverErrors constants removed. Use instanceof checks.

Callback signature — Single EventPayload object replaces positional arguments.

- obs.observe('#foo', (node, event, options) => { ... })
+ obs.observe('#foo', ({ node, event, options }) => { ... })

Event constants — Static class properties removed.

- DOMObserver.ADD / .EXIST / .REMOVE / .CHANGE / .EVENTS
+ DOMObserverEvent.ADD / .EXIST / .REMOVE / .CHANGE / DOMObserverEvents

Factory APIDOMObserver class no longer exported.

- import { DOMObserver } from '@untemps/dom-observer'
- const obs = new DOMObserver()
+ import { createDOMObserver, type DOMObserverInstance } from '@untemps/dom-observer'
+ const obs = createDOMObserver()

Method renames

- .watch(target, cb, opts)  → .observe(target, cb, opts)
- .wait(target, opts)       → .observeOnce(target, opts)
- .clear()                  → .disconnect()
- WatchOptions              → ObserveOptions
- WaitOptions               → ObserveOnceOptions
- WaitResult                → ObserveOnceResult

Test plan

  • All 96 tests pass
  • Build produces correct .d.ts declarations
  • CHANGELOG correctly documents all breaking changes for 5.0.0

untemps added 9 commits May 2, 2026 15:12
BREAKING CHANGE: wait() now clears internal state synchronously before the Promise resolves, instead of relying on .finally() for deferred cleanup.
Before: 
   const { node } = await obs.wait('#foo')
   obs.isObserving // true — observer still running at this point
After:
   const { node } = await obs.wait('#foo')
   obs.isObserving // false — cleared before promise settles
Affected scenarios:
   - Code checking obs.isObserving === true after await obs.wait() must update that expectation to false.
   - Code calling obs.clear() after wait() resolves continues to work (no-op).
   - Code relying on the timeout timer firing after resolution: cleanup now happens at resolution time, not when the timer would have expired.
BREAKING CHANGE: DOMObserverErrors constants and DOMObserverErrorCode type are removed. All throws and rejections now use typed Error subclasses. Consumers who matched on error message strings must migrate to instanceof checks.
Error messages no longer carry [TIMEOUT]/[ABORT]/[EVENTS]/[TARGET] prefixes.
The AbortSignal rejection path (DOMException, name: 'AbortError') is unchanged.
BREAKING CHANGE: OnEventCallback and FilterCallback now receive a single EventPayload object instead of three positional arguments.
Before:
   obs.watch('#foo', (node, event, options) => { ... })
   obs.watch('#foo', (node, event, options) => { ... }, { filter: (node, event, options) => ... })
After:
   obs.watch('#foo', ({ node, event, options }) => { ... })
   obs.watch('#foo', ({ node, event, options }) => { ... }, { filter: ({ node, event, options }) => ... }
Migration is mechanical: wrap the parameter list in braces.
The EventPayload type is exported for explicit annotation.
…#75)

BREAKING CHANGE: EventPayload and WaitResult are now type aliases, not interfaces. Code using `extends EventPayload`, `extends WaitResult`, or `implements` either type must migrate to intersection types:
// Before
interface MyPayload extends EventPayload { extra: string }
// After
type MyPayload = EventPayload & { extra: string }
Code that accesses `options?.attributeName` defensively continues to compile without changes.
…const (#76)

BREAKING CHANGE: Static class properties removed.
Migration:
   DOMObserver.ADD    → DOMObserverEvent.ADD
   DOMObserver.EXIST  → DOMObserverEvent.EXIST
   DOMObserver.REMOVE → DOMObserverEvent.REMOVE
   DOMObserver.CHANGE → DOMObserverEvent.CHANGE
   DOMObserver.EVENTS → DOMObserverEvents
   type DOMObserverEvent → type DOMObserverEventValue
A global find-and-replace handles most cases. The type rename only affects code that references DOMObserverEvent as a TypeScript type (not as a value).
… export (#77)

BREAKING CHANGE: The DOMObserver class is no longer exported.
Migration:
   import { DOMObserver } from '@untemps/dom-observer'
   const obs = new DOMObserver()
   let obs: DOMObserver
→
   import { createDOMObserver, type DOMObserverInstance } from '@untemps/dom-observer'
   const obs = createDOMObserver()
   let obs: DOMObserverInstance
BREAKING CHANGE: Three methods and three types renamed.
Migration:
   .watch(target, cb, opts)  → .observe(target, cb, opts)
   .wait(target, opts) → .observeOnce(target, opts)
   .clear() → .disconnect()
   WatchOptions → ObserveOptions
   WaitOptions → ObserveOnceOptions
   WaitResult → ObserveOnceResult
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant