meadow-endpoints 4.0.21 → 4.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -15
- package/diagrams/how-it-works.excalidraw +1462 -0
- package/diagrams/how-it-works.mmd +9 -0
- package/diagrams/how-it-works.svg +2 -0
- package/dist/meadow-endpoints.js +591 -227
- package/dist/meadow-endpoints.js.map +1 -1
- package/dist/meadow-endpoints.min.js +22 -17
- package/dist/meadow-endpoints.min.js.map +1 -1
- package/docs/README.md +9 -25
- package/docs/_brand.json +18 -0
- package/docs/_cover.md +9 -0
- package/docs/_sidebar.md +1 -0
- package/docs/_version.json +3 -3
- package/docs/architecture.md +119 -0
- package/docs/crud/README.md +6 -6
- package/docs/diagrams/behavior-injection-hook-points.excalidraw +677 -0
- package/docs/diagrams/behavior-injection-hook-points.mmd +9 -0
- package/docs/diagrams/behavior-injection-hook-points.svg +2 -0
- package/docs/diagrams/how-it-works.excalidraw +2777 -0
- package/docs/diagrams/how-it-works.mmd +16 -0
- package/docs/diagrams/how-it-works.svg +2 -0
- package/docs/diagrams/how-routes-are-generated.excalidraw +1237 -0
- package/docs/diagrams/how-routes-are-generated.mmd +13 -0
- package/docs/diagrams/how-routes-are-generated.svg +2 -0
- package/docs/diagrams/request-lifecycle.excalidraw +1897 -0
- package/docs/diagrams/request-lifecycle.mmd +22 -0
- package/docs/diagrams/request-lifecycle.svg +2 -0
- package/docs/diagrams/where-it-sits-in-the-stack.excalidraw +2068 -0
- package/docs/diagrams/where-it-sits-in-the-stack.mmd +19 -0
- package/docs/diagrams/where-it-sits-in-the-stack.svg +2 -0
- package/docs/index.html +6 -7
- package/docs/quickstart.md +151 -0
- package/docs/retold-catalog.json +155 -186
- package/docs/retold-keyword-index.json +6593 -2920
- package/package.json +8 -8
- package/source/controller/Meadow-Endpoints-Controller-Base.js +40 -0
- package/source/endpoints/count/Meadow-Endpoint-Count.js +1 -0
- package/source/endpoints/count/Meadow-Endpoint-CountBy.js +1 -0
- package/source/endpoints/create/Meadow-Operation-Create.js +1 -0
- package/source/endpoints/delete/Meadow-Endpoint-Delete.js +1 -0
- package/source/endpoints/delete/Meadow-Endpoint-Undelete.js +1 -0
- package/source/endpoints/read/Meadow-Endpoint-Read.js +1 -0
- package/source/endpoints/read/Meadow-Endpoint-ReadDistinctList.js +1 -0
- package/source/endpoints/read/Meadow-Endpoint-ReadLiteList.js +1 -0
- package/source/endpoints/read/Meadow-Endpoint-ReadMax.js +1 -0
- package/source/endpoints/read/Meadow-Endpoint-ReadSelectList.js +1 -0
- package/source/endpoints/read/Meadow-Endpoint-Reads.js +1 -0
- package/source/endpoints/read/Meadow-Endpoint-ReadsBy.js +1 -0
- package/source/endpoints/update/Meadow-Operation-Update.js +2 -0
- package/source/endpoints/upsert/Meadow-Operation-Upsert.js +1 -0
- package/test/MeadowEndpoints_SessionOverride_tests.js +75 -0
- package/dist/indoctrinate_content_staging/Indoctrinate-Catalog-AppData.json +0 -4769
- package/docs/css/docuserve.css +0 -327
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
graph TB
|
|
2
|
+
Orator["Orator<br/>(API Server / Restify host)"]
|
|
3
|
+
MeadowEndpoints["Meadow Endpoints<br/>(Route Registration)"]
|
|
4
|
+
Controller["Controller<br/>(Request Lifecycle)"]
|
|
5
|
+
SessionMarshaler["Session Marshaler<br/>(Authentication)"]
|
|
6
|
+
BehaviorInjection["Behavior Injection<br/>(Authorization & Custom Logic)"]
|
|
7
|
+
ErrorHandler["Error Handler<br/>(Error Responses)"]
|
|
8
|
+
LogController["Log Controller<br/>(Request Logging)"]
|
|
9
|
+
Meadow["Meadow DAL<br/>(Data Access)"]
|
|
10
|
+
Provider["Database Provider<br/>(MySQL, MSSQL, PostgreSQL,<br/>SQLite, MongoDB, etc.)"]
|
|
11
|
+
|
|
12
|
+
Orator --> MeadowEndpoints
|
|
13
|
+
MeadowEndpoints --> Controller
|
|
14
|
+
Controller --> SessionMarshaler
|
|
15
|
+
Controller --> BehaviorInjection
|
|
16
|
+
Controller --> ErrorHandler
|
|
17
|
+
Controller --> LogController
|
|
18
|
+
MeadowEndpoints --> Meadow
|
|
19
|
+
Meadow --> Provider
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1550 627" width="1550" height="627"><!-- svg-source:excalidraw --><metadata><!-- payload-type:application/vnd.excalidraw+json --><!-- payload-version:2 --><!-- payload-start -->eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1dbXNcdTAwMWK5kf7uX8FSqq7uqiwsXHUwMDFh79hvfr31nZ04q1xckqskdUVTY4pnmlTI0dpOav/7NYbDXHUwMDAxMFx1MDAxY1x1MDAxMlx1MDAwM1HUknvkanclkoNBXHUwMDAz3XiebnRj/vlkMLgov91cdTAwMTZcdTAwMTffXHUwMDBmLoqvo+F0cr1cdTAwMTh+uXjq3v+pWCwn81x1MDAxOX7Eqr+X87vFqPrmTVnefv/dd8A0ofhcdTAwMGZ8L6xcdTAwMDa7uqqYXHUwMDE2n4tZucTv/Vx1MDAwNf9cdTAwMWVcZv5Z/Vx1MDAxNz+ZXFy7a5c3w9vi8neLYTlfXFzS6vVxWV1afWndmUUxKoez8bTwXHUwMDFmfcX3hTLN39/wb1DNn18m1+Vccr7FmW3euykm45tcdTAwMTLf1P6yVavfXHUwMDBmaPPOslxczD9cdTAwMTUv5tP5wt36N/BcdTAwMWNeM+5v/GE4+jRezO9m1813ysVwtrxcdTAwMWQuUFL/vY+T6fSq/Fa1jqOFY3nRusef6j6y1vvbrsKbjm9mxdKNJjTvzm+Ho0lZiU+9XHUwMDE0roe3b66rgf+b79Ni+Ll440Z+djedhlxyz67rhtdcdTAwMTPkR5/X7/zsu1lcdTAwMTSuXHJcdTAwMTlcZn9LPcL3fjufVYpcdTAwMDKCUmWF4X5GJsuXqCFl1drH4XRZ+FF2XXrV1p5Qg1x1MDAwMi1cdTAwMWEuXHUwMDE28y9rLXpXXGav519eza5v51x1MDAxM7y21qrPN804RppVXXrRfPJz/ZtcdTAwMWayu9vr4aqDoFxyXHUwMDE1gilFXHUwMDA184JPJ7NP7fGczkefOmSazK6Lr9VN6eqO9Yi2bGI6/FBMY5tY3GzaRFl8LXebg9RE9jNcYkaPyiDgmFxmXCL6oNZ8a2yW5kslubWa6/to/kF0sdJcdTAwMWVcdTAwMWPRf332/s3gqlhgj1x1MDAwN99ccn4sluXk47fBzXxZ/lswc/NZeTX5R1x1MDAxMS+x7t3Xw8+TaaVrUcvPppOxXHUwMDFikYtcdTAwMTFcblEsLsKBKSdcYizNXHUwMDE3yvltqEnLXHUwMDAyZVhcclnz7lxi7zPEd1x1MDAxN5vzNF9MxpPZcPqHXHUwMDFjaYZ35Vx1MDAxYz9ayVMu7opw/IpcdTAwMWbWNlx1MDAwMYT5PnjThV2mu4Kz7lx1MDAxNVxip6YvrknqR7nSYyM27JhJflx1MDAwNrZcdTAwMDNcdTAwMDGbXHUwMDExWcDGqFx1MDAwNKpcdTAwMTTYY1x1MDAwNran6fu0b/BcdTAwMDJccm8xn06LXHUwMDA2hsZcdTAwMDe71+rv+j7q6zGBNUuDdffUjDosflx1MDAxM7Xbxs6Y7IDtTnM/w3ZcdTAwMWVsXHUwMDBiuWHDu2Fba6NcZlx1MDAxOHlcdTAwMWa7Pixs/zi/K1x1MDAwYkS48Vx1MDAwNMd6WGKvT1x1MDAxMq93irFcdTAwMWZQ8zRQbyxwky/9Mdrf040nXHUwMDBmVKuxWeHfO0P0w0K0MjRU0pQpXHUwMDBizVx1MDAxNFxiXHRcdTAwMDdC6MdEzqDtK1x1MDAxYzZcdTAwMTTy3XCB+uxvJpaHuNnz4mb402S+eDP7X7RcYrxtfbdheYi7vcI3XHUwMDE2P1xmZ9edxvmAN3o7XHUwMDFm71pcdTAwMDZ23ulx+IdI849cclx0jOhFPVprmOVdzKNrXHUwMDE1OzOPPObBbFx1MDAxNvMwUrmIgThG4lH8/Vx1MDAwZf3qwdvJx2L0bTQtTpN37JBiP9oh07Rjy7KtaW/yoWLDldw7XHUwMDA3jdlcdTAwMDYmeiZcdTAwMWZcdTAwMGZLPlimXHUwMDFmoYWwXFxcdTAwMTl5L3N+TEbwOICm0oC2RY5xx97QJqy1rUOLLljrso8zrOXBXHUwMDFhKkOWITDBmZFG3IuGXHUwMDFmOFx1MDAwZX5X3uCdXHUwMDEwdE7Wmd4qwn6IptOIts03XHUwMDE4jXtDXHUwMDFhp63Nq1x1MDAwZUzj6uxQXHUwMDFmXG7TRF7MXHUwMDFiqOZgkbT4vlx1MDAxZlxu0/Z1PFx1MDAxZlx1MDAwN9RMXHUwMDFh1LZcdKJMXHUwMDFmVNswkE5Y6zSRM6xlemssXHUwMDBi1lx1MDAxOLVGo792jLu7XGJcdIhcdTAwMTP/qFx1MDAxMGHwL4NcdTAwMTd3y3L+efB2Pp6MTlx1MDAxNuN6XGK0XHUwMDFm4tk04nXEpz71T1xcUsIr2NmBe3yw05lgx5S1wlo4PNjtXHUwMDEx93xcdTAwMWOce5bGuVx1MDAwZVx1MDAxOYpRL8etbVx1MDAxNmfP7VBcdTAwMTAng3W+j1x1MDAwNVx1MDAxOFx1MDAwZYKBZveygMNiXFylbi7Z53Y+W1x1MDAxNsuThLXtMuyHZM/TSNa1XHUwMDAxXCI6zHVcdTAwMGKU2WAj7lxmZY9cdTAwMGZlIPNcZplcdLQ4apifpUNB2fHvrL1IY1mndfTaXFzbMIwzmFx1MDAxZFxuzCCPzllcdTAwMTBS8qOMQjb7UvMxXHUwMDAyxPgksWy7XGb7YdnLvpm3tZnedoRVtoCY4elsXHUwMDFl0P47Z1x1MDAxMHtYXHUwMDEwszTLgFx1MDAxNdXCXCIhPVx1MDAxMIY9SG7q0773uXy/mP80uW7Q5e/0mCDyVd/k13Xiie2DjVx1MDAxYvbWmXnSaXFnbMzNPNE5piWAMcs43Mu0XHUwMDBli40vh+Vw8Gw0QllPXHUwMDEyXHUwMDE3u/u/XHUwMDFmJr5OY2JreVH9s0yAKa871UBcdTAwMDbG12w4gJ/VxkiBev05XHUwMDA2Kz1VXFxkmVFcdTAwMWHKgWlh6L12XCJ+XHUwMDFkgPXvacBq9X/ey53bNFx1MDAwNrVZlNVpXGbijFhZiGUyy4qtlVxmdV5cdTAwMWXh9tu7b1e/f/t08O6q+t/7+bJcdTAwMWMvXG73+19n+N9JWeBn89l4/vL500FRjshJ4tpcdTAwMWVC7lx1MDAwN34/7DL1vNK51qJcdTAwMTVZvuKMxHTVblo+XHUwMDEw4FxuNZdrjYs2KMqLS+go2bI5i1x1MDAwMXulX2rx/1x1MDAwNlx1MDAxODtcdTAwMTdcdTAwMDOaV2mNK1x1MDAwMafMXHUwMDFlT+L0SuNcInz1v1xy/ORXfzS//+1p+tug8r5uidFcdTAwMTI0XGKltVx1MDAxMlSYrMtcdTAwMTl6aGCNpUxRxSF17W57qFx1MDAxYVTEKlx1MDAxNv7s3yanhHFcdTAwMGVWgbToyFCjs2TknHBpuVWCc6GpTEpcdTAwMTlfrVxi19T/5I0vt4RZYZmQUoDhRmRdLVx1MDAxOMFcdTAwMTExSkplmUafL083hMz7uibYQ+BCcKqZpiyvs5JcdTAwMTJcdTAwMWNcXKqlXHUwMDEw0mC3bd7VnOSpTXy1XCKo+6g6rsJcdTAwMDJcdTAwMDc8b5KkJVopg3MrULe0zVNcdTAwMTDFXHRccjUkTzmVXCLIcoBazS1XeWOmKXErIzOSM4YqnjdfOu/rNljGnrQuQ1x1MDAwNr4sX8w/f56UuL6+d2vjxsJfXHUwMDBlXHUwMDE35XNE+clsXHUwMDFje0uf59dcdTAwMTU2zVx1MDAxN1x1MDAxZiZh7t/6lKE3gde77UihXG5cdTAwMWS/+ltHUlx1MDAxMEkpPN14Z0NcdTAwMWPvp1x1MDAxNbPrvbuaPC7igftcXFxy8DPHc27wzu3hR4nCz9qEqJh+mH/Z6YC9SbOynHLJXcxss3S+Y++Zdpx3XHUwMDAzuIjQIMnvTMV6UDFrcv0yXHUwMDFjZs3pr5SLXXq3rN/3kfC4zXdLJVx1MDAxN1ZbXHUwMDExMVx1MDAxNyBcXFx0XHUwMDAxIFx1MDAxOVOca5lcXN8vXHUwMDFk3Vx1MDAxMEpShp6vXHUwMDAyznjUXHUwMDFkiffSmivFpFx1MDAwNMFtXHUwMDEyJS9cdTAwMDW2XHUwMDA3VqxfXFxE3cP+cVx0zStJLy5cdTAwMTFoXdJcdTAwMTDTUjNcbspcdTAwMTeRVs1ZvFx1MDAxNyiEQFx1MDAwM8Yya5L841JJYmUlKSijmYi6x1xmMStJXHUwMDA15cym+cilllx1MDAwNMmSf0VLKHIxpZlZvyxNi2sk4ZSuRFV+yXEvXHREsEpQ/Iab4rSwVlx1MDAxMEutn91IWKRcdTAwMTFcdTAwMDaC2VXp3lx1MDAwMVxyclx1MDAwZtxLK2TzaZ1cdTAwMDBcdTAwMTDEKyzjJtIxg5S10ViBjle6PfRcIpRFhmpccpfciVx1MDAxOGlcdTAwMDVcdTAwMDVcIpG7XHUwMDFioPglaXpoXHUwMDA1OMougldsVOBcYr3X2iRdu0RTIW6N4c7NcMpcdTAwMWJcdIyj7mg2iiqxn5qaXHUwMDFlIyhcdTAwMTnOVqWxtdRRg9h9jYOCKuukRibdY9VhXHUwMDA0XHUwMDE5qNfceFxiXHUwMDA14Kf+ZXvMicZcdTAwMDaDXHUwMDE5NrGlXCLXR3dxPcWyh65cdTAwMTlG9Gpya/2N2kNrUNJNbq3AaVNcdTAwMDVcdTAwMWKP2Vxuu9PLbWyFXHUwMDFilz1pXf5o1PSx+d5DcNTdiVxcu7qrLIt7y6nZ0dlcdTAwMDOT0/9Ik9Osatpd7Fx1MDAxNHTMTtFZ3mCnnsDdc+/szEtxnPOqsblcdTAwMDUtlOW/Ul6aXHUwMDE5I7ykxGVtgEJcdTAwMDapkZRph/dcdTAwMTG3olx1MDAwNHDugGtcdTAwMWM2XHUwMDA2VKaXXmySXHUwMDBihiMsXHUwMDE5Mlx1MDAxNap5zE1XKFpH6CRcdTAwMGVar05q4X9cdTAwMTA74lx1MDAxNlxytsh8ZEUlQyuXLlwigpdQppHqXHUwMDFh/DdcdTAwMTKaM1x1MDAxNDonnObaM8adMYS9U4q7f6NcdTAwMDZcdTAwMTWOSVx1MDAxMH9N83tKmLT+h8e4jFx1MDAxNNWGUbA+7eE0UK1cZmgpXHKSkVxiRZD3ID3xwU/oM8tcdTAwMDK1hVpFXHUwMDE5+lxy2sVcdTAwMDOjXHUwMDE2NalcImzrkGafXHUwMDFlRnOATCFNXHUwMDAw8Vx1MDAxYcOspdyiXHUwMDExSrA0XHUwMDFhJYmsXFxcdTAwMDSxxj5qgVx1MDAxM+dcdTAwMTJgXGa6XHUwMDE4gLNcdTAwMWZ3XHRcdTAwMTkvXHUwMDA1XHUwMDFmPzR99FwiVFxc5PImbNCFXHUwMDA0w5hxn1x1MDAwZVx1MDAxYaS1RlxuJFHokllcdTAwMTV1ULmgelx1MDAxMOrr1Z7m2lrNpJLuoNrYT8CPs1x1MDAwMr3Ynm3pbdSeIFx1MDAwNu9WKy2nfSZcdTAwMThFRItcdTAwMTaok0ZbXFxlo/aMi0TXwVhhZZo/Y3tcdTAwMTao4cqRWmTIMmKJyF2RNFt0Jlxyk9r0UNrIitL7XHLx91x1MDAxMes3uNDjXHUwMDEz0vuTu1+Ei6aPzzmtgOl/ZnHSXHUwMDFl1fC7SGmYXHUwMDBlWGVeXHUwMDFh5fB/g5hyICx4gb/KXHUwMDEzVSPRllx1MDAxOG1ennKdeWtcdTAwMGbeyjNcdTAwMGZcdTAwMTF3Szq61fR4SvBcdTAwMWWUt2aGU8FcdTAwMTKo44curEbjQFxyUlx1MDAwZlxc4oUxXFxQhFxynsRcdTAwMDXmcLVcdTAwMGU7uchEjKqEa8OZXHUwMDEy6DcwXHUwMDE3ykvCXHUwMDE2XHUwMDAzXHUwMDEyhJ1cdTAwMTBv4u4h2dJcYmdy9cNoMkqD3WtCMC70xFwiVGWcXGLNmFx1MDAwMDeZyFvT27lgiPAxmFx1MDAxOPO5JNRQbaVcdTAwMDJUXGaZxnyQxIQxJ1x1MDAxZDNLgytcdJImU/+kw5/ASCMoznBw2pZ7KUZcdTAwMWOfs1ZI4NTFvVPtuTBlMLk2Zlx1MDAxMJpINFx1MDAwMGFdQVx1MDAwMSApSbUmY5ZqXHUwMDE5LoLKL4Lp0VwiYSyY0VbIkuLMcFx1MDAxYyR3LIg0uk/MMlx1MDAxYS1HxaNcdTAwMDadclx1MDAxOCEoOm5GWZVOLLhcdTAwMTTRdJpWXHUwMDAwj7uAYKO70INcdTAwMDLrWNdi9Fx1MDAwNYmMXGbAjYOxUveJXCLbXbbg4qPoXHUwMDA3aIn95tz04fxAd1x1MDAxYatmqD+N+opcdTAwMWUhVVx1MDAxYq8lXCLuoLZEXHUwMDAx8k8umXSpLOlcdDHRUlx1MDAwN1x1MDAxMFx1MDAwNzaNQM+OK1x1MDAxN+hW0vZYnC5lfH1cdTAwMWLGk1x1MDAxYVxmfa9/0mrnXHUwMDE0KK1cdTAwMTI0eEVDhVx1MDAxZS96XFzBa1ck8yGobo9ztU6L677N4rq7XHUwMDBmw8iiubZS0k2aK7qIrXacWFx1MDAwN9N8JrZZp1x1MDAwMuadzVxyjqdcdGbp8dRcdTAwMWP9ksSWXHUwMDBiwriQSltcbu6XVpqAVLZcdMeATu/hSkSv1flUgrtf4t64qGSQ8ciT2KEsQVjjzavFXHJcXIJbXHUwMDEwlEySXHUwMDE3o90+tFx1MDAxNzeO6jrgZVVcdTAwMWOmXG6cpuPEbp/b0pWglcRxXGaWXHUwMDEzJFx1MDAwNk3+nklLi3cnoIJXhLxCXHUwMDEyxaGJ3aVjsMAtQjWsZ1ZFvECiQyPriLihkFx1MDAwZcCCVCRcdTAwMTCVRVx1MDAwYr3mhFtdJ+vikp9cdTAwMWU6zWNia1xmLoLcL4LpXHUwMDE2rEPPRjhcdTAwMWSzXHUwMDE0ypD11MmLLsLWwyPTXHUwMDA058rLXHUwMDE3NVx1MDAwN4og+1tcdTAwMDX9wJo0q0X3iFx1MDAwNHqL3lxcrLmUhJpcdTAwMGLJvFAmXHUwMDE4odbLq2M7XHUwMDE1btuf+lxc5GRzOP3CW6lW8ba+dOF56fZfVsHd5GQw9GuQKjaKq+P2kCTbIO6cXHUwMDFlPStIMLOUxnbvVlx1MDAwNc18Wm1yjXMunpdV8lx1MDAxNuNcdTAwMTao2MHuS7I5XHUwMDFlM9JccvxOr7m6b1x1MDAwM09aXHKdPKVtfbpcdTAwMTmQflhKu/vgvNNis++y2GziPJxcdTAwMWM6KyjS2SC9YE1nlekoOcJF4JzsemhcdTAwMGXLXHUwMDEwzVx1MDAxMbqP6Fxm0F+Sw7pcdTAwMWFcclx1MDAxZvCBeFx1MDAwZlx1MDAxMFxcXHUwMDFkQ51twI1MszrkXHUwMDE1xsd7lI1pXHUwMDEzUT7RXHUwMDAwuEjTXHUwMDE05jgn9+HKXHUwMDE4O5BzWtNs2Fwi4KWHxmFzXHUwMDEwYYyghFHky6xOMkAum1x1MDAwZa5YSzRvonkmjlZyILzJMbBuXGaTyM0lXHUwMDExYXgrWv6rdEdcdTAwMWXs1qZ5hdtcdTAwMTGWTXArTpuQXHUwMDEyh2KdYWDT9J9TRVhcdTAwMTjMi51cdTAwMTPrqrnW6Vx1MDAwNThcdTAwMTlpXHUwMDE4h1x1MDAxNodF8dLcXHUwMDBiiVx1MDAxZvG50oLGeVxmVjnms8ovQHdEJZ1cdTAwMDZUXHUwMDFhgvR9XHUwMDFk4G3tWFx1MDAwM1BcdTAwMTRZr/JcdTAwMGLQhUtXXHUwMDAxXHSBXG5cdTAwMWLG11s5qUjlTJBhkG5cdTAwMGZHhak6U1x1MDAxYdU25sHI86hdJVx1MDAxNyhsLMlcZpF9o4Ppg5Ot7FFJ0Crr3Fx1MDAwMmwtycQkqpAwyqvrXHUwMDA2XHJcdTAwMGWzXHUwMDBi0r2zlVx1MDAwM+dTw2Pa6nJi6DqzIL15j55cdTAwMDGan094juOoSlx1MDAxMGS0dV6BQlx1MDAwZiDZnGqxaNUnsTXA+M6rnrSuPlx1MDAwMYKqwvBxm+Ipu1x1MDAxOVB+WEqaOFx1MDAwMfO0OOlv88uvtp1vtYuRap83s7X0KiCoXHUwMDAxXHUwMDE5PVx1MDAwN1Pzzm9cdTAwMTJZWVx1MDAwMlxiusiVJDvz0OrryKWkz0Vt7TxcdTAwMTJf88DBQUSaS5GAXGIgK2mVXFz56iSmbXqfm8kwV061q2FcdTAwMThcdFx1MDAwYltEulx1MDAxYYZcdTAwMTlcIsLsRVx1MDAxZOfxXHUwMDAyWVcnVVx1MDAwNT3poFxiJTUwXCLnXHUwMDE2QOOSK+5cbk18VYtN81x1MDAxOM6iVEij20w0rMdK0ngkKtJYI+pkvjj85lwio0GlXHUwMDFkSydEuGq6xiXBa+NgKiU0KD3rXHUwMDEx34pcXJR0cLIqOFvzXHUwMDA2XHUwMDFjzIimWE1sUJGkk2qKLFx1MDAxOKdcdTAwMGJkndbNYpZcdTAwMDHIkcPqnDSf5XEmcktLRaymyYlDSrh21jiVtlx1MDAxNUl08+CLXHUwMDA2VVpW5MZRXnPMyYQj7+taM1x1MDAxNDgprIwzzaFVeiTzlFRcIjdv/Fx1MDAxN47rxkZcdTAwMTQ2mFeW3nmXroQ0zIeNXVx1MDAwMaSCTT2oU9VUc6pVK5BcXFx1MDAxMtr3O4a46CmWU207p/a0qObv+lLNXHUwMDFkJ8btLKBC7zhcIpncx2p8fb/sTE1ccmpcdM48c9CDZ1qeddSg243i/Fdb3J/JM5l1PriywKXBX4SJ13mCXFyk2WNH5pOMsiGCXHUwMDFiJVxcXHUwMDE2XHUwMDFip1x1MDAwNlx1MDAxOZ1ubdpDUKOQJCPSxSW27lx1MDAwNPLWoUVJxFXapYc20sZcdTAwMTlcdTAwMDBcZjlesynrzopKQ4rFVcxJuVx1MDAxMjeOvSHJc6mZzaFIyc5ZiDZ548y7ilxm+D3edOKoSydA3lDPqrJxpqFytUJNkVx1MDAxOO+T+lx0inhRXdFKxDKRXHUwMDE4adqcX8XSZ2wh4Y9zUV3NWPIq4WIqjUxcdTAwMTBHcIFiL5jPkkjnNDiOQ2UjlG7t09v4qKh095SMUi7i5N+qYD6nXlxutEY3z8tr4q1cYlRcdNSt5iiqdHTeWGLXdolcdTAwMTK3UkWlJrrJ4KA2rf3I+VxccuxcdTAwMTaFXHUwMDA1tDVcYqv80u1cdTAwMDGOXjO1+EvUnFx1MDAxNoRcdTAwMDelnOmkXHUwMDEw9Fx1MDAxZIhcdTAwMTdWt3KRXFzxlfWb/jK9eSBamaM0XeHHWunH8TVPWtc+Mus8OIN7XGKyuf1cdTAwMDDo06Kb79Mn+0anfi1u/qeclOGh1ttP91x1MDAxNUFYsmKarOvZmqzjKCmWwzPPp/tcdTAwMGUsy9pYt1x1MDAwMt13fUzxzPXhvitd6zywN1x1MDAxMPFcYlx1MDAwZuxtd3y/Q3h/3/dcdTAwMDFcdTAwMTFtXHUwMDBmffSpv3luXHUwMDFj9EZp17OUZEf2y9k+M1x1MDAwZtyVWc+LMFx1MDAxY5DeUTg++1xcad2gUbtcdTAwMTO01O1cIuxnsz+mbXZjQ9SIXGZzbT3dRZkua/VHwp2t9d7WmoemgExcdTAwMWRcdTAwMDRcYn48NcRrc/VcbneChtrV+f1M9CptolvOQVx1MDAxOC/7XHUwMDFiqopcclVcbtv7XHUwMDExhWdDzcsnXHKGutchVUKBlOxcYlx1MDAxZmpRq92g0btcdTAwMTO011x1MDAxZDLsZ7Z/SJvttppOZfrbLaexu9ptuFxcnVx1MDAxMXZ/w818vq6mXHUwMDE0jFx1MDAxNep4ilx1MDAxOdeGu1a8QaN5J2i5u4TYz3T/655cdTAwMGa2z0Db9uPtz3B7uChT3tk67qhcdTAwMTPt8kOOzmpXT4avle5cdTAwMDRccnZL//ez1T/e98Hd/Y114/HdZ2M9lLFqmuXEXG5XViuDQ4uOxlZR51x1MDAwNiftx25cdTAwMTNgP2v9U/YzhPub6caThDtjTd1PXHUwMDEyPptpnplcdTAwMDb0pVx1MDAwZqZcblx1MDAwYoJcbmuOz07ruOrLZ29P0Ea7Or+fff75XHUwMDFlj0ztb6GbXHUwMDBmTuWem+18cOrZQDNLRSDvIHR33K87Ovn4gsHuUdnOUFx1MDAwNmu9O0E73SHDfub637W5PqnzXi6Gt7dXJU7BxTpFXHUwMDA01Wpy3Vx1MDAxYaTVe2Vx61x1MDAwN6h66938ung1XHUwMDFifpi2p+Pip0nx5fmmXHUwMDE1/eb189f61atamnom391Ny8lcdTAwMTXqTuWSV0+5dv2rllx1MDAxNGdiRf3Wz/9cdTAwMDfoxbbaIn0=<!-- payload-end --><pict-renderer-graph:source xmlns:pict-renderer-graph="https://fable-retold.github.io/pict-renderer-graph/ns/v1"><![CDATA[{"type":"flowgraph","mermaid":"graph TB\n\tOrator[\"Orator<br/>(API Server / Restify host)\"]\n\tMeadowEndpoints[\"Meadow Endpoints<br/>(Route Registration)\"]\n\tController[\"Controller<br/>(Request Lifecycle)\"]\n\tSessionMarshaler[\"Session Marshaler<br/>(Authentication)\"]\n\tBehaviorInjection[\"Behavior Injection<br/>(Authorization & Custom Logic)\"]\n\tErrorHandler[\"Error Handler<br/>(Error Responses)\"]\n\tLogController[\"Log Controller<br/>(Request Logging)\"]\n\tMeadow[\"Meadow DAL<br/>(Data Access)\"]\n\tProvider[\"Database Provider<br/>(MySQL, MSSQL, PostgreSQL,<br/>SQLite, MongoDB, etc.)\"]\n\n\tOrator --> MeadowEndpoints\n\tMeadowEndpoints --> Controller\n\tController --> SessionMarshaler\n\tController --> BehaviorInjection\n\tController --> ErrorHandler\n\tController --> LogController\n\tMeadowEndpoints --> Meadow\n\tMeadow --> Provider\n","style":"notebook"}]]></pict-renderer-graph:source></metadata><defs><style class="style-fonts">
|
|
2
|
+
@font-face { font-family: Excalifont; src: url(data:font/woff2;base64,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); }</style></defs><g stroke-linecap="round" transform="translate(423 10) rotate(0 164.5 39)"><path d="M19.5 0 C78.93 0.88, 137.27 -1.23, 309.5 0 M19.5 0 C104.64 1.04, 188.64 0.99, 309.5 0 M309.5 0 C323.62 -1.42, 330.22 4.86, 329 19.5 M309.5 0 C322.66 -0.9, 327.5 7.88, 329 19.5 M329 19.5 C328.14 33.13, 327.47 46.91, 329 58.5 M329 19.5 C328.72 28.68, 328.42 38.25, 329 58.5 M329 58.5 C329.16 69.52, 323.45 78.91, 309.5 78 M329 58.5 C328.63 72.68, 322.74 75.87, 309.5 78 M309.5 78 C221.92 80.53, 133.82 80.23, 19.5 78 M309.5 78 C197.87 79.34, 85.91 79.21, 19.5 78 M19.5 78 C4.77 76.72, -1.82 73.2, 0 58.5 M19.5 78 C4.39 79.51, 0.74 73.27, 0 58.5 M0 58.5 C1 44.63, -1.58 36.38, 0 19.5 M0 58.5 C0.43 49.71, 0.4 41.56, 0 19.5 M0 19.5 C1.6 6.48, 7.24 -0.87, 19.5 0 M0 19.5 C-0.44 5.4, 4.98 0.46, 19.5 0" stroke="var(--diagram-ink, #1B1F23)" stroke-width="2" fill="none"/></g><g transform="translate(423 51.5) rotate(0 164.5 10)"><text x="164.5" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="var(--diagram-ink, #1B1F23)" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">(API Server / Restify host)</text></g><g stroke-linecap="round" transform="translate(461 178) rotate(0 126.5 39)"><path d="M19.5 0 C63.96 -2.15, 105.72 -1.28, 233.5 0 M19.5 0 C72.59 -0.91, 126.31 -1.76, 233.5 0 M233.5 0 C248.36 -1.24, 252.31 4.53, 253 19.5 M233.5 0 C247.1 -0.15, 254.94 5.09, 253 19.5 M253 19.5 C253.91 27.42, 254.66 39.63, 253 58.5 M253 19.5 C253.12 32.77, 252.67 43.96, 253 58.5 M253 58.5 C251.86 69.93, 246.99 77.24, 233.5 78 M253 58.5 C253.46 71.87, 246.57 77.32, 233.5 78 M233.5 78 C170.31 78.68, 109.1 76.32, 19.5 78 M233.5 78 C187.27 78.01, 141.17 77.41, 19.5 78 M19.5 78 C8.45 76.23, 0.97 72.94, 0 58.5 M19.5 78 C6.37 79.19, -1.77 72.61, 0 58.5 M0 58.5 C-1.24 49.46, -1.03 43.72, 0 19.5 M0 58.5 C-0.11 50.39, 0.97 43.52, 0 19.5 M0 19.5 C-0.35 5.49, 4.81 0.92, 19.5 0 M0 19.5 C0.67 5.08, 8.22 1.95, 19.5 0" stroke="var(--diagram-ink, #1B1F23)" stroke-width="2" fill="none"/></g><g transform="translate(461 219.5) rotate(0 126.5 10)"><text x="126.5" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="var(--diagram-ink, #1B1F23)" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">(Route Registration)</text></g><g stroke-linecap="round" transform="translate(10 346) rotate(0 121 39)"><path d="M19.5 0 C61.56 -0.17, 102.45 -0.61, 222.5 0 M19.5 0 C92.08 1.67, 163.74 2, 222.5 0 M222.5 0 C235.31 1.85, 241.66 7.13, 242 19.5 M222.5 0 C234.92 2.16, 242.79 8.6, 242 19.5 M242 19.5 C240.58 31.65, 242.88 41.6, 242 58.5 M242 19.5 C241.08 30.32, 240.72 40.13, 242 58.5 M242 58.5 C240.84 70.49, 234.66 78.24, 222.5 78 M242 58.5 C241.04 70.52, 234.76 79.21, 222.5 78 M222.5 78 C171.98 78.22, 116.87 76.32, 19.5 78 M222.5 78 C149.68 76.19, 77.03 77.65, 19.5 78 M19.5 78 C5.44 76.52, -1.51 72.29, 0 58.5 M19.5 78 C7.02 77.54, -1.18 70.24, 0 58.5 M0 58.5 C-0.21 48.12, -0.87 39.23, 0 19.5 M0 58.5 C0.86 44.94, -0.73 29.87, 0 19.5 M0 19.5 C-1.58 6.08, 5.47 0.64, 19.5 0 M0 19.5 C-0.92 8.03, 8.12 1.98, 19.5 0" stroke="var(--diagram-ink, #1B1F23)" stroke-width="2" fill="none"/></g><g transform="translate(10 387.5) rotate(0 121 10)"><text x="121" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="var(--diagram-ink, #1B1F23)" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">(Request Lifecycle)</text></g><g stroke-linecap="round" transform="translate(20 527) rotate(0 110 39)"><path d="M19.5 0 C53.94 0.77, 93.73 -1.01, 200.5 0 M19.5 0 C81.92 2.6, 142.94 1.59, 200.5 0 M200.5 0 C212.57 -0.64, 219.48 6.6, 220 19.5 M200.5 0 C215.27 1.14, 221.72 8.13, 220 19.5 M220 19.5 C221.5 28.86, 219.18 35.95, 220 58.5 M220 19.5 C219.56 32.88, 220.43 47.64, 220 58.5 M220 58.5 C220.03 70.67, 213.48 78.5, 200.5 78 M220 58.5 C219.82 71.23, 212.43 77.46, 200.5 78 M200.5 78 C136.55 78.74, 75.66 79.89, 19.5 78 M200.5 78 C130.66 79.01, 59.76 78.56, 19.5 78 M19.5 78 C5.01 79.56, 1.71 70.46, 0 58.5 M19.5 78 C5.52 75.87, -0.88 70.45, 0 58.5 M0 58.5 C0.45 46.81, -0.24 37.82, 0 19.5 M0 58.5 C-0.84 48.17, 0.16 37.99, 0 19.5 M0 19.5 C-0.15 7.6, 5.52 0.41, 19.5 0 M0 19.5 C-2.22 6.68, 6.65 -0.04, 19.5 0" stroke="var(--diagram-ink, #1B1F23)" stroke-width="2" fill="none"/></g><g transform="translate(20 568.5) rotate(0 110 10)"><text x="110" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="var(--diagram-ink, #1B1F23)" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">(Authentication)</text></g><g stroke-linecap="round" transform="translate(263 527) rotate(0 181 39)"><path d="M19.5 0 C83.4 1.74, 149.13 -0.15, 342.5 0 M19.5 0 C101.91 2.17, 183.59 2, 342.5 0 M342.5 0 C356.3 -0.92, 361.75 5.57, 362 19.5 M342.5 0 C354.82 0.75, 364.28 7.1, 362 19.5 M362 19.5 C360.5 27.15, 360.37 39.46, 362 58.5 M362 19.5 C362.06 30.84, 361.82 43.63, 362 58.5 M362 58.5 C362.72 73.35, 354.36 77.33, 342.5 78 M362 58.5 C361.94 69.74, 353.85 79.85, 342.5 78 M342.5 78 C272.18 77.3, 199.3 78.09, 19.5 78 M342.5 78 C250.06 78.19, 157.32 79.02, 19.5 78 M19.5 78 C7.19 79.22, -0.73 69.88, 0 58.5 M19.5 78 C5.52 77.02, -0.81 70.92, 0 58.5 M0 58.5 C-0.88 47.07, -1.23 37.12, 0 19.5 M0 58.5 C1.1 50.02, 0.88 39.92, 0 19.5 M0 19.5 C1.29 6.91, 5.42 0.07, 19.5 0 M0 19.5 C0.4 5.53, 7.54 -0.83, 19.5 0" stroke="var(--diagram-ink, #1B1F23)" stroke-width="2" fill="none"/></g><g transform="translate(263 568.5) rotate(0 181 10)"><text x="181" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="var(--diagram-ink, #1B1F23)" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">(Authorization & Custom Logic)</text></g><g stroke-linecap="round" transform="translate(599 527) rotate(0 110 39)"><path d="M19.5 0 C55.54 -2.08, 91.94 -1.01, 200.5 0 M19.5 0 C64.73 0.36, 110.74 -0.43, 200.5 0 M200.5 0 C213.1 1.84, 219.42 5.79, 220 19.5 M200.5 0 C212.63 -1.08, 222.02 6.74, 220 19.5 M220 19.5 C219.31 32.3, 219.84 40.49, 220 58.5 M220 19.5 C219.61 34.24, 220.21 46.77, 220 58.5 M220 58.5 C219.33 69.79, 213.58 77.26, 200.5 78 M220 58.5 C219.18 70.19, 211.99 79.1, 200.5 78 M200.5 78 C143.53 78.09, 84.33 81.36, 19.5 78 M200.5 78 C158.3 78.53, 115.6 78.32, 19.5 78 M19.5 78 C5.13 76.98, -1.46 72.17, 0 58.5 M19.5 78 C7.31 76.35, -1.53 72.19, 0 58.5 M0 58.5 C-0.95 44.96, 1.11 31.27, 0 19.5 M0 58.5 C-0.2 44.44, -0.94 30.42, 0 19.5 M0 19.5 C0.06 5.84, 7.96 -0.29, 19.5 0 M0 19.5 C-1.7 5.2, 8.05 0.11, 19.5 0" stroke="var(--diagram-ink, #1B1F23)" stroke-width="2" fill="none"/></g><g transform="translate(599 568.5) rotate(0 110 10)"><text x="110" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="var(--diagram-ink, #1B1F23)" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">(Error Responses)</text></g><g stroke-linecap="round" transform="translate(935 527) rotate(0 110 39)"><path d="M19.5 0 C55.56 -0.75, 92.27 -1.66, 200.5 0 M19.5 0 C60.92 1.94, 102.52 1.98, 200.5 0 M200.5 0 C213.12 0.55, 219.11 6.37, 220 19.5 M200.5 0 C214.6 -2.14, 221.06 7.51, 220 19.5 M220 19.5 C222.1 33.47, 221.81 47.19, 220 58.5 M220 19.5 C218.81 33.45, 219.72 48.82, 220 58.5 M220 58.5 C218.88 72.13, 215.01 79.64, 200.5 78 M220 58.5 C220.98 69.8, 214.59 77.89, 200.5 78 M200.5 78 C154.41 77.48, 110.59 76.66, 19.5 78 M200.5 78 C151.52 77.86, 103.51 79.3, 19.5 78 M19.5 78 C6.15 79.16, -1.42 71.81, 0 58.5 M19.5 78 C4.58 77.56, -1.2 70.41, 0 58.5 M0 58.5 C1.5 43.24, -1.4 31.38, 0 19.5 M0 58.5 C1.3 46.46, 1.35 33.55, 0 19.5 M0 19.5 C-2 7.95, 6.46 1.97, 19.5 0 M0 19.5 C2.13 7.7, 5.94 -1.99, 19.5 0" stroke="var(--diagram-ink, #1B1F23)" stroke-width="2" fill="none"/></g><g transform="translate(935 568.5) rotate(0 110 10)"><text x="110" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="var(--diagram-ink, #1B1F23)" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">(Request Logging)</text></g><g stroke-linecap="round" transform="translate(790 346) rotate(0 87.5 39)"><path d="M19.5 0 C47.65 2.55, 74.67 -0.5, 155.5 0 M19.5 0 C68.99 -0.09, 119.96 0.03, 155.5 0 M155.5 0 C168.52 -1.49, 175.05 6.18, 175 19.5 M155.5 0 C167.22 1.33, 175.05 7.78, 175 19.5 M175 19.5 C176.23 32.41, 174.71 41.36, 175 58.5 M175 19.5 C175.34 30.69, 175.86 42.26, 175 58.5 M175 58.5 C173.58 70.02, 170.03 78.03, 155.5 78 M175 58.5 C175.3 71.04, 169.52 79.93, 155.5 78 M155.5 78 C126.08 77.17, 94.4 75.71, 19.5 78 M155.5 78 C105.68 79.31, 55.99 79.95, 19.5 78 M19.5 78 C7.24 78.98, -1.58 72.59, 0 58.5 M19.5 78 C5.81 78.13, -1 73.79, 0 58.5 M0 58.5 C-0.3 48.24, -1.21 39.35, 0 19.5 M0 58.5 C-0.84 43.43, -0.66 28.74, 0 19.5 M0 19.5 C1.81 5.27, 7.72 -1.55, 19.5 0 M0 19.5 C0.25 5.02, 4.64 0.3, 19.5 0" stroke="var(--diagram-ink, #1B1F23)" stroke-width="2" fill="none"/></g><g transform="translate(790 387.5) rotate(0 87.5 10)"><text x="87.5" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="var(--diagram-ink, #1B1F23)" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">(Data Access)</text></g><g stroke-linecap="round" transform="translate(1222 514) rotate(0 159 51.5)"><path d="M25.75 0 C78.65 -3.05, 133.6 -0.64, 292.25 0 M25.75 0 C118.71 0.8, 212.41 1.69, 292.25 0 M292.25 0 C311.19 0.31, 317.84 10.1, 318 25.75 M292.25 0 C308.64 -0.67, 317.17 7.68, 318 25.75 M318 25.75 C319.55 45.47, 316.99 64.68, 318 77.25 M318 25.75 C317 43.83, 318.89 59.8, 318 77.25 M318 77.25 C316.6 95.13, 307.97 101.43, 292.25 103 M318 77.25 C318.83 96.49, 311.45 100.89, 292.25 103 M292.25 103 C190.69 104.35, 87.36 104.67, 25.75 103 M292.25 103 C233.91 102.37, 176.32 101.39, 25.75 103 M25.75 103 C7.02 102.91, 0.04 94.39, 0 77.25 M25.75 103 C10.7 101.5, -0.43 94.5, 0 77.25 M0 77.25 C-1.53 60.39, -1.55 40.99, 0 25.75 M0 77.25 C0.52 62.23, -0.34 45.47, 0 25.75 M0 25.75 C0.16 9.82, 7.46 -0.5, 25.75 0 M0 25.75 C1.71 9.72, 9.04 0.95, 25.75 0" stroke="var(--diagram-ink, #1B1F23)" stroke-width="2" fill="none"/></g><g transform="translate(1222 558) rotate(0 159 20)"><text x="159" y="14.096" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="var(--diagram-ink, #1B1F23)" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">(MySQL, MSSQL, PostgreSQL,</text><text x="159" y="34.096000000000004" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="16px" fill="var(--diagram-ink, #1B1F23)" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">SQLite, MongoDB, etc.)</text></g><g stroke-linecap="round"><g transform="translate(587.5 88) rotate(0 0.2635893660320221 45)"><path d="M0 0 C1.31 3.08, 1.15 7.32, 0 16 M0 0 C0.58 3.68, -0.52 7.18, 0 16 M0 16 C0.11 16.82, -0.22 17.91, 0 19.88 M0 16 C0.13 16.71, 0.09 17.67, 0 19.88 M0 19.88 C0.18 20.96, 0.13 22.04, 0 23.52 M0 19.88 C-0.01 20.98, 0 22.05, 0 23.52 M0 23.52 C-0.22 24.37, -0.02 24.89, 0 26.96 M0 23.52 C0.01 24.98, 0.13 26.17, 0 26.96 M0 26.96 C-0.07 28.31, -0.17 29.03, 0 30.23 M0 26.96 C-0.13 27.74, -0.12 28.89, 0 30.23 M0 30.23 C-0.25 31.47, -0.19 32.24, 0 33.36 M0 30.23 C0.04 31.06, 0.06 32.18, 0 33.36 M0 33.36 C-0.22 34.41, 0 35.33, 0 36.37 M0 33.36 C0.08 34.42, 0.01 35.51, 0 36.37 M0 36.37 C0.24 37.71, -0.1 38.4, 0 39.29 M0 36.37 C-0.05 37.01, 0.1 37.55, 0 39.29 M0 39.29 C0.05 40.58, -0.05 41.11, 0 42.16 M0 39.29 C-0.03 40.4, -0.04 41.51, 0 42.16 M0 42.16 C-0.07 43.47, 0.23 44.28, 0 45 M0 42.16 C0.13 43, 0.03 43.47, 0 45 M0 45 C0.17 46.04, -0.2 47.05, 0 47.84 M0 45 C-0.07 45.71, 0.08 46.47, 0 47.84 M0 47.84 C0.26 49.12, -0.05 50.23, 0 50.71 M0 47.84 C-0.04 48.55, 0.09 49.62, 0 50.71 M0 50.71 C0.14 51.56, 0.03 52.33, 0 53.63 M0 50.71 C0.01 51.83, -0.09 52.81, 0 53.63 M0 53.63 C-0.03 54.5, -0.1 55.8, 0 56.64 M0 53.63 C0.12 54.3, -0.1 55.3, 0 56.64 M0 56.64 C-0.13 57.66, -0.21 58.36, 0 59.77 M0 56.64 C-0.12 57.85, 0.13 58.86, 0 59.77 M0 59.77 C0.02 60.66, 0.25 61.09, 0 63.04 M0 59.77 C0.04 60.81, -0.07 61.45, 0 63.04 M0 63.04 C-0.27 64.04, 0.31 65.83, 0 66.48 M0 63.04 C0.03 64.02, -0.09 65.17, 0 66.48 M0 66.48 C-0.24 67.62, -0.16 69.45, 0 70.12 M0 66.48 C0.1 67.68, -0.1 68.62, 0 70.12 M0 70.12 C-0.05 70.66, -0.16 71.74, 0 74 M0 70.12 C-0.22 71.59, -0.17 72.66, 0 74 M0 74 C-0.71 79.41, -0.31 85.44, 0 90 M0 74 C0.49 78.66, -0.04 82.69, 0 90" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g><g transform="translate(587.5 88) rotate(0 0.2635893660320221 45)"><path d="M-2.64 82.45 C-1.45 83.9, -0.99 85.93, 0 90 M-2.64 82.45 C-1.71 84.15, -1.62 85.8, 0 90" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g><g transform="translate(587.5 88) rotate(0 0.2635893660320221 45)"><path d="M2.83 82.52 C2.91 83.95, 2.25 85.97, 0 90 M2.83 82.52 C2.43 84.26, 1.19 85.89, 0 90" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g></g><mask/><g stroke-linecap="round"><g transform="translate(461 217) rotate(0 -104.5 76.08486472366312)"><path d="M0 0 C-2.49 -1.47, -8.08 -0.75, -16 0 M0 0 C-4.63 0.12, -10.99 -0.22, -16 0 M-16 0 C-18.22 0.71, -22.28 0.34, -26.25 1.36 M-16 0 C-19.69 0.67, -23.35 1.04, -26.25 1.36 M-26.25 1.36 C-30.13 2.37, -33.03 4.34, -36.35 5.25 M-26.25 1.36 C-28.42 1.71, -31.03 2.98, -36.35 5.25 M-36.35 5.25 C-39.23 8.12, -45.44 9.58, -46.32 11.34 M-36.35 5.25 C-39.89 7.15, -42.61 8.29, -46.32 11.34 M-46.32 11.34 C-48.77 14.66, -54.19 16.64, -56.18 19.31 M-46.32 11.34 C-48.25 13.34, -51.64 14.65, -56.18 19.31 M-56.18 19.31 C-59.09 22.02, -62.86 23.86, -65.96 28.86 M-56.18 19.31 C-57.83 20.77, -59.66 23.83, -65.96 28.86 M-65.96 28.86 C-70.66 33.37, -73.93 35.82, -75.66 39.67 M-65.96 28.86 C-68.33 31.82, -71.08 34.87, -75.66 39.67 M-75.66 39.67 C-78.29 44.99, -81.88 47.86, -85.3 51.43 M-75.66 39.67 C-78.93 42.62, -79.85 45.05, -85.3 51.43 M-85.3 51.43 C-88.28 52.82, -88.36 56.18, -94.91 63.81 M-85.3 51.43 C-87.79 55.16, -90.02 59.08, -94.91 63.81 M-94.91 63.81 C-99.64 67.72, -101.37 71.96, -104.5 76.51 M-94.91 63.81 C-98.73 69.34, -102.1 73.14, -104.5 76.51 M-104.5 76.51 C-107.92 79.92, -111.64 84.91, -114.09 89.21 M-104.5 76.51 C-107.24 79, -109.12 81.95, -114.09 89.21 M-114.09 89.21 C-118.79 92.81, -119.51 95.65, -123.7 101.6 M-114.09 89.21 C-115.61 91.89, -118.22 95.71, -123.7 101.6 M-123.7 101.6 C-124.92 105.1, -130.19 108.93, -133.34 113.35 M-123.7 101.6 C-125.71 103.41, -127.15 106.31, -133.34 113.35 M-133.34 113.35 C-137.37 115.74, -139.79 120.25, -143.04 124.16 M-133.34 113.35 C-135.91 115.42, -138.05 119.09, -143.04 124.16 M-143.04 124.16 C-146.95 126.7, -149.23 128.89, -152.82 133.71 M-143.04 124.16 C-145.07 127.14, -148.09 128.31, -152.82 133.71 M-152.82 133.71 C-155.52 136.66, -160.25 138.99, -162.68 141.69 M-152.82 133.71 C-156.16 136.8, -159 138.76, -162.68 141.69 M-162.68 141.69 C-166.38 142.92, -169.4 145.21, -172.65 147.78 M-162.68 141.69 C-165.59 143.35, -168.21 145.96, -172.65 147.78 M-172.65 147.78 C-175.39 148.97, -178.89 149.91, -182.75 151.66 M-172.65 147.78 C-174.93 148.51, -177.49 149.43, -182.75 151.66 M-182.75 151.66 C-185.23 151.25, -190.34 152.4, -193 153.02 M-182.75 151.66 C-185.85 151.72, -189.48 152.91, -193 153.02 M-193 153.02 C-195.14 151.88, -201.08 152.01, -209 153.02 M-193 153.02 C-199.78 152.53, -206.18 152.59, -209 153.02" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g><g transform="translate(461 217) rotate(0 -104.5 76.08486472366312)"><path d="M-201.74 149.67 C-202.86 149.63, -205.51 150.67, -209 153.02 M-201.74 149.67 C-203.8 150.83, -206.74 151.77, -209 153.02" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g><g transform="translate(461 217) rotate(0 -104.5 76.08486472366312)"><path d="M-201.28 155.12 C-202.45 153.96, -205.18 153.89, -209 153.02 M-201.28 155.12 C-203.51 154.49, -206.6 153.63, -209 153.02" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g></g><mask/><g stroke-linecap="round"><g transform="translate(131 424) rotate(0 -0.5298737175266979 51.5)"><path d="M0 0 C1.2 3.04, -0.76 4.88, 0 16 M0 0 C0.63 5.91, -0.18 11.66, 0 16 M0 16 C0.41 16.94, 0.42 17.66, -0.01 20.11 M0 16 C0.01 17.26, 0.07 18.76, -0.01 20.11 M-0.01 20.11 C0.26 21.75, 0.27 22.84, -0.03 24.16 M-0.01 20.11 C0.12 20.88, 0.12 21.96, -0.03 24.16 M-0.03 24.16 C-0.1 25.42, -0.27 27.61, -0.07 28.16 M-0.03 24.16 C-0.1 25.4, 0.02 26.17, -0.07 28.16 M-0.07 28.16 C0.05 29.39, 0.07 30.67, -0.13 32.12 M-0.07 28.16 C-0.01 29.19, -0.04 30.09, -0.13 32.12 M-0.13 32.12 C0 33.79, -0.24 34.81, -0.19 36.04 M-0.13 32.12 C-0.02 33.7, -0.22 35.1, -0.19 36.04 M-0.19 36.04 C0.16 37.2, -0.52 39.21, -0.26 39.93 M-0.19 36.04 C-0.07 37.65, -0.35 38.84, -0.26 39.93 M-0.26 39.93 C-0.07 41.05, -0.13 43.05, -0.34 43.8 M-0.26 39.93 C-0.41 40.89, -0.28 41.91, -0.34 43.8 M-0.34 43.8 C-0.17 44.63, -0.15 45.87, -0.42 47.65 M-0.34 43.8 C-0.28 44.92, -0.59 46.21, -0.42 47.65 M-0.42 47.65 C-0.11 48.72, -0.36 49.36, -0.5 51.5 M-0.42 47.65 C-0.31 48.85, -0.59 50.3, -0.5 51.5 M-0.5 51.5 C-0.81 52.17, -0.48 53.13, -0.58 55.35 M-0.5 51.5 C-0.57 52.76, -0.72 54, -0.58 55.35 M-0.58 55.35 C-0.3 56.26, -0.96 57.32, -0.66 59.2 M-0.58 55.35 C-0.68 56.72, -0.7 58.39, -0.66 59.2 M-0.66 59.2 C-0.47 60.56, -0.46 61.45, -0.74 63.07 M-0.66 59.2 C-0.73 60.64, -0.86 61.54, -0.74 63.07 M-0.74 63.07 C-0.65 64.14, -1.01 64.7, -0.81 66.96 M-0.74 63.07 C-0.79 64.46, -0.84 65.79, -0.81 66.96 M-0.81 66.96 C-0.74 67.66, -1.12 68.6, -0.87 70.88 M-0.81 66.96 C-0.67 68.01, -0.92 68.85, -0.87 70.88 M-0.87 70.88 C-0.82 72.29, -0.78 73.52, -0.93 74.84 M-0.87 70.88 C-1.09 71.99, -0.85 73.1, -0.93 74.84 M-0.93 74.84 C-0.5 76.28, -0.81 77.38, -0.97 78.84 M-0.93 74.84 C-1.06 76.29, -0.76 77.79, -0.97 78.84 M-0.97 78.84 C-1.07 80.11, -1.15 82.3, -0.99 82.89 M-0.97 78.84 C-1.18 80.09, -0.91 81.66, -0.99 82.89 M-0.99 82.89 C-0.97 83.94, -0.95 85.44, -1 87 M-0.99 82.89 C-1.03 84.59, -1.08 86.19, -1 87 M-1 87 C-2.01 90.86, -1.05 94.5, -1 103 M-1 87 C-0.8 92.08, -1.4 96.55, -1 103" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g><g transform="translate(131 424) rotate(0 -0.5298737175266979 51.5)"><path d="M-3.93 95.56 C-2.74 96.97, -3.13 97.78, -1 103 M-3.93 95.56 C-2.5 98.28, -1.78 100.94, -1 103" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g><g transform="translate(131 424) rotate(0 -0.5298737175266979 51.5)"><path d="M1.54 95.41 C1.63 96.85, 0.14 97.68, -1 103 M1.54 95.41 C0.88 98.23, -0.5 100.94, -1 103" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g></g><mask/><g stroke-linecap="round"><g transform="translate(252 380.008) rotate(0 5.504493479655423 92.85679365215049)"><path d="M0 0 C4.41 -0.97, 6.15 0.25, 16 0 M0 0 C3.54 0.1, 5.94 0.01, 16 0 M16 0 C17.05 0.27, 18.04 0.94, 19.17 1.66 M16 0 C17.34 0.78, 18.38 1.22, 19.17 1.66 M19.17 1.66 C19.79 3.18, 19.46 4.03, 20.81 6.38 M19.17 1.66 C19.71 3.01, 20.27 4.79, 20.81 6.38 M20.81 6.38 C20.53 9.41, 21.51 11.58, 21.11 13.78 M20.81 6.38 C21.22 8.61, 20.87 11.18, 21.11 13.78 M21.11 13.78 C21.01 16.28, 21.3 18.78, 20.26 23.47 M21.11 13.78 C21.2 15.89, 20.52 17.63, 20.26 23.47 M20.26 23.47 C20.07 24.94, 18.31 28.04, 18.46 35.08 M20.26 23.47 C20.1 27.2, 19.22 30.34, 18.46 35.08 M18.46 35.08 C18.34 38.8, 16.69 39.69, 15.89 48.22 M18.46 35.08 C17.55 39.4, 17.15 43.75, 15.89 48.22 M15.89 48.22 C14.2 52.98, 13.77 56.34, 12.74 62.51 M15.89 48.22 C14.97 52.93, 13.77 55.99, 12.74 62.51 M12.74 62.51 C10.73 67.55, 9.89 72.18, 9.22 77.56 M12.74 62.51 C10.96 68.02, 10.41 73.69, 9.22 77.56 M9.22 77.56 C8.23 82.47, 7.37 89.67, 5.5 93 M9.22 77.56 C8.99 80.38, 6.85 84.85, 5.5 93 M5.5 93 C5.06 99.26, 2.13 103.46, 1.78 108.43 M5.5 93 C4.74 97.39, 4.22 100.44, 1.78 108.43 M1.78 108.43 C1.3 113.13, -1.69 115.66, -1.74 123.48 M1.78 108.43 C1.23 112.87, -0.16 115.4, -1.74 123.48 M-1.74 123.48 C-2.8 127.77, -3.15 130.47, -4.89 137.77 M-1.74 123.48 C-3.03 127, -3.86 131.48, -4.89 137.77 M-4.89 137.77 C-5.43 141.24, -7.63 147.18, -7.46 150.91 M-4.89 137.77 C-5.77 140.36, -5.87 143.41, -7.46 150.91 M-7.46 150.91 C-7.76 156.46, -7.88 159.87, -9.26 162.52 M-7.46 150.91 C-8.38 154.72, -8.47 157.78, -9.26 162.52 M-9.26 162.52 C-10.39 165.21, -10.23 166.78, -10.11 172.21 M-9.26 162.52 C-9.59 166.19, -9.47 169.32, -10.11 172.21 M-10.11 172.21 C-9.33 173.84, -9.9 176.36, -9.81 179.61 M-10.11 172.21 C-9.93 174.64, -9.58 177.11, -9.81 179.61 M-9.81 179.61 C-9.41 181.41, -9.36 182.48, -8.17 184.33 M-9.81 179.61 C-9.46 180.75, -9.37 181.59, -8.17 184.33 M-8.17 184.33 C-7.07 184.66, -6.33 185.21, -5 185.99 M-8.17 184.33 C-7.05 184.81, -5.88 185.67, -5 185.99 M-5 185.99 C-0.45 185.42, 7.61 185.36, 11 185.99 M-5 185.99 C1.49 185.59, 6.45 186.36, 11 185.99" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g><g transform="translate(252 380.008) rotate(0 5.504493479655423 92.85679365215049)"><path d="M3.54 188.88 C5.66 187.82, 6.42 187.84, 11 185.99 M3.54 188.88 C5.21 188.34, 6.3 187.7, 11 185.99" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g><g transform="translate(252 380.008) rotate(0 5.504493479655423 92.85679365215049)"><path d="M3.43 183.41 C5.52 183.45, 6.31 184.58, 11 185.99 M3.43 183.41 C5.09 183.99, 6.21 184.47, 11 185.99" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g></g><mask/><g stroke-linecap="round"><g transform="translate(252 389.992) rotate(0 173.5 88.12564244777636)"><path d="M0 0 C4 1.02, 6.95 0.64, 16 0 M0 0 C6.01 0.29, 11.2 0.58, 16 0 M16 0 C21.89 0.02, 28.33 1.58, 34.23 1.57 M16 0 C23.24 0.32, 30.45 1.98, 34.23 1.57 M34.23 1.57 C37.94 1.67, 42.62 2.03, 52.21 6.04 M34.23 1.57 C37.75 2.75, 41.67 3.21, 52.21 6.04 M52.21 6.04 C58.08 7.41, 63.56 10.68, 69.96 13.04 M52.21 6.04 C56.87 7, 60.3 8.46, 69.96 13.04 M69.96 13.04 C73.47 14.2, 80.61 18.7, 87.51 22.21 M69.96 13.04 C74.14 16.2, 80.16 18.27, 87.51 22.21 M87.51 22.21 C92.74 25.25, 95.9 29.25, 104.9 33.2 M87.51 22.21 C92.93 26.02, 99.48 30.52, 104.9 33.2 M104.9 33.2 C111.2 38.1, 114.67 40.52, 122.17 45.63 M104.9 33.2 C110.98 37.8, 117.99 42.16, 122.17 45.63 M122.17 45.63 C129.73 51.56, 134.59 53.16, 139.33 59.15 M122.17 45.63 C127.19 48.47, 130.27 52.16, 139.33 59.15 M139.33 59.15 C141.47 63.26, 146.3 64.93, 156.43 73.4 M139.33 59.15 C146.47 65.1, 153.37 70.01, 156.43 73.4 M156.43 73.4 C162.22 77.94, 170.25 82.23, 173.5 88 M156.43 73.4 C162.79 79.69, 170.69 84.23, 173.5 88 M173.5 88 C178.07 91.4, 186.78 96, 190.57 102.61 M173.5 88 C178.69 93.24, 183.55 97.07, 190.57 102.61 M190.57 102.61 C194.47 106.03, 198.42 110.03, 207.67 116.86 M190.57 102.61 C193.3 104.75, 197.69 108.56, 207.67 116.86 M207.67 116.86 C211.95 122, 220.66 124.7, 224.83 130.38 M207.67 116.86 C214.25 121.61, 218.72 125.18, 224.83 130.38 M224.83 130.38 C230.08 134.06, 236.29 137.16, 242.1 142.81 M224.83 130.38 C231.26 134.64, 236.77 138.6, 242.1 142.81 M242.1 142.81 C245.69 144.85, 249.83 149.54, 259.49 153.8 M242.1 142.81 C248.78 146.8, 254.34 150.36, 259.49 153.8 M259.49 153.8 C265.59 156.3, 273.53 160.09, 277.04 162.97 M259.49 153.8 C264.73 157.5, 269.52 158.9, 277.04 162.97 M277.04 162.97 C280.69 167.04, 289.29 167.5, 294.79 169.97 M277.04 162.97 C282.77 164.88, 287.8 167.48, 294.79 169.97 M294.79 169.97 C301.72 172.19, 306.95 172.65, 312.77 174.44 M294.79 169.97 C300.8 170.68, 305.85 172.49, 312.77 174.44 M312.77 174.44 C316.03 173.25, 320.19 176.22, 331 176.01 M312.77 174.44 C317.05 175.16, 319.83 175.97, 331 176.01 M331 176.01 C334.37 176.77, 337.86 175.46, 347 176.01 M331 176.01 C336.63 176.58, 340.88 175.73, 347 176.01" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g><g transform="translate(252 389.992) rotate(0 173.5 88.12564244777636)"><path d="M339.47 178.72 C341.36 178.69, 342.74 177.94, 347 176.01 M339.47 178.72 C342.29 177.89, 344.72 177.08, 347 176.01" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g><g transform="translate(252 389.992) rotate(0 173.5 88.12564244777636)"><path d="M339.49 173.25 C341.41 174.32, 342.79 174.69, 347 176.01 M339.49 173.25 C342.34 174.37, 344.76 175.5, 347 176.01" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g></g><mask/><g stroke-linecap="round"><g transform="translate(252 399.976) rotate(0 341.5 83.13361407095238)"><path d="M0 0 C4 1.02, 6.95 0.64, 16 0 M0 0 C6.01 0.29, 11.2 0.58, 16 0 M16 0 C27.6 -0.01, 39.8 1.62, 53.68 1.48 M16 0 C30.86 0.42, 45.7 2.15, 53.68 1.48 M53.68 1.48 C61.75 1.61, 70.85 1.85, 90.83 5.69 M53.68 1.48 C61.35 2.71, 69.46 3.08, 90.83 5.69 M90.83 5.69 C101.82 7.01, 112.41 10.25, 127.51 12.3 M90.83 5.69 C99.97 6.43, 107.8 7.79, 127.51 12.3 M127.51 12.3 C136.23 13.4, 148.61 17.77, 163.79 20.95 M127.51 12.3 C136.93 15.42, 148.22 17.34, 163.79 20.95 M163.79 20.95 C173.29 23.97, 180.72 27.82, 199.74 31.31 M163.79 20.95 C175.91 24.59, 189.16 28.86, 199.74 31.31 M199.74 31.31 C210.81 35.9, 219.07 38.14, 235.41 43.04 M199.74 31.31 C212.72 35.55, 226.64 39.64, 235.41 43.04 M235.41 43.04 C249.46 48.57, 260.79 49.9, 270.89 55.8 M235.41 43.04 C244.75 45.66, 252.15 49.16, 270.89 55.8 M270.89 55.8 C276.98 59.9, 285.76 61.39, 306.23 69.23 M270.89 55.8 C285.3 61.6, 299.49 66.18, 306.23 69.23 M306.23 69.23 C318.42 73.37, 332.85 77.37, 341.5 83.01 M306.23 69.23 C319.62 75.08, 334.57 79.3, 341.5 83.01 M341.5 83.01 C352.09 86.09, 366.83 90.41, 376.77 96.79 M341.5 83.01 C352.36 88.06, 362.91 91.64, 376.77 96.79 M376.77 96.79 C385.67 100.09, 394.63 103.86, 412.11 110.23 M376.77 96.79 C383.23 98.75, 391.33 102.4, 412.11 110.23 M412.11 110.23 C422.29 115.27, 436.89 117.72, 447.59 122.98 M412.11 110.23 C424.81 114.79, 435.39 118.11, 447.59 122.98 M447.59 122.98 C458.54 126.3, 470.46 129.19, 483.26 134.71 M447.59 122.98 C460.26 126.98, 472.02 130.69, 483.26 134.71 M483.26 134.71 C491.42 136.54, 500.13 141.07, 519.21 145.07 M483.26 134.71 C496.43 138.63, 508.47 141.97, 519.21 145.07 M519.21 145.07 C532.5 147.41, 547.64 151, 555.49 153.73 M519.21 145.07 C530.23 148.77, 540.79 149.99, 555.49 153.73 M555.49 153.73 C564.71 157.88, 579.11 158.15, 592.17 160.33 M555.49 153.73 C567 155.34, 577.76 157.84, 592.17 160.33 M592.17 160.33 C606.03 162.37, 618.06 162.65, 629.32 164.54 M592.17 160.33 C603.78 160.87, 614.35 162.64, 629.32 164.54 M629.32 164.54 C636.61 163.29, 644.9 166.48, 667 166.02 M629.32 164.54 C637.68 165.26, 644.39 166.1, 667 166.02 M667 166.02 C670.37 166.78, 673.86 165.47, 683 166.02 M667 166.02 C672.63 166.6, 676.88 165.74, 683 166.02" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g><g transform="translate(252 399.976) rotate(0 341.5 83.13361407095238)"><path d="M675.47 168.74 C677.36 168.7, 678.74 167.96, 683 166.02 M675.47 168.74 C678.29 167.91, 680.72 167.09, 683 166.02" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g><g transform="translate(252 399.976) rotate(0 341.5 83.13361407095238)"><path d="M675.49 163.26 C677.41 164.34, 678.79 164.71, 683 166.02 M675.49 163.26 C678.34 164.38, 680.76 165.52, 683 166.02" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g></g><mask/><g stroke-linecap="round"><g transform="translate(714 217) rotate(0 38 84.26930053266348)"><path d="M0 0 C4.38 -0.07, 6.74 1.23, 16 0 M0 0 C5.9 0.26, 9.77 -0.27, 16 0 M16 0 C17.55 0.35, 18.92 0.86, 19.75 1.5 M16 0 C17.09 0.27, 17.89 0.93, 19.75 1.5 M19.75 1.5 C20.03 2.3, 20.84 3.56, 23.04 5.76 M19.75 1.5 C21.1 3.07, 22.06 4.98, 23.04 5.76 M23.04 5.76 C22.98 7.54, 23.68 8.43, 25.93 12.44 M23.04 5.76 C24.1 8.18, 24.85 9.79, 25.93 12.44 M25.93 12.44 C27.17 16.05, 27.7 19.59, 28.47 21.2 M25.93 12.44 C26.31 15.47, 27.67 17.99, 28.47 21.2 M28.47 21.2 C28.68 25.8, 30.01 29.34, 30.72 31.69 M28.47 21.2 C29.38 25.45, 30.53 28.67, 30.72 31.69 M30.72 31.69 C31.49 37.17, 32.24 41.02, 32.74 43.56 M30.72 31.69 C30.71 35.1, 31.81 37.29, 32.74 43.56 M32.74 43.56 C34.44 47.32, 34.41 50.38, 34.59 56.46 M32.74 43.56 C32.94 46.53, 33.7 49.47, 34.59 56.46 M34.59 56.46 C34.95 59.64, 35 61.66, 36.32 70.06 M34.59 56.46 C35.56 61.39, 36.32 66.46, 36.32 70.06 M36.32 70.06 C36.29 73.86, 35.97 78.38, 38 84 M36.32 70.06 C36.6 74.4, 38.08 78.53, 38 84 M38 84 C38.52 90.72, 39.88 95.11, 39.68 97.94 M38 84 C38.83 88.1, 38.64 91.02, 39.68 97.94 M39.68 97.94 C39.36 100.64, 41.58 105.64, 41.41 111.54 M39.68 97.94 C39.76 101.29, 40.31 104.95, 41.41 111.54 M41.41 111.54 C43.07 114.57, 42.53 115.86, 43.26 124.44 M41.41 111.54 C41.2 114.14, 42.28 117.65, 43.26 124.44 M43.26 124.44 C42.69 127.53, 43.39 131.39, 45.28 136.31 M43.26 124.44 C43.35 128.27, 44.02 132.61, 45.28 136.31 M45.28 136.31 C46.66 138.32, 45.91 141.66, 47.53 146.8 M45.28 136.31 C45.37 139.22, 46.55 140.72, 47.53 146.8 M47.53 146.8 C47.87 150.4, 49.07 154.26, 50.07 155.56 M47.53 146.8 C48.1 149.97, 49.32 153.18, 50.07 155.56 M50.07 155.56 C51.23 157.77, 51.48 160.58, 52.96 162.24 M50.07 155.56 C51.5 158.32, 52.54 160.53, 52.96 162.24 M52.96 162.24 C53.73 163.98, 55.58 165.45, 56.25 166.5 M52.96 162.24 C53.55 163.42, 54.44 164.34, 56.25 166.5 M56.25 166.5 C57.69 166.87, 58.63 167.63, 60 168 M56.25 166.5 C57.66 167, 58.91 167.5, 60 168 M60 168 C62.3 169.36, 67.86 168.06, 76 168 M60 168 C63.76 168.33, 67.93 167.96, 76 168" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g><g transform="translate(714 217) rotate(0 38 84.26930053266348)"><path d="M68.5 170.79 C70.61 170.2, 71.69 170.28, 76 168 M68.5 170.79 C71.27 170, 73.04 168.83, 76 168" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g><g transform="translate(714 217) rotate(0 38 84.26930053266348)"><path d="M68.46 165.32 C70.55 165.82, 71.63 167.01, 76 168 M68.46 165.32 C71.28 166.32, 73.06 166.93, 76 168" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g></g><mask/><g stroke-linecap="round"><g transform="translate(965 385) rotate(0 128.5 90.03753775876396)"><path d="M0 0 C3.59 0.05, 5.5 -1.13, 16 0 M0 0 C6.67 0.75, 11.82 -0.67, 16 0 M16 0 C20.54 0.24, 22.66 0.57, 29.02 1.61 M16 0 C19.78 0.43, 23.05 0.27, 29.02 1.61 M29.02 1.61 C33.59 3.64, 37.61 4.69, 41.86 6.19 M29.02 1.61 C32.43 2.78, 36.19 4.55, 41.86 6.19 M41.86 6.19 C44.66 9.64, 48.69 9.01, 54.54 13.37 M41.86 6.19 C44.97 8.25, 47.7 9.19, 54.54 13.37 M54.54 13.37 C57.92 16.53, 59.71 17.3, 67.08 22.78 M54.54 13.37 C57.73 16.25, 61.97 18.51, 67.08 22.78 M67.08 22.78 C70.23 24.1, 72.56 28.87, 79.5 34.04 M67.08 22.78 C69.89 25.49, 75.01 30.03, 79.5 34.04 M79.5 34.04 C83.55 38.73, 88.86 43.74, 91.83 46.8 M79.5 34.04 C84 38.7, 87.53 43.17, 91.83 46.8 M91.83 46.8 C96.59 49.31, 96.14 54.75, 104.09 60.66 M91.83 46.8 C95.94 50, 98.9 53.52, 104.09 60.66 M104.09 60.66 C106.39 62.83, 108.4 66.56, 116.31 75.27 M104.09 60.66 C108.88 66.49, 113.59 70.96, 116.31 75.27 M116.31 75.27 C120.85 81.01, 123.31 85.61, 128.5 90.25 M116.31 75.27 C118.98 79.04, 123.05 83.77, 128.5 90.25 M128.5 90.25 C130.92 94.76, 134.98 97.87, 140.69 105.23 M128.5 90.25 C131.52 94.26, 132.72 95.87, 140.69 105.23 M140.69 105.23 C144.27 108.99, 145.31 112.55, 152.91 119.84 M140.69 105.23 C145.8 111.61, 150.33 117.52, 152.91 119.84 M152.91 119.84 C156.21 123.19, 158.24 125.14, 165.17 133.7 M152.91 119.84 C156.39 123.13, 159.51 127.84, 165.17 133.7 M165.17 133.7 C169.27 136.71, 173.14 142.54, 177.5 146.46 M165.17 133.7 C169.7 137.55, 172.96 141.89, 177.5 146.46 M177.5 146.46 C180.96 151.35, 185.27 154, 189.92 157.72 M177.5 146.46 C180.69 149.5, 182.79 151.7, 189.92 157.72 M189.92 157.72 C192.82 160.09, 197.98 162.91, 202.46 167.13 M189.92 157.72 C192.56 159.15, 195.76 162.54, 202.46 167.13 M202.46 167.13 C205.86 169.54, 210.92 172.72, 215.14 174.31 M202.46 167.13 C206.41 169.72, 209.95 172.06, 215.14 174.31 M215.14 174.31 C219.54 175.98, 220.68 177.8, 227.98 178.89 M215.14 174.31 C218.97 175.72, 223.26 177.33, 227.98 178.89 M227.98 178.89 C231.68 178.28, 236.55 180.52, 241 180.5 M227.98 178.89 C232.74 179.89, 237.03 179.92, 241 180.5 M241 180.5 C245.82 179.07, 247.31 180.2, 257 180.5 M241 180.5 C247.89 180.71, 254.43 180.34, 257 180.5" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g><g transform="translate(965 385) rotate(0 128.5 90.03753775876396)"><path d="M249.46 183.17 C251.15 182.65, 252.02 181.52, 257 180.5 M249.46 183.17 C252.63 182.51, 255.03 180.77, 257 180.5" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g><g transform="translate(965 385) rotate(0 128.5 90.03753775876396)"><path d="M249.51 177.69 C251.2 178.29, 252.06 178.28, 257 180.5 M249.51 177.69 C252.63 179.15, 255 179.53, 257 180.5" stroke="var(--diagram-link, #2E7D74)" stroke-width="2" fill="none"/></g></g><mask/><g transform="translate(423 26.5) rotate(0 164.5 12.5)"><text x="164.5" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="var(--diagram-ink, #1B1F23)" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Orator</text></g><g transform="translate(461 194.5) rotate(0 126.5 12.5)"><text x="126.5" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="var(--diagram-ink, #1B1F23)" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Meadow Endpoints</text></g><g transform="translate(10 362.5) rotate(0 121 12.5)"><text x="121" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="var(--diagram-ink, #1B1F23)" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Controller</text></g><g transform="translate(20 543.5) rotate(0 110 12.5)"><text x="110" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="var(--diagram-ink, #1B1F23)" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Session Marshaler</text></g><g transform="translate(263 543.5) rotate(0 181 12.5)"><text x="181" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="var(--diagram-ink, #1B1F23)" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Behavior Injection</text></g><g transform="translate(599 543.5) rotate(0 110 12.5)"><text x="110" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="var(--diagram-ink, #1B1F23)" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Error Handler</text></g><g transform="translate(935 543.5) rotate(0 110 12.5)"><text x="110" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="var(--diagram-ink, #1B1F23)" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Log Controller</text></g><g transform="translate(790 362.5) rotate(0 87.5 12.5)"><text x="87.5" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="var(--diagram-ink, #1B1F23)" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Meadow DAL</text></g><g transform="translate(1222 533) rotate(0 159 12.5)"><text x="159" y="17.619999999999997" font-family="Excalifont, Xiaolai, sans-serif, Segoe UI Emoji" font-size="20px" fill="var(--diagram-ink, #1B1F23)" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Database Provider</text></g></svg>
|
package/docs/index.html
CHANGED
|
@@ -4,12 +4,10 @@
|
|
|
4
4
|
<meta charset="utf-8">
|
|
5
5
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
|
7
|
-
<meta name="description" content="
|
|
7
|
+
<meta name="description" content="Meadow-Endpoints v4.0.22 Documentation — Automatic API endpoints for Meadow data.">
|
|
8
8
|
|
|
9
|
-
<title>
|
|
9
|
+
<title>Meadow-Endpoints v4.0.22 Documentation</title>
|
|
10
10
|
|
|
11
|
-
<!-- Application Stylesheet -->
|
|
12
|
-
<link href="css/docuserve.css" rel="stylesheet">
|
|
13
11
|
<!-- KaTeX stylesheet for LaTeX equation rendering -->
|
|
14
12
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.21/dist/katex.min.css">
|
|
15
13
|
<!-- PICT Dynamic View CSS Container -->
|
|
@@ -28,12 +26,13 @@
|
|
|
28
26
|
<!-- The root container for the Pict application -->
|
|
29
27
|
<div id="Docuserve-Application-Container"></div>
|
|
30
28
|
|
|
31
|
-
<!-- Mermaid diagram rendering
|
|
29
|
+
<!-- Mermaid diagram rendering. pict-section-content (v0.1.8+) drives
|
|
30
|
+
initialization with theme: 'base' + themeVariables sourced
|
|
31
|
+
from --theme-color-* so diagrams follow the active theme. -->
|
|
32
32
|
<script src="https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js"></script>
|
|
33
|
-
<script>mermaid.initialize({ startOnLoad: false, theme: 'default' });</script>
|
|
34
33
|
<!-- KaTeX for LaTeX equation rendering -->
|
|
35
34
|
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.21/dist/katex.min.js"></script>
|
|
36
35
|
<!-- Load the Docuserve PICT Application Bundle from jsDelivr CDN -->
|
|
37
|
-
<script src="https://cdn.jsdelivr.net/npm/pict-docuserve@
|
|
36
|
+
<script src="https://cdn.jsdelivr.net/npm/pict-docuserve@1/dist/pict-docuserve.min.js" type="text/javascript"></script>
|
|
38
37
|
</body>
|
|
39
38
|
</html>
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# Quick Start
|
|
2
|
+
|
|
3
|
+
This guide walks you through standing up a working REST API from a single Meadow entity: install the packages, create a Fable instance, wire up Orator, define a Meadow DAL, generate the endpoints, and call them with `curl`.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
Meadow Endpoints needs Fable as its runtime container, Meadow for data access, Orator as the API server, and an Orator service server implementation. Install them together:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install meadow-endpoints fable meadow orator orator-serviceserver-restify
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Creating the Server
|
|
14
|
+
|
|
15
|
+
Create a Fable instance, register Orator and its Restify service server, and instantiate both service providers.
|
|
16
|
+
|
|
17
|
+
```javascript
|
|
18
|
+
const libFable = require('fable');
|
|
19
|
+
const libOrator = require('orator');
|
|
20
|
+
const libOratorServiceServerRestify = require('orator-serviceserver-restify');
|
|
21
|
+
const libMeadow = require('meadow');
|
|
22
|
+
const libMeadowEndpoints = require('meadow-endpoints');
|
|
23
|
+
|
|
24
|
+
const _Fable = new libFable(
|
|
25
|
+
{
|
|
26
|
+
Product: 'MyAPI',
|
|
27
|
+
ProductVersion: '1.0.0',
|
|
28
|
+
ServicePort: 8086
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
// Register and instantiate Orator and the Restify service server
|
|
32
|
+
_Fable.serviceManager.addServiceType('Orator', libOrator);
|
|
33
|
+
_Fable.serviceManager.addServiceType('OratorServiceServer', libOratorServiceServerRestify);
|
|
34
|
+
_Fable.serviceManager.instantiateServiceProvider('Orator');
|
|
35
|
+
_Fable.serviceManager.instantiateServiceProvider('OratorServiceServer');
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Defining the Meadow Entity
|
|
39
|
+
|
|
40
|
+
Create a Meadow data access layer (DAL) for the entity you want to expose. The scope name (`Book`) becomes the entity segment in every generated route, and the schema's special column types drive auto-stamping and soft-delete behavior.
|
|
41
|
+
|
|
42
|
+
```javascript
|
|
43
|
+
const tmpMeadow = libMeadow.new(_Fable, 'Book')
|
|
44
|
+
.setProvider('MySQL')
|
|
45
|
+
.setDefaultIdentifier('IDBook')
|
|
46
|
+
.setSchema(
|
|
47
|
+
[
|
|
48
|
+
{ Column: 'IDBook', Type: 'AutoIdentity' },
|
|
49
|
+
{ Column: 'GUIDBook', Type: 'AutoGUID' },
|
|
50
|
+
{ Column: 'Title', Type: 'String', Size: '255' },
|
|
51
|
+
{ Column: 'Author', Type: 'String', Size: '128' },
|
|
52
|
+
{ Column: 'CreateDate', Type: 'CreateDate' },
|
|
53
|
+
{ Column: 'CreatingIDUser', Type: 'CreateIDUser' },
|
|
54
|
+
{ Column: 'UpdateDate', Type: 'UpdateDate' },
|
|
55
|
+
{ Column: 'UpdatingIDUser', Type: 'UpdateIDUser' },
|
|
56
|
+
{ Column: 'Deleted', Type: 'Deleted' }
|
|
57
|
+
]);
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
For the full set of schema column types and provider options, see the [meadow](https://fable-retold.github.io/meadow/) documentation.
|
|
61
|
+
|
|
62
|
+
## Generating and Connecting the Routes
|
|
63
|
+
|
|
64
|
+
Construct a `MeadowEndpoints` instance from the DAL and call `connectRoutes()`, passing the Orator service server. This is the single line that registers the entire CRUD route table.
|
|
65
|
+
|
|
66
|
+
```javascript
|
|
67
|
+
const tmpMeadowEndpoints = new libMeadowEndpoints(tmpMeadow);
|
|
68
|
+
tmpMeadowEndpoints.connectRoutes(_Fable.Orator.serviceServer);
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Starting the Service
|
|
72
|
+
|
|
73
|
+
```javascript
|
|
74
|
+
_Fable.Orator.startService(
|
|
75
|
+
() =>
|
|
76
|
+
{
|
|
77
|
+
console.log('API running on port 8086');
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Generated Routes
|
|
82
|
+
|
|
83
|
+
With the version defaulting to `1.0` and the entity scope `Book`, `connectRoutes()` registers the following routes. This is a representative selection -- see [Generated Routes](generated-routes.md) and the [CRUD Deep Dive](crud/README.md) for the complete table including filtered, paginated, lite, distinct, and select-list variants.
|
|
84
|
+
|
|
85
|
+
| Method | Route | Description |
|
|
86
|
+
|--------|-------|-------------|
|
|
87
|
+
| POST | `/1.0/Book` | Create a record |
|
|
88
|
+
| POST | `/1.0/Book/s` | Bulk create (array of records) |
|
|
89
|
+
| GET | `/1.0/Book/:IDBook` | Read one record by ID |
|
|
90
|
+
| GET | `/1.0/Book/s` | Read records (default cap: 250) |
|
|
91
|
+
| GET | `/1.0/Book/s/:Begin/:Cap` | Read records with pagination |
|
|
92
|
+
| GET | `/1.0/Book/s/FilteredTo/:Filter` | Read records with a filter |
|
|
93
|
+
| PUT | `/1.0/Book` | Update a record |
|
|
94
|
+
| PUT | `/1.0/Book/Upsert` | Insert or update a record |
|
|
95
|
+
| DELETE | `/1.0/Book/:IDBook` | Delete a record |
|
|
96
|
+
| GET | `/1.0/Book/Undelete/:IDBook` | Undelete a soft-deleted record |
|
|
97
|
+
| GET | `/1.0/Book/s/Count` | Count records |
|
|
98
|
+
| GET | `/1.0/Book/Schema` | Return the JSON Schema |
|
|
99
|
+
| GET | `/1.0/Book/Schema/New` | Return an empty default record |
|
|
100
|
+
| POST | `/1.0/Book/Schema/Validate` | Validate a record against the schema |
|
|
101
|
+
|
|
102
|
+
## Calling the API
|
|
103
|
+
|
|
104
|
+
With the service running on port 8086, exercise the endpoints with `curl`.
|
|
105
|
+
|
|
106
|
+
Create a record:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
curl -X POST http://localhost:8086/1.0/Book \
|
|
110
|
+
-H "Content-Type: application/json" \
|
|
111
|
+
-d '{ "Title": "Dune", "Author": "Frank Herbert" }'
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Read it back by ID (the create response includes the new `IDBook`):
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
curl http://localhost:8086/1.0/Book/1
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
List records with pagination:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
curl http://localhost:8086/1.0/Book/s/0/10
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Filter the list (titles containing "Dune"):
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
curl http://localhost:8086/1.0/Book/s/FilteredTo/Title~Dune
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Count the records:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
curl http://localhost:8086/1.0/Book/s/Count
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
The `FilteredTo` segment accepts the operators `=`, `!=`, `>`, `<`, `>=`, `<=`, and `~` (contains). See [Dynamic Filtering](dynamic-filtering.md) for the full expression syntax.
|
|
139
|
+
|
|
140
|
+
## Next Steps
|
|
141
|
+
|
|
142
|
+
- Add authentication and authorization with [Behavior Injection](behavior-injection.md)
|
|
143
|
+
- Restrict which endpoints are generated -- see Disabling Endpoint Groups in the [CRUD Deep Dive](crud/README.md)
|
|
144
|
+
- Understand the request lifecycle in the [Architecture](architecture.md) overview
|
|
145
|
+
|
|
146
|
+
## Related Modules
|
|
147
|
+
|
|
148
|
+
- [meadow](https://fable-retold.github.io/meadow/) -- the data access layer this guide builds on
|
|
149
|
+
- [orator](https://fable-retold.github.io/orator/) -- the API server hosting the routes
|
|
150
|
+
- [retold-data-service](https://fable-retold.github.io/retold-data-service/) -- assembles Meadow Endpoints into a complete, schema-driven REST service
|
|
151
|
+
- [pict-section-recordset](https://fable-retold.github.io/pict-section-recordset/) -- browser-side UI that consumes these CRUD endpoints
|