Publish - 2026-05-21 19:00:05 UTC

This commit is contained in:
Duende Bot 2026-05-21 19:00:39 +00:00
parent d4a4e901f6
commit d1f96fb8cf
26 changed files with 30 additions and 1295 deletions

View file

@ -31,6 +31,7 @@
"bff\\templates\\src\\BffRemoteApi\\BffRemoteApi.csproj",
"bff\\test\\Bff.Tests\\Bff.Tests.csproj",
"bff\\test\\Hosts.Tests\\Hosts.Tests.csproj",
"shared\\AppHost.Abstractions\\AppHost.Abstractions.csproj",
"shared\\ShouldlyExtensions\\ShouldlyExtensions.csproj",
"shared\\Xunit.Playwright\\Xunit.Playwright.csproj"
]

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 88 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 66 KiB

View file

@ -1,959 +0,0 @@
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1531px" height="691px" viewBox="-0.5 -0.5 1531 691" content="&lt;mxfile&gt;&lt;diagram id=&quot;kZiCPH_EdFoNHLtwF32E&quot; name=&quot;Page-1&quot;&gt;7Vxdc9o4FP01zHRfGH8Dj4E0bWbINJNsZ7ePwhagjbFYWQTor1/JloxtCQeIP9ItncwUXUtGPvfo6upIpmdPVrsvBKyXDziAYc8ygl3Pvu1ZlmUYI/Yft+xTi2mO3NSyICgQtoPhGf2EwmgI6wYFMC5UpBiHFK2LRh9HEfRpwQYIwdtitTkOi9+6BguoGJ59EKrWv1BAl6l16BoH+1eIFkv5zaYhrqyArCwM8RIEeJsz2Z979oRgTNNPq90Ehhw9iUva7u7I1axjBEb0lAZW2uAVhBvxbOO7O9E1upfPG2/RKgQRK423S0Th8xr4/NKW+ZfZlnQVspLJPqrfL7r0CgmFu5xJ9OcLxCtIyZ5VEVcdAc2+WNwegLYl0MscyN5IGIFw7iK78+H52QcBgR4O21CeHQbM9aIY4QSD3PPCHaJ/s89G3xWlH7krt/yRDFnYy0LEepVrxIs/8tcOzZKSbKdiK7wX4w3xRXeHqYn3uhJsAkNA0WuR0DroRNNHjNi3Zk4yvaKXXLOEPgVkAaloVXJA1o2TfDJUKTqfT3A0R4sNYc+AI8VnBG+iAAYCtzcoO0dhOMEhJklbOwBwOPeZPaYEv8DcFc8fwtm8yhGnk3xQIrmlsty0dCyvg+T2uSTPCFug64G97yGsLQN4Qhhhs+pm8cnYyHBVYNsdwRGFUVAr0eZz6PlaogWD0cyoBPDiaGqbbRJNnV3ubwEFn3cMzJgN3PgXBNQclRB1W0TUUekpuVkdEXMz+JzVl2OdY+IvURhMwR5veEdjCvwXWRovMUE/WX0gIWeXCRUJmW0UajzzluKeBMaszqPE2SyZHsCuUHEKYip7g8MQrGM0S/rHG65YYEDRGFOKVx84opvukRkxzwtHw4uMLO8ihmaosYG0+8pQ+U5ChQ/soaiCiIj8efiECYRoEbFiCOe8GUcFsXT4RphXKAj4nccx8wmKFtOk2q1zsDyJ5+UmzJrPwyTrXbKGkN1hvOaJQvL87pj9MUQmfH5xWV8nrGweyuyPVyeUEZ51H6DEY5AxaAs5i8YEUxZjZhm/z85YndNTVhkDTnS1XYenbcXT39YwuucBgC92quPA1e91+t1r0++O4vcJxi8IXh3ensNHLTpczidHs6cpBgEk9aZQQx/qU6jZ0HXchlIo7ThqKoVyPQVWluGPNywJ6gpMBTkNvkfBLKcdLULpqSGpZ3lgxWEJafJ4+dL3GMaZZVG4LkotSi+XrGRLy9E3l7aesOWXtq6h92btK1nPPcs5Ps/hUdSMg6zTPVQf0nZbmoH8cu2iLAxZTla3RtVJZDHbDC1qksuCdP8HIGsFyHbF6eGb6nS28KtdnZZSaKMhUgVJyoW58TbSDtP6VWZ30Ldy/8xBca5zSqDWJzqPFP49ErzbNyg7u3AYOLohPbRmtudVeeYM2dktsrfNxMv2zmVvbbKzhsG20w6FbaMUMMpLg/o4a6vpWEG79pKJfsaSXE9O7qlFGvo3QfAEV5jCmzX69Ie8zr53prTJ3+VoUgHlUuWsrOJ9GvDcOqIBezPPrWkYZWNE6j+tjqOB4ubMaVWT42+n+7bDhfIAt4caLug0glr2q9XN0Sn2QfjIzxlcpaDTE8FsUH1IzddW05F0yF+l/abd3KrEqy7Zs8h+3d7rNnM2nWLq7GpWfo2FeUfVLK9h/pLxn42wDxnmnWOZ3TXMN+3mNsO8q4pbfCtHPQzTgLza6Jra1RzlakYpuiEE7HMVBPmOrsLLZ0pHRslh6Q0vXXm7mpU331C63KVdnCY90aP1KycnDxz19FOiyqmiRNP7pNBkWcdAl3OMvIEN6so5utwmVeeiNAWVaKaQB+hVYv4pgCFcAArzwlHuejcOeGMHxK50QOmQs6nL+RrbXFW3/5/gAsVUQ+WmdgEqt+F04WKkhouUSG1sw6nR4VLAZEg1exdMkrWA1sksmWU3xaTo7sTqVt2zqqp6HE5q9E/Qs/Nydvxr6tmdxDndmqepMGedvStUy56mqY5DOdvmx6FpdpXrmGr4T+ffO8SAqZNiFx2PPnvj3DTffq+rOZK5LZDsyNLq7DRcR01NGm56nVHz+EsI9b7Q0RYzS8cRMxq2QU1TlfYOO7bs/t6/G/4u6JhTNCsoKP/W+m87LLHKh1Y1LLGGGpZY5VcjL6KJuhxL3+/482GaqINGYswRpt/vVxDmqh5WHArzTibH8YRJS4U61ENT3fJN3v+41b//ceVFh7zQCDbN8UJdLWnfD7kSokNCaN4faYwQlk4Pkavhawbx3h3k852vyyu13q/lrLCleD+3ZXwNArUFgTNSyQ6yBc1B+iQIfH+aXlnQKQvazA0cNTeokjnvV+sQrmCiFdf3NtC7RPU3BBK5J/kxfkTEVWPv/wtu3bawfDuoA7jVY3PfuFpiPEDWPS6jpCkw+6AVT0Vcy4EnQ5fPQICkKnjpAkVR8spnUxph/nwhwigdPpePnwskI00cke8Dvgtpde1ZRWwU/cMWpB+H1ZU7czqaDzQ095phdY/LfvJX39LNssOP59mf/wM=&lt;/diagram&gt;&lt;/mxfile&gt;">
<defs/>
<g>
<g>
<path d="M 0 23 L 0 0 L 350 0 L 350 23" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
<path d="M 0 23 L 0 690 L 350 690 L 350 23" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
<path d="M 0 23 L 350 23" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 348px; height: 1px; padding-top: 12px; margin-left: 1px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">
BFF
</div>
</div>
</div>
</foreignObject>
<text x="175" y="15" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle" font-weight="bold">
BFF
</text>
</switch>
</g>
</g>
<g>
<path d="M 130 480 L 155.5 505.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
<path d="M 159.21 509.21 L 151.78 506.73 L 155.5 505.5 L 156.73 501.78 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
</g>
<g>
<rect x="70" y="420" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59)); stroke: light-dark(rgb(108, 142, 191), rgb(92, 121, 163));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 450px; margin-left: 71px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
BffConfiguration
</div>
</div>
</div>
</foreignObject>
<text x="130" y="454" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">
BffConfiguration
</text>
</switch>
</g>
</g>
<g>
<path d="M 160 366.67 L 184.18 377.41" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
<path d="M 188.98 379.55 L 181.16 379.9 L 184.18 377.41 L 184 373.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
</g>
<g>
<rect x="40" y="310" width="120" height="60" fill="#ffe6cc" stroke="#d79b00" pointer-events="all" style="fill: light-dark(rgb(255, 230, 204), rgb(54, 33, 10)); stroke: light-dark(rgb(215, 155, 0), rgb(153, 101, 0));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 340px; margin-left: 41px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
BffFrontend
</div>
</div>
</div>
</foreignObject>
<text x="100" y="344" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">
BffFrontend
</text>
</switch>
</g>
</g>
<g>
<rect x="190" y="350" width="120" height="60" fill="#ffe6cc" stroke="#d79b00" pointer-events="all" style="fill: light-dark(rgb(255, 230, 204), rgb(54, 33, 10)); stroke: light-dark(rgb(215, 155, 0), rgb(153, 101, 0));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 380px; margin-left: 191px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
IDataExtensions
</div>
</div>
</div>
</foreignObject>
<text x="250" y="384" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">
IDataExtensions
</text>
</switch>
</g>
</g>
<g>
<path d="M 150 540 L 150 510 L 290 510 L 290 540" fill="#dae8fc" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59)); stroke: light-dark(rgb(108, 142, 191), rgb(92, 121, 163));"/>
<path d="M 150 540 L 150 630 L 290 630 L 290 540" fill="none" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(108, 142, 191), rgb(92, 121, 163));"/>
<path d="M 150 540 L 290 540" fill="none" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(108, 142, 191), rgb(92, 121, 163));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 525px; margin-left: 151px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
FrontendConfiguration
</div>
</div>
</div>
</foreignObject>
<text x="220" y="529" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">
FrontendConfiguration
</text>
</switch>
</g>
</g>
<g>
<rect x="150" y="540" width="140" height="30" fill="none" stroke="none" pointer-events="all"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 130px; height: 1px; padding-top: 555px; margin-left: 156px;">
<div style="box-sizing: border-box; font-size: 0; text-align: left; max-height: 26px; overflow: hidden; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
IndexHtmlUrl
</div>
</div>
</div>
</foreignObject>
<text x="156" y="559" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px">
IndexHtmlUrl
</text>
</switch>
</g>
</g>
<g>
<rect x="150" y="570" width="140" height="30" fill="none" stroke="none" pointer-events="all"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 130px; height: 1px; padding-top: 585px; margin-left: 156px;">
<div style="box-sizing: border-box; font-size: 0; text-align: left; max-height: 26px; overflow: hidden; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
OpenIdConnectConfiguration
</div>
</div>
</div>
</foreignObject>
<text x="156" y="589" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px">
OpenIdConnectConfigura...
</text>
</switch>
</g>
</g>
<g>
<rect x="150" y="600" width="140" height="30" fill="none" stroke="none" pointer-events="all"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 130px; height: 1px; padding-top: 615px; margin-left: 156px;">
<div style="box-sizing: border-box; font-size: 0; text-align: left; max-height: 26px; overflow: hidden; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
CookieConfiguration
</div>
</div>
</div>
</foreignObject>
<text x="156" y="619" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px">
CookieConfiguration
</text>
</switch>
</g>
</g>
<g>
<rect x="190" y="260" width="120" height="60" fill="#f8cecc" stroke="#b85450" pointer-events="all" style="fill: light-dark(rgb(248, 206, 204), rgb(81, 45, 43)); stroke: light-dark(rgb(184, 84, 80), rgb(215, 129, 126));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 290px; margin-left: 191px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
IDataExtensionLoader
</div>
</div>
</div>
</foreignObject>
<text x="250" y="294" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">
IDataExtensionLoader
</text>
</switch>
</g>
</g>
<g>
<rect x="50" y="50" width="120" height="60" fill="#f8cecc" stroke="#b85450" pointer-events="all" style="fill: light-dark(rgb(248, 206, 204), rgb(81, 45, 43)); stroke: light-dark(rgb(184, 84, 80), rgb(215, 129, 126));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 80px; margin-left: 51px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
BffBuilder
</div>
</div>
</div>
</foreignObject>
<text x="110" y="84" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">
BffBuilder
</text>
</switch>
</g>
</g>
<g>
<path d="M 110 210 L 185.5 285.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
<path d="M 189.21 289.21 L 181.78 286.73 L 185.5 285.5 L 186.73 281.78 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 250px; margin-left: 150px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; ">
<div style="display: inline-block; font-size: 11px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">
&lt;&lt;Uses&gt;&gt;
</div>
</div>
</div>
</foreignObject>
<text x="150" y="254" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="11px" text-anchor="middle">
&lt;&lt;Uses&gt;&gt;
</text>
</switch>
</g>
</g>
<g>
<path d="M 80 210 L 94.42 303.71" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
<path d="M 95.21 308.9 L 90.69 302.51 L 94.42 303.71 L 97.61 301.44 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 260px; margin-left: 88px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; ">
<div style="display: inline-block; font-size: 11px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">
&lt;&lt;contains&gt;&gt;
</div>
</div>
</div>
</foreignObject>
<text x="88" y="264" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="11px" text-anchor="middle">
&lt;&lt;contains&gt;&gt;
</text>
</switch>
</g>
</g>
<g>
<rect x="50" y="150" width="120" height="60" fill="#f8cecc" stroke="#b85450" pointer-events="all" style="fill: light-dark(rgb(248, 206, 204), rgb(81, 45, 43)); stroke: light-dark(rgb(184, 84, 80), rgb(215, 129, 126));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 180px; margin-left: 51px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
FrontendCollection
</div>
</div>
</div>
</foreignObject>
<text x="110" y="184" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">
FrontendCollection
</text>
</switch>
</g>
</g>
<g>
<path d="M 440 23 L 440 0 L 950 0 L 950 23" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
<path d="M 440 23 L 440 690 L 950 690 L 950 23" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
<path d="M 440 23 L 950 23" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 508px; height: 1px; padding-top: 12px; margin-left: 441px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">
Bff.Yarp
</div>
</div>
</div>
</foreignObject>
<text x="695" y="15" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle" font-weight="bold">
Bff.Yarp
</text>
</switch>
</g>
</g>
<g>
<path d="M 575 520 L 592.49 535.74" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
<path d="M 596.39 539.25 L 588.85 537.17 L 592.49 535.74 L 593.53 531.97 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
</g>
<g>
<rect x="515" y="460" width="120" height="60" fill="#d5e8d4" stroke="#82b366" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 490px; margin-left: 516px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
ProxyConfiguration
</div>
</div>
</div>
</foreignObject>
<text x="575" y="494" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">
ProxyConfiguration
</text>
</switch>
</g>
</g>
<g>
<path d="M 680 410 L 733.96 427.99" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
<path d="M 738.94 429.65 L 731.19 430.75 L 733.96 427.99 L 733.41 424.11 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
</g>
<g>
<rect x="560" y="360" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: light-dark(rgb(255, 242, 204), rgb(40, 29, 0)); stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 390px; margin-left: 561px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
BffFrontend
<br/>
<b>
.AddRemoteApi()
</b>
<br/>
&lt;&lt;extension&gt;&gt;
</div>
</div>
</div>
</foreignObject>
<text x="620" y="394" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">
BffFrontend...
</text>
</switch>
</g>
</g>
<g>
<path d="M 740 410 L 740 380 L 880 380 L 880 410" fill="#fff2cc" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(255, 242, 204), rgb(40, 29, 0)); stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/>
<path d="M 740 410 L 740 470 L 880 470 L 880 410" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/>
<path d="M 740 410 L 880 410" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 395px; margin-left: 741px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
RemoteApi
</div>
</div>
</div>
</foreignObject>
<text x="810" y="399" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">
RemoteApi
</text>
</switch>
</g>
</g>
<g>
<rect x="740" y="410" width="140" height="30" fill="none" stroke="none" pointer-events="all"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 130px; height: 1px; padding-top: 425px; margin-left: 746px;">
<div style="box-sizing: border-box; font-size: 0; text-align: left; max-height: 26px; overflow: hidden; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
PathMatch
</div>
</div>
</div>
</foreignObject>
<text x="746" y="429" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px">
PathMatch
</text>
</switch>
</g>
</g>
<g>
<rect x="740" y="440" width="140" height="30" fill="none" stroke="none" pointer-events="all"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 130px; height: 1px; padding-top: 455px; margin-left: 746px;">
<div style="box-sizing: border-box; font-size: 0; text-align: left; max-height: 26px; overflow: hidden; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
RemoteUrl
</div>
</div>
</div>
</foreignObject>
<text x="746" y="459" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px">
RemoteUrl
</text>
</switch>
</g>
</g>
<g>
<path d="M 585 570 L 585 540 L 725 540 L 725 570" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/>
<path d="M 585 570 L 585 630 L 725 630 L 725 570" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/>
<path d="M 585 570 L 725 570" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 555px; margin-left: 586px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
RemoteApiConfiguration
</div>
</div>
</div>
</foreignObject>
<text x="655" y="559" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">
RemoteApiConfiguration
</text>
</switch>
</g>
</g>
<g>
<rect x="585" y="570" width="140" height="30" fill="none" stroke="none" pointer-events="all"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 130px; height: 1px; padding-top: 585px; margin-left: 591px;">
<div style="box-sizing: border-box; font-size: 0; text-align: left; max-height: 26px; overflow: hidden; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
PathMatch
</div>
</div>
</div>
</foreignObject>
<text x="591" y="589" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px">
PathMatch
</text>
</switch>
</g>
</g>
<g>
<rect x="585" y="600" width="140" height="30" fill="none" stroke="none" pointer-events="all"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 130px; height: 1px; padding-top: 615px; margin-left: 591px;">
<div style="box-sizing: border-box; font-size: 0; text-align: left; max-height: 26px; overflow: hidden; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
RemoteUrl
</div>
</div>
</div>
</foreignObject>
<text x="591" y="619" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px">
RemoteUrl
</text>
</switch>
</g>
</g>
<g>
<path d="M 480 320 L 480 480 Q 480 490 490 490 L 508.63 490" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
<path d="M 513.88 490 L 506.88 493.5 L 508.63 490 L 506.88 486.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 423px; margin-left: 480px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; ">
<div style="display: inline-block; font-size: 11px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">
Loads
</div>
</div>
</div>
</foreignObject>
<text x="480" y="426" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="11px" text-anchor="middle">
Loads
</text>
</switch>
</g>
</g>
<g>
<path d="M 510 320 L 614.02 357.82" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
<path d="M 618.95 359.62 L 611.17 360.52 L 614.02 357.82 L 613.57 353.94 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 340px; margin-left: 565px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; ">
<div style="display: inline-block; font-size: 11px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">
Builds
</div>
</div>
</div>
</foreignObject>
<text x="565" y="343" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="11px" text-anchor="middle">
Builds
</text>
</switch>
</g>
</g>
<g>
<rect x="450" y="260" width="120" height="60" fill="#e1d5e7" stroke="#9673a6" pointer-events="all" style="fill: light-dark(rgb(225, 213, 231), rgb(57, 47, 63)); stroke: light-dark(rgb(150, 115, 166), rgb(149, 119, 163));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 290px; margin-left: 451px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
Proxy
<br/>
DataExtensionLoader
</div>
</div>
</div>
</foreignObject>
<text x="510" y="294" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">
Proxy...
</text>
</switch>
</g>
</g>
<g>
<rect x="500" y="140" width="120" height="60" fill="#e1d5e7" stroke="#9673a6" pointer-events="all" style="fill: light-dark(rgb(225, 213, 231), rgb(57, 47, 63)); stroke: light-dark(rgb(150, 115, 166), rgb(149, 119, 163));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 170px; margin-left: 501px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
ConfigLoader
<div>
(delegate)
</div>
</div>
</div>
</div>
</foreignObject>
<text x="560" y="174" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">
ConfigLoader...
</text>
</switch>
</g>
</g>
<g>
<path d="M 560 90 L 560 133.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
<path d="M 560 138.88 L 556.5 131.88 L 560 133.63 L 563.5 131.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 115px; margin-left: 560px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; ">
<div style="display: inline-block; font-size: 11px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">
Register
</div>
</div>
</div>
</foreignObject>
<text x="560" y="118" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="11px" text-anchor="middle">
Register
</text>
</switch>
</g>
</g>
<g>
<path d="M 620 60 L 660 60 Q 670 60 670 70 L 670 280 Q 670 290 660 290 L 576.37 290" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
<path d="M 571.12 290 L 578.12 286.5 L 576.37 290 L 578.12 293.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 200px; margin-left: 670px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; ">
<div style="display: inline-block; font-size: 11px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">
Register
</div>
</div>
</div>
</foreignObject>
<text x="670" y="203" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="11px" text-anchor="middle">
Register
</text>
</switch>
</g>
</g>
<g>
<rect x="500" y="30" width="120" height="60" fill="#e1d5e7" stroke="#9673a6" pointer-events="all" style="fill: light-dark(rgb(225, 213, 231), rgb(57, 47, 63)); stroke: light-dark(rgb(150, 115, 166), rgb(149, 119, 163));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 60px; margin-left: 501px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
BffBuilder.
<br/>
<b>
AddRemoteApis()
</b>
<br/>
&lt;&lt;extension&gt;&gt;
</div>
</div>
</div>
</foreignObject>
<text x="560" y="64" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">
BffBuilder....
</text>
</switch>
</g>
</g>
<g>
<path d="M 1160 60 L 1175.5 75.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
<path d="M 1179.21 79.21 L 1171.78 76.73 L 1175.5 75.5 L 1176.73 71.78 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
</g>
<g>
<rect x="1100" y="0" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59)); stroke: light-dark(rgb(108, 142, 191), rgb(92, 121, 163));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 30px; margin-left: 1101px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
ConfigFile
</div>
</div>
</div>
</foreignObject>
<text x="1160" y="34" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">
ConfigFile
</text>
</switch>
</g>
</g>
<g>
<path d="M 1210 140 L 1245.5 175.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
<path d="M 1249.21 179.21 L 1241.78 176.73 L 1245.5 175.5 L 1246.73 171.78 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
</g>
<g>
<rect x="1150" y="80" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59)); stroke: light-dark(rgb(108, 142, 191), rgb(92, 121, 163));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 110px; margin-left: 1151px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
Frontends
</div>
</div>
</div>
</foreignObject>
<text x="1210" y="114" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">
Frontends
</text>
</switch>
</g>
</g>
<g>
<path d="M 1250 210 L 1250 180 L 1530 180 L 1530 210" fill="#dae8fc" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59)); stroke: light-dark(rgb(108, 142, 191), rgb(92, 121, 163));"/>
<path d="M 1250 210 L 1250 390 L 1530 390 L 1530 210" fill="none" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(108, 142, 191), rgb(92, 121, 163));"/>
<path d="M 1250 210 L 1530 210" fill="none" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(108, 142, 191), rgb(92, 121, 163));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 278px; height: 1px; padding-top: 195px; margin-left: 1251px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
Frontend "one"
</div>
</div>
</div>
</foreignObject>
<text x="1390" y="199" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">
Frontend "one"
</text>
</switch>
</g>
</g>
<g>
<rect x="1250" y="210" width="280" height="30" fill="none" stroke="none" pointer-events="all"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 270px; height: 1px; padding-top: 225px; margin-left: 1256px;">
<div style="box-sizing: border-box; font-size: 0; text-align: left; max-height: 26px; overflow: hidden; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
IndexHTMLUrl = "..."
</div>
</div>
</div>
</foreignObject>
<text x="1256" y="229" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px">
IndexHTMLUrl = "..."
</text>
</switch>
</g>
</g>
<g>
<rect x="1250" y="240" width="280" height="30" fill="none" stroke="none" pointer-events="all"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 270px; height: 1px; padding-top: 255px; margin-left: 1256px;">
<div style="box-sizing: border-box; font-size: 0; text-align: left; max-height: 26px; overflow: hidden; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
OpenIDConnectConfiguration = "..."
</div>
</div>
</div>
</foreignObject>
<text x="1256" y="259" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px">
OpenIDConnectConfiguration = "..."
</text>
</switch>
</g>
</g>
<g>
<rect x="1250" y="270" width="280" height="30" fill="none" stroke="none" pointer-events="all"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 270px; height: 1px; padding-top: 285px; margin-left: 1256px;">
<div style="box-sizing: border-box; font-size: 0; text-align: left; max-height: 26px; overflow: hidden; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
CookieConfiguration = "..."
</div>
</div>
</div>
</foreignObject>
<text x="1256" y="289" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px">
CookieConfiguration = "..."
</text>
</switch>
</g>
</g>
<g>
<path d="M 1250 330 L 1250 300 L 1530 300 L 1530 330" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/>
<path d="M 1250 330 L 1250 390 L 1530 390 L 1530 330" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/>
<path d="M 1250 330 L 1530 330" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 278px; height: 1px; padding-top: 315px; margin-left: 1251px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
RemoteApis
</div>
</div>
</div>
</foreignObject>
<text x="1390" y="319" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">
RemoteApis
</text>
</switch>
</g>
</g>
<g>
<rect x="1250" y="330" width="280" height="30" fill="none" stroke="none" pointer-events="all"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 270px; height: 1px; padding-top: 345px; margin-left: 1256px;">
<div style="box-sizing: border-box; font-size: 0; text-align: left; max-height: 26px; overflow: hidden; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
PathMatch = "..."
</div>
</div>
</div>
</foreignObject>
<text x="1256" y="349" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px">
PathMatch = "..."
</text>
</switch>
</g>
</g>
<g>
<rect x="1250" y="360" width="280" height="30" fill="none" stroke="none" pointer-events="all"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 270px; height: 1px; padding-top: 375px; margin-left: 1256px;">
<div style="box-sizing: border-box; font-size: 0; text-align: left; max-height: 26px; overflow: hidden; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
RemotURL = "..."
</div>
</div>
</div>
</foreignObject>
<text x="1256" y="379" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px">
RemotURL = "..."
</text>
</switch>
</g>
</g>
<g>
<path d="M 560 388.06 L 316.36 380.21" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
<path d="M 311.12 380.04 L 318.23 376.76 L 316.36 380.21 L 318 383.76 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 384px; margin-left: 435px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; ">
<div style="display: inline-block; font-size: 11px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">
&lt;&lt;Implements&gt;&gt;
</div>
</div>
</div>
</foreignObject>
<text x="435" y="387" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="11px" text-anchor="middle">
&lt;&lt;Implements&gt;&gt;
</text>
</switch>
</g>
</g>
<g>
<path d="M 450 290 L 316.37 290" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
<path d="M 311.12 290 L 318.12 286.5 L 316.37 290 L 318.12 293.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 290px; margin-left: 380px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; ">
<div style="display: inline-block; font-size: 11px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">
&lt;&lt;Implements&gt;&gt;
</div>
</div>
</div>
</foreignObject>
<text x="380" y="293" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="11px" text-anchor="middle">
&lt;&lt;Implements&gt;&gt;
</text>
</switch>
</g>
</g>
<g>
<rect x="980" y="15" width="90" height="65" fill="none" stroke="none" pointer-events="all"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 48px; margin-left: 981px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
<div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">
One Merged Config File
</div>
</div>
</div>
</foreignObject>
<text x="1025" y="51" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle" font-weight="bold">
One Merged Conf...
</text>
</switch>
</g>
</g>
<g>
<path d="M 500 156.15 L 176.2 81.43" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
<path d="M 171.09 80.25 L 178.7 78.42 L 176.2 81.43 L 177.12 85.24 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
</g>
<g>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 118px; margin-left: 335px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; ">
<div style="display: inline-block; font-size: 11px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">
&lt;&lt;injects&gt;&gt;
</div>
</div>
</div>
</foreignObject>
<text x="335" y="121" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="11px" text-anchor="middle">
&lt;&lt;injects&gt;&gt;
</text>
</switch>
</g>
</g>
</g>
<switch>
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
<a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank">
<text text-anchor="middle" font-size="10px" x="50%" y="100%">
Text is not SVG - cannot display
</text>
</a>
</switch>
</svg>

Before

Width:  |  Height:  |  Size: 76 KiB

View file

@ -1,110 +0,0 @@
# Upgrade guide
## From v2.x => v3.x
If you rely on the default extension methods for wiring up the BFF, then V3 should be a drop-in replacement.
### Migrating from custom implementations of IHttpMessageInvokerFactory
In Duende.BFF V2, there was an interface called IHttpMessageInvokerFactory. This class was responsible for creating
and wiring up yarp's HttpMessageInvoker. This interface has been removed in favor yarp's IForwarderHttpClientFactory.
One common scenario for creating a custom implementation of this class was for mocking the http client
during unit testing.
If you wish to inject a http handler for unit testing, you should now inject a custom IForwarderHttpClientFactory. For example:
``` c#
// A Forwarder factory that forwards the messages to a message handler (which can be easily retrieved from a testhost)
public class BackChannelHttpMessageInvokerFactory(HttpMessageHandler backChannel)
: IForwarderHttpClientFactory
{
public HttpMessageInvoker CreateClient(ForwarderHttpClientContext context) =>
new HttpMessageInvoker(backChannel);
}
// Wire up the forwarder in your application's test host:
services.AddSingleton<IForwarderHttpClientFactory>(
new BackChannelHttpMessageInvokerFactory(_apiHost.Server.CreateHandler()));
```
### Migrating from custom implementations IHttpTransformerFactory
The *IHttpTransformerFactory* was a way to globally configure the YARP tranform pipeline. In V3, the way that
the default *endpoints.MapRemoteBffApiEndpoint()* method builds up the YARP transform has been simplified
significantly. Most of the logic has been pushed down to the *AccessTokenRequestTransform*.
Here are common scenario's for implementing your own *IHttpTransformerFactory* and how to upgrade:
**Replacing defaults**
If you used a custom implementation of IHttpTransformerFactory to change the default behavior of *MapRemoteBffApiEndpoint()*,
for example to add additional transforms, then you can now inject a custom delegate into the di container:
```
services.AddSingleton<BffYarpTransformBuilder>(CustomDefaultYarpTransforms);
//...
// This is an example of how to add a response header to ALL invocations of MapRemoteBffApiEndpoint()
private void CustomDefaultBffTransformBuilder(string pathMatch, TransformBuilderContext context)
{
context.AddResponseHeader("added-by-custom-default-transform", "some-value");
DefaultBffYarpTransformerBuilders.DirectProxyWithAccessToken(pathMatch, context);
}
```
Another way of doing this is to create a custom extensionmethod *MyCustomMapRemoteBffApiEndpoint()* that wraps
the MapRemoteBffApiEndpoint() and use that everywhere in your application. This is a great way to add other defaults
that should apply to all endpoints, such as requiring a specific type of access token.
**Configuring transforms for a single route**
Another common usecase for overriding the IHttpTransformerFactory was to have a custom transform for a single route, by
applying a switch statement and testing for specific routes.
Now, there is an overload on the *endpoints.MapRemoteBffApiEndpoint()* that allows you to configure the pipeline directly:
``` c#
endpoints.MapRemoteBffApiEndpoint(
"/local-path",
_apiHost.Url(),
context =>
{
// do something custom: IE: copy request headers
context.CopyRequestHeaders = true;
// wire up the default transformer logic
DefaultTransformers.DirectProxyWithAccessToken("/local-path", context);
})
// Continue with normal BFF configuration, for example, allowing optional user access tokens
.WithOptionalUserAccessToken();
```
### Removed method RemoteApiEndpoint.Map(localpath, apiAddress).
The Map method was no longer needed as most of the logic had been moved to either the MapRemoteBffApiEndpoint and the DefaultTransformers. The map method also wasn't very explicit about what it did and a number of test scenario's tried to verify if it wasn't called wrongly. You are now expected to call the method MapRemoteBffApiEndpoint. This method now has a nullable parameter that allows you to inject your own transformers.
### AccessTokenRetrievalContext properties are now typed
The PathMatch and ApiAddress properties are now typed. They used to be strings. If you rely on these, for example for implementing
a custom IAccessTokenRetriever, then you should adjust their usage accordingly.
/// <summary>
/// The locally requested path.
/// </summary>
public required PathString PathMatch { get; set; }
/// <summary>
/// The remote address of the API.
/// </summary>
public required Uri ApiAddress { get; set; }
### AddAddEntityFrameworkServerSideSessionsServices has been renamed to AddEntityFrameworkServerSideSessionsServices
If you used the method AddAddEntityFrameworkServerSideSessionsServices() in your code, please replace it with the corrected AddEntityFrameworkServerSideSessionsServices()
### StateProviderPollingDelay and StateProviderPollingInterval have been split into separate options for WebAssembly and Server.
If you used BffBlazorOptions.StateProviderPollingInterval or BffBlazorOptions.StateProviderPollingDelay to configure different polling settings, you should now consider if this same setting applies to either Server, WASM or both. Set the appropriate properties accordingly.

View file

@ -1,4 +1,4 @@
<Project Sdk="Aspire.AppHost.Sdk/13.1.2">
<Project Sdk="Aspire.AppHost.Sdk/13.2.4">
<PropertyGroup>
<OutputType>Exe</OutputType>

View file

@ -1,5 +0,0 @@
<ProjectConfiguration>
<Settings>
<IgnoreThisComponentCompletely>True</IgnoreThisComponentCompletely>
</Settings>
</ProjectConfiguration>

View file

@ -1,5 +0,0 @@
<ProjectConfiguration>
<Settings>
<IgnoreThisComponentCompletely>True</IgnoreThisComponentCompletely>
</Settings>
</ProjectConfiguration>

View file

@ -1,5 +0,0 @@
<ProjectConfiguration>
<Settings>
<IgnoreThisComponentCompletely>True</IgnoreThisComponentCompletely>
</Settings>
</ProjectConfiguration>

View file

@ -107,17 +107,6 @@ else
</div>
</div>
@if (Model.View.AllowRememberConsent)
{
<div class="form-group">
<div class="form-check">
<input class="form-check-input" asp-for="Input.RememberConsent">
<label class="form-check-label" asp-for="Input.RememberConsent">
<strong>Remember My Decision</strong>
</label>
</div>
</div>
}
</div>
</div>

View file

@ -41,7 +41,7 @@ public class Index : PageModel
[BindProperty]
public InputModel Input { get; set; }
public async Task<IActionResult> OnGet(string userCode)
public async Task<IActionResult> OnGetAsync(string userCode)
{
if (string.IsNullOrWhiteSpace(userCode))
{
@ -67,7 +67,7 @@ public class Index : PageModel
return Page();
}
public async Task<IActionResult> OnPost()
public async Task<IActionResult> OnPostAsync()
{
var request = await _interaction.GetAuthorizationContextAsync(Input.UserCode);
if (request == null)
@ -102,7 +102,7 @@ public class Index : PageModel
grantedConsent = new ConsentResponse
{
RememberConsent = Input.RememberConsent,
RememberConsent = false,
ScopesValuesConsented = scopes.ToArray(),
Description = Input.Description
};
@ -152,8 +152,7 @@ public class Index : PageModel
{
ClientName = request.Client.ClientName ?? request.Client.ClientId,
ClientUrl = request.Client.ClientUri,
ClientLogoUrl = request.Client.LogoUri,
AllowRememberConsent = request.Client.AllowRememberConsent
ClientLogoUrl = request.Client.LogoUri
};
vm.IdentityScopes = request.ValidatedResources.Resources.IdentityResources.Select(x => CreateScopeViewModel(x, model == null || model.ScopesConsented?.Contains(x.Name) == true)).ToArray();

View file

@ -7,7 +7,6 @@ public class InputModel
{
public string Button { get; set; }
public IEnumerable<string> ScopesConsented { get; set; }
public bool RememberConsent { get; set; } = true;
public string ReturnUrl { get; set; }
public string Description { get; set; }
public string UserCode { get; set; }

View file

@ -8,8 +8,6 @@ public class ViewModel
public string ClientName { get; set; }
public string ClientUrl { get; set; }
public string ClientLogoUrl { get; set; }
public bool AllowRememberConsent { get; set; }
public IEnumerable<ScopeViewModel> IdentityScopes { get; set; }
public IEnumerable<ScopeViewModel> ApiScopes { get; set; }
}

View file

@ -18,7 +18,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\shared\Xunit.Playwright\Xunit.Playwright.csproj" />
<ProjectReference Include="..\..\..\shared\AppHost.Abstractions\AppHost.Abstractions.csproj" />
<ProjectReference Include="..\..\src\Bff\Bff.csproj" />
</ItemGroup>

View file

@ -1,7 +0,0 @@
<ProjectConfiguration>
<Settings>
<HiddenComponentWarnings>
<Value>AspNetTestHostCompatibility</Value>
</HiddenComponentWarnings>
</Settings>
</ProjectConfiguration>

View file

@ -1,7 +0,0 @@
<ProjectConfiguration>
<Settings>
<HiddenComponentWarnings>
<Value>AspNetTestHostCompatibility</Value>
</HiddenComponentWarnings>
</Settings>
</ProjectConfiguration>

View file

@ -5,6 +5,7 @@ using System.Net.Http.Json;
using System.Security.Claims;
using System.Text.Json;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
namespace Duende.Bff.Blazor.Client.Internals;
@ -34,9 +35,7 @@ internal class FetchUserService : IDisposable
internal FetchUserService()
{
_client = new HttpClient();
#pragma warning disable CA2000 // This is a test-only ctor, so we don't want to dispose the client here.
_logger = new Logger<FetchUserService>(new LoggerFactory());
#pragma warning restore CA2000
_logger = NullLogger<FetchUserService>.Instance;
}
public virtual async ValueTask<ClaimsPrincipal> FetchUserAsync()

View file

@ -36,9 +36,12 @@ public class SessionDbContext<TContext> : DbContext, ISessionDbContext
/// Initializes a new instance of the <see cref="SessionDbContext"/> class.
/// </summary>
/// <param name="options"></param>
// TODO: address CS8618
#pragma warning disable CS8618 // Non-nullable variable must contain a non-null value when exiting constructor. Consider adding the 'required' modifier declaring it as nullable.
public SessionDbContext(DbContextOptions<TContext> options) : base(options)
{
}
#pragma warning restore CS8618
/// <summary>
/// DbSet for user sessions

View file

@ -1,6 +1,7 @@
using BffBlazorAutoRenderMode;
using BffBlazorAutoRenderMode.Components;
using Duende.Bff.Blazor;
using Microsoft.AspNetCore.DataProtection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
@ -62,6 +63,11 @@ builder.Services.AddCascadingAuthenticationState();
builder.Services.AddAuthorization();
// Add `.PersistKeysTo…()` and `.ProtectKeysWith…()` calls
// See more at https://docs.duendesoftware.com/general/data-protection
builder.Services.AddDataProtection()
.SetApplicationName("BFF");
var app = builder.Build();
// Configure the HTTP request pipeline.

View file

@ -1,3 +1,4 @@
using Microsoft.AspNetCore.DataProtection;
using Serilog;
namespace BffLocalApi;
@ -49,6 +50,12 @@ internal static class HostingExtensions
options.TokenValidationParameters.RoleClaimType = "role";
});
// Add `.PersistKeysTo…()` and `.ProtectKeysWith…()` calls
// See more at https://docs.duendesoftware.com/general/data-protection
_ = builder.Services.AddDataProtection()
.SetApplicationName("BFF");
return builder.Build();
}

View file

@ -1,5 +1,6 @@
using BffRemoteApi;
using Duende.Bff.Yarp;
using Microsoft.AspNetCore.DataProtection;
var builder = WebApplication.CreateBuilder(args);
@ -46,6 +47,10 @@ builder.Services.AddAuthentication(options =>
};
});
// Add `.PersistKeysTo…()` and `.ProtectKeysWith…()` calls
// See more at https://docs.duendesoftware.com/general/data-protection
builder.Services.AddDataProtection()
.SetApplicationName("BFF");
var app = builder.Build();

View file

@ -1,4 +0,0 @@
// Copyright (c) Duende Software. All rights reserved.
// See LICENSE in the project root for license information.
[assembly: CaptureConsole]

View file

@ -1,143 +0,0 @@
<ProjectConfiguration>
<Settings>
<EnableRDI>True</EnableRDI>
<HiddenComponentWarnings>
<Value>AspNetTestHostCompatibility</Value>
</HiddenComponentWarnings>
<IgnoredTests>
<FixtureTestSelector>
<FixtureName>Bff.Tests.Blazor.BffBlazorTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.Endpoints.RemoteEndpointTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.Endpoints.Management.UserEndpointTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.Endpoints.Management.ManagementBasePathTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.Endpoints.Management.LogoutEndpointTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.Endpoints.Management.LoginEndpointTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.Endpoints.LocalEndpointTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.Endpoints.DpopRemoteEndpointTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.Configuration.BffBuilderTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.BffWithoutExplicitFrontendTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.BffFrontendSigninTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.BffFrontendMatchingTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.BffFrontendIndexTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.EntityFramework.Tests.UserSessionStoreTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Blazor.Client.UnitTests.ServiceCollectionExtensionsTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Blazor.Client.UnitTests.FetchUserServiceTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Blazor.Client.UnitTests.BffClientAuthenticationStateProviderTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Blazor.Client.UnitTests.AntiForgeryHandlerTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.Endpoints.Management.LoginEndpointTestsCopy</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Bff.Tests.Blazor.ServerSideTokenStoreTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.ConventionTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.Endpoints.DPoPTestsWithManualAuthentication</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.BffRemoteApiTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.Headers.ApiUseForwardedHeaders</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.Endpoints.Management.BackchannelLogoutEndpointTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.Endpoints.Management.BackchannelLogoutEndpointTests2</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.TestInfra.TestInfraTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.SessionManagement.ServerSideTicketStoreTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.SessionManagement.RevokeRefreshTokenTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.SessionManagement.CookieSlidingTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.MultiFrontend.OriginTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.MultiFrontend.LocalFrontEndCacheTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.MultiFrontend.DefaultPathMapperTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.MultiFrontend.DefaultFrontendSelectorTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.IAccessTokenRetriever_Extensibility_tests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.Headers.General</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.Headers.ApiAndBffUseForwardedHeaders</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.GenericHostTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.Endpoints.YarpTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Duende.Bff.Tests.MultiFrontend.LocalFrontEndStoreTests</FixtureName>
</FixtureTestSelector>
<NamedTestSelector>
<TestName>Bff.Tests.PublicApiVerificationTests.VerifyPublicApi_Bff_Yarp</TestName>
</NamedTestSelector>
<NamedTestSelector>
<TestName>Bff.Tests.PublicApiVerificationTests.VerifyPublicApi_Bff_EntityFramework</TestName>
</NamedTestSelector>
<NamedTestSelector>
<TestName>Bff.Tests.PublicApiVerificationTests.VerifyPublicApi_Bff_Blazor_Client</TestName>
</NamedTestSelector>
<NamedTestSelector>
<TestName>Bff.Tests.PublicApiVerificationTests.VerifyPublicApi_Bff_Blazor</TestName>
</NamedTestSelector>
<AllTestsSelector />
</IgnoredTests>
</Settings>
</ProjectConfiguration>

View file

@ -1,7 +0,0 @@
<ProjectConfiguration>
<Settings>
<HiddenComponentWarnings>
<Value>AspNetTestHostCompatibility</Value>
</HiddenComponentWarnings>
</Settings>
</ProjectConfiguration>

View file

@ -1,4 +0,0 @@
// Copyright (c) Duende Software. All rights reserved.
// See LICENSE in the project root for license information.
[assembly: CaptureConsole]

View file

@ -1,7 +0,0 @@
<ProjectConfiguration>
<Settings>
<ConsiderInconclusiveTestsAsPassing>True</ConsiderInconclusiveTestsAsPassing>
<EnableRDI>False</EnableRDI>
<UseBuildConfiguration>Debug_NCrunch</UseBuildConfiguration>
</Settings>
</ProjectConfiguration>