From 52ebb70c45247d4744cf68a5a2c9c14094613582 Mon Sep 17 00:00:00 2001 From: idugalic Date: Thu, 23 May 2024 20:05:40 +0000 Subject: [PATCH] deploy: f0424691b7eaa828d2473c71821eada182d620b8 --- 404.html | 4 ++-- assets/js/{14609be1.669f82b9.js => 14609be1.1c782208.js} | 2 +- .../{runtime~main.e69fb202.js => runtime~main.17df055a.js} | 2 +- blog.html | 4 ++-- blog/archive.html | 4 ++-- blog/tags.html | 4 ++-- blog/tags/domain.html | 4 ++-- blog/tags/fmodel.html | 4 ++-- blog/tags/hello.html | 4 ++-- blog/tags/modeling.html | 4 ++-- blog/welcome.html | 4 ++-- docs/application.html | 4 ++-- docs/application/architecture.html | 4 ++-- docs/application/example.html | 4 ++-- docs/category/composing-the-application.html | 4 ++-- docs/category/modeling-the-domain.html | 4 ++-- docs/category/other-programming-languages.html | 4 ++-- docs/domain/aggregating-the-behaviour.html | 4 ++-- docs/domain/discovering-the-domain.html | 4 ++-- docs/domain/modeling-the-behaviour.html | 4 ++-- docs/domain/specification-by-example.html | 4 ++-- docs/domain/structuring-the-data.html | 4 ++-- docs/intro.html | 4 ++-- docs/other/rust.html | 4 ++-- docs/other/type-script.html | 4 ++-- index.html | 4 ++-- release-notes.html | 6 +++--- search.html | 4 ++-- 28 files changed, 55 insertions(+), 55 deletions(-) rename assets/js/{14609be1.669f82b9.js => 14609be1.1c782208.js} (95%) rename assets/js/{runtime~main.e69fb202.js => runtime~main.17df055a.js} (98%) diff --git a/404.html b/404.html index 7fbe83d..e29a0eb 100644 --- a/404.html +++ b/404.html @@ -13,13 +13,13 @@ - +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- + \ No newline at end of file diff --git a/assets/js/14609be1.669f82b9.js b/assets/js/14609be1.1c782208.js similarity index 95% rename from assets/js/14609be1.669f82b9.js rename to assets/js/14609be1.1c782208.js index fd40fad..2563946 100644 --- a/assets/js/14609be1.669f82b9.js +++ b/assets/js/14609be1.1c782208.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfmodel=self.webpackChunkfmodel||[]).push([[7307],{3905:(e,a,t)=>{t.d(a,{Zo:()=>p,kt:()=>f});var n=t(7294);function r(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function o(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function l(e){for(var a=1;a=0||(r[t]=e[t]);return r}(e,a);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var c=n.createContext({}),m=function(e){var a=n.useContext(c),t=a;return e&&(t="function"==typeof e?e(a):l(l({},a),e)),t},p=function(e){var a=m(e.components);return n.createElement(c.Provider,{value:a},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},u=n.forwardRef((function(e,a){var t=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=m(t),u=r,f=d["".concat(c,".").concat(u)]||d[u]||s[u]||o;return t?n.createElement(f,l(l({ref:a},p),{},{components:t})):n.createElement(f,l({ref:a},p))}));function f(e,a){var t=arguments,r=a&&a.mdxType;if("string"==typeof e||r){var o=t.length,l=new Array(o);l[0]=u;var i={};for(var c in a)hasOwnProperty.call(a,c)&&(i[c]=a[c]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var m=2;m{t.r(a),t.d(a,{contentTitle:()=>c,default:()=>u,frontMatter:()=>i,metadata:()=>m,toc:()=>p});var n=t(7462),r=(t(7294),t(3905)),o=t(4866),l=t(5162);const i={title:"Release Notes"},c="Release Notes",m={type:"mdx",permalink:"/fmodel/release-notes",source:"@site/src/pages/release-notes.md",title:"Release Notes",description:"3.5.1",frontMatter:{title:"Release Notes"}},p=[{value:"3.5.1",id:"351",level:2},{value:"What's changed",id:"whats-changed",level:3},{value:"Include the dependencies",id:"include-the-dependencies",level:3},{value:"3.5.0",id:"350",level:2},{value:"What's changed",id:"whats-changed-1",level:3},{value:"Include the dependencies",id:"include-the-dependencies-1",level:3},{value:"3.4.0",id:"340",level:2},{value:"What's changed",id:"whats-changed-2",level:3},{value:"Include the dependencies",id:"include-the-dependencies-2",level:3},{value:"3.3.0",id:"330",level:2},{value:"What's changed",id:"whats-changed-3",level:3},{value:"A convenient DSL (builder) for the domain components",id:"a-convenient-dsl-builder-for-the-domain-components",level:4},{value:"Minimizing the API",id:"minimizing-the-api",level:4},{value:"Include the dependencies",id:"include-the-dependencies-3",level:3},{value:"3.2.0",id:"320",level:2},{value:"What's changed",id:"whats-changed-4",level:3},{value:"Optimistic Locking",id:"optimistic-locking",level:4},{value:"Include the dependencies",id:"include-the-dependencies-4",level:3},{value:"3.1.0",id:"310",level:2},{value:"What's changed",id:"whats-changed-5",level:3},{value:"Experimental Actors (JVM only)",id:"experimental-actors-jvm-only",level:4},{value:"Include the dependencies",id:"include-the-dependencies-5",level:3},{value:"3.0.0",id:"300",level:2},{value:"What's changed",id:"whats-changed-6",level:3},{value:"Tests example",id:"tests-example",level:4},{value:"Include the dependencies",id:"include-the-dependencies-6",level:3}],d={toc:p},s="wrapper";function u(e){let{components:a,...t}=e;return(0,r.kt)(s,(0,n.Z)({},d,t,{components:a,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"release-notes"},"Release Notes"),(0,r.kt)("h2",{id:"351"},"3.5.1"),(0,r.kt)("p",null,"Artifacts are available on Maven Central"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.5.1/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.5.1/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.5.1/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.5.1/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.5.1/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.5.1/jar"))),(0,r.kt)("h3",{id:"whats-changed"},"What's changed"),(0,r.kt)("p",null,"In this ",(0,r.kt)("inlineCode",{parentName:"p"},"minor")," release, we have fixed the bug on the Event Sourced aggregate within the ",(0,r.kt)("inlineCode",{parentName:"p"},"application")," module - ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fraktalio/fmodel/pull/291"},"https://github.com/fraktalio/fmodel/pull/291"),".\nIt is reproducible only in the orchestrating scenarios where you communicate two deciders back and forth, a couple of times."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Full Changelog"),": ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fraktalio/fmodel/compare/v3.5.0...v3.5.1"},"https://github.com/fraktalio/fmodel/compare/v3.5.0...v3.5.1")),(0,r.kt)("h3",{id:"include-the-dependencies"},"Include the dependencies"),(0,r.kt)(o.Z,{groupId:"build",queryString:"build-type",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"gradleKotlin",label:"Gradle (Kotlin)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'dependencies {\n implementation("com.fraktalio.fmodel:domain:3.5.1")\n implementation("com.fraktalio.fmodel:application-vanilla:3.5.1")\n implementation("com.fraktalio.fmodel:application-arrow:3.5.1")\n}\n'))),(0,r.kt)(l.Z,{value:"gradleGroovy",label:"Gradle (Groovy)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.fraktalio.fmodel:domain:3.5.1'\n implementation 'com.fraktalio.fmodel:application-vanilla:3.5.1'\n implementation 'com.fraktalio.fmodel:application-arrow:3.5.1'\n}\n"))),(0,r.kt)(l.Z,{value:"maven",label:"Maven",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-xml"},"\n\n com.fraktalio.fmodel\n domain\n 3.5.1\n\n\n\n com.fraktalio.fmodel\n application-vanilla\n 3.5.1\n\n\n\n com.fraktalio.fmodel\n application-arrow\n 3.5.1\n\n")))),(0,r.kt)("h2",{id:"350"},"3.5.0"),(0,r.kt)("p",null,"Artifacts are available on Maven Central"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.5.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.5.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.5.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.5.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.5.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.5.0/jar"))),(0,r.kt)("h3",{id:"whats-changed-1"},"What's changed"),(0,r.kt)("p",null,"In this release, we have upgraded the Kotlin Arrow library to ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/arrow-kt/arrow/releases/tag/1.2.0"},"1.2.0"),". It is a breaking change for the ",(0,r.kt)("inlineCode",{parentName:"p"},"application-arrow")," module/extension."),(0,r.kt)("p",null,"We have introduced and configured a binary compatibility validator into our build process."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"The tool allows dumping binary API of a JVM part of a Kotlin library that is public in the sense of Kotlin visibilities and ensures that the public binary API wasn't changed in a way that makes this change binary incompatible.\n")),(0,r.kt)("p",null,"We extended the case of using ",(0,r.kt)("inlineCode",{parentName:"p"},"actor")," functions to parallelize the message handling processes. (available on JVM target only)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},"/**\n * Extension function - Handles the flow of command messages of type [C] by concurrently distributing the load across finite number of actors/handlers\n *\n * @param commands [Flow] of Command messages of type [C]\n * @param numberOfActors total number of actors/workers available for distributing the load. Minimum one.\n * @param actorsCapacity capacity of the actors channel's buffer\n * @param actorsStart actors coroutine start option\n * @param actorsContext additional to [CoroutineScope.coroutineContext] context of the actor coroutines.\n * @param partitionKey a function that calculates the partition key/routing key of command - commands with the same partition key will be handled with the same 'actor' to keep the ordering\n * @return [Flow] of stored Events of type [E]\n *\n */\nfun EventSourcingAggregate.handleConcurrently(\n commands: Flow,\n numberOfActors: Int = 100,\n actorsCapacity: Int = Channel.BUFFERED,\n actorsStart: CoroutineStart = CoroutineStart.LAZY,\n actorsContext: CoroutineContext = EmptyCoroutineContext,\n partitionKey: (C) -> Int\n): Flow\n")),(0,r.kt)("p",null,"Deprecating factory functions in favor of constructor-like functions."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'@Deprecated(\n message = "Use EventSourcingLockingAggregate constructor-like function instead",\n replaceWith = ReplaceWith("EventSourcingLockingAggregate(decider, eventRepository)")\n)\nfun eventSourcingLockingAggregate(\n decider: IDecider,\n eventRepository: EventLockingRepository\n): EventSourcingLockingAggregate =\n object : EventSourcingLockingAggregate,\n EventLockingRepository by eventRepository,\n IDecider by decider {}\n\n')),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Full Changelog"),": ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fraktalio/fmodel/compare/v3.4.0...v3.5.0"},"https://github.com/fraktalio/fmodel/compare/v3.4.0...v3.5.0")),(0,r.kt)("h3",{id:"include-the-dependencies-1"},"Include the dependencies"),(0,r.kt)(o.Z,{groupId:"build",queryString:"build-type",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"gradleKotlin",label:"Gradle (Kotlin)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'dependencies {\n implementation("com.fraktalio.fmodel:domain:3.5.0")\n implementation("com.fraktalio.fmodel:application-vanilla:3.5.0")\n implementation("com.fraktalio.fmodel:application-arrow:3.5.0")\n}\n'))),(0,r.kt)(l.Z,{value:"gradleGroovy",label:"Gradle (Groovy)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.fraktalio.fmodel:domain:3.5.0'\n implementation 'com.fraktalio.fmodel:application-vanilla:3.5.0'\n implementation 'com.fraktalio.fmodel:application-arrow:3.5.0'\n}\n"))),(0,r.kt)(l.Z,{value:"maven",label:"Maven",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-xml"},"\n\n com.fraktalio.fmodel\n domain\n 3.5.0\n\n\n\n com.fraktalio.fmodel\n application-vanilla\n 3.5.0\n\n\n\n com.fraktalio.fmodel\n application-arrow\n 3.5.0\n\n")))),(0,r.kt)("h2",{id:"340"},"3.4.0"),(0,r.kt)("p",null,"Artifacts are available on Maven Central"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.4.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.4.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.4.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.4.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.4.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.4.0/jar"))),(0,r.kt)("h3",{id:"whats-changed-2"},"What's changed"),(0,r.kt)("p",null,"New native targets are available:\nlinuxX64(), mingwX64(), macosX64(), macosArm64(), tvos(), tvosSimulatorArm64(), watchosArm32(), watchosArm64(),\nwatchosX86(), watchosX64(), watchosSimulatorArm64(), iosX64(), iosArm64(), iosArm32(), iosSimulatorArm64()"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Full Changelog"),": ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fraktalio/fmodel/compare/v3.3.0...v3.4.0"},"https://github.com/fraktalio/fmodel/compare/v3.3.0...v3.4.0")),(0,r.kt)("h3",{id:"include-the-dependencies-2"},"Include the dependencies"),(0,r.kt)(o.Z,{groupId:"build",queryString:"build-type",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"gradleKotlin",label:"Gradle (Kotlin)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'dependencies {\n implementation("com.fraktalio.fmodel:domain:3.4.0")\n implementation("com.fraktalio.fmodel:application-vanilla:3.4.0")\n implementation("com.fraktalio.fmodel:application-arrow:3.4.0")\n}\n'))),(0,r.kt)(l.Z,{value:"gradleGroovy",label:"Gradle (Groovy)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.fraktalio.fmodel:domain:3.4.0'\n implementation 'com.fraktalio.fmodel:application-vanilla:3.4.0'\n implementation 'com.fraktalio.fmodel:application-arrow:3.4.0'\n}\n"))),(0,r.kt)(l.Z,{value:"maven",label:"Maven",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-xml"},"\n\n com.fraktalio.fmodel\n domain\n 3.4.0\n\n\n\n com.fraktalio.fmodel\n application-vanilla\n 3.4.0\n\n\n\n com.fraktalio.fmodel\n application-arrow\n 3.4.0\n\n")))),(0,r.kt)("h2",{id:"330"},"3.3.0"),(0,r.kt)("p",null,"Artifacts are available on Maven Central"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.3.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.3.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.3.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.3.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.3.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.3.0/jar"))),(0,r.kt)("h3",{id:"whats-changed-3"},"What's changed"),(0,r.kt)("h4",{id:"a-convenient-dsl-builder-for-the-domain-components"},"A convenient DSL (builder) for the domain components"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'fun evenNumberDecider(): Decider =\n decider {\n initialState {\n evenNumberState {\n descriptionString { "Initial state" }\n valueInt { 0 }\n }\n }\n decide { c, s ->\n when (c) {\n is AddEvenNumber -> flowOf(\n evenNumberAdded {\n description { c.description }\n value { s.value + c.value }\n }\n )\n\n is SubtractEvenNumber -> flowOf(\n evenNumberSubtracted {\n description { c.description }\n value { s.value - c.value }\n }\n )\n\n null -> emptyFlow()\n }\n }\n evolve { s, e ->\n when (e) {\n is EvenNumberAdded ->\n evenNumberState {\n description { s.description + e.description }\n value { e.value }\n }\n\n is EvenNumberSubtracted ->\n evenNumberState {\n description { s.description - e.description }\n value { e.value }\n }\n\n null -> s\n }\n }\n }\n')),(0,r.kt)("h4",{id:"minimizing-the-api"},"Minimizing the API"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"_Decider")," is internal now"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"_View")," is internal now")),(0,r.kt)("p",null,"There was no true usage of this API, so we have decided to make it internal, in favor of ",(0,r.kt)("inlineCode",{parentName:"p"},"Decider"),"\nand ",(0,r.kt)("inlineCode",{parentName:"p"},"View"),".\nPreviously, ",(0,r.kt)("inlineCode",{parentName:"p"},"Decider")," was just a type alias of ",(0,r.kt)("inlineCode",{parentName:"p"},"_Decider"),", but these are different types actually, and we want to\npromote that."),(0,r.kt)("p",null,"We hope to minimize the complexity of the API, and make the right thing to do the easy thing to do."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Full Changelog"),": ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fraktalio/fmodel/compare/v3.2.0...v3.3.0"},"https://github.com/fraktalio/fmodel/compare/v3.2.0...v3.3.0")),(0,r.kt)("h3",{id:"include-the-dependencies-3"},"Include the dependencies"),(0,r.kt)(o.Z,{groupId:"build",queryString:"build-type",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"gradleKotlin",label:"Gradle (Kotlin)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'dependencies {\n implementation("com.fraktalio.fmodel:domain:3.3.0")\n implementation("com.fraktalio.fmodel:application-vanilla:3.3.0")\n implementation("com.fraktalio.fmodel:application-arrow:3.3.0")\n}\n'))),(0,r.kt)(l.Z,{value:"gradleGroovy",label:"Gradle (Groovy)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.fraktalio.fmodel:domain:3.3.0'\n implementation 'com.fraktalio.fmodel:application-vanilla:3.3.0'\n implementation 'com.fraktalio.fmodel:application-arrow:3.3.0'\n}\n"))),(0,r.kt)(l.Z,{value:"maven",label:"Maven",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-xml"},"\n\n com.fraktalio.fmodel\n domain\n 3.3.0\n\n\n\n com.fraktalio.fmodel\n application-vanilla\n 3.3.0\n\n\n\n com.fraktalio.fmodel\n application-arrow\n 3.3.0\n\n")))),(0,r.kt)("h2",{id:"320"},"3.2.0"),(0,r.kt)("p",null,"Artifacts are available on Maven Central"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.2.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.2.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.2.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.2.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.2.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.2.0/jar"))),(0,r.kt)("h3",{id:"whats-changed-4"},"What's changed"),(0,r.kt)("h4",{id:"optimistic-locking"},"Optimistic Locking"),(0,r.kt)("p",null,"Optimistic locking, also referred to as optimistic concurrency control, allows multiple concurrent users to attempt to\nupdate the same resource."),(0,r.kt)("p",null,"There are two common ways to implement optimistic locking: version number and timestamp. The version number is generally\nconsidered to be a better option because the server clock can be inaccurate over time, but we do not want to restrict it\nto only one option, so we have the generic parameter V acting as a Version."),(0,r.kt)("p",null,"The optimistic locking mechanism is not leaking into the core Domain layer."),(0,r.kt)("p",null,"Application modules provide more interfaces and extensions, giving you additional options to compose your unique Domain\ncomponents with Optimistic Locking formally in place, without changing the Domain components whatsoever."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"example (state-stored aggregate / traditional):")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"}," stateStoredLockingAggregate(\n decider = myDecider,\n stateRepository = myLockingRepository\n ).handleOptimistically(myCommand)\n")),(0,r.kt)("p",null,"where ",(0,r.kt)("inlineCode",{parentName:"p"},"myDecider")," is of type ",(0,r.kt)("inlineCode",{parentName:"p"},"IDecider"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"myLockingRepository")," is of type ",(0,r.kt)("inlineCode",{parentName:"p"},"StateLockingRepository"),"\nand ",(0,r.kt)("inlineCode",{parentName:"p"},"myCommand")," is of type ",(0,r.kt)("inlineCode",{parentName:"p"},"C")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"example (event-sourced aggregate / event-driven):")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},"\n eventSourcingLockingAggregate(\n decider = myDecider,\n stateRepository = myLockingRepository\n ).handleOptimistically(myCommand)\n")),(0,r.kt)("p",null,"where ",(0,r.kt)("inlineCode",{parentName:"p"},"myDecider")," is of type ",(0,r.kt)("inlineCode",{parentName:"p"},"IDecider"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"myLockingRepository")," is of type ",(0,r.kt)("inlineCode",{parentName:"p"},"EventLockingRepository"),"\nand ",(0,r.kt)("inlineCode",{parentName:"p"},"myCommand")," is of type ",(0,r.kt)("inlineCode",{parentName:"p"},"C")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Full Changelog"),": ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fraktalio/fmodel/compare/v3.1.0...v3.2.0"},"https://github.com/fraktalio/fmodel/compare/v3.1.0...v3.2.0")),(0,r.kt)("h3",{id:"include-the-dependencies-4"},"Include the dependencies"),(0,r.kt)(o.Z,{groupId:"build",queryString:"build-type",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"gradleKotlin",label:"Gradle (Kotlin)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'dependencies {\n implementation("com.fraktalio.fmodel:domain:3.2.0")\n implementation("com.fraktalio.fmodel:application-vanilla:3.2.0")\n implementation("com.fraktalio.fmodel:application-arrow:3.2.0")\n}\n'))),(0,r.kt)(l.Z,{value:"gradleGroovy",label:"Gradle (Groovy)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.fraktalio.fmodel:domain:3.2.0'\n implementation 'com.fraktalio.fmodel:application-vanilla:3.2.0'\n implementation 'com.fraktalio.fmodel:application-arrow:3.2.0'\n}\n"))),(0,r.kt)(l.Z,{value:"maven",label:"Maven",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-xml"},"\n\n com.fraktalio.fmodel\n domain\n 3.2.0\n\n\n\n com.fraktalio.fmodel\n application-vanilla\n 3.2.0\n\n\n\n com.fraktalio.fmodel\n application-arrow\n 3.2.0\n\n")))),(0,r.kt)("h2",{id:"310"},"3.1.0"),(0,r.kt)("p",null,"Artifacts are available on Maven Central"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.1.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.1.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.1.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.1.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.1.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.1.0/jar"))),(0,r.kt)("h3",{id:"whats-changed-5"},"What's changed"),(0,r.kt)("h4",{id:"experimental-actors-jvm-only"},"Experimental Actors (JVM only)"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Kotlin Actors (experimental) - concurrently handling messages by ",(0,r.kt)("inlineCode",{parentName:"li"},"idugalic"),"\nin ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/fraktalio/fmodel/pull/70"},"https://github.com/fraktalio/fmodel/pull/70"))),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://raw.githubusercontent.com/fraktalio/fmodel/main/.assets/kotlin-actors.png",alt:"kotlin actors"})),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},"@ExperimentalContracts\n@FlowPreview\nfun EventSourcingAggregate.handleConcurrently(\n commands: Flow,\n numberOfActors: Int = 100,\n actorsCapacity: Int = Channel.BUFFERED,\n actorsStart: CoroutineStart = CoroutineStart.LAZY,\n actorsContext: CoroutineContext = EmptyCoroutineContext,\n partitionKey: (C) -> Int\n): Flow = channelFlow {\n val actors: List> = (1..numberOfActors).map {\n commandActor(channel, actorsCapacity, actorsStart, actorsContext) { handle(it) }\n\n }\n commands\n .onCompletion {\n actors.forEach {\n it.close()\n }\n }\n .collect {\n val partition = partitionKey(it).absoluteValue % numberOfActors.coerceAtLeast(1)\n actors[partition].send(it)\n }\n}\n\n")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Full Changelog"),": ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fraktalio/fmodel/compare/v3.0.0...v3.1.0"},"https://github.com/fraktalio/fmodel/compare/v3.0.0...v3.1.0")),(0,r.kt)("h3",{id:"include-the-dependencies-5"},"Include the dependencies"),(0,r.kt)(o.Z,{groupId:"build",queryString:"build-type",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"gradleKotlin",label:"Gradle (Kotlin)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'dependencies {\n implementation("com.fraktalio.fmodel:domain:3.1.0")\n implementation("com.fraktalio.fmodel:application-vanilla:3.1.0")\n implementation("com.fraktalio.fmodel:application-arrow:3.1.0")\n}\n'))),(0,r.kt)(l.Z,{value:"gradleGroovy",label:"Gradle (Groovy)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.fraktalio.fmodel:domain:3.1.0'\n implementation 'com.fraktalio.fmodel:application-vanilla:3.1.0'\n implementation 'com.fraktalio.fmodel:application-arrow:3.1.0'\n}\n"))),(0,r.kt)(l.Z,{value:"maven",label:"Maven",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-xml"},"\n\n com.fraktalio.fmodel\n domain\n 3.1.0\n\n\n\n com.fraktalio.fmodel\n application-vanilla\n 3.1.0\n\n\n\n com.fraktalio.fmodel\n application-arrow\n 3.1.0\n\n")))),(0,r.kt)("h2",{id:"300"},"3.0.0"),(0,r.kt)("p",null,"Artifacts are available on Maven Central"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.0.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.0.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.0.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.0.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.0.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.0.0/jar"))),(0,r.kt)("h3",{id:"whats-changed-6"},"What's changed"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"A ",(0,r.kt)("a",{parentName:"li",href:"https://kotlinlang.org/docs/multiplatform.html"},"multiplatform support (jvm, js, native)")," included"),(0,r.kt)("li",{parentName:"ul"},"Switched from Spek to Kotest test framework"),(0,r.kt)("li",{parentName:"ul"},"Switched from Maven to Gradle")),(0,r.kt)("h4",{id:"tests-example"},"Tests example"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'class DeciderTest : FunSpec({\n val evenDecider = evenNumberDecider()\n val oddDecider = oddNumberDecider()\n\n test("Event-sourced Decider - add even number") {\n with(evenDecider) {\n givenEvents(emptyList()) {\n whenCommand(AddEvenNumber(Description("2"), NumberValue(2)))\n } thenEvents listOf(EvenNumberAdded(Description("2"), NumberValue(2)))\n }\n }\n\n test("Event-sourced Decider - given previous state, add even number") {\n with(evenDecider) {\n givenEvents(listOf(EvenNumberAdded(Description("2"), NumberValue(2)))) {\n whenCommand(AddEvenNumber(Description("4"), NumberValue(4)))\n } thenEvents listOf(EvenNumberAdded(Description("4"), NumberValue(4)))\n }\n }\n})\n')),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Full Changelog"),": ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fraktalio/fmodel/compare/v3.0.0...v3.1.0"},"https://github.com/fraktalio/fmodel/compare/v3.0.0...v3.1.0")),(0,r.kt)("h3",{id:"include-the-dependencies-6"},"Include the dependencies"),(0,r.kt)(o.Z,{groupId:"build",queryString:"build-type",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"gradleKotlin",label:"Gradle (Kotlin)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'dependencies {\n implementation("com.fraktalio.fmodel:domain:3.0.0")\n implementation("com.fraktalio.fmodel:application-vanilla:3.0.0")\n implementation("com.fraktalio.fmodel:application-arrow:3.0.0")\n}\n'))),(0,r.kt)(l.Z,{value:"gradleGroovy",label:"Gradle (Groovy)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.fraktalio.fmodel:domain:3.0.0'\n implementation 'com.fraktalio.fmodel:application-vanilla:3.0.0'\n implementation 'com.fraktalio.fmodel:application-arrow:3.0.0'\n}\n"))),(0,r.kt)(l.Z,{value:"maven",label:"Maven",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-xml"},"\n\n com.fraktalio.fmodel\n domain\n 3.0.0\n\n\n\n com.fraktalio.fmodel\n application-vanilla\n 3.0.0\n\n\n\n com.fraktalio.fmodel\n application-arrow\n 3.0.0\n\n")))))}u.isMDXComponent=!0},5162:(e,a,t)=>{t.d(a,{Z:()=>l});var n=t(7294),r=t(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:a,hidden:t,className:l}=e;return n.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:t},a)}},4866:(e,a,t)=>{t.d(a,{Z:()=>N});var n=t(7462),r=t(7294),o=t(6010),l=t(2466),i=t(6550),c=t(1980),m=t(7392),p=t(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:a}=e;return!!a&&"object"==typeof a&&"value"in a}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:a,label:t,attributes:n,default:r}}=e;return{value:a,label:t,attributes:n,default:r}}))}function s(e){const{values:a,children:t}=e;return(0,r.useMemo)((()=>{const e=a??d(t);return function(e){const a=(0,m.l)(e,((e,a)=>e.value===a.value));if(a.length>0)throw new Error(`Docusaurus error: Duplicate values "${a.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[a,t])}function u(e){let{value:a,tabValues:t}=e;return t.some((e=>e.value===a))}function f(e){let{queryString:a=!1,groupId:t}=e;const n=(0,i.k6)(),o=function(e){let{queryString:a=!1,groupId:t}=e;if("string"==typeof a)return a;if(!1===a)return null;if(!0===a&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:a,groupId:t});return[(0,c._X)(o),(0,r.useCallback)((e=>{if(!o)return;const a=new URLSearchParams(n.location.search);a.set(o,e),n.replace({...n.location,search:a.toString()})}),[o,n])]}function k(e){const{defaultValue:a,queryString:t=!1,groupId:n}=e,o=s(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:a,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(a){if(!u({value:a,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${a}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return a}const n=t.find((e=>e.default))??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:a,tabValues:o}))),[c,m]=f({queryString:t,groupId:n}),[d,k]=function(e){let{groupId:a}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(a),[n,o]=(0,p.Nk)(t);return[n,(0,r.useCallback)((e=>{t&&o.set(e)}),[t,o])]}({groupId:n}),h=(()=>{const e=c??d;return u({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{h&&i(h)}),[h]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!u({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),m(e),k(e)}),[m,k,o]),tabValues:o}}var h=t(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:a,block:t,selectedValue:i,selectValue:c,tabValues:m}=e;const p=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),s=e=>{const a=e.currentTarget,t=p.indexOf(a),n=m[t].value;n!==i&&(d(a),c(n))},u=e=>{let a=null;switch(e.key){case"Enter":s(e);break;case"ArrowRight":{const t=p.indexOf(e.currentTarget)+1;a=p[t]??p[0];break}case"ArrowLeft":{const t=p.indexOf(e.currentTarget)-1;a=p[t]??p[p.length-1];break}}a?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":t},a)},m.map((e=>{let{value:a,label:t,attributes:l}=e;return r.createElement("li",(0,n.Z)({role:"tab",tabIndex:i===a?0:-1,"aria-selected":i===a,key:a,ref:e=>p.push(e),onKeyDown:u,onClick:s},l,{className:(0,o.Z)("tabs__item",v.tabItem,l?.className,{"tabs__item--active":i===a})}),t??a)})))}function y(e){let{lazy:a,children:t,selectedValue:n}=e;const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(a){const e=o.find((e=>e.props.value===n));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,a)=>(0,r.cloneElement)(e,{key:a,hidden:e.props.value!==n}))))}function b(e){const a=k(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",v.tabList)},r.createElement(g,(0,n.Z)({},e,a)),r.createElement(y,(0,n.Z)({},e,a)))}function N(e){const a=(0,h.Z)();return r.createElement(b,(0,n.Z)({key:String(a)},e))}}}]); \ No newline at end of file +"use strict";(self.webpackChunkfmodel=self.webpackChunkfmodel||[]).push([[7307],{3905:(e,a,t)=>{t.d(a,{Zo:()=>m,kt:()=>f});var n=t(7294);function r(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function o(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function l(e){for(var a=1;a=0||(r[t]=e[t]);return r}(e,a);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var c=n.createContext({}),p=function(e){var a=n.useContext(c),t=a;return e&&(t="function"==typeof e?e(a):l(l({},a),e)),t},m=function(e){var a=p(e.components);return n.createElement(c.Provider,{value:a},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},u=n.forwardRef((function(e,a){var t=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),d=p(t),u=r,f=d["".concat(c,".").concat(u)]||d[u]||s[u]||o;return t?n.createElement(f,l(l({ref:a},m),{},{components:t})):n.createElement(f,l({ref:a},m))}));function f(e,a){var t=arguments,r=a&&a.mdxType;if("string"==typeof e||r){var o=t.length,l=new Array(o);l[0]=u;var i={};for(var c in a)hasOwnProperty.call(a,c)&&(i[c]=a[c]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var p=2;p{t.r(a),t.d(a,{contentTitle:()=>c,default:()=>u,frontMatter:()=>i,metadata:()=>p,toc:()=>m});var n=t(7462),r=(t(7294),t(3905)),o=t(4866),l=t(5162);const i={title:"Release Notes"},c="Release Notes",p={type:"mdx",permalink:"/fmodel/release-notes",source:"@site/src/pages/release-notes.md",title:"Release Notes",description:"3.5.1",frontMatter:{title:"Release Notes"}},m=[{value:"3.5.1",id:"351",level:2},{value:"What's changed",id:"whats-changed",level:3},{value:"Include the dependencies",id:"include-the-dependencies",level:3},{value:"3.5.0",id:"350",level:2},{value:"What's changed",id:"whats-changed-1",level:3},{value:"Include the dependencies",id:"include-the-dependencies-1",level:3},{value:"3.4.0",id:"340",level:2},{value:"What's changed",id:"whats-changed-2",level:3},{value:"Include the dependencies",id:"include-the-dependencies-2",level:3},{value:"3.3.0",id:"330",level:2},{value:"What's changed",id:"whats-changed-3",level:3},{value:"A convenient DSL (builder) for the domain components",id:"a-convenient-dsl-builder-for-the-domain-components",level:4},{value:"Minimizing the API",id:"minimizing-the-api",level:4},{value:"Include the dependencies",id:"include-the-dependencies-3",level:3},{value:"3.2.0",id:"320",level:2},{value:"What's changed",id:"whats-changed-4",level:3},{value:"Optimistic Locking",id:"optimistic-locking",level:4},{value:"Include the dependencies",id:"include-the-dependencies-4",level:3},{value:"3.1.0",id:"310",level:2},{value:"What's changed",id:"whats-changed-5",level:3},{value:"Experimental Actors (JVM only)",id:"experimental-actors-jvm-only",level:4},{value:"Include the dependencies",id:"include-the-dependencies-5",level:3},{value:"3.0.0",id:"300",level:2},{value:"What's changed",id:"whats-changed-6",level:3},{value:"Tests example",id:"tests-example",level:4},{value:"Include the dependencies",id:"include-the-dependencies-6",level:3}],d={toc:m},s="wrapper";function u(e){let{components:a,...t}=e;return(0,r.kt)(s,(0,n.Z)({},d,t,{components:a,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"release-notes"},"Release Notes"),(0,r.kt)("h2",{id:"351"},"3.5.1"),(0,r.kt)("p",null,"Artifacts are available on Maven Central"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.5.1/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.5.1/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.5.1/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.5.1/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.5.1/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.5.1/jar"))),(0,r.kt)("h3",{id:"whats-changed"},"What's changed"),(0,r.kt)("p",null,"In this ",(0,r.kt)("inlineCode",{parentName:"p"},"patch")," release, we have fixed the bug on the Event Sourced aggregate within the ",(0,r.kt)("inlineCode",{parentName:"p"},"application")," module - ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fraktalio/fmodel/pull/291"},"https://github.com/fraktalio/fmodel/pull/291"),".\nIt is reproducible only in the orchestrating scenarios where you communicate two deciders back and forth, a couple of times."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Full Changelog"),": ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fraktalio/fmodel/compare/v3.5.0...v3.5.1"},"https://github.com/fraktalio/fmodel/compare/v3.5.0...v3.5.1")),(0,r.kt)("h3",{id:"include-the-dependencies"},"Include the dependencies"),(0,r.kt)(o.Z,{groupId:"build",queryString:"build-type",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"gradleKotlin",label:"Gradle (Kotlin)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'dependencies {\n implementation("com.fraktalio.fmodel:domain:3.5.1")\n implementation("com.fraktalio.fmodel:application-vanilla:3.5.1")\n implementation("com.fraktalio.fmodel:application-arrow:3.5.1")\n}\n'))),(0,r.kt)(l.Z,{value:"gradleGroovy",label:"Gradle (Groovy)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.fraktalio.fmodel:domain:3.5.1'\n implementation 'com.fraktalio.fmodel:application-vanilla:3.5.1'\n implementation 'com.fraktalio.fmodel:application-arrow:3.5.1'\n}\n"))),(0,r.kt)(l.Z,{value:"maven",label:"Maven",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-xml"},"\n\n com.fraktalio.fmodel\n domain\n 3.5.1\n\n\n\n com.fraktalio.fmodel\n application-vanilla\n 3.5.1\n\n\n\n com.fraktalio.fmodel\n application-arrow\n 3.5.1\n\n")))),(0,r.kt)("h2",{id:"350"},"3.5.0"),(0,r.kt)("p",null,"Artifacts are available on Maven Central"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.5.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.5.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.5.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.5.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.5.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.5.0/jar"))),(0,r.kt)("h3",{id:"whats-changed-1"},"What's changed"),(0,r.kt)("p",null,"In this release, we have upgraded the Kotlin Arrow library to ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/arrow-kt/arrow/releases/tag/1.2.0"},"1.2.0"),". It is a breaking change for the ",(0,r.kt)("inlineCode",{parentName:"p"},"application-arrow")," module/extension."),(0,r.kt)("p",null,"We have introduced and configured a binary compatibility validator into our build process."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"The tool allows dumping binary API of a JVM part of a Kotlin library that is public in the sense of Kotlin visibilities and ensures that the public binary API wasn't changed in a way that makes this change binary incompatible.\n")),(0,r.kt)("p",null,"We extended the case of using ",(0,r.kt)("inlineCode",{parentName:"p"},"actor")," functions to parallelize the message handling processes. (available on JVM target only)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},"/**\n * Extension function - Handles the flow of command messages of type [C] by concurrently distributing the load across finite number of actors/handlers\n *\n * @param commands [Flow] of Command messages of type [C]\n * @param numberOfActors total number of actors/workers available for distributing the load. Minimum one.\n * @param actorsCapacity capacity of the actors channel's buffer\n * @param actorsStart actors coroutine start option\n * @param actorsContext additional to [CoroutineScope.coroutineContext] context of the actor coroutines.\n * @param partitionKey a function that calculates the partition key/routing key of command - commands with the same partition key will be handled with the same 'actor' to keep the ordering\n * @return [Flow] of stored Events of type [E]\n *\n */\nfun EventSourcingAggregate.handleConcurrently(\n commands: Flow,\n numberOfActors: Int = 100,\n actorsCapacity: Int = Channel.BUFFERED,\n actorsStart: CoroutineStart = CoroutineStart.LAZY,\n actorsContext: CoroutineContext = EmptyCoroutineContext,\n partitionKey: (C) -> Int\n): Flow\n")),(0,r.kt)("p",null,"Deprecating factory functions in favor of constructor-like functions."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'@Deprecated(\n message = "Use EventSourcingLockingAggregate constructor-like function instead",\n replaceWith = ReplaceWith("EventSourcingLockingAggregate(decider, eventRepository)")\n)\nfun eventSourcingLockingAggregate(\n decider: IDecider,\n eventRepository: EventLockingRepository\n): EventSourcingLockingAggregate =\n object : EventSourcingLockingAggregate,\n EventLockingRepository by eventRepository,\n IDecider by decider {}\n\n')),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Full Changelog"),": ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fraktalio/fmodel/compare/v3.4.0...v3.5.0"},"https://github.com/fraktalio/fmodel/compare/v3.4.0...v3.5.0")),(0,r.kt)("h3",{id:"include-the-dependencies-1"},"Include the dependencies"),(0,r.kt)(o.Z,{groupId:"build",queryString:"build-type",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"gradleKotlin",label:"Gradle (Kotlin)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'dependencies {\n implementation("com.fraktalio.fmodel:domain:3.5.0")\n implementation("com.fraktalio.fmodel:application-vanilla:3.5.0")\n implementation("com.fraktalio.fmodel:application-arrow:3.5.0")\n}\n'))),(0,r.kt)(l.Z,{value:"gradleGroovy",label:"Gradle (Groovy)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.fraktalio.fmodel:domain:3.5.0'\n implementation 'com.fraktalio.fmodel:application-vanilla:3.5.0'\n implementation 'com.fraktalio.fmodel:application-arrow:3.5.0'\n}\n"))),(0,r.kt)(l.Z,{value:"maven",label:"Maven",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-xml"},"\n\n com.fraktalio.fmodel\n domain\n 3.5.0\n\n\n\n com.fraktalio.fmodel\n application-vanilla\n 3.5.0\n\n\n\n com.fraktalio.fmodel\n application-arrow\n 3.5.0\n\n")))),(0,r.kt)("h2",{id:"340"},"3.4.0"),(0,r.kt)("p",null,"Artifacts are available on Maven Central"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.4.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.4.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.4.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.4.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.4.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.4.0/jar"))),(0,r.kt)("h3",{id:"whats-changed-2"},"What's changed"),(0,r.kt)("p",null,"New native targets are available:\nlinuxX64(), mingwX64(), macosX64(), macosArm64(), tvos(), tvosSimulatorArm64(), watchosArm32(), watchosArm64(),\nwatchosX86(), watchosX64(), watchosSimulatorArm64(), iosX64(), iosArm64(), iosArm32(), iosSimulatorArm64()"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Full Changelog"),": ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fraktalio/fmodel/compare/v3.3.0...v3.4.0"},"https://github.com/fraktalio/fmodel/compare/v3.3.0...v3.4.0")),(0,r.kt)("h3",{id:"include-the-dependencies-2"},"Include the dependencies"),(0,r.kt)(o.Z,{groupId:"build",queryString:"build-type",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"gradleKotlin",label:"Gradle (Kotlin)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'dependencies {\n implementation("com.fraktalio.fmodel:domain:3.4.0")\n implementation("com.fraktalio.fmodel:application-vanilla:3.4.0")\n implementation("com.fraktalio.fmodel:application-arrow:3.4.0")\n}\n'))),(0,r.kt)(l.Z,{value:"gradleGroovy",label:"Gradle (Groovy)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.fraktalio.fmodel:domain:3.4.0'\n implementation 'com.fraktalio.fmodel:application-vanilla:3.4.0'\n implementation 'com.fraktalio.fmodel:application-arrow:3.4.0'\n}\n"))),(0,r.kt)(l.Z,{value:"maven",label:"Maven",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-xml"},"\n\n com.fraktalio.fmodel\n domain\n 3.4.0\n\n\n\n com.fraktalio.fmodel\n application-vanilla\n 3.4.0\n\n\n\n com.fraktalio.fmodel\n application-arrow\n 3.4.0\n\n")))),(0,r.kt)("h2",{id:"330"},"3.3.0"),(0,r.kt)("p",null,"Artifacts are available on Maven Central"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.3.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.3.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.3.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.3.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.3.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.3.0/jar"))),(0,r.kt)("h3",{id:"whats-changed-3"},"What's changed"),(0,r.kt)("h4",{id:"a-convenient-dsl-builder-for-the-domain-components"},"A convenient DSL (builder) for the domain components"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'fun evenNumberDecider(): Decider =\n decider {\n initialState {\n evenNumberState {\n descriptionString { "Initial state" }\n valueInt { 0 }\n }\n }\n decide { c, s ->\n when (c) {\n is AddEvenNumber -> flowOf(\n evenNumberAdded {\n description { c.description }\n value { s.value + c.value }\n }\n )\n\n is SubtractEvenNumber -> flowOf(\n evenNumberSubtracted {\n description { c.description }\n value { s.value - c.value }\n }\n )\n\n null -> emptyFlow()\n }\n }\n evolve { s, e ->\n when (e) {\n is EvenNumberAdded ->\n evenNumberState {\n description { s.description + e.description }\n value { e.value }\n }\n\n is EvenNumberSubtracted ->\n evenNumberState {\n description { s.description - e.description }\n value { e.value }\n }\n\n null -> s\n }\n }\n }\n')),(0,r.kt)("h4",{id:"minimizing-the-api"},"Minimizing the API"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"_Decider")," is internal now"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"_View")," is internal now")),(0,r.kt)("p",null,"There was no true usage of this API, so we have decided to make it internal, in favor of ",(0,r.kt)("inlineCode",{parentName:"p"},"Decider"),"\nand ",(0,r.kt)("inlineCode",{parentName:"p"},"View"),".\nPreviously, ",(0,r.kt)("inlineCode",{parentName:"p"},"Decider")," was just a type alias of ",(0,r.kt)("inlineCode",{parentName:"p"},"_Decider"),", but these are different types actually, and we want to\npromote that."),(0,r.kt)("p",null,"We hope to minimize the complexity of the API, and make the right thing to do the easy thing to do."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Full Changelog"),": ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fraktalio/fmodel/compare/v3.2.0...v3.3.0"},"https://github.com/fraktalio/fmodel/compare/v3.2.0...v3.3.0")),(0,r.kt)("h3",{id:"include-the-dependencies-3"},"Include the dependencies"),(0,r.kt)(o.Z,{groupId:"build",queryString:"build-type",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"gradleKotlin",label:"Gradle (Kotlin)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'dependencies {\n implementation("com.fraktalio.fmodel:domain:3.3.0")\n implementation("com.fraktalio.fmodel:application-vanilla:3.3.0")\n implementation("com.fraktalio.fmodel:application-arrow:3.3.0")\n}\n'))),(0,r.kt)(l.Z,{value:"gradleGroovy",label:"Gradle (Groovy)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.fraktalio.fmodel:domain:3.3.0'\n implementation 'com.fraktalio.fmodel:application-vanilla:3.3.0'\n implementation 'com.fraktalio.fmodel:application-arrow:3.3.0'\n}\n"))),(0,r.kt)(l.Z,{value:"maven",label:"Maven",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-xml"},"\n\n com.fraktalio.fmodel\n domain\n 3.3.0\n\n\n\n com.fraktalio.fmodel\n application-vanilla\n 3.3.0\n\n\n\n com.fraktalio.fmodel\n application-arrow\n 3.3.0\n\n")))),(0,r.kt)("h2",{id:"320"},"3.2.0"),(0,r.kt)("p",null,"Artifacts are available on Maven Central"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.2.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.2.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.2.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.2.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.2.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.2.0/jar"))),(0,r.kt)("h3",{id:"whats-changed-4"},"What's changed"),(0,r.kt)("h4",{id:"optimistic-locking"},"Optimistic Locking"),(0,r.kt)("p",null,"Optimistic locking, also referred to as optimistic concurrency control, allows multiple concurrent users to attempt to\nupdate the same resource."),(0,r.kt)("p",null,"There are two common ways to implement optimistic locking: version number and timestamp. The version number is generally\nconsidered to be a better option because the server clock can be inaccurate over time, but we do not want to restrict it\nto only one option, so we have the generic parameter V acting as a Version."),(0,r.kt)("p",null,"The optimistic locking mechanism is not leaking into the core Domain layer."),(0,r.kt)("p",null,"Application modules provide more interfaces and extensions, giving you additional options to compose your unique Domain\ncomponents with Optimistic Locking formally in place, without changing the Domain components whatsoever."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"example (state-stored aggregate / traditional):")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"}," stateStoredLockingAggregate(\n decider = myDecider,\n stateRepository = myLockingRepository\n ).handleOptimistically(myCommand)\n")),(0,r.kt)("p",null,"where ",(0,r.kt)("inlineCode",{parentName:"p"},"myDecider")," is of type ",(0,r.kt)("inlineCode",{parentName:"p"},"IDecider"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"myLockingRepository")," is of type ",(0,r.kt)("inlineCode",{parentName:"p"},"StateLockingRepository"),"\nand ",(0,r.kt)("inlineCode",{parentName:"p"},"myCommand")," is of type ",(0,r.kt)("inlineCode",{parentName:"p"},"C")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"example (event-sourced aggregate / event-driven):")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},"\n eventSourcingLockingAggregate(\n decider = myDecider,\n stateRepository = myLockingRepository\n ).handleOptimistically(myCommand)\n")),(0,r.kt)("p",null,"where ",(0,r.kt)("inlineCode",{parentName:"p"},"myDecider")," is of type ",(0,r.kt)("inlineCode",{parentName:"p"},"IDecider"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"myLockingRepository")," is of type ",(0,r.kt)("inlineCode",{parentName:"p"},"EventLockingRepository"),"\nand ",(0,r.kt)("inlineCode",{parentName:"p"},"myCommand")," is of type ",(0,r.kt)("inlineCode",{parentName:"p"},"C")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Full Changelog"),": ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fraktalio/fmodel/compare/v3.1.0...v3.2.0"},"https://github.com/fraktalio/fmodel/compare/v3.1.0...v3.2.0")),(0,r.kt)("h3",{id:"include-the-dependencies-4"},"Include the dependencies"),(0,r.kt)(o.Z,{groupId:"build",queryString:"build-type",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"gradleKotlin",label:"Gradle (Kotlin)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'dependencies {\n implementation("com.fraktalio.fmodel:domain:3.2.0")\n implementation("com.fraktalio.fmodel:application-vanilla:3.2.0")\n implementation("com.fraktalio.fmodel:application-arrow:3.2.0")\n}\n'))),(0,r.kt)(l.Z,{value:"gradleGroovy",label:"Gradle (Groovy)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.fraktalio.fmodel:domain:3.2.0'\n implementation 'com.fraktalio.fmodel:application-vanilla:3.2.0'\n implementation 'com.fraktalio.fmodel:application-arrow:3.2.0'\n}\n"))),(0,r.kt)(l.Z,{value:"maven",label:"Maven",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-xml"},"\n\n com.fraktalio.fmodel\n domain\n 3.2.0\n\n\n\n com.fraktalio.fmodel\n application-vanilla\n 3.2.0\n\n\n\n com.fraktalio.fmodel\n application-arrow\n 3.2.0\n\n")))),(0,r.kt)("h2",{id:"310"},"3.1.0"),(0,r.kt)("p",null,"Artifacts are available on Maven Central"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.1.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.1.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.1.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.1.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.1.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.1.0/jar"))),(0,r.kt)("h3",{id:"whats-changed-5"},"What's changed"),(0,r.kt)("h4",{id:"experimental-actors-jvm-only"},"Experimental Actors (JVM only)"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Kotlin Actors (experimental) - concurrently handling messages by ",(0,r.kt)("inlineCode",{parentName:"li"},"idugalic"),"\nin ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/fraktalio/fmodel/pull/70"},"https://github.com/fraktalio/fmodel/pull/70"))),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://raw.githubusercontent.com/fraktalio/fmodel/main/.assets/kotlin-actors.png",alt:"kotlin actors"})),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},"@ExperimentalContracts\n@FlowPreview\nfun EventSourcingAggregate.handleConcurrently(\n commands: Flow,\n numberOfActors: Int = 100,\n actorsCapacity: Int = Channel.BUFFERED,\n actorsStart: CoroutineStart = CoroutineStart.LAZY,\n actorsContext: CoroutineContext = EmptyCoroutineContext,\n partitionKey: (C) -> Int\n): Flow = channelFlow {\n val actors: List> = (1..numberOfActors).map {\n commandActor(channel, actorsCapacity, actorsStart, actorsContext) { handle(it) }\n\n }\n commands\n .onCompletion {\n actors.forEach {\n it.close()\n }\n }\n .collect {\n val partition = partitionKey(it).absoluteValue % numberOfActors.coerceAtLeast(1)\n actors[partition].send(it)\n }\n}\n\n")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Full Changelog"),": ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fraktalio/fmodel/compare/v3.0.0...v3.1.0"},"https://github.com/fraktalio/fmodel/compare/v3.0.0...v3.1.0")),(0,r.kt)("h3",{id:"include-the-dependencies-5"},"Include the dependencies"),(0,r.kt)(o.Z,{groupId:"build",queryString:"build-type",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"gradleKotlin",label:"Gradle (Kotlin)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'dependencies {\n implementation("com.fraktalio.fmodel:domain:3.1.0")\n implementation("com.fraktalio.fmodel:application-vanilla:3.1.0")\n implementation("com.fraktalio.fmodel:application-arrow:3.1.0")\n}\n'))),(0,r.kt)(l.Z,{value:"gradleGroovy",label:"Gradle (Groovy)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.fraktalio.fmodel:domain:3.1.0'\n implementation 'com.fraktalio.fmodel:application-vanilla:3.1.0'\n implementation 'com.fraktalio.fmodel:application-arrow:3.1.0'\n}\n"))),(0,r.kt)(l.Z,{value:"maven",label:"Maven",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-xml"},"\n\n com.fraktalio.fmodel\n domain\n 3.1.0\n\n\n\n com.fraktalio.fmodel\n application-vanilla\n 3.1.0\n\n\n\n com.fraktalio.fmodel\n application-arrow\n 3.1.0\n\n")))),(0,r.kt)("h2",{id:"300"},"3.0.0"),(0,r.kt)("p",null,"Artifacts are available on Maven Central"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.0.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/domain/3.0.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.0.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-vanilla/3.0.0/jar")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.0.0/jar"},"https://search.maven.org/artifact/com.fraktalio.fmodel/application-arrow/3.0.0/jar"))),(0,r.kt)("h3",{id:"whats-changed-6"},"What's changed"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"A ",(0,r.kt)("a",{parentName:"li",href:"https://kotlinlang.org/docs/multiplatform.html"},"multiplatform support (jvm, js, native)")," included"),(0,r.kt)("li",{parentName:"ul"},"Switched from Spek to Kotest test framework"),(0,r.kt)("li",{parentName:"ul"},"Switched from Maven to Gradle")),(0,r.kt)("h4",{id:"tests-example"},"Tests example"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'class DeciderTest : FunSpec({\n val evenDecider = evenNumberDecider()\n val oddDecider = oddNumberDecider()\n\n test("Event-sourced Decider - add even number") {\n with(evenDecider) {\n givenEvents(emptyList()) {\n whenCommand(AddEvenNumber(Description("2"), NumberValue(2)))\n } thenEvents listOf(EvenNumberAdded(Description("2"), NumberValue(2)))\n }\n }\n\n test("Event-sourced Decider - given previous state, add even number") {\n with(evenDecider) {\n givenEvents(listOf(EvenNumberAdded(Description("2"), NumberValue(2)))) {\n whenCommand(AddEvenNumber(Description("4"), NumberValue(4)))\n } thenEvents listOf(EvenNumberAdded(Description("4"), NumberValue(4)))\n }\n }\n})\n')),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Full Changelog"),": ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fraktalio/fmodel/compare/v3.0.0...v3.1.0"},"https://github.com/fraktalio/fmodel/compare/v3.0.0...v3.1.0")),(0,r.kt)("h3",{id:"include-the-dependencies-6"},"Include the dependencies"),(0,r.kt)(o.Z,{groupId:"build",queryString:"build-type",mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"gradleKotlin",label:"Gradle (Kotlin)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-kotlin"},'dependencies {\n implementation("com.fraktalio.fmodel:domain:3.0.0")\n implementation("com.fraktalio.fmodel:application-vanilla:3.0.0")\n implementation("com.fraktalio.fmodel:application-arrow:3.0.0")\n}\n'))),(0,r.kt)(l.Z,{value:"gradleGroovy",label:"Gradle (Groovy)",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-groovy"},"dependencies {\n implementation 'com.fraktalio.fmodel:domain:3.0.0'\n implementation 'com.fraktalio.fmodel:application-vanilla:3.0.0'\n implementation 'com.fraktalio.fmodel:application-arrow:3.0.0'\n}\n"))),(0,r.kt)(l.Z,{value:"maven",label:"Maven",mdxType:"TabItem"},(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-xml"},"\n\n com.fraktalio.fmodel\n domain\n 3.0.0\n\n\n\n com.fraktalio.fmodel\n application-vanilla\n 3.0.0\n\n\n\n com.fraktalio.fmodel\n application-arrow\n 3.0.0\n\n")))))}u.isMDXComponent=!0},5162:(e,a,t)=>{t.d(a,{Z:()=>l});var n=t(7294),r=t(6010);const o={tabItem:"tabItem_Ymn6"};function l(e){let{children:a,hidden:t,className:l}=e;return n.createElement("div",{role:"tabpanel",className:(0,r.Z)(o.tabItem,l),hidden:t},a)}},4866:(e,a,t)=>{t.d(a,{Z:()=>N});var n=t(7462),r=t(7294),o=t(6010),l=t(2466),i=t(6550),c=t(1980),p=t(7392),m=t(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:a}=e;return!!a&&"object"==typeof a&&"value"in a}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:a,label:t,attributes:n,default:r}}=e;return{value:a,label:t,attributes:n,default:r}}))}function s(e){const{values:a,children:t}=e;return(0,r.useMemo)((()=>{const e=a??d(t);return function(e){const a=(0,p.l)(e,((e,a)=>e.value===a.value));if(a.length>0)throw new Error(`Docusaurus error: Duplicate values "${a.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[a,t])}function u(e){let{value:a,tabValues:t}=e;return t.some((e=>e.value===a))}function f(e){let{queryString:a=!1,groupId:t}=e;const n=(0,i.k6)(),o=function(e){let{queryString:a=!1,groupId:t}=e;if("string"==typeof a)return a;if(!1===a)return null;if(!0===a&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:a,groupId:t});return[(0,c._X)(o),(0,r.useCallback)((e=>{if(!o)return;const a=new URLSearchParams(n.location.search);a.set(o,e),n.replace({...n.location,search:a.toString()})}),[o,n])]}function k(e){const{defaultValue:a,queryString:t=!1,groupId:n}=e,o=s(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:a,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(a){if(!u({value:a,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${a}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return a}const n=t.find((e=>e.default))??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:a,tabValues:o}))),[c,p]=f({queryString:t,groupId:n}),[d,k]=function(e){let{groupId:a}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(a),[n,o]=(0,m.Nk)(t);return[n,(0,r.useCallback)((e=>{t&&o.set(e)}),[t,o])]}({groupId:n}),h=(()=>{const e=c??d;return u({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{h&&i(h)}),[h]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!u({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),p(e),k(e)}),[p,k,o]),tabValues:o}}var h=t(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){let{className:a,block:t,selectedValue:i,selectValue:c,tabValues:p}=e;const m=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),s=e=>{const a=e.currentTarget,t=m.indexOf(a),n=p[t].value;n!==i&&(d(a),c(n))},u=e=>{let a=null;switch(e.key){case"Enter":s(e);break;case"ArrowRight":{const t=m.indexOf(e.currentTarget)+1;a=m[t]??m[0];break}case"ArrowLeft":{const t=m.indexOf(e.currentTarget)-1;a=m[t]??m[m.length-1];break}}a?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":t},a)},p.map((e=>{let{value:a,label:t,attributes:l}=e;return r.createElement("li",(0,n.Z)({role:"tab",tabIndex:i===a?0:-1,"aria-selected":i===a,key:a,ref:e=>m.push(e),onKeyDown:u,onClick:s},l,{className:(0,o.Z)("tabs__item",v.tabItem,l?.className,{"tabs__item--active":i===a})}),t??a)})))}function y(e){let{lazy:a,children:t,selectedValue:n}=e;const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(a){const e=o.find((e=>e.props.value===n));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,a)=>(0,r.cloneElement)(e,{key:a,hidden:e.props.value!==n}))))}function b(e){const a=k(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",v.tabList)},r.createElement(g,(0,n.Z)({},e,a)),r.createElement(y,(0,n.Z)({},e,a)))}function N(e){const a=(0,h.Z)();return r.createElement(b,(0,n.Z)({key:String(a)},e))}}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.e69fb202.js b/assets/js/runtime~main.17df055a.js similarity index 98% rename from assets/js/runtime~main.e69fb202.js rename to assets/js/runtime~main.17df055a.js index 835972d..0741170 100644 --- a/assets/js/runtime~main.e69fb202.js +++ b/assets/js/runtime~main.17df055a.js @@ -1 +1 @@ -(()=>{"use strict";var e,f,a,t,r,c={},d={};function b(e){var f=d[e];if(void 0!==f)return f.exports;var a=d[e]={exports:{}};return c[e].call(a.exports,a,a.exports,b),a.exports}b.m=c,e=[],b.O=(f,a,t,r)=>{if(!a){var c=1/0;for(i=0;i=r)&&Object.keys(b.O).every((e=>b.O[e](a[o])))?a.splice(o--,1):(d=!1,r0&&e[i-1][2]>r;i--)e[i]=e[i-1];e[i]=[a,t,r]},b.n=e=>{var f=e&&e.__esModule?()=>e.default:()=>e;return b.d(f,{a:f}),f},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,b.t=function(e,t){if(1&t&&(e=this(e)),8&t)return e;if("object"==typeof e&&e){if(4&t&&e.__esModule)return e;if(16&t&&"function"==typeof e.then)return e}var r=Object.create(null);b.r(r);var c={};f=f||[null,a({}),a([]),a(a)];for(var d=2&t&&e;"object"==typeof d&&!~f.indexOf(d);d=a(d))Object.getOwnPropertyNames(d).forEach((f=>c[f]=()=>e[f]));return c.default=()=>e,b.d(r,c),r},b.d=(e,f)=>{for(var a in f)b.o(f,a)&&!b.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:f[a]})},b.f={},b.e=e=>Promise.all(Object.keys(b.f).reduce(((f,a)=>(b.f[a](e,f),f)),[])),b.u=e=>"assets/js/"+({53:"935f2afb",752:"f968e98d",1527:"c1f7e749",1689:"a2fcca17",1860:"5ee02ab1",2207:"8148c342",2534:"141d0549",2535:"814f3328",2554:"1d739a3e",2769:"3bb0f7c2",3085:"1f391b9e",3089:"a6aa9e1f",3113:"45b56f2b",3237:"1df93b7f",3608:"9e4087bc",3780:"69031cbe",4013:"01a85c17",4396:"d086cdc2",4671:"9b2071c2",4750:"c3ff3d02",4957:"bb6e875d",5500:"64c20f8b",5538:"7251d2db",6103:"ccc49370",6274:"ebdd19aa",6881:"fffb7f2f",6956:"610708b8",7044:"c6cfed06",7307:"14609be1",7471:"6cfda13e",7822:"248eab2d",7918:"17896441",7920:"1a4e3797",7992:"54c7ed6b",8215:"854fdf0f",8396:"edb4519d",8433:"a7d5466f",8610:"6875c492",8786:"631e3ca7",8885:"5f63c9c4",9282:"b6d2a715",9514:"1be78505",9671:"0e384e19",9817:"14eb3368",9836:"9ee97374"}[e]||e)+"."+{53:"8c627ff2",752:"9728d966",814:"e0477b55",1527:"0d14c9b3",1689:"f8ed647b",1860:"3cdce842",2207:"4bf8e120",2529:"de59b905",2534:"63eb8c3e",2535:"8c8549a4",2554:"e9f74344",2769:"653d446a",3085:"efe87e27",3089:"c139ceca",3113:"461a7118",3140:"b7938c41",3237:"8f786bab",3608:"22b8870e",3780:"00b443ec",4013:"aa0a119f",4396:"b61942c8",4671:"50165f5e",4750:"79a6489d",4957:"5cd648cf",4972:"7e4934dc",5500:"ea4359b6",5538:"707880a9",6103:"48ed5495",6274:"25d4bf8e",6780:"18d6d070",6881:"f21be06f",6945:"7101b757",6956:"541b9b48",7044:"1cfca991",7307:"669f82b9",7471:"4a84dc10",7822:"41c64e15",7918:"2bef28ca",7920:"92ff25f8",7992:"7edd23e5",8215:"03f11744",8396:"0b6aa5f6",8433:"4eca7b18",8610:"ec17f690",8786:"454a1000",8885:"c468d8db",8894:"508b38da",9282:"9f4e2e2e",9514:"bfd298a6",9671:"f1069bc8",9817:"73966175",9836:"ca335f02"}[e]+".js",b.miniCssF=e=>{},b.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),b.o=(e,f)=>Object.prototype.hasOwnProperty.call(e,f),t={},r="fmodel:",b.l=(e,f,a,c)=>{if(t[e])t[e].push(f);else{var d,o;if(void 0!==a)for(var n=document.getElementsByTagName("script"),i=0;i{d.onerror=d.onload=null,clearTimeout(s);var r=t[e];if(delete t[e],d.parentNode&&d.parentNode.removeChild(d),r&&r.forEach((e=>e(a))),f)return f(a)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:d}),12e4);d.onerror=u.bind(null,d.onerror),d.onload=u.bind(null,d.onload),o&&document.head.appendChild(d)}},b.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},b.p="/fmodel/",b.gca=function(e){return e={17896441:"7918","935f2afb":"53",f968e98d:"752",c1f7e749:"1527",a2fcca17:"1689","5ee02ab1":"1860","8148c342":"2207","141d0549":"2534","814f3328":"2535","1d739a3e":"2554","3bb0f7c2":"2769","1f391b9e":"3085",a6aa9e1f:"3089","45b56f2b":"3113","1df93b7f":"3237","9e4087bc":"3608","69031cbe":"3780","01a85c17":"4013",d086cdc2:"4396","9b2071c2":"4671",c3ff3d02:"4750",bb6e875d:"4957","64c20f8b":"5500","7251d2db":"5538",ccc49370:"6103",ebdd19aa:"6274",fffb7f2f:"6881","610708b8":"6956",c6cfed06:"7044","14609be1":"7307","6cfda13e":"7471","248eab2d":"7822","1a4e3797":"7920","54c7ed6b":"7992","854fdf0f":"8215",edb4519d:"8396",a7d5466f:"8433","6875c492":"8610","631e3ca7":"8786","5f63c9c4":"8885",b6d2a715:"9282","1be78505":"9514","0e384e19":"9671","14eb3368":"9817","9ee97374":"9836"}[e]||e,b.p+b.u(e)},(()=>{var e={1303:0,532:0};b.f.j=(f,a)=>{var t=b.o(e,f)?e[f]:void 0;if(0!==t)if(t)a.push(t[2]);else if(/^(1303|532)$/.test(f))e[f]=0;else{var r=new Promise(((a,r)=>t=e[f]=[a,r]));a.push(t[2]=r);var c=b.p+b.u(f),d=new Error;b.l(c,(a=>{if(b.o(e,f)&&(0!==(t=e[f])&&(e[f]=void 0),t)){var r=a&&("load"===a.type?"missing":a.type),c=a&&a.target&&a.target.src;d.message="Loading chunk "+f+" failed.\n("+r+": "+c+")",d.name="ChunkLoadError",d.type=r,d.request=c,t[1](d)}}),"chunk-"+f,f)}},b.O.j=f=>0===e[f];var f=(f,a)=>{var t,r,c=a[0],d=a[1],o=a[2],n=0;if(c.some((f=>0!==e[f]))){for(t in d)b.o(d,t)&&(b.m[t]=d[t]);if(o)var i=o(b)}for(f&&f(a);n{"use strict";var e,f,a,t,r,c={},d={};function b(e){var f=d[e];if(void 0!==f)return f.exports;var a=d[e]={exports:{}};return c[e].call(a.exports,a,a.exports,b),a.exports}b.m=c,e=[],b.O=(f,a,t,r)=>{if(!a){var c=1/0;for(i=0;i=r)&&Object.keys(b.O).every((e=>b.O[e](a[o])))?a.splice(o--,1):(d=!1,r0&&e[i-1][2]>r;i--)e[i]=e[i-1];e[i]=[a,t,r]},b.n=e=>{var f=e&&e.__esModule?()=>e.default:()=>e;return b.d(f,{a:f}),f},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,b.t=function(e,t){if(1&t&&(e=this(e)),8&t)return e;if("object"==typeof e&&e){if(4&t&&e.__esModule)return e;if(16&t&&"function"==typeof e.then)return e}var r=Object.create(null);b.r(r);var c={};f=f||[null,a({}),a([]),a(a)];for(var d=2&t&&e;"object"==typeof d&&!~f.indexOf(d);d=a(d))Object.getOwnPropertyNames(d).forEach((f=>c[f]=()=>e[f]));return c.default=()=>e,b.d(r,c),r},b.d=(e,f)=>{for(var a in f)b.o(f,a)&&!b.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:f[a]})},b.f={},b.e=e=>Promise.all(Object.keys(b.f).reduce(((f,a)=>(b.f[a](e,f),f)),[])),b.u=e=>"assets/js/"+({53:"935f2afb",752:"f968e98d",1527:"c1f7e749",1689:"a2fcca17",1860:"5ee02ab1",2207:"8148c342",2534:"141d0549",2535:"814f3328",2554:"1d739a3e",2769:"3bb0f7c2",3085:"1f391b9e",3089:"a6aa9e1f",3113:"45b56f2b",3237:"1df93b7f",3608:"9e4087bc",3780:"69031cbe",4013:"01a85c17",4396:"d086cdc2",4671:"9b2071c2",4750:"c3ff3d02",4957:"bb6e875d",5500:"64c20f8b",5538:"7251d2db",6103:"ccc49370",6274:"ebdd19aa",6881:"fffb7f2f",6956:"610708b8",7044:"c6cfed06",7307:"14609be1",7471:"6cfda13e",7822:"248eab2d",7918:"17896441",7920:"1a4e3797",7992:"54c7ed6b",8215:"854fdf0f",8396:"edb4519d",8433:"a7d5466f",8610:"6875c492",8786:"631e3ca7",8885:"5f63c9c4",9282:"b6d2a715",9514:"1be78505",9671:"0e384e19",9817:"14eb3368",9836:"9ee97374"}[e]||e)+"."+{53:"8c627ff2",752:"9728d966",814:"e0477b55",1527:"0d14c9b3",1689:"f8ed647b",1860:"3cdce842",2207:"4bf8e120",2529:"de59b905",2534:"63eb8c3e",2535:"8c8549a4",2554:"e9f74344",2769:"653d446a",3085:"efe87e27",3089:"c139ceca",3113:"461a7118",3140:"b7938c41",3237:"8f786bab",3608:"22b8870e",3780:"00b443ec",4013:"aa0a119f",4396:"b61942c8",4671:"50165f5e",4750:"79a6489d",4957:"5cd648cf",4972:"7e4934dc",5500:"ea4359b6",5538:"707880a9",6103:"48ed5495",6274:"25d4bf8e",6780:"18d6d070",6881:"f21be06f",6945:"7101b757",6956:"541b9b48",7044:"1cfca991",7307:"1c782208",7471:"4a84dc10",7822:"41c64e15",7918:"2bef28ca",7920:"92ff25f8",7992:"7edd23e5",8215:"03f11744",8396:"0b6aa5f6",8433:"4eca7b18",8610:"ec17f690",8786:"454a1000",8885:"c468d8db",8894:"508b38da",9282:"9f4e2e2e",9514:"bfd298a6",9671:"f1069bc8",9817:"73966175",9836:"ca335f02"}[e]+".js",b.miniCssF=e=>{},b.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),b.o=(e,f)=>Object.prototype.hasOwnProperty.call(e,f),t={},r="fmodel:",b.l=(e,f,a,c)=>{if(t[e])t[e].push(f);else{var d,o;if(void 0!==a)for(var n=document.getElementsByTagName("script"),i=0;i{d.onerror=d.onload=null,clearTimeout(s);var r=t[e];if(delete t[e],d.parentNode&&d.parentNode.removeChild(d),r&&r.forEach((e=>e(a))),f)return f(a)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:d}),12e4);d.onerror=u.bind(null,d.onerror),d.onload=u.bind(null,d.onload),o&&document.head.appendChild(d)}},b.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},b.p="/fmodel/",b.gca=function(e){return e={17896441:"7918","935f2afb":"53",f968e98d:"752",c1f7e749:"1527",a2fcca17:"1689","5ee02ab1":"1860","8148c342":"2207","141d0549":"2534","814f3328":"2535","1d739a3e":"2554","3bb0f7c2":"2769","1f391b9e":"3085",a6aa9e1f:"3089","45b56f2b":"3113","1df93b7f":"3237","9e4087bc":"3608","69031cbe":"3780","01a85c17":"4013",d086cdc2:"4396","9b2071c2":"4671",c3ff3d02:"4750",bb6e875d:"4957","64c20f8b":"5500","7251d2db":"5538",ccc49370:"6103",ebdd19aa:"6274",fffb7f2f:"6881","610708b8":"6956",c6cfed06:"7044","14609be1":"7307","6cfda13e":"7471","248eab2d":"7822","1a4e3797":"7920","54c7ed6b":"7992","854fdf0f":"8215",edb4519d:"8396",a7d5466f:"8433","6875c492":"8610","631e3ca7":"8786","5f63c9c4":"8885",b6d2a715:"9282","1be78505":"9514","0e384e19":"9671","14eb3368":"9817","9ee97374":"9836"}[e]||e,b.p+b.u(e)},(()=>{var e={1303:0,532:0};b.f.j=(f,a)=>{var t=b.o(e,f)?e[f]:void 0;if(0!==t)if(t)a.push(t[2]);else if(/^(1303|532)$/.test(f))e[f]=0;else{var r=new Promise(((a,r)=>t=e[f]=[a,r]));a.push(t[2]=r);var c=b.p+b.u(f),d=new Error;b.l(c,(a=>{if(b.o(e,f)&&(0!==(t=e[f])&&(e[f]=void 0),t)){var r=a&&("load"===a.type?"missing":a.type),c=a&&a.target&&a.target.src;d.message="Loading chunk "+f+" failed.\n("+r+": "+c+")",d.name="ChunkLoadError",d.type=r,d.request=c,t[1](d)}}),"chunk-"+f,f)}},b.O.j=f=>0===e[f];var f=(f,a)=>{var t,r,c=a[0],d=a[1],o=a[2],n=0;if(c.some((f=>0!==e[f]))){for(t in d)b.o(d,t)&&(b.m[t]=d[t]);if(o)var i=o(b)}for(f&&f(a);n