Skip to content

Release v2.0.0

Choose a tag to compare

@github-actions github-actions released this 07 Aug 11:37
· 153 commits to 4ffba5c0a621b8a12c0017946274029b4ae75b2f since this release

Summary

Every open language decision, landed together as one release so consumers take a single version bump.

Added

  • reads <ReadModel> [by <property>] on a command, declaring the state it consults before it decides (#35)
  • require <condition> inside validate, for rules about the command as a whole rather than one of its properties (#32)
  • readmodel <Name> as a declaration in its own right, and reducer <Name> => <ReadModel> with on <EventType> rules for views a projection cannot express (#39)
  • for <expression> inside a produces body, saying which event source the event lands on (#33)
  • produces and invokes on a reactor trigger, so an automation states the events it appends and the commands it hands on (#34)
  • Qualified references and a stated scoping rule for what a screen binds to — a bare name resolves slice, then feature, then module, then document (#28)
  • A language registry, so the languages an inline block may carry can be extended without changing the compiler (#74)
  • provider <Name> name <Alias>, so two providers of the same kind are distinguishable (#80)
  • != in the validation grammar (#66)
  • A slice may declare more than one projection (#30)
  • query <Name> => observable <ReturnType> for live queries (#37)
  • A diagnostic code on every diagnostic, so consumers group and suppress without matching message text (#63)
  • ScreenplaySyntaxWalker, a base class that walks every node kind (#77)
  • Documented contexts for inline rule and policy code (#61)

Changed

  • One condition grammar for the whole language: and binds tighter than or, both are left associative, and parentheses group (#83)
  • authorize carries a requirement tree rather than a flat list, so A or B C states which grouping it means. AuthorizeSyntax.Policies is replaced by Requirement; call References() for the policies alone (#68)
  • A claim target is an expression, so a literal value stays distinguishable from a path (#67)
  • SliceSyntax.Projection is now Projections (#30)
  • An authentication provider carries no configuration — reaching a provider is what running an application needs to know, not what the application is (#80)

Fixed

  • A policy condition dropped its parentheses when printed, so a printed document admitted different callers than the one it came from (#59)
  • A produces when condition dropped its parentheses when printed, and its precedence disagreed with a policy condition (#83)
  • A query with a nullable return type was never registered as a symbol in the language service (#85)
  • policies.md documented a policy result and a context that do not exist (#62)
  • The invoicing sample navigated to three screens it never declared (#82)
  • Projection documentation described children … id …, events inside a join block, and an automap directive, none of which the language has

Removed

  • $secrets, and the secrets files it read — credentials are a runtime concern, and a document holding them is a different document per environment (#80)
  • Free-form settings on an authentication provider (#80)

Security

  • A policy condition that lost its parentheses when printed changed who the policy admitted, so round-tripping a document could silently widen access (#59)
  • authorize A B means both policies, but a flat list could not distinguish that from either policy — the requirement tree makes the difference explicit (#68)