Skip to content

Release v22.15.0

Choose a tag to compare

@github-actions github-actions released this 15 Sep 08:54
6ee9624

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

  • detailsType on <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-proxies processor 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 emits default when 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 with hasData / isReady on 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 any IEnumerable<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 any DateOnly, 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.ts exports 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.ts is a merge target, not generated output. (#2621)
  • A single-instance query proxy's defaultValue is typed as the model rather than {} as any, which tripped @typescript-eslint/no-explicit-any in consuming applications (#2613)
  • A nullable enum query parameter no longer generates a spurious class from Nullable<T> alongside the enum (#2571)