Releases: fraktalio/fmodel-ts
v2.1.1
Fmodel
provides just enough tactical Domain-Driven Design patterns, optimized for Event Sourcing and CQRS.
The domain
components are fully isolated from the application layer and API-related concerns.
It represents a pure declaration (pure functions) of the program logic.
Decider
, View
, and Saga
The application
components orchestrate the execution of the logic by loading the state, executing domain components, and storing a new state.
EventSourcingAggregate
, StateStoredAggregate
, MaterializedView
, and SagaManager
Install
npm i @fraktalio/fmodel-ts
Available on https://www.npmjs.com/package/@fraktalio/fmodel-ts
Learn more
What's Changed
Full Changelog: v2.1.0...v2.1.1
v2.1.0
Fmodel
provides just enough tactical Domain-Driven Design patterns, optimized for Event Sourcing and CQRS.
The domain
components are fully isolated from the application layer and API-related concerns.
It represents a pure declaration (pure functions) of the program logic.
Decider
, View
, and Saga
The application
components orchestrate the execution of the logic by loading the state, executing domain components, and storing a new state.
EventSourcingAggregate
, StateStoredAggregate
, MaterializedView
, and SagaManager
Install
npm i @fraktalio/fmodel-ts
Available on https://www.npmjs.com/package/@fraktalio/fmodel-ts
Learn more
What's Changed
Lowering down the responsibility of the Metadata types in the Application layer.
For example, the EventRepository interface:
export interface IEventRepository<C, E, V, CM, EM> {
/**
* Fetch events
*
* @param command - Command of type `C`
*
* @return list of Events with Version and Event Metadata
*/
readonly fetch: (command: C) => Promise<readonly (E & V & EM)[]>;
/**
* Get the event stream version / sequence
*
* @param event - Event of type `E`
*
* @return the version / sequence of the event stream that this event belongs to.
*/
readonly versionProvider: (event: E & EM) => Promise<V | null>;
/**
* Save events
*
* @param events - list of Events
* @param commandMetadata - Command Metadata of the command that initiated `events`
* @param versionProvider - A provider for the Latest Event in this stream and its Version/Sequence
* @return a list of newly saved Event(s) of type `E` with Version of type `V` and with Event Metadata of type `EM`
*/
readonly save: (
events: readonly E[],
commandMetadata: CM,
versionProvider: (e: E) => Promise<V | null>
) => Promise<readonly (E & V & EM)[]>;
}
Old interface:
export interface IEventRepository<C, E, V, CM, EM> {
/**
* Fetch events
*
* @param command - Command of type `C` with metadata of type `CM`
*
* @return list of Events with Version and Event Metadata
*/
readonly fetch: (command: C & CM) => Promise<readonly (E & V & EM)[]>;
/**
* Get the latest event stream version / sequence
*
* @param event - Event of type `E`
*
* @return the latest version / sequence of the event stream that this event belongs to.
*/
readonly versionProvider: (event: E) => Promise<V | null>;
/**
* Save events
*
* @param events - list of Events
* @param commandMetadata - Command Metadata of the command that initiated `events`
* @param versionProvider - A provider for the Latest Event in this stream and its Version/Sequence
* @return a list of newly saved Event(s) of type `E` with Version of type `V` and with Event Metadata of type `EM`
*/
readonly save: (
events: readonly E[],
commandMetadata: CM,
versionProvider: (e: E) => Promise<V | null>
) => Promise<readonly (E & V & EM)[]>;
}
The interface used CM
as the param of fetch
method, and EM
in the versionProvider
. This could lead to problems, for example, the C
lost the relation with the list of E/Events it produced, as CM
could be used to identify the events it needs to fetch.
The relation between:
- C and the E/Events it can produce
- E and the Commands we can trigger next
- List of E and the S/state they can evolve to
is the concern of domain layer, not of the application layer.
Full Changelog: v2.0.1...v2.1.0
v2.0.1
Fmodel
provides just enough tactical Domain-Driven Design patterns, optimized for Event Sourcing and CQRS.
The domain
components are fully isolated from the application layer and API-related concerns.
It represents a pure declaration (pure functions) of the program logic.
Decider
, View
, and Saga
The application
components orchestrate the execution of the logic by loading the state, executing domain components, and storing a new state.
EventSourcingAggregate
, StateStoredAggregate
, MaterializedView
, and SagaManager
Install
npm i @fraktalio/fmodel-ts
Available on https://www.npmjs.com/package/@fraktalio/fmodel-ts
Learn more
What's Changed
The most important change is that versionProvider
(part of the application EventSourcingAggregate
API) uses both Event/E and EventMetadata/EM to provide the version of the stream / previously it was only E/Event:
export interface IEventRepository<C, E, V, CM, EM> {
/**
* Fetch events
*
* @param command - Command of type `C` with metadata of type `CM`
*
* @return list of Events with Version and Event Metadata
*/
readonly fetch: (command: C & CM) => Promise<readonly (E & V & EM)[]>;
/**
* Get the latest event stream version / sequence
*
* @param event - Event of type `E & EM`
*
* @return the latest version / sequence of the event stream that this event belongs to.
*/
readonly versionProvider: (event: E & EM) => Promise<V | null>;
/**
* Save events
*
* @param events - list of Events
* @param commandMetadata - Command Metadata of the command that initiated `events`
* @param versionProvider - A provider for the stream Version/Sequence
* @return a list of newly saved Event(s) of type `E` with Version of type `V` and with Event Metadata of type `EM`
*/
readonly save: (
events: readonly E[],
commandMetadata: CM,
versionProvider: (e: E & EM) => Promise<V | null>
) => Promise<readonly (E & V & EM)[]>;
}
We hope that E/Event can be liberated from the technical data/properties that do not influence core domain logic/computation. In this case, the EM properties can be used to find the version of the stream and these properties don't have to leak into the E/Event.
- build(deps-dev): bump @types/node from 20.11.27 to 20.11.28 by @dependabot in #702
- build(deps-dev): bump @types/node from 20.11.28 to 20.11.29 by @dependabot in #703
- build(deps-dev): bump @types/node from 20.11.29 to 20.11.30 by @dependabot in #704
- build(deps-dev): bump typescript from 5.4.2 to 5.4.3 by @dependabot in #705
- build(deps-dev): bump eslint-plugin-functional from 6.1.1 to 6.3.0 by @dependabot in #707
- build(deps-dev): bump cspell from 8.6.0 to 8.6.1 by @dependabot in #708
- build(deps-dev): bump @types/node from 20.11.30 to 20.12.2 by @dependabot in #709
- build(deps-dev): bump eslint-plugin-functional from 6.3.0 to 6.4.0 by @dependabot in #710
- build(deps-dev): bump @types/node from 20.12.2 to 20.12.3 by @dependabot in #711
- build(deps-dev): bump @types/node from 20.12.3 to 20.12.4 by @dependabot in #712
- build(deps-dev): bump typescript from 5.4.3 to 5.4.4 by @dependabot in #713
- build(deps-dev): bump @types/node from 20.12.4 to 20.12.5 by @dependabot in #714
- build(deps-dev): bump typedoc from 0.25.12 to 0.25.13 by @dependabot in #715
- build(deps-dev): bump @types/node from 20.12.5 to 20.12.7 by @dependabot in #716
- build(deps-dev): bump cspell from 8.6.1 to 8.7.0 by @dependabot in #717
- build(deps-dev): bump typescript from 5.4.4 to 5.4.5 by @dependabot in #718
- Include
event metadata
as param in the version provider by @idugalic in #719
Full Changelog: v2.0.0...v2.0.1
v2.0.0
Fmodel
provides just enough tactical Domain-Driven Design patterns, optimized for Event Sourcing and CQRS.
The domain
components are fully isolated from the application layer and API-related concerns.
It represents a pure declaration (pure functions) of the program logic.
Decider
, View
, and Saga
The application
components orchestrate the execution of the logic by loading the state, executing domain components, and storing a new state.
EventSourcingAggregate
, StateStoredAggregate
, MaterializedView
, and SagaManager
Install
npm i @fraktalio/fmodel-ts
Available on https://www.npmjs.com/package/@fraktalio/fmodel-ts
Learn more
Breaking changes
v2.0.0
of the library is introducing breaking changes. Check the PR!
To keep it simple, v2.*.*
will use the main branch. Old version - v1.. will continue to be supported (bugs only, no new features)
Besides keeping the focus on separating data from behavior, we want to split the responsibilities between the domain and application/adapter layers better.
Join the discussion
Application layer components (Aggregate, MaterializedView, SagaManager)
- Metadata types are introduced (
CM
/CommandMetadata,EM
/Event Metadata) on the application layer. Observe how these types (CM
,EM
) are not leaking into the domain components, as these don't benefit core logic, for example:traceId
,correlationId
, ... - Previously, two repository interfaces existed: locking and normal (non-locking). Locking was enabling and communicating
optimistic locking
on concurrent write. Now, we have zipped these two interfaces into one interface that supports versioning/optimistic locking out of the box, for example:
export interface IEventRepository<C, E, V, CM, EM> {
/**
* Fetch events
*
* @param command - Command of type `C` with metadata of type `CM`
*
* @return list of Events with Version and Event Metadata
*/
readonly fetch: (command: C & CM) => Promise<readonly (E & V & EM)[]>;
/**
* Get the latest event stream version / sequence
*
* @param event - Event of type `E`
*
* @return the latest version / sequence of the event stream that this event belongs to.
*/
readonly versionProvider: (event: E) => Promise<V | null>;
/**
* Save events
*
* @param events - list of Events
* @param commandMetadata - Command Metadata of the command that initiated `events`
* @param versionProvider - A provider for the Latest Event in this stream and its Version/Sequence
* @return a list of newly saved Event(s) of type `E` with Version of type `V` and with Event Metadata of type `EM`
*/
readonly save: (
events: readonly E[],
commandMetadata: CM,
versionProvider: (e: E) => Promise<V | null>
) => Promise<readonly (E & V & EM)[]>;
}
Domain layer components (Decider, View, Saga)
maptLeft***
functions are renamed tomapContra***
- The new
combine
method uses TypeScript intersections rather than Tuples to combine states asS1
&S2
. The previouscombine
method is renamed tocombineViaTuples
and is still available for usage.
Tuples are more straightforward and may be more suitable for simple cases,
while intersections provide more flexibility and can handle more complex scenarios.
- Flexibility: If you anticipate needing to access individual components of the combined state separately, using tuples might be more appropriate, as it allows you to maintain separate types for each component. However, if you primarily need to treat the combined state as a single entity with all properties accessible at once, intersections might be more suitable.
- Readability: Consider which approach makes your code more readable and understandable to other developers who may be working with your codebase. Choose the approach that best communicates your intentions and the structure of your data.
- Compatibility: Consider the compatibility of your chosen approach with other libraries, frameworks, or tools you're using in your TypeScript project. Some libraries or tools might work better with one approach over the other.
TypeScript adopts a structural type system that determines type compatibility and equivalence based on the type structure or definition rather than the declarative relationship between types and interfaces, which contrasts with the nominal type system.
We want to use this, not fight it! We want to provide a more robust tool to effectively model the domain!
What's Changed (the list)
- build(deps-dev): bump cspell from 8.4.1 to 8.6.0 by @dependabot in #687
- build(deps-dev): bump typescript from 5.3.3 to 5.4.2 by @dependabot in #688
- build(deps-dev): bump @types/node from 20.11.24 to 20.11.25 by @dependabot in #689
- build(deps-dev): bump marked from 12.0.0 to 12.0.1 by @dependabot in #690
- build(deps-dev): bump typedoc from 0.25.9 to 0.25.11 by @dependabot in #691
- v2.0.0 by @idugalic in #692
combine
method is usingintersections
/&
by @idugalic in #693- build(deps-dev): bump eslint-plugin-functional from 6.0.1 to 6.1.1 by @dependabot in #694
- build(deps-dev): bump typedoc from 0.25.11 to 0.25.12 by @dependabot in #695
- build(deps-dev): bump typescript from 5.3.3 to 5.4.2 by @dependabot in #696
- build(deps-dev): bump @types/node from 20.11.25 to 20.11.26 by @dependabot in #697
- build(deps-dev): bump @types/node from 20.11.26 to 20.11.27 by @dependabot in #698
- Infrastructure interfaces extended to include
metadata
by @idugalic in #699 - Unsuitable intersection of
different
types by @idugalic in #700
Full Changelog: v1.4.0...v2.0.0
v2.0.0-alpha.04
Fmodel
provides just enough tactical Domain-Driven Design patterns, optimized for Event Sourcing and CQRS.
v2.0.0 of the library is introducing breaking changes. Check the PR!
Besides keeping the focus on separating data from behavior, we want to split the responsibilities between the domain and application/adapter layers better.
For example,metadata types
exist only on the application layer, not leaking into the domain, as these don't benefit core logic. Example:traceId
,correlationId
, ...The library will use
alpha
/pre-release
versions until it reach production-ready quality. It will happen soon! We need more tests, better documentation.
To keep it simple,v2.*.*
will use the main branch going forward. v1.. will continue to be supported (bugs only, no new features)
The domain
components are fully isolated from the application layer and API-related concerns.
It represents a pure declaration (pure functions) of the program logic.
Decider
, View
, and Saga
The application
components orchestrate the execution of the logic by loading the state, executing domain components, and storing a new state.
EventSourcingAggregate
, StateStoredAggregate
, MaterializedView
, and SagaManager
Install
npm i @fraktalio/fmodel-ts
Available on https://www.npmjs.com/package/@fraktalio/fmodel-ts
Learn more
What's Changed
Full Changelog: v2.0.0-alpha.03...v2.0.0-alpha.04
v2.0.0-alpha.03
Fmodel
provides just enough tactical Domain-Driven Design patterns, optimized for Event Sourcing and CQRS.
v2.0.0 of the library is introducing breaking changes. Check the PR!
Besides keeping the focus on separating data from behavior, we want to split the responsibilities between the domain and application/adapter layers better.
For example,metadata types
exist only on the application layer, not leaking into the domain, as these don't benefit core logic. Example:traceId
,correlationId
, ...The library will use
alpha
/pre-release
versions until it reach production-ready quality. It will happen soon! We need more tests, better documentation.
To keep it simple,v2.*.*
will use the main branch going forward. v1.. will continue to be supported (bugs only, no new features)
The domain
components are fully isolated from the application layer and API-related concerns.
It represents a pure declaration (pure functions) of the program logic.
Decider
, View
, and Saga
The application
components orchestrate the execution of the logic by loading the state, executing domain components, and storing a new state.
EventSourcingAggregate
, StateStoredAggregate
, MaterializedView
, and SagaManager
Install
npm i @fraktalio/fmodel-ts
Available on https://www.npmjs.com/package/@fraktalio/fmodel-ts
Learn more
What's Changed
Full Changelog: v2.0.0-alpha.02...v2.0.0-alpha.03
v2.0.0-alpha.02
Fmodel
provides just enough tactical Domain-Driven Design patterns, optimized for Event Sourcing and CQRS.
v2.0.0 of the library is introducing breaking changes. Check the PR!
Besides keeping the focus on separating data from behavior, we want to split the responsibilities between the domain and application/adapter layers better.
For example,metadata types
exist only on the application layer, not leaking into the domain, as these don't benefit core logic. Example:traceId
,correlationId
, ...The library will use
alpha
/pre-release
versions until it reach production-ready quality. It will happen soon! We need more tests, better documentation.
To keep it simple,v2.*.*
will use the main branch going forward. v1.. will continue to be supported (bugs only, no new features)
The domain
components are fully isolated from the application layer and API-related concerns.
It represents a pure declaration (pure functions) of the program logic.
Decider
, View
, and Saga
The application
components orchestrate the execution of the logic by loading the state, executing domain components, and storing a new state.
EventSourcingAggregate
, StateStoredAggregate
, MaterializedView
, and SagaManager
Install
npm i @fraktalio/fmodel-ts
Available on https://www.npmjs.com/package/@fraktalio/fmodel-ts
Learn more
What's Changed
-
combine
method on Decider, View and Saga is usingintersections
/&
by @idugalic in #693. Alternatively, you can still usecombineViaTuples
which is the old behavior of thecombine
function and uses Tuples to model Product/And behavior. -
build(deps-dev): bump eslint-plugin-functional from 6.0.1 to 6.1.1 by @dependabot in #694
-
build(deps-dev): bump typedoc from 0.25.11 to 0.25.12 by @dependabot in #695
-
build(deps-dev): bump typescript from 5.3.3 to 5.4.2 by @dependabot in #696
-
build(deps-dev): bump @types/node from 20.11.25 to 20.11.26 by @dependabot in #697
-
build(deps-dev): bump @types/node from 20.11.26 to 20.11.27 by @dependabot in #698
Full Changelog: v2.0.0-alpha.01...v2.0.0-alpha.02
v2.0.0-alpha.01
Fmodel
provides just enough tactical Domain-Driven Design patterns, optimized for Event Sourcing and CQRS.
v2.0.0 of the library is introducing breaking changes. Check the PR!
Besides keeping the focus on separating data from behavior, we want to split the responsibilities between the domain and application/adapter layers better.
For example,metadata types
exist only on the application layer, not leaking into the domain, as these don't benefit core logic. Example:traceId
,correlationId
, ...The library will use
alpha
/pre-release
versions until it reach production-ready quality. It will happen soon! We need more tests, better documentation.
To keep it simple,v2.*.*
will use the main branch going forward. v1.. will continue to be supported (bugs only, no new features)
The domain
components are fully isolated from the application layer and API-related concerns.
It represents a pure declaration (pure functions) of the program logic.
Decider
, View
, and Saga
The application
components orchestrate the execution of the logic by loading the state, executing domain components, and storing a new state.
EventSourcingAggregate
, StateStoredAggregate
, MaterializedView
, and SagaManager
Install
npm i @fraktalio/fmodel-ts
Available on https://www.npmjs.com/package/@fraktalio/fmodel-ts
Learn more
What's Changed
- v2.0.0 by @idugalic in #692
- build(deps-dev): bump cspell from 8.4.1 to 8.6.0 by @dependabot in #687
- build(deps-dev): bump typescript from 5.3.3 to 5.4.2 by @dependabot in #688
- build(deps-dev): bump @types/node from 20.11.24 to 20.11.25 by @dependabot in #689
- build(deps-dev): bump marked from 12.0.0 to 12.0.1 by @dependabot in #690
- build(deps-dev): bump typedoc from 0.25.9 to 0.25.11 by @dependabot in #691
Full Changelog: v1.4.0...v2.0.0-alpha.01
v1.4.0
Fmodel
provides just enough tactical Domain-Driven Design patterns, optimized for Event Sourcing and CQRS.
The domain
components are fully isolated from the application layer and API-related concerns.
It represents a pure declaration (pure functions) of the program logic.
Decider
, View
, and Saga
The application
components orchestrate the execution of the logic by loading the state, executing domain components, and storing a new state.
EventSourcingAggregate
, StateStoredAggregate
, MaterializedView
, and SagaManager
Install
npm i @fraktalio/fmodel-ts
Available on https://www.npmjs.com/package/@fraktalio/fmodel-ts
Learn more
What's Changed
Introducing combineAndIntersect
method on Decider and View
Combines state via intersection (S & S2)
. Check the alternative method combine which uses tuples [S, S2]
to achieve a similar goal.
- Flexibility: If you anticipate needing to access individual components of the combined state separately, using tuples might be more appropriate, as it allows you to maintain separate types for each component. However, if you primarily need to treat the combined state as a single entity with all properties accessible at once, intersections might be more suitable.
- Readability: Consider which approach makes your code more readable and understandable to other developers who may be working with your codebase. Choose the approach that best communicates your intentions and the structure of your data.
- Compatibility: Consider the compatibility of your chosen approach with other libraries, frameworks, or tools you're using in your TypeScript project. Some libraries or tools might work better with one approach over the other.
Depricating mapLeft*
methods
We are renaming the mapLeftOnCommand
, mapLeftOnEvent
to mapContraOnCommand
and mapContraOnEvent
...
All changes
- Bump marked from 7.0.1 to 7.0.2 by @dependabot in #516
- Bump cspell from 6.31.3 to 7.0.0 by @dependabot in #517
- Bump eslint from 8.46.0 to 8.47.0 by @dependabot in #518
- Bump gh-pages from 5.0.0 to 6.0.0 by @dependabot in #519
- Bump @types/node from 20.4.9 to 20.5.0 by @dependabot in #520
- Bump marked from 7.0.2 to 7.0.3 by @dependabot in #522
- build(deps-dev): bump eslint-plugin-import from 2.28.0 to 2.28.1 by @dependabot in #525
- build(deps-dev): bump marked from 7.0.3 to 7.0.4 by @dependabot in #526
- build(deps-dev): bump cspell from 7.0.0 to 7.0.1 by @dependabot in #528
- build(deps-dev): bump @types/node from 20.5.0 to 20.5.4 by @dependabot in #531
- build(deps-dev): bump @types/node from 20.5.4 to 20.5.6 by @dependabot in #532
- build(deps-dev): bump typescript from 5.1.6 to 5.2.2 by @dependabot in #533
- build(deps-dev): bump marked from 7.0.4 to 7.0.5 by @dependabot in #534
- build(deps-dev): bump @types/node from 20.5.6 to 20.5.7 by @dependabot in #535
- build(deps-dev): bump typedoc from 0.24.8 to 0.25.0 by @dependabot in #536
- build(deps-dev): bump eslint from 8.47.0 to 8.48.0 by @dependabot in #537
- build(deps-dev): bump typescript from 5.1.6 to 5.2.2 by @dependabot in #540
- build(deps-dev): bump cspell from 7.0.1 to 7.3.6 by @dependabot in #548
- build(deps-dev): bump @types/node from 20.5.7 to 20.6.2 by @dependabot in #549
- build(deps-dev): bump marked from 7.0.5 to 9.0.2 by @dependabot in #550
- build(deps-dev): bump marked from 9.0.2 to 9.0.3 by @dependabot in #551
- build(deps-dev): bump typedoc from 0.25.0 to 0.25.1 by @dependabot in #553
- build(deps-dev): bump eslint from 8.48.0 to 8.49.0 by @dependabot in #554
- build(deps-dev): bump @types/node from 20.6.2 to 20.6.3 by @dependabot in #555
- build(deps-dev): bump eslint from 8.49.0 to 8.50.0 by @dependabot in #556
- build(deps-dev): bump @types/node from 20.6.3 to 20.7.1 by @dependabot in #560
- build(deps-dev): bump cspell from 7.3.6 to 7.3.7 by @dependabot in #561
- build(deps-dev): bump @types/node from 20.7.1 to 20.8.2 by @dependabot in #563
- build(deps-dev): bump eslint from 8.50.0 to 8.51.0 by @dependabot in #566
- build(deps-dev): bump typedoc from 0.25.1 to 0.25.2 by @dependabot in #567
- build(deps-dev): bump marked from 9.0.3 to 9.1.1 by @dependabot in #571
- build(deps-dev): bump @types/node from 20.8.2 to 20.8.5 by @dependabot in #572
- build(deps-dev): bump marked from 9.1.1 to 9.1.2 by @dependabot in #573
- build(deps-dev): bump cspell from 7.3.7 to 7.3.8 by @dependabot in #574
- build(deps-dev): bump @babel/traverse from 7.15.0 to 7.23.2 by @dependabot in #577
- build(deps-dev): bump @types/node from 20.8.5 to 20.8.9 by @dependabot in #581
- build(deps-dev): bump typedoc from 0.25.2 to 0.25.3 by @dependabot in #582
- build(deps-dev): bump eslint from 8.51.0 to 8.52.0 by @dependabot in #584
- build(deps-dev): bump eslint-plugin-import from 2.28.1 to 2.29.0 by @dependabot in #585
- build(deps-dev): bump marked from 9.1.2 to 9.1.5 by @dependabot in #588
- build(deps-dev): bump eslint from 8.52.0 to 8.53.0 by @dependabot in #589
- build(deps-dev): bump @types/node from 20.8.9 to 20.9.0 by @dependabot in #592
- build(deps-dev): bump cspell from 7.3.8 to 8.0.0 by @dependabot in #593
- build(deps-dev): bump marked from 9.1.5 to 10.0.0 by @dependabot in #594
- build(deps-dev): bump @types/node from 20.9.0 to 20.9.1 by @dependabot in #597
- build(deps-dev): bump eslint from 8.53.0 to 8.54.0 by @dependabot in #598
- build(deps-dev): bump gh-pages from 6.0.0 to 6.1.0 by @dependabot in #600
- build(deps-dev): bump typescript from 5.2.2 to 5.3.2 by @dependabot in #601
- build(deps-dev): bump typedoc from 0.25.3 to 0.25.4 by @dependabot in #607
- build(deps-dev): bump @types/node from 20.9.1 to 20.10.1 by @dependabot in #610
- build(deps-dev): bump marked from 10.0.0 to 11.0.0 by @dependabot in #611
- build(deps-dev): bump eslint-config-prettier from 9.0.0 to 9.1.0 by @dependabot in #613
- build(deps-dev): bump eslint from 8.54.0 to 8.55.0 by @dependabot in #615
- build(deps-dev): bump cspell from 8.0.0 to 8.1.3 by @dependabot in #618
- build(deps-dev): bump @types/node from 20.10.1 to 20.10.4 by @dependabot in #619
- build(deps-dev): bump ts-node from 10.9.1 to 10.9.2 by @dependabot in #621
- build(deps-dev): bump typescript from 5.3.2 to 5.3.3 by @dependabot in #623
- build(deps-dev): bump marked from 11.0.0 to 11.1.0 by @dependabot in #625
- build(deps-dev): bump eslint-plugin-import from 2.29.0 to 2.29.1 by @dependabot in #626
- build(deps-dev): bump @types/node from 20.10.4 to 20.10.5 by @dependabot in #629
- build(deps-dev): bump eslint from 8.55.0 to 8.56.0 by @dependabot in #628
- build(deps-dev): bump open-cli from 7.2.0 to 8.0.0 by @dependabot in #631
- build(deps-dev): bump cspell from 8.1.3 to 8.2.1 by @dependabot in #632
- build(deps-dev): bump gh-pages from 6.1.0 to 6.1.1 by @dependabot in #633
- build(deps-dev): bump cspell from 8.2.1 to 8.2.4 by @dependabot in #636
- build(deps-dev): bump @types/no...
v1.3.3
Fmodel
provides just enough tactical Domain-Driven Design patterns, optimized for Event Sourcing and CQRS.
The domain
components are fully isolated from the application layer and API-related concerns.
It represents a pure declaration (pure functions) of the program logic.
Decider
, View
, and Saga
The application
components orchestrate the execution of the logic by loading the state, executing domain components, and storing a new state.
EventSourcingAggregate
, StateStoredAggregate
, MaterializedView
, and SagaManager
Install
npm i @fraktalio/fmodel-ts
Available on https://www.npmjs.com/package/@fraktalio/fmodel-ts
Learn more
What's Changed
- bind this to latestVersionProvider by @reify-joe-eckard in #515
New Contributors
- @reify-joe-eckard made their first contribution in #515
Full Changelog: v1.3.2...v1.3.3