Release v22.15.0
Summary
A batch of reported issues. Most were silent failures — things that went wrong without telling anyone. Two change runtime behavior rather than just a diagnostic and are worth reading before upgrading: collection query arguments now actually bind, and a single-instance observable query now notifies when the observed document is gone.
Added
detailsTypeon<Arc>, forwarded to the identity provider, so identity details are deserialized into their declared type instead of staying raw JSON (#2583)IEnumerable<TEnum>is supported as a model-bound query argument (#2571)- Documentation for the
skip-generated-proxiesprocessor in@cratis/eslint-plugin-arc, which excludes generated proxies from linting without a hand-maintained path allow-list (#2613) - Reference pages for ARCCHR0004 and ARCCHR0006 (#2633, #2632)
Changed
- A single-instance observable query —
ObserveSingle/ObserveById, on both MongoDB and EF Core — now emitsdefaultwhen no document matches: after the document is deleted, after an update moves it out of the filter, and when the initial query finds nothing. It previously held the last known value forever with no signal. Guard withhasData/isReadyon the client. Note a read model with[RemovedWith<T>]hard-deletes its document, so "the read model was removed" is this case. (#2642) - Direct-mode WebSocket and SSE observables forward a null emission instead of dropping it, matching what the multiplexed transport already did (#2642)
Fixed
- Collection query arguments —
IEnumerable<int>,IEnumerable<SomeConcept>, and similar — are now bound from the query string. They were classified as injected dependencies, because the DI container reports it can supply anyIEnumerable<T>, so the query ran with an empty collection and returned an empty answer while reporting success. (#2652) useIdentity(type)deserializes with the type it is given, as its documentation already promised. Previously the type was used only to decide which argument was the default and was then discarded, so anyDateOnly,Guid,ConceptAs<T>, or nested value on identity details was raw JSON at runtime. (#2583)- ARCCHR0004 only flags an
[EventType]id that repeats the type name. An id that differs is the supported way to rename an event record while events already in the log keep resolving; following the old advice to remove it orphaned every stored event of that type. (#2633) - ARCCHR0006 no longer flags private helper methods that reactor dispatch would never select, and is suppressed when a
[Replay]handler is declared for the same event type. Its message now states that[OnceOnly]fires once per event source, not once per event — so a handler for an event that recurs on the same source would run only for the first one. (#2632, #2615) - The proxy generator no longer deletes hand-written
index.tsexports that point at a sibling folder or an npm package. It only ever wrote exports for files it generated, so those lines were always hand-written;index.tsis a merge target, not generated output. (#2621) - A single-instance query proxy's
defaultValueis typed as the model rather than{} as any, which tripped@typescript-eslint/no-explicit-anyin consuming applications (#2613) - A nullable enum query parameter no longer generates a spurious class from
Nullable<T>alongside the enum (#2571)