Release v2.0.0
·
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>insidevalidate, for rules about the command as a whole rather than one of its properties (#32)readmodel <Name>as a declaration in its own right, andreducer <Name> => <ReadModel>withon <EventType>rules for views a projection cannot express (#39)for <expression>inside aproducesbody, saying which event source the event lands on (#33)producesandinvokeson 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:
andbinds tighter thanor, both are left associative, and parentheses group (#83) authorizecarries a requirement tree rather than a flat list, soA or B Cstates which grouping it means.AuthorizeSyntax.Policiesis replaced byRequirement; callReferences()for the policies alone (#68)- A claim target is an expression, so a literal value stays distinguishable from a path (#67)
SliceSyntax.Projectionis nowProjections(#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 whencondition 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.mddocumented 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 …,eventsinside a join block, and anautomapdirective, 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 Bmeans both policies, but a flat list could not distinguish that from either policy — the requirement tree makes the difference explicit (#68)