Page Not Found
We could not find what you were looking for.
Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
diff --git a/404.html b/404.html index 95e5593e32..568c7342b1 100644 --- a/404.html +++ b/404.html @@ -17,8 +17,8 @@ - - + +
We could not find what you were looking for.
Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
dev
subcommand",id:"1-dev-subcommand",level:3},{value:"2. typegate
subcommand",id:"2-typegate-subcommand",level:3}];function i(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h3:"h3",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.em,{children:"Meta CLI"})," comes with an embedded typegate packaged inside it. A ",(0,r.jsx)(t.a,{href:"/docs/reference/typegate",children:"typegate"})," instance is where you deploy your ",(0,r.jsx)(t.a,{href:"/docs/reference/typegraph",children:"typegraphs"})," where any logic written in them is exposed via an HTTP or GraphQL endpoints. You can run an embedded typegate node from the terminal. There are two ways to launch the embedded typegate"]}),"\n",(0,r.jsx)(t.admonition,{type:"note",children:(0,r.jsxs)(t.p,{children:["If you have not installed ",(0,r.jsx)(t.em,{children:"Meta CLI"})," or you have downloaded the ",(0,r.jsx)(t.em,{children:"thin"})," version, you can check ",(0,r.jsx)(t.a,{href:"/docs/reference/meta-cli#Installation",children:"this"})," installation guide of the ",(0,r.jsx)(t.em,{children:"CLI"}),"."]})}),"\n",(0,r.jsxs)(t.h3,{id:"1-dev-subcommand",children:["1. ",(0,r.jsx)(t.code,{children:"dev"})," subcommand"]}),"\n",(0,r.jsx)(t.p,{children:"You can start the embedded typegatxe easily with default configs using the following command."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",children:"meta dev\n"})}),"\n",(0,r.jsx)(t.p,{children:"The above command can be a good gateway to get started and also for development purposes. But if you want more granular control, you can use the second approach."}),"\n",(0,r.jsxs)(t.h3,{id:"2-typegate-subcommand",children:["2. ",(0,r.jsx)(t.code,{children:"typegate"})," subcommand"]}),"\n",(0,r.jsxs)(t.p,{children:["Set the ",(0,r.jsx)(t.code,{children:"tg_admin_password"})," and ",(0,r.jsx)(t.code,{children:"tg_secret"})," environment variables. You can use the following command to configure a sample value for the variables and test the embedded typegate."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",children:"export tg_secret=a4lNi0PbEItlFZbus1oeH/+wyIxi9uH6TpL8AIqIaMBNvp7SESmuUBbfUwC0prxhGhZqHw8vMDYZAGMhSZ4fLw== tg_admin_password=password\n"})}),"\n",(0,r.jsx)(t.p,{children:"Run the instance"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",children:"meta typegate\n"})}),"\n",(0,r.jsxs)(t.p,{children:["The typegate instance runs on port ",(0,r.jsx)(t.code,{children:"7890"})," by default. You can check if the typegate node is running by accessing ",(0,r.jsx)(t.a,{href:"http://localhost:7890",children:"http://localhost:7890"})," in your browser."]})]})}function c(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},36233:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>x,frontMatter:()=>i,metadata:()=>l,toc:()=>o});var r=n(86070),s=n(25710),d=n(96503);const i={sidebar_position:6},c="Typegate",l={id:"reference/typegate/index",title:"Typegate",description:"Typegate version",source:"@site/docs/reference/typegate/index.mdx",sourceDirName:"reference/typegate",slug:"/reference/typegate/",permalink:"/docs/reference/typegate/",draft:!1,unlisted:!1,editUrl:"https://github.com/metatypedev/metatype/tree/main/docs/metatype.dev/docs/reference/typegate/index.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{sidebar_position:6},sidebar:"docs",previous:{title:"Typegraph",permalink:"/docs/reference/typegraph/"},next:{title:"Authentication",permalink:"/docs/reference/typegate/authentication/"}},a={},o=[...d.RM,{value:"Internal APIs",id:"internal-apis",level:2},{value:"Request lifecycle",id:"request-lifecycle",level:2},{value:"HTTP/GraphQL interface",id:"httpgraphql-interface",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Environment variables.",id:"environment-variables",level:3}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"typegate",children:"Typegate"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"https://github.com/metatypedev/metatype/pkgs/container/typegate",children:(0,r.jsx)(t.img,{src:"https://ghcr-badge.deta.dev/metatypedev/typegate/latest_tag?trim=major&label=typegate",alt:"Typegate version"})})}),"\n",(0,r.jsx)(d.Ay,{}),"\n",(0,r.jsx)(t.h2,{id:"internal-apis",children:"Internal APIs"}),"\n",(0,r.jsx)(t.p,{children:"Most of the internal APIs are still unstable, and may change without notice. If you still want to experiment with them, you can use the GraphQL introspection to discover them."}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"/typegate"}),"\n",(0,r.jsx)(t.li,{children:"/prisma-migration"}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"The typegate nodes - or typegates - are the central components of the ecosystems. They build and type check typegraphs, and expose them through a HTTP/GraphQL interface. They enforce the type safety of the data flows, connect to all the runtimes and orchestrate the execution of incoming requests."}),"\n",(0,r.jsx)(t.h2,{id:"request-lifecycle",children:"Request lifecycle"}),"\n",(0,r.jsx)(t.p,{children:"When a new request fires a trigger, the typegate orchestrates the following stages:"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsx)(t.li,{children:"extract the secure request context from custom authentication or JSON Web Token (JWT)"}),"\n",(0,r.jsxs)(t.li,{children:["retrieve cached execution plan or compute a new one","\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"traverse the typegraph to create a DAG of the required types"}),"\n",(0,r.jsx)(t.li,{children:"optimize the DAG to reduce the number of calls to the runtimes"}),"\n",(0,r.jsx)(t.li,{children:"pre-compute all structural elements and data resolutions"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["execute the plan","\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"type check the arguments"}),"\n",(0,r.jsx)(t.li,{children:"verify lazily policies on the need"}),"\n",(0,r.jsx)(t.li,{children:"run the DAG execution"}),"\n",(0,r.jsx)(t.li,{children:"enforce the rate-limiting"}),"\n",(0,r.jsx)(t.li,{children:"type check the response"}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.li,{children:"manage metadata of the request"}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"httpgraphql-interface",children:"HTTP/GraphQL interface"}),"\n",(0,r.jsxs)(t.p,{children:["For now, the typegate nodes are only accessible through HTTP/1.1 and HTTP/2. More protocols could be supported in the future. Typegates expose a GraphQL interface which is the result of a ",(0,r.jsx)(t.a,{href:"./typegraph",children:"typegraph"})," projected onto corresponding GraphQL types. While this reduces the type safety of the data flowing, it makes more interoperable thanks to the many high-quality and well-known GraphQL tooling already available. The underlying types are also exposed in order for API clients to verify the underlying types."]}),"\n",(0,r.jsx)(t.p,{children:"GraphQL, being a query language, offers a great asset for Metatype's philosophy:"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsx)(t.li,{children:"Efficient querying: the client can specify exactly what data it needs, reducing the amount of over- or under-fetching"}),"\n",(0,r.jsx)(t.li,{children:"Flexibility: allows for retrieving multiple resources in a single request, unlike REST, which often requires multiple ones"}),"\n",(0,r.jsx)(t.li,{children:"Typing: GraphQL has a built-in type system that allows for better documentation and stronger validation of the requests"}),"\n",(0,r.jsx)(t.li,{children:"Improved tooling: tools and libraries around GraphQL are rapidly growing and great a development experience"}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(t.h3,{id:"environment-variables",children:"Environment variables."}),"\n",(0,r.jsxs)(t.p,{children:["The following environment variables can be used to configure the typegate. ",(0,r.jsx)(t.code,{children:"SYNC_*"})," variables have special semantics which you can read about ",(0,r.jsx)(t.a,{href:"/docs/reference/typegate/synchronization",children:"here"}),"."]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Environment variables"}),(0,r.jsx)(t.th,{children:"Desc"}),(0,r.jsx)(t.th,{children:"Default"}),(0,r.jsx)(t.th,{children:"Examples"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"HOSTNAME"}),(0,r.jsx)(t.td,{children:"Hostname that typegate is deployed on."}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:"getHostname()"})," result."]}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"typegate-123"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"TG_PORT"}),(0,r.jsx)(t.td,{children:"Tcp port to serve typegate APIs at."}),(0,r.jsx)(t.td,{children:"7890"}),(0,r.jsx)(t.td,{children:"7891"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"TG_ADMIN_PASSWORD"}),(0,r.jsx)(t.td,{children:"Password use by the CLI/SDK to configure the typegate."}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Required"})}),(0,r.jsx)(t.td,{children:"My5up3r53cr37"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"TG_SECRET"}),(0,r.jsx)(t.td,{children:"Symmetric key used to encrypt cookies and other things (64-byte binary string encoded in base64)."}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.strong,{children:"Required"}),"."]}),(0,r.jsx)(t.td,{children:"0p64wJCpQCTiPqPOEze92HLBieszD3sGLtnx6tWm67kqo1tCYcNZ17rjFjEzMl7HJ/SOFZsTVWU0fUjndMrhsQ=="})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"TMP_DIR"}),(0,r.jsx)(t.td,{children:"Top-level temporary directory."}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"$PWD/tmp"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"/tmp/typegate-tmp-dir"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"DEBUG"}),(0,r.jsx)(t.td,{children:"Enable debug output and other development paths."}),(0,r.jsx)(t.td,{children:"false"}),(0,r.jsx)(t.td,{children:"true"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"TIMER_MAX_TIMEOUT_MS"}),(0,r.jsx)(t.td,{children:"Timeout for custom runtime functions and other proccesses."}),(0,r.jsx)(t.td,{children:"3000"}),(0,r.jsx)(t.td,{children:"5000"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"TIMER_POLICY_EVAL_RETRIES"}),(0,r.jsx)(t.td,{children:"Number of retries when evaluating policies that have timed out"}),(0,r.jsx)(t.td,{children:"1"}),(0,r.jsx)(t.td,{children:"3"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"TIMER_DESTROY_RESOURCES"}),(0,r.jsx)(t.td,{children:"Force abort and attempt to restart operations that did not respond after multiple retries"}),(0,r.jsx)(t.td,{children:"true"}),(0,r.jsx)(t.td,{children:"false"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"JWT_MAX_DURATION_SEC"}),(0,r.jsx)(t.td,{children:"The lifetime of generated JWT access tokens."}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"30 * 24 * 3600"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"604800"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"JWT_REFRESH_DURATION_SEC"}),(0,r.jsx)(t.td,{children:"The lifetime of generated JWT refresh tokens."}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"5 * 60"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"600"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SENTRY_DSN"}),(0,r.jsx)(t.td,{children:"Data source name for sentry"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"null"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"https://public@sentry.example.com/1"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SENTRY_SAMPLE_RATE"}),(0,r.jsx)(t.td,{children:"The rate of error events to be sent to Sentry (between 0.0 and 1.0)"}),(0,r.jsx)(t.td,{children:"1.0"}),(0,r.jsx)(t.td,{children:"0.5"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SENTRY_TRACES_SAMPLE_RATE"}),(0,r.jsx)(t.td,{children:"The rate of transactions be sent to Sentry (between 0.0 and 1.0)"}),(0,r.jsx)(t.td,{children:"1.0"}),(0,r.jsx)(t.td,{children:"0.2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"TRUST_PROXY"}),(0,r.jsx)(t.td,{children:"Whether to accept proxy headers when resolving request contexts."}),(0,r.jsx)(t.td,{children:"false"}),(0,r.jsx)(t.td,{children:"true"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"TRUST_HEADER_IP"}),(0,r.jsx)(t.td,{children:"The header key on which to resolve request origin addresses."}),(0,r.jsx)(t.td,{children:"X-Forwarded-For"}),(0,r.jsx)(t.td,{children:"X-Forwarded-For"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"DENO_V8_FLAGS"}),(0,r.jsxs)(t.td,{children:["Flags for tuning the v8 javascript engine. Use the ",(0,r.jsx)(t.code,{children:"--help"})," flag here to see what options are available."]}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"--stack-size=1968"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SYNC_REDIS_URL"}),(0,r.jsx)(t.td,{children:"URL to the Redis database. Must include the database number."}),(0,r.jsx)(t.td,{children:"**Required (sync mode)"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"http://:password@localhost:6379/0"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SYNC_S3_HOST"}),(0,r.jsx)(t.td,{children:"Hostname of the S3 store."}),(0,r.jsx)(t.td,{children:"**Required (sync mode)"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"play.min.io:9000"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SYNC_S3_REGION"}),(0,r.jsx)(t.td,{children:"S3 region."}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Required (sync mode)"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"us-west-2"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SYNC_S3_ACCESS_KEY"}),(0,r.jsx)(t.td,{children:"Access key for the S3 store credentials."}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Required (sync mode)"})}),(0,r.jsx)(t.td,{children:"user"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SYNC_S3_SECRET_KEY"}),(0,r.jsx)(t.td,{children:"Access key secret for the S3 store credentials."}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Required (sync mode)"})}),(0,r.jsx)(t.td,{children:"password"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SYNC_S3_PATH_STYLE"}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:"true"})," or ",(0,r.jsx)(t.code,{children:"false"}),", force path style if ",(0,r.jsx)(t.code,{children:"true"}),"."]}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"false"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"true"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SYNC_S3_BUCKET"}),(0,r.jsx)(t.td,{children:"The bucket to be used for the system (dedicated)."}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Required (sync mode)"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"mybucket"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SUBSTANTIAL_POLL_INTERVAL_SEC"}),(0,r.jsx)(t.td,{children:"Rate at which new schedules are read."}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Required (sync mode)"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"mybucket"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SUBSTANTIAL_LEASE_LIFESPAN_SEC"}),(0,r.jsx)(t.td,{children:"Lease duration associated to a workflow run"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Required (sync mode)"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"mybucket"})})]})]})]})]})}function x(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2606],{96503:(e,t,n)=>{n.d(t,{Ay:()=>c,RM:()=>d});var r=n(86070),s=n(25710);n(75707);const d=[{value:"Using Embedded Typegate (Recommended)",id:"using-embedded-typegate-recommended",level:3}];function i(e){const t={a:"a",admonition:"admonition",code:"code",h3:"h3",p:"p",pre:"pre",...(0,s.R)(),...e.components},{Details:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h3,{id:"using-embedded-typegate-recommended",children:"Using Embedded Typegate (Recommended)"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",children:"meta dev\n"})}),"\n",(0,r.jsx)(t.admonition,{type:"note",children:(0,r.jsxs)(t.p,{children:["You can launch the embedded typegate via two subcommands, ",(0,r.jsx)(t.code,{children:"meta dev"})," and ",(0,r.jsx)(t.code,{children:"meta typegate"}),". Check the ",(0,r.jsx)(t.a,{href:"/docs/reference/meta-cli/embedded-typegate",children:"Embedded Typegate"})," for more info."]})}),"\n",(0,r.jsxs)(t.p,{children:["The typegate instance runs on port ",(0,r.jsx)(t.code,{children:"7890"})," by default. You can check if the typegate node is running by accessing ",(0,r.jsx)(t.a,{href:"http://localhost:7890",children:"http://localhost:7890"})," in your browser."]}),"\n",(0,r.jsxs)(n,{children:[(0,r.jsx)("summary",{children:" Using docker (Not Recommended) "}),(0,r.jsxs)(t.p,{children:["Install ",(0,r.jsx)(t.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"})," and use the following ",(0,r.jsx)(t.code,{children:"compose.yml"})," to launch a typegate node. For multi-instance production workloads, Redis and an S3 object store provider are required but the typegate will run using in-memory stores if no ",(0,r.jsx)(t.code,{children:"SYNC_*"})," environment variable is detected. More details can be found ",(0,r.jsx)(t.a,{href:"/docs/reference/typegate/synchronization",children:"here"}),". In practice you might also want to add a database or other systems that the typegate can connect to."]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yml",children:'services:\n typegate:\n image: ghcr.io/metatypedev/typegate:latest\n ports:\n - "7890:7890"\n extra_hosts:\n - "host.docker.internal:host-gateway"\n environment:\n # only for dev, generate secure values for production\n TG_SECRET: "a4lNi0PbEItlFZbus1oeH/+wyIxi9uH6TpL8AIqIaMBNvp7SESmuUBbfUwC0prxhGhZqHw8vMDYZAGMhSZ4fLw=="\n TG_ADMIN_PASSWORD: password\n DEBUG: "true"\n'})}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"# launch the containers\ndocker compose up --detach\n\n# watch the typegate logs\ndocker compose logs typegate --follow\n"})})]})]})}function c(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},75707:(e,t,n)=>{n.d(t,{Ay:()=>c,RM:()=>d});var r=n(86070),s=n(25710);const d=[{value:"1. dev
subcommand",id:"1-dev-subcommand",level:3},{value:"2. typegate
subcommand",id:"2-typegate-subcommand",level:3}];function i(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h3:"h3",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.em,{children:"Meta CLI"})," comes with an embedded typegate packaged inside it. A ",(0,r.jsx)(t.a,{href:"/docs/reference/typegate",children:"typegate"})," instance is where you deploy your ",(0,r.jsx)(t.a,{href:"/docs/reference/typegraph",children:"typegraphs"})," where any logic written in them is exposed via an HTTP or GraphQL endpoints. You can run an embedded typegate node from the terminal. There are two ways to launch the embedded typegate"]}),"\n",(0,r.jsx)(t.admonition,{type:"note",children:(0,r.jsxs)(t.p,{children:["If you have not installed ",(0,r.jsx)(t.em,{children:"Meta CLI"})," or you have downloaded the ",(0,r.jsx)(t.em,{children:"thin"})," version, you can check ",(0,r.jsx)(t.a,{href:"/docs/reference/meta-cli#Installation",children:"this"})," installation guide of the ",(0,r.jsx)(t.em,{children:"CLI"}),"."]})}),"\n",(0,r.jsxs)(t.h3,{id:"1-dev-subcommand",children:["1. ",(0,r.jsx)(t.code,{children:"dev"})," subcommand"]}),"\n",(0,r.jsx)(t.p,{children:"You can start the embedded typegatxe easily with default configs using the following command."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",children:"meta dev\n"})}),"\n",(0,r.jsx)(t.p,{children:"The above command can be a good gateway to get started and also for development purposes. But if you want more granular control, you can use the second approach."}),"\n",(0,r.jsxs)(t.h3,{id:"2-typegate-subcommand",children:["2. ",(0,r.jsx)(t.code,{children:"typegate"})," subcommand"]}),"\n",(0,r.jsxs)(t.p,{children:["Set the ",(0,r.jsx)(t.code,{children:"tg_admin_password"})," and ",(0,r.jsx)(t.code,{children:"tg_secret"})," environment variables. You can use the following command to configure a sample value for the variables and test the embedded typegate."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",children:"export tg_secret=a4lNi0PbEItlFZbus1oeH/+wyIxi9uH6TpL8AIqIaMBNvp7SESmuUBbfUwC0prxhGhZqHw8vMDYZAGMhSZ4fLw== tg_admin_password=password\n"})}),"\n",(0,r.jsx)(t.p,{children:"Run the instance"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",children:"meta typegate\n"})}),"\n",(0,r.jsxs)(t.p,{children:["The typegate instance runs on port ",(0,r.jsx)(t.code,{children:"7890"})," by default. You can check if the typegate node is running by accessing ",(0,r.jsx)(t.a,{href:"http://localhost:7890",children:"http://localhost:7890"})," in your browser."]})]})}function c(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},36233:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>x,frontMatter:()=>i,metadata:()=>l,toc:()=>o});var r=n(86070),s=n(25710),d=n(96503);const i={sidebar_position:6},c="Typegate",l={id:"reference/typegate/index",title:"Typegate",description:"Typegate version",source:"@site/docs/reference/typegate/index.mdx",sourceDirName:"reference/typegate",slug:"/reference/typegate/",permalink:"/docs/reference/typegate/",draft:!1,unlisted:!1,editUrl:"https://github.com/metatypedev/metatype/tree/main/docs/metatype.dev/docs/reference/typegate/index.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{sidebar_position:6},sidebar:"docs",previous:{title:"Typegraph",permalink:"/docs/reference/typegraph/"},next:{title:"Authentication",permalink:"/docs/reference/typegate/authentication/"}},a={},o=[...d.RM,{value:"Internal APIs",id:"internal-apis",level:2},{value:"Request lifecycle",id:"request-lifecycle",level:2},{value:"HTTP/GraphQL interface",id:"httpgraphql-interface",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Environment variables.",id:"environment-variables",level:3}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"typegate",children:"Typegate"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"https://github.com/metatypedev/metatype/pkgs/container/typegate",children:(0,r.jsx)(t.img,{src:"https://ghcr-badge.deta.dev/metatypedev/typegate/latest_tag?trim=major&label=typegate",alt:"Typegate version"})})}),"\n",(0,r.jsx)(d.Ay,{}),"\n",(0,r.jsx)(t.h2,{id:"internal-apis",children:"Internal APIs"}),"\n",(0,r.jsx)(t.p,{children:"Most of the internal APIs are still unstable, and may change without notice. If you still want to experiment with them, you can use the GraphQL introspection to discover them."}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"/typegate"}),"\n",(0,r.jsx)(t.li,{children:"/prisma-migration"}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"The typegate nodes - or typegates - are the central components of the ecosystems. They build and type check typegraphs, and expose them through a HTTP/GraphQL interface. They enforce the type safety of the data flows, connect to all the runtimes and orchestrate the execution of incoming requests."}),"\n",(0,r.jsx)(t.h2,{id:"request-lifecycle",children:"Request lifecycle"}),"\n",(0,r.jsx)(t.p,{children:"When a new request fires a trigger, the typegate orchestrates the following stages:"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsx)(t.li,{children:"extract the secure request context from custom authentication or JSON Web Token (JWT)"}),"\n",(0,r.jsxs)(t.li,{children:["retrieve cached execution plan or compute a new one","\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"traverse the typegraph to create a DAG of the required types"}),"\n",(0,r.jsx)(t.li,{children:"optimize the DAG to reduce the number of calls to the runtimes"}),"\n",(0,r.jsx)(t.li,{children:"pre-compute all structural elements and data resolutions"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["execute the plan","\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"type check the arguments"}),"\n",(0,r.jsx)(t.li,{children:"verify lazily policies on the need"}),"\n",(0,r.jsx)(t.li,{children:"run the DAG execution"}),"\n",(0,r.jsx)(t.li,{children:"enforce the rate-limiting"}),"\n",(0,r.jsx)(t.li,{children:"type check the response"}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.li,{children:"manage metadata of the request"}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"httpgraphql-interface",children:"HTTP/GraphQL interface"}),"\n",(0,r.jsxs)(t.p,{children:["For now, the typegate nodes are only accessible through HTTP/1.1 and HTTP/2. More protocols could be supported in the future. Typegates expose a GraphQL interface which is the result of a ",(0,r.jsx)(t.a,{href:"./typegraph",children:"typegraph"})," projected onto corresponding GraphQL types. While this reduces the type safety of the data flowing, it makes more interoperable thanks to the many high-quality and well-known GraphQL tooling already available. The underlying types are also exposed in order for API clients to verify the underlying types."]}),"\n",(0,r.jsx)(t.p,{children:"GraphQL, being a query language, offers a great asset for Metatype's philosophy:"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsx)(t.li,{children:"Efficient querying: the client can specify exactly what data it needs, reducing the amount of over- or under-fetching"}),"\n",(0,r.jsx)(t.li,{children:"Flexibility: allows for retrieving multiple resources in a single request, unlike REST, which often requires multiple ones"}),"\n",(0,r.jsx)(t.li,{children:"Typing: GraphQL has a built-in type system that allows for better documentation and stronger validation of the requests"}),"\n",(0,r.jsx)(t.li,{children:"Improved tooling: tools and libraries around GraphQL are rapidly growing and great a development experience"}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(t.h3,{id:"environment-variables",children:"Environment variables."}),"\n",(0,r.jsxs)(t.p,{children:["The following environment variables can be used to configure the typegate. ",(0,r.jsx)(t.code,{children:"SYNC_*"})," variables have special semantics which you can read about ",(0,r.jsx)(t.a,{href:"/docs/reference/typegate/synchronization",children:"here"}),"."]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Environment variables"}),(0,r.jsx)(t.th,{children:"Desc"}),(0,r.jsx)(t.th,{children:"Default"}),(0,r.jsx)(t.th,{children:"Examples"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"HOSTNAME"}),(0,r.jsx)(t.td,{children:"Hostname that typegate is deployed on."}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:"getHostname()"})," result."]}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"typegate-123"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"TG_PORT"}),(0,r.jsx)(t.td,{children:"Tcp port to serve typegate APIs at."}),(0,r.jsx)(t.td,{children:"7890"}),(0,r.jsx)(t.td,{children:"7891"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"TG_ADMIN_PASSWORD"}),(0,r.jsx)(t.td,{children:"Password use by the CLI/SDK to configure the typegate."}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Required"})}),(0,r.jsx)(t.td,{children:"My5up3r53cr37"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"TG_SECRET"}),(0,r.jsx)(t.td,{children:"Symmetric key used to encrypt cookies and other things (64-byte binary string encoded in base64)."}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.strong,{children:"Required"}),"."]}),(0,r.jsx)(t.td,{children:"0p64wJCpQCTiPqPOEze92HLBieszD3sGLtnx6tWm67kqo1tCYcNZ17rjFjEzMl7HJ/SOFZsTVWU0fUjndMrhsQ=="})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"TMP_DIR"}),(0,r.jsx)(t.td,{children:"Top-level temporary directory."}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"$PWD/tmp"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"/tmp/typegate-tmp-dir"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"DEBUG"}),(0,r.jsx)(t.td,{children:"Enable debug output and other development paths."}),(0,r.jsx)(t.td,{children:"false"}),(0,r.jsx)(t.td,{children:"true"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"TIMER_MAX_TIMEOUT_MS"}),(0,r.jsx)(t.td,{children:"Timeout for custom runtime functions and other proccesses."}),(0,r.jsx)(t.td,{children:"3000"}),(0,r.jsx)(t.td,{children:"5000"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"TIMER_POLICY_EVAL_RETRIES"}),(0,r.jsx)(t.td,{children:"Number of retries when evaluating policies that have timed out"}),(0,r.jsx)(t.td,{children:"1"}),(0,r.jsx)(t.td,{children:"3"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"TIMER_DESTROY_RESOURCES"}),(0,r.jsx)(t.td,{children:"Force abort and attempt to restart operations that did not respond after multiple retries"}),(0,r.jsx)(t.td,{children:"true"}),(0,r.jsx)(t.td,{children:"false"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"JWT_MAX_DURATION_SEC"}),(0,r.jsx)(t.td,{children:"The lifetime of generated JWT access tokens."}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"30 * 24 * 3600"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"604800"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"JWT_REFRESH_DURATION_SEC"}),(0,r.jsx)(t.td,{children:"The lifetime of generated JWT refresh tokens."}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"5 * 60"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"600"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SENTRY_DSN"}),(0,r.jsx)(t.td,{children:"Data source name for sentry"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"null"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"https://public@sentry.example.com/1"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SENTRY_SAMPLE_RATE"}),(0,r.jsx)(t.td,{children:"The rate of error events to be sent to Sentry (between 0.0 and 1.0)"}),(0,r.jsx)(t.td,{children:"1.0"}),(0,r.jsx)(t.td,{children:"0.5"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SENTRY_TRACES_SAMPLE_RATE"}),(0,r.jsx)(t.td,{children:"The rate of transactions be sent to Sentry (between 0.0 and 1.0)"}),(0,r.jsx)(t.td,{children:"1.0"}),(0,r.jsx)(t.td,{children:"0.2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"TRUST_PROXY"}),(0,r.jsx)(t.td,{children:"Whether to accept proxy headers when resolving request contexts."}),(0,r.jsx)(t.td,{children:"false"}),(0,r.jsx)(t.td,{children:"true"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"TRUST_HEADER_IP"}),(0,r.jsx)(t.td,{children:"The header key on which to resolve request origin addresses."}),(0,r.jsx)(t.td,{children:"X-Forwarded-For"}),(0,r.jsx)(t.td,{children:"X-Forwarded-For"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"DENO_V8_FLAGS"}),(0,r.jsxs)(t.td,{children:["Flags for tuning the v8 javascript engine. Use the ",(0,r.jsx)(t.code,{children:"--help"})," flag here to see what options are available."]}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"--stack-size=1968"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SYNC_REDIS_URL"}),(0,r.jsx)(t.td,{children:"URL to the Redis database. Must include the database number."}),(0,r.jsx)(t.td,{children:"**Required (sync mode)"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"http://:password@localhost:6379/0"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SYNC_S3_HOST"}),(0,r.jsx)(t.td,{children:"Hostname of the S3 store."}),(0,r.jsx)(t.td,{children:"**Required (sync mode)"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"play.min.io:9000"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SYNC_S3_REGION"}),(0,r.jsx)(t.td,{children:"S3 region."}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Required (sync mode)"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"us-west-2"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SYNC_S3_ACCESS_KEY"}),(0,r.jsx)(t.td,{children:"Access key for the S3 store credentials."}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Required (sync mode)"})}),(0,r.jsx)(t.td,{children:"user"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SYNC_S3_SECRET_KEY"}),(0,r.jsx)(t.td,{children:"Access key secret for the S3 store credentials."}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Required (sync mode)"})}),(0,r.jsx)(t.td,{children:"password"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SYNC_S3_PATH_STYLE"}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:"true"})," or ",(0,r.jsx)(t.code,{children:"false"}),", force path style if ",(0,r.jsx)(t.code,{children:"true"}),"."]}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"false"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"true"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SYNC_S3_BUCKET"}),(0,r.jsx)(t.td,{children:"The bucket to be used for the system (dedicated)."}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Required (sync mode)"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"mybucket"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SUBSTANTIAL_POLL_INTERVAL_SEC"}),(0,r.jsx)(t.td,{children:"Rate at which new schedules are read."}),(0,r.jsx)(t.td,{children:"1.0"}),(0,r.jsx)(t.td,{children:"0.6"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SUBSTANTIAL_LEASE_LIFESPAN_SEC"}),(0,r.jsx)(t.td,{children:"Lease duration associated to a workflow run"}),(0,r.jsx)(t.td,{children:"2.0"}),(0,r.jsx)(t.td,{children:"6"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"SUBSTANTIAL_MAX_ACQUIRE_PER_TICK"}),(0,r.jsx)(t.td,{children:"Max amount of new acquired replay requests per tick"}),(0,r.jsx)(t.td,{children:"3"}),(0,r.jsx)(t.td,{children:"5"})]})]})]})]})}function x(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}}}]);
\ No newline at end of file
diff --git a/assets/js/878e8ee7.04844c2c.js b/assets/js/878e8ee7.04844c2c.js
new file mode 100644
index 0000000000..06d5448480
--- /dev/null
+++ b/assets/js/878e8ee7.04844c2c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6800],{49362:e=>{e.exports=JSON.parse('{"version":{"pluginId":"docs","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"link","label":"Getting started","href":"/docs/","docId":"index","unlisted":false},{"type":"category","label":"Tutorials","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Quick-start","href":"/docs/tutorials/quick-start/","docId":"tutorials/quick-start/index","unlisted":false},{"type":"link","label":"Metatype Basics","href":"/docs/tutorials/metatype-basics/","docId":"tutorials/metatype-basics/index","unlisted":false}]},{"type":"category","label":"How-to guides","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Custom functions","href":"/docs/guides/external-functions/","docId":"guides/external-functions/index","unlisted":false},{"type":"link","label":"Upload files to cloud storage","href":"/docs/guides/files-upload/","docId":"guides/files-upload/index","unlisted":false},{"type":"link","label":"Write REST endpoints","href":"/docs/guides/rest/","docId":"guides/rest/index","unlisted":false},{"type":"link","label":"Secure your requests","href":"/docs/guides/securing-requests/","docId":"guides/securing-requests/index","unlisted":false},{"type":"link","label":"Wasm functions","href":"/docs/guides/wasm-functions/","docId":"guides/wasm-functions/index","unlisted":false},{"type":"link","label":"Self-host the Typegate","href":"/docs/guides/self-hosting","docId":"guides/self-hosting","unlisted":false},{"type":"link","label":"Contribute to Metatype","href":"/docs/guides/contributing","docId":"guides/contributing","unlisted":false},{"type":"link","label":"Importing External Modules","href":"/docs/guides/import-external-modules/","docId":"guides/import-external-modules/index","unlisted":false},{"type":"link","label":"Programmatic deployment","href":"/docs/guides/programmatic-deployment/","docId":"guides/programmatic-deployment/index","unlisted":false},{"type":"link","label":"Test typegraphs","href":"/docs/guides/test-your-typegraph/","docId":"guides/test-your-typegraph/index","unlisted":false}]},{"type":"category","label":"Reference","collapsible":true,"collapsed":false,"items":[{"type":"category","label":"Types","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Type comparison","href":"/docs/reference/types/comparison","docId":"reference/types/comparison","unlisted":false},{"type":"link","label":"Functions","href":"/docs/reference/types/functions","docId":"reference/types/functions","unlisted":false},{"type":"link","label":"Injections","href":"/docs/reference/types/injections","docId":"reference/types/injections","unlisted":false},{"type":"link","label":"Parameter Transformations","href":"/docs/reference/types/parameter-transformations","docId":"reference/types/parameter-transformations","unlisted":false}],"href":"/docs/reference/types/"},{"type":"category","label":"Runtimes","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Deno/typescript","href":"/docs/reference/runtimes/deno/","docId":"reference/runtimes/deno/index","unlisted":false},{"type":"link","label":"GraphQL","href":"/docs/reference/runtimes/graphql/","docId":"reference/runtimes/graphql/index","unlisted":false},{"type":"link","label":"gRPC Runtime","href":"/docs/reference/runtimes/grpc/","docId":"reference/runtimes/grpc/index","unlisted":false},{"type":"link","label":"HTTP/REST","href":"/docs/reference/runtimes/http/","docId":"reference/runtimes/http/index","unlisted":false},{"type":"link","label":"Kv","href":"/docs/reference/runtimes/kv/","docId":"reference/runtimes/kv/index","unlisted":false},{"type":"link","label":"Prisma","href":"/docs/reference/runtimes/prisma/","docId":"reference/runtimes/prisma/index","unlisted":false},{"type":"link","label":"Python","href":"/docs/reference/runtimes/python/","docId":"reference/runtimes/python/index","unlisted":false},{"type":"link","label":"Random","href":"/docs/reference/runtimes/random/","docId":"reference/runtimes/random/index","unlisted":false},{"type":"link","label":"S3","href":"/docs/reference/runtimes/s3/","docId":"reference/runtimes/s3/index","unlisted":false},{"type":"link","label":"Substantial","href":"/docs/reference/runtimes/substantial/","docId":"reference/runtimes/substantial/index","unlisted":false},{"type":"link","label":"Temporal","href":"/docs/reference/runtimes/temporal/","docId":"reference/runtimes/temporal/index","unlisted":false},{"type":"link","label":"Wasm","href":"/docs/reference/runtimes/wasm/","docId":"reference/runtimes/wasm/index","unlisted":false}],"href":"/docs/reference/runtimes/"},{"type":"link","label":"Policies","href":"/docs/reference/policies/","docId":"reference/policies/index","unlisted":false},{"type":"link","label":"Ecosystem","href":"/docs/reference/ecosystem/","docId":"reference/ecosystem/index","unlisted":false},{"type":"link","label":"REST","href":"/docs/reference/rest/","docId":"reference/rest/index","unlisted":false},{"type":"link","label":"Typegraph","href":"/docs/reference/typegraph/","docId":"reference/typegraph/index","unlisted":false},{"type":"category","label":"Typegate","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Authentication","href":"/docs/reference/typegate/authentication/","docId":"reference/typegate/authentication/index","unlisted":false},{"type":"link","label":"CORS","href":"/docs/reference/typegate/cors/","docId":"reference/typegate/cors/index","unlisted":false},{"type":"link","label":"Rate limiting","href":"/docs/reference/typegate/rate-limiting/","docId":"reference/typegate/rate-limiting/index","unlisted":false},{"type":"link","label":"Synchronization","href":"/docs/reference/typegate/synchronization/","docId":"reference/typegate/synchronization/index","unlisted":false}],"href":"/docs/reference/typegate/"},{"type":"category","label":"Meta CLI","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Available commands","href":"/docs/reference/meta-cli/available-commands","docId":"reference/meta-cli/available-commands","unlisted":false},{"type":"link","label":"Configuration file","href":"/docs/reference/meta-cli/configuration-file","docId":"reference/meta-cli/configuration-file","unlisted":false},{"type":"link","label":"Embedded Typegate","href":"/docs/reference/meta-cli/embedded-typegate/","docId":"reference/meta-cli/embedded-typegate/index","unlisted":false}],"href":"/docs/reference/meta-cli/"},{"type":"link","label":"Metagen","href":"/docs/reference/metagen/","docId":"reference/metagen/index","unlisted":false},{"type":"link","label":"Changelog","href":"/docs/reference/changelog","docId":"reference/changelog","unlisted":false}]},{"type":"category","label":"Concepts","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Features overview","href":"/docs/concepts/features-overview/","docId":"concepts/features-overview/index","unlisted":false},{"type":"link","label":"Mental model","href":"/docs/concepts/mental-model/","docId":"concepts/mental-model/index","unlisted":false},{"type":"link","label":"Architecture","href":"/docs/concepts/architecture/","docId":"concepts/architecture/index","unlisted":false},{"type":"link","label":"Comparing Metatype","href":"/docs/concepts/comparisons/","docId":"concepts/comparisons/index","unlisted":false},{"type":"category","label":"RFCs","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"M0 - Template","href":"/docs/concepts/RFCs/M0-template","docId":"concepts/RFCs/M0-template","unlisted":false}],"href":"/docs/concepts/RFCs/"}]}]},"docs":{"concepts/architecture/index":{"id":"concepts/architecture/index","title":"Architecture","description":"Artifacts","sidebar":"docs"},"concepts/comparisons/index":{"id":"concepts/comparisons/index","title":"Comparing Metatype","description":"Metatype foundations takes inspiration from many innovative tools that arose in the last years. We took the best of each of them and combined them into a single engine backed by a convenient computing model.","sidebar":"docs"},"concepts/features-overview/index":{"id":"concepts/features-overview/index","title":"Features overview","description":"We\'re taking any and all kinds of feature requests, suggestions and recommendations. Please direct them kindly to the github ticket or better yet discussion boards. Thank you!","sidebar":"docs"},"concepts/mental-model/index":{"id":"concepts/mental-model/index","title":"Mental model","description":"This page gives a high-level view of Metatype\'s foundations.","sidebar":"docs"},"concepts/RFCs/index":{"id":"concepts/RFCs/index","title":"RFCs","description":"| N\xb0 | Name | Date |","sidebar":"docs"},"concepts/RFCs/M0-template":{"id":"concepts/RFCs/M0-template","title":"M0 - Template","description":"This template is derived from the Rust RFC template and thus is under the same license. Please adapt the following template to your needs and ensure that the RFC is complete before submitting it.","sidebar":"docs"},"guides/contributing":{"id":"guides/contributing","title":"Contribute to Metatype","description":"","sidebar":"docs"},"guides/external-functions/index":{"id":"guides/external-functions/index","title":"Custom functions","description":"Custom functions can be used to run custom code at different points of a typegraph. These constructs fall under functions which are, concretly, operations associated to a specific runtime. For some common tasks, like simple operations on database tables for example, runtime implementations provide function generators to minimize boilerplate. For cases not expressible by generators, runtimes like the DenoRuntime allow us to write more powerful custom functions.","sidebar":"docs"},"guides/files-upload/index":{"id":"guides/files-upload/index","title":"Upload files to cloud storage","description":"We can then use this typegraph from our client code like so:","sidebar":"docs"},"guides/import-external-modules/index":{"id":"guides/import-external-modules/index","title":"Importing External Modules","description":"So far, the functinos we\'ve looked at have been generated by helpers like the CRUD helpers from the Prisma runtime or the the Random runtime\'s generate helper. The deno.policy function we used for authoring policies was also based on function objects. All these helpers are shorthands for creating function objects and now we\'ll look at how to roll a custom function ourselves. We\'ll be using the Deno runtime to run our code.","sidebar":"docs"},"guides/programmatic-deployment/index":{"id":"guides/programmatic-deployment/index","title":"Programmatic deployment","description":"The SDKs are complete enough to enable deploying typegraphs without using meta cli, the later being built as a convenience tool for everyday use.","sidebar":"docs"},"guides/rest/index":{"id":"guides/rest/index","title":"Write REST endpoints","description":"The root functions, the ones we expose from our typegraphs, are served through a GraphQl API over HTTP.","sidebar":"docs"},"guides/securing-requests/index":{"id":"guides/securing-requests/index","title":"Secure your requests","description":"Authentication","sidebar":"docs"},"guides/self-hosting":{"id":"guides/self-hosting","title":"Self-host the Typegate","description":"Helm","sidebar":"docs"},"guides/test-your-typegraph/index":{"id":"guides/test-your-typegraph/index","title":"Test typegraphs","description":"Typegraph is the SDK for Metatype, used to author and define applications..","sidebar":"docs"},"guides/wasm-functions/index":{"id":"guides/wasm-functions/index","title":"Wasm functions","description":"The following feature is not yet stable.","sidebar":"docs"},"index":{"id":"index","title":"Getting started","description":"Start building with the tutorials","sidebar":"docs"},"reference/changelog":{"id":"reference/changelog","title":"Changelog","description":"","sidebar":"docs"},"reference/ecosystem/index":{"id":"reference/ecosystem/index","title":"Ecosystem","description":"Metatype","sidebar":"docs"},"reference/meta-cli/available-commands":{"id":"reference/meta-cli/available-commands","title":"Available commands","description":"Managing typegraphs","sidebar":"docs"},"reference/meta-cli/configuration-file":{"id":"reference/meta-cli/configuration-file","title":"Configuration file","description":"metatype.yml Example file","sidebar":"docs"},"reference/meta-cli/embedded-typegate/index":{"id":"reference/meta-cli/embedded-typegate/index","title":"Embedded Typegate","description":"","sidebar":"docs"},"reference/meta-cli/index":{"id":"reference/meta-cli/index","title":"Meta CLI","description":"Meta-cli version","sidebar":"docs"},"reference/metagen/index":{"id":"reference/metagen/index","title":"Metagen","description":"The following feature is not yet stable.","sidebar":"docs"},"reference/policies/index":{"id":"reference/policies/index","title":"Policies","description":"Typegraphs allow you to specify granular access control when exposing your functions. This can be done at the function or the type field level. This section also makes use of toy typegraph for the sake of clarity.","sidebar":"docs"},"reference/rest/index":{"id":"reference/rest/index","title":"REST","description":"Metatype also allows you to consume your API in the same way you would consume regular REST APIs. It is as easy as calling a function: g.rest(..).","sidebar":"docs"},"reference/runtimes/deno/index":{"id":"reference/runtimes/deno/index","title":"Deno/typescript","description":"Deno runtime","sidebar":"docs"},"reference/runtimes/graphql/index":{"id":"reference/runtimes/graphql/index","title":"GraphQL","description":"GraphQL runtime","sidebar":"docs"},"reference/runtimes/grpc/index":{"id":"reference/runtimes/grpc/index","title":"gRPC Runtime","description":"Overview","sidebar":"docs"},"reference/runtimes/http/index":{"id":"reference/runtimes/http/index","title":"HTTP/REST","description":"HTTP Runtime","sidebar":"docs"},"reference/runtimes/index":{"id":"reference/runtimes/index","title":"Runtimes","description":"Specialized runtimes","sidebar":"docs"},"reference/runtimes/kv/index":{"id":"reference/runtimes/kv/index","title":"Kv","description":"Kv Runtime","sidebar":"docs"},"reference/runtimes/prisma/index":{"id":"reference/runtimes/prisma/index","title":"Prisma","description":"Prisma is a database ORM runtime that enables to query many different databases. It enables to create, read, update and delete data with a developer-friendly API. This runtime is included within the typegate and is compatible with the following databases:","sidebar":"docs"},"reference/runtimes/python/index":{"id":"reference/runtimes/python/index","title":"Python","description":"Python Runtime","sidebar":"docs"},"reference/runtimes/random/index":{"id":"reference/runtimes/random/index","title":"Random","description":"Random runtime","sidebar":"docs"},"reference/runtimes/s3/index":{"id":"reference/runtimes/s3/index","title":"S3","description":"S3 runtime","sidebar":"docs"},"reference/runtimes/substantial/index":{"id":"reference/runtimes/substantial/index","title":"Substantial","description":"Substantial runtime","sidebar":"docs"},"reference/runtimes/temporal/index":{"id":"reference/runtimes/temporal/index","title":"Temporal","description":"Temporal runtime","sidebar":"docs"},"reference/runtimes/wasm/index":{"id":"reference/runtimes/wasm/index","title":"Wasm","description":"Wasm runtime","sidebar":"docs"},"reference/typegate/authentication/index":{"id":"reference/typegate/authentication/index","title":"Authentication","description":"Authentication enable the typegate to identify the user making the request and share some contextual data (called later \\"context\\" or \\"claims\\"). This data can then be used by policies or injected into various fields. Authenticated requests must use the Authorization header to provide a token in one of the following format.","sidebar":"docs"},"reference/typegate/cors/index":{"id":"reference/typegate/cors/index","title":"CORS","description":"","sidebar":"docs"},"reference/typegate/index":{"id":"reference/typegate/index","title":"Typegate","description":"Typegate version","sidebar":"docs"},"reference/typegate/rate-limiting/index":{"id":"reference/typegate/rate-limiting/index","title":"Rate limiting","description":"The rate limiting algorithm works as follows:","sidebar":"docs"},"reference/typegate/synchronization/index":{"id":"reference/typegate/synchronization/index","title":"Synchronization","description":"The typegate run in either on of the following modes:","sidebar":"docs"},"reference/typegraph/index":{"id":"reference/typegraph/index","title":"Typegraph","description":"Typegraphs are the main building blocks when writing some code using Metatype. They define the unit of development/deployment and expose under a define name a set of types and their relationships.","sidebar":"docs"},"reference/types/comparison":{"id":"reference/types/comparison","title":"Type comparison","description":"A type A is called a subtype of a type B if any valid value for A is a valid value for B.","sidebar":"docs"},"reference/types/functions":{"id":"reference/types/functions","title":"Functions","description":"Function objects describe a piece of logic that is to be run on a certain runtime.","sidebar":"docs"},"reference/types/index":{"id":"reference/types/index","title":"Types","description":"Overview","sidebar":"docs"},"reference/types/injections":{"id":"reference/types/injections","title":"Injections","description":"Injection is a mechanism to get the value of a parameter from other sources than the graphql query. When a parameter is injected, no value is expected in the query, otherwise, the query will fail. They are specified at the type level for input types that are direct children of a t.struct.","sidebar":"docs"},"reference/types/parameter-transformations":{"id":"reference/types/parameter-transformations","title":"Parameter Transformations","description":"might consider using parameter transformations if:","sidebar":"docs"},"tutorials/metatype-basics/index":{"id":"tutorials/metatype-basics/index","title":"Metatype Basics","description":"This page will walk you through a real world API with data storage and authorization.","sidebar":"docs"},"tutorials/quick-start/index":{"id":"tutorials/quick-start/index","title":"Quick-start","description":"This page will show you how to install the different components used by Metatype. It will also go over a simple application to get you started.","sidebar":"docs"}}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/878e8ee7.73ae282f.js b/assets/js/878e8ee7.73ae282f.js
deleted file mode 100644
index 39851d75df..0000000000
--- a/assets/js/878e8ee7.73ae282f.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6800],{49362:e=>{e.exports=JSON.parse('{"version":{"pluginId":"docs","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"link","label":"Getting started","href":"/docs/","docId":"index","unlisted":false},{"type":"category","label":"Tutorials","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Quick-start","href":"/docs/tutorials/quick-start/","docId":"tutorials/quick-start/index","unlisted":false},{"type":"link","label":"Metatype Basics","href":"/docs/tutorials/metatype-basics/","docId":"tutorials/metatype-basics/index","unlisted":false}]},{"type":"category","label":"How-to guides","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Custom functions","href":"/docs/guides/external-functions/","docId":"guides/external-functions/index","unlisted":false},{"type":"link","label":"Upload files to cloud storage","href":"/docs/guides/files-upload/","docId":"guides/files-upload/index","unlisted":false},{"type":"link","label":"Write REST endpoints","href":"/docs/guides/rest/","docId":"guides/rest/index","unlisted":false},{"type":"link","label":"Secure your requests","href":"/docs/guides/securing-requests/","docId":"guides/securing-requests/index","unlisted":false},{"type":"link","label":"Wasm functions","href":"/docs/guides/wasm-functions/","docId":"guides/wasm-functions/index","unlisted":false},{"type":"link","label":"Self-host the Typegate","href":"/docs/guides/self-hosting","docId":"guides/self-hosting","unlisted":false},{"type":"link","label":"Contribute to Metatype","href":"/docs/guides/contributing","docId":"guides/contributing","unlisted":false},{"type":"link","label":"Importing External Modules","href":"/docs/guides/import-external-modules/","docId":"guides/import-external-modules/index","unlisted":false},{"type":"link","label":"Programmatic deployment","href":"/docs/guides/programmatic-deployment/","docId":"guides/programmatic-deployment/index","unlisted":false},{"type":"link","label":"Test typegraphs","href":"/docs/guides/test-your-typegraph/","docId":"guides/test-your-typegraph/index","unlisted":false}]},{"type":"category","label":"Reference","collapsible":true,"collapsed":false,"items":[{"type":"category","label":"Types","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Type comparison","href":"/docs/reference/types/comparison","docId":"reference/types/comparison","unlisted":false},{"type":"link","label":"Functions","href":"/docs/reference/types/functions","docId":"reference/types/functions","unlisted":false},{"type":"link","label":"Injections","href":"/docs/reference/types/injections","docId":"reference/types/injections","unlisted":false},{"type":"link","label":"Parameter Transformations","href":"/docs/reference/types/parameter-transformations","docId":"reference/types/parameter-transformations","unlisted":false}],"href":"/docs/reference/types/"},{"type":"category","label":"Runtimes","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Deno/typescript","href":"/docs/reference/runtimes/deno/","docId":"reference/runtimes/deno/index","unlisted":false},{"type":"link","label":"GraphQL","href":"/docs/reference/runtimes/graphql/","docId":"reference/runtimes/graphql/index","unlisted":false},{"type":"link","label":"gRPC Runtime","href":"/docs/reference/runtimes/grpc/","docId":"reference/runtimes/grpc/index","unlisted":false},{"type":"link","label":"HTTP/REST","href":"/docs/reference/runtimes/http/","docId":"reference/runtimes/http/index","unlisted":false},{"type":"link","label":"Kv","href":"/docs/reference/runtimes/kv/","docId":"reference/runtimes/kv/index","unlisted":false},{"type":"link","label":"Prisma","href":"/docs/reference/runtimes/prisma/","docId":"reference/runtimes/prisma/index","unlisted":false},{"type":"link","label":"Python","href":"/docs/reference/runtimes/python/","docId":"reference/runtimes/python/index","unlisted":false},{"type":"link","label":"Random","href":"/docs/reference/runtimes/random/","docId":"reference/runtimes/random/index","unlisted":false},{"type":"link","label":"S3","href":"/docs/reference/runtimes/s3/","docId":"reference/runtimes/s3/index","unlisted":false},{"type":"link","label":"Temporal","href":"/docs/reference/runtimes/temporal/","docId":"reference/runtimes/temporal/index","unlisted":false},{"type":"link","label":"Wasm","href":"/docs/reference/runtimes/wasm/","docId":"reference/runtimes/wasm/index","unlisted":false}],"href":"/docs/reference/runtimes/"},{"type":"link","label":"Policies","href":"/docs/reference/policies/","docId":"reference/policies/index","unlisted":false},{"type":"link","label":"Ecosystem","href":"/docs/reference/ecosystem/","docId":"reference/ecosystem/index","unlisted":false},{"type":"link","label":"REST","href":"/docs/reference/rest/","docId":"reference/rest/index","unlisted":false},{"type":"link","label":"Typegraph","href":"/docs/reference/typegraph/","docId":"reference/typegraph/index","unlisted":false},{"type":"category","label":"Typegate","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Authentication","href":"/docs/reference/typegate/authentication/","docId":"reference/typegate/authentication/index","unlisted":false},{"type":"link","label":"CORS","href":"/docs/reference/typegate/cors/","docId":"reference/typegate/cors/index","unlisted":false},{"type":"link","label":"Rate limiting","href":"/docs/reference/typegate/rate-limiting/","docId":"reference/typegate/rate-limiting/index","unlisted":false},{"type":"link","label":"Synchronization","href":"/docs/reference/typegate/synchronization/","docId":"reference/typegate/synchronization/index","unlisted":false}],"href":"/docs/reference/typegate/"},{"type":"category","label":"Meta CLI","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Available commands","href":"/docs/reference/meta-cli/available-commands","docId":"reference/meta-cli/available-commands","unlisted":false},{"type":"link","label":"Configuration file","href":"/docs/reference/meta-cli/configuration-file","docId":"reference/meta-cli/configuration-file","unlisted":false},{"type":"link","label":"Embedded Typegate","href":"/docs/reference/meta-cli/embedded-typegate/","docId":"reference/meta-cli/embedded-typegate/index","unlisted":false}],"href":"/docs/reference/meta-cli/"},{"type":"link","label":"Metagen","href":"/docs/reference/metagen/","docId":"reference/metagen/index","unlisted":false},{"type":"link","label":"Changelog","href":"/docs/reference/changelog","docId":"reference/changelog","unlisted":false}]},{"type":"category","label":"Concepts","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Features overview","href":"/docs/concepts/features-overview/","docId":"concepts/features-overview/index","unlisted":false},{"type":"link","label":"Mental model","href":"/docs/concepts/mental-model/","docId":"concepts/mental-model/index","unlisted":false},{"type":"link","label":"Architecture","href":"/docs/concepts/architecture/","docId":"concepts/architecture/index","unlisted":false},{"type":"link","label":"Comparing Metatype","href":"/docs/concepts/comparisons/","docId":"concepts/comparisons/index","unlisted":false},{"type":"category","label":"RFCs","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"M0 - Template","href":"/docs/concepts/RFCs/M0-template","docId":"concepts/RFCs/M0-template","unlisted":false}],"href":"/docs/concepts/RFCs/"}]}]},"docs":{"concepts/architecture/index":{"id":"concepts/architecture/index","title":"Architecture","description":"Artifacts","sidebar":"docs"},"concepts/comparisons/index":{"id":"concepts/comparisons/index","title":"Comparing Metatype","description":"Metatype foundations takes inspiration from many innovative tools that arose in the last years. We took the best of each of them and combined them into a single engine backed by a convenient computing model.","sidebar":"docs"},"concepts/features-overview/index":{"id":"concepts/features-overview/index","title":"Features overview","description":"We\'re taking any and all kinds of feature requests, suggestions and recommendations. Please direct them kindly to the github ticket or better yet discussion boards. Thank you!","sidebar":"docs"},"concepts/mental-model/index":{"id":"concepts/mental-model/index","title":"Mental model","description":"This page gives a high-level view of Metatype\'s foundations.","sidebar":"docs"},"concepts/RFCs/index":{"id":"concepts/RFCs/index","title":"RFCs","description":"| N\xb0 | Name | Date |","sidebar":"docs"},"concepts/RFCs/M0-template":{"id":"concepts/RFCs/M0-template","title":"M0 - Template","description":"This template is derived from the Rust RFC template and thus is under the same license. Please adapt the following template to your needs and ensure that the RFC is complete before submitting it.","sidebar":"docs"},"guides/contributing":{"id":"guides/contributing","title":"Contribute to Metatype","description":"","sidebar":"docs"},"guides/external-functions/index":{"id":"guides/external-functions/index","title":"Custom functions","description":"Custom functions can be used to run custom code at different points of a typegraph. These constructs fall under functions which are, concretly, operations associated to a specific runtime. For some common tasks, like simple operations on database tables for example, runtime implementations provide function generators to minimize boilerplate. For cases not expressible by generators, runtimes like the DenoRuntime allow us to write more powerful custom functions.","sidebar":"docs"},"guides/files-upload/index":{"id":"guides/files-upload/index","title":"Upload files to cloud storage","description":"We can then use this typegraph from our client code like so:","sidebar":"docs"},"guides/import-external-modules/index":{"id":"guides/import-external-modules/index","title":"Importing External Modules","description":"So far, the functinos we\'ve looked at have been generated by helpers like the CRUD helpers from the Prisma runtime or the the Random runtime\'s generate helper. The deno.policy function we used for authoring policies was also based on function objects. All these helpers are shorthands for creating function objects and now we\'ll look at how to roll a custom function ourselves. We\'ll be using the Deno runtime to run our code.","sidebar":"docs"},"guides/programmatic-deployment/index":{"id":"guides/programmatic-deployment/index","title":"Programmatic deployment","description":"The SDKs are complete enough to enable deploying typegraphs without using meta cli, the later being built as a convenience tool for everyday use.","sidebar":"docs"},"guides/rest/index":{"id":"guides/rest/index","title":"Write REST endpoints","description":"The root functions, the ones we expose from our typegraphs, are served through a GraphQl API over HTTP.","sidebar":"docs"},"guides/securing-requests/index":{"id":"guides/securing-requests/index","title":"Secure your requests","description":"Authentication","sidebar":"docs"},"guides/self-hosting":{"id":"guides/self-hosting","title":"Self-host the Typegate","description":"Helm","sidebar":"docs"},"guides/test-your-typegraph/index":{"id":"guides/test-your-typegraph/index","title":"Test typegraphs","description":"Typegraph is the SDK for Metatype, used to author and define applications..","sidebar":"docs"},"guides/wasm-functions/index":{"id":"guides/wasm-functions/index","title":"Wasm functions","description":"The following feature is not yet stable.","sidebar":"docs"},"index":{"id":"index","title":"Getting started","description":"Start building with the tutorials","sidebar":"docs"},"reference/changelog":{"id":"reference/changelog","title":"Changelog","description":"","sidebar":"docs"},"reference/ecosystem/index":{"id":"reference/ecosystem/index","title":"Ecosystem","description":"Metatype","sidebar":"docs"},"reference/meta-cli/available-commands":{"id":"reference/meta-cli/available-commands","title":"Available commands","description":"Managing typegraphs","sidebar":"docs"},"reference/meta-cli/configuration-file":{"id":"reference/meta-cli/configuration-file","title":"Configuration file","description":"metatype.yml Example file","sidebar":"docs"},"reference/meta-cli/embedded-typegate/index":{"id":"reference/meta-cli/embedded-typegate/index","title":"Embedded Typegate","description":"","sidebar":"docs"},"reference/meta-cli/index":{"id":"reference/meta-cli/index","title":"Meta CLI","description":"Meta-cli version","sidebar":"docs"},"reference/metagen/index":{"id":"reference/metagen/index","title":"Metagen","description":"The following feature is not yet stable.","sidebar":"docs"},"reference/policies/index":{"id":"reference/policies/index","title":"Policies","description":"Typegraphs allow you to specify granular access control when exposing your functions. This can be done at the function or the type field level. This section also makes use of toy typegraph for the sake of clarity.","sidebar":"docs"},"reference/rest/index":{"id":"reference/rest/index","title":"REST","description":"Metatype also allows you to consume your API in the same way you would consume regular REST APIs. It is as easy as calling a function: g.rest(..).","sidebar":"docs"},"reference/runtimes/deno/index":{"id":"reference/runtimes/deno/index","title":"Deno/typescript","description":"Deno runtime","sidebar":"docs"},"reference/runtimes/graphql/index":{"id":"reference/runtimes/graphql/index","title":"GraphQL","description":"GraphQL runtime","sidebar":"docs"},"reference/runtimes/grpc/index":{"id":"reference/runtimes/grpc/index","title":"gRPC Runtime","description":"Overview","sidebar":"docs"},"reference/runtimes/http/index":{"id":"reference/runtimes/http/index","title":"HTTP/REST","description":"HTTP Runtime","sidebar":"docs"},"reference/runtimes/index":{"id":"reference/runtimes/index","title":"Runtimes","description":"Specialized runtimes","sidebar":"docs"},"reference/runtimes/kv/index":{"id":"reference/runtimes/kv/index","title":"Kv","description":"Kv Runtime","sidebar":"docs"},"reference/runtimes/prisma/index":{"id":"reference/runtimes/prisma/index","title":"Prisma","description":"Prisma is a database ORM runtime that enables to query many different databases. It enables to create, read, update and delete data with a developer-friendly API. This runtime is included within the typegate and is compatible with the following databases:","sidebar":"docs"},"reference/runtimes/python/index":{"id":"reference/runtimes/python/index","title":"Python","description":"Python Runtime","sidebar":"docs"},"reference/runtimes/random/index":{"id":"reference/runtimes/random/index","title":"Random","description":"Random runtime","sidebar":"docs"},"reference/runtimes/s3/index":{"id":"reference/runtimes/s3/index","title":"S3","description":"S3 runtime","sidebar":"docs"},"reference/runtimes/temporal/index":{"id":"reference/runtimes/temporal/index","title":"Temporal","description":"Temporal runtime","sidebar":"docs"},"reference/runtimes/wasm/index":{"id":"reference/runtimes/wasm/index","title":"Wasm","description":"Wasm runtime","sidebar":"docs"},"reference/typegate/authentication/index":{"id":"reference/typegate/authentication/index","title":"Authentication","description":"Authentication enable the typegate to identify the user making the request and share some contextual data (called later \\"context\\" or \\"claims\\"). This data can then be used by policies or injected into various fields. Authenticated requests must use the Authorization header to provide a token in one of the following format.","sidebar":"docs"},"reference/typegate/cors/index":{"id":"reference/typegate/cors/index","title":"CORS","description":"","sidebar":"docs"},"reference/typegate/index":{"id":"reference/typegate/index","title":"Typegate","description":"Typegate version","sidebar":"docs"},"reference/typegate/rate-limiting/index":{"id":"reference/typegate/rate-limiting/index","title":"Rate limiting","description":"The rate limiting algorithm works as follows:","sidebar":"docs"},"reference/typegate/synchronization/index":{"id":"reference/typegate/synchronization/index","title":"Synchronization","description":"The typegate run in either on of the following modes:","sidebar":"docs"},"reference/typegraph/index":{"id":"reference/typegraph/index","title":"Typegraph","description":"Typegraphs are the main building blocks when writing some code using Metatype. They define the unit of development/deployment and expose under a define name a set of types and their relationships.","sidebar":"docs"},"reference/types/comparison":{"id":"reference/types/comparison","title":"Type comparison","description":"A type A is called a subtype of a type B if any valid value for A is a valid value for B.","sidebar":"docs"},"reference/types/functions":{"id":"reference/types/functions","title":"Functions","description":"Function objects describe a piece of logic that is to be run on a certain runtime.","sidebar":"docs"},"reference/types/index":{"id":"reference/types/index","title":"Types","description":"Overview","sidebar":"docs"},"reference/types/injections":{"id":"reference/types/injections","title":"Injections","description":"Injection is a mechanism to get the value of a parameter from other sources than the graphql query. When a parameter is injected, no value is expected in the query, otherwise, the query will fail. They are specified at the type level for input types that are direct children of a t.struct.","sidebar":"docs"},"reference/types/parameter-transformations":{"id":"reference/types/parameter-transformations","title":"Parameter Transformations","description":"might consider using parameter transformations if:","sidebar":"docs"},"tutorials/metatype-basics/index":{"id":"tutorials/metatype-basics/index","title":"Metatype Basics","description":"This page will walk you through a real world API with data storage and authorization.","sidebar":"docs"},"tutorials/quick-start/index":{"id":"tutorials/quick-start/index","title":"Quick-start","description":"This page will show you how to install the different components used by Metatype. It will also go over a simple application to get you started.","sidebar":"docs"}}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/a4f64869.3c3a0bcf.js b/assets/js/a4f64869.3c3a0bcf.js
new file mode 100644
index 0000000000..fdeea513b9
--- /dev/null
+++ b/assets/js/a4f64869.3c3a0bcf.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1723],{33454:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>c,toc:()=>u});var s=t(86070),i=t(25710),r=t(65480),a=t(27676);const o={},l="Substantial",c={id:"reference/runtimes/substantial/index",title:"Substantial",description:"Substantial runtime",source:"@site/docs/reference/runtimes/substantial/index.mdx",sourceDirName:"reference/runtimes/substantial",slug:"/reference/runtimes/substantial/",permalink:"/docs/reference/runtimes/substantial/",draft:!1,unlisted:!1,editUrl:"https://github.com/metatypedev/metatype/tree/main/docs/metatype.dev/docs/reference/runtimes/substantial/index.mdx",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"S3",permalink:"/docs/reference/runtimes/s3/"},next:{title:"Temporal",permalink:"/docs/reference/runtimes/temporal/"}},d={},u=[{value:"Substantial runtime",id:"substantial-runtime",level:2},{value:"Key Concepts",id:"key-concepts",level:2},{value:"Workflows",id:"workflows",level:3},{value:"Backend",id:"backend",level:3},{value:"Run",id:"run",level:3},{value:"Child workflows",id:"child-workflows",level:2}];function h(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"substantial",children:"Substantial"}),"\n",(0,s.jsx)(n.h2,{id:"substantial-runtime",children:"Substantial runtime"}),"\n",(0,s.jsx)(n.p,{children:"The Substantial runtime enables the execution of durable workflows in one or accross multiple typegates."}),"\n",(0,s.jsx)(n.p,{children:"Why use it?"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:'Long-running "processes"'}),": Durable tasks that need to run over extended periods (days, weeks or months), handling ",(0,s.jsx)(n.strong,{children:"retries"})," and ",(0,s.jsx)(n.strong,{children:"restarts"})," seamlessly."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Fault-tolerant execution"}),": Ensure reliable execution of tasks, even upon failures, by maintaining a durable state of the latest run."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Task orchestration"}),": Coordinate complex sequences of workflows (analogous to microservices interactions)."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["For example, the workflow bellow will continue running until a ",(0,s.jsx)(n.code,{children:"confirmation"})," event is sent to the ",(0,s.jsx)(n.strong,{children:"associated run"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'export async function sendEmail(ctx: Context) {\n // 1. A workflow can receive parameters whose type is defined on the typegraph\n const { to } = ctx.kwargs;\n\n // 2. When a function call produces effects, we can make it durable\n const info = await ctx.save(() => sendSubscriptionEmail(to));\n const timeSent = await ctx.save(() => new Date().toJSON());\n\n const confirmation = ctx.receiveYour Docusaurus site did not load properly.
\nA very common reason is a wrong site baseUrl configuration.
\nCurrent configured baseUrl = ${e} ${"/"===e?" (default value)":""}
\nWe suggest trying baseUrl =
\n.comment
can become .namespace--comment
) or replace them with your defined ones (like .editor__comment
). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll
and highlightAllUnder
methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},46532:(e,t,n)=>{const r=n(39227),o=n(29670),a=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...a,...Object.keys(Prism.languages)];o(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(57507).resolve(t)],delete Prism.languages[e],n(57507)(t),a.add(e)}))}i.silent=!1,e.exports=i},1274:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,s=i.length;-1!==n.code.indexOf(o=t(r,s));)++s;return i[s]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(s){for(var l=0;l{const a=t.toLowerCase(),i=((e,t)=>{const[n,r]=(0,u.useState)(K(t,e)),o=(0,u.useRef)(),a=(0,u.useRef)();return(0,u.useEffect)((()=>{t===o.current&&e===a.current||(o.current=t,a.current=e,r(K(t,e)))}),[e,t]),n})(a,r),s=(e=>(0,u.useCallback)((t=>{var n=t,{className:r,style:o,line:a}=n,i=E(n,["className","style","line"]);const s=C(S({},i),{className:(0,d.A)("token-line",r)});return"object"==typeof e&&"plain"in e&&(s.style=e.plain),"object"==typeof o&&(s.style=S(S({},s.style||{}),o)),s}),[e]))(i),l=(e=>{const t=(0,u.useCallback)((({types:t,empty:n})=>{if(null!=e)return 1===t.length&&"plain"===t[0]?null!=n?{display:"inline-block"}:void 0:1===t.length&&null!=n?e[t[0]]:Object.assign(null!=n?{display:"inline-block"}:{},...t.map((t=>e[t])))}),[e]);return(0,u.useCallback)((e=>{var n=e,{token:r,className:o,style:a}=n,i=E(n,["token","className","style"]);const s=C(S({},i),{className:(0,d.A)("token",...r.types,o),children:r.content,style:t(r)});return null!=a&&(s.style=S(S({},s.style||{}),a)),s}),[t])})(i),c=(({prism:e,code:t,grammar:n,language:r})=>{const o=(0,u.useRef)(e);return(0,u.useMemo)((()=>{if(null==n)return J([t]);const e={code:t,grammar:n,language:r,tokens:[]};return o.current.hooks.run("before-tokenize",e),e.tokens=o.current.tokenize(t,n),o.current.hooks.run("after-tokenize",e),J(e.tokens)}),[t,n,r])})({prism:o,language:a,code:n,grammar:o.languages[a]});return e({tokens:c,className:`prism-code language-${a}`,style:null!=i?i.root:{},getLineProps:s,getTokenProps:l})},ee=e=>(0,u.createElement)(Q,C(S({},e),{prism:e.prism||L,theme:e.theme||q,code:e.code,language:e.language}))},25385:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=!0,o="Invariant failed";function a(e,t){if(!e){if(r)throw new Error(o);var n="function"==typeof t?t():t,a=n?"".concat(o,": ").concat(n):o;throw new Error(a)}}},22654:e=>{"use strict";e.exports={}},84054:e=>{"use strict";e.exports=JSON.parse('{"/blog-b71":{"__comp":"a6aa9e1f","__context":{"plugin":"f1c506b7"},"sidebar":"95b96bb9","items":[{"content":"4f68146b"},{"content":"127f5bd6"},{"content":"9cca6528"},{"content":"5622ed62"},{"content":"068acb3c"},{"content":"da9cdc83"}],"__props":"97787cbd"},"/blog/2023/03/15/emulating-servers-0e6":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"49f06b57"},"plugin":"f1c506b7"},"sidebar":"95b96bb9","content":"80eba989"},"/blog/2023/06/18/programmable-glue-3bd":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"49f06b57"},"plugin":"f1c506b7"},"sidebar":"95b96bb9","content":"9ef5846e"},"/blog/2023/11/27/node-compatibility-b09":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"49f06b57"},"plugin":"f1c506b7"},"sidebar":"95b96bb9","content":"d2f8c7b3"},"/blog/2024/05/09/programmatic-deployment-c79":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"49f06b57"},"plugin":"f1c506b7"},"sidebar":"95b96bb9","content":"ac075c54"},"/blog/2024/08/26/python-on-webassembly-d29":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"49f06b57"},"plugin":"f1c506b7"},"sidebar":"95b96bb9","content":"6c5c337a"},"/blog/2024/08/27/distributed-execution-flow-paradigms-ca6":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"49f06b57"},"plugin":"f1c506b7"},"sidebar":"95b96bb9","content":"6e544dd5"},"/blog/archive-d1d":{"__comp":"9e4087bc","__context":{"plugin":"f1c506b7"},"__props":"b3219b4c"},"/legal/privacy-policy-4fe":{"__comp":"1f391b9e","__context":{"plugin":"a7456010"},"content":"e8113c3c"},"/legal/terms-aed":{"__comp":"1f391b9e","__context":{"plugin":"a7456010"},"content":"dce22fdb"},"/docs-c08":{"__comp":"5e95c892","__context":{"plugin":"4b100ba1"}},"/docs-75e":{"__comp":"a7bd4aaa","__props":"878e8ee7"},"/docs-811":{"__comp":"a94703ab"},"/docs-e81":{"__comp":"17896441","content":"4edc808e"},"/docs/concepts/architecture-5a3":{"__comp":"17896441","content":"9f09fab9"},"/docs/concepts/comparisons-c09":{"__comp":"17896441","content":"10a64d3a"},"/docs/concepts/features-overview-196":{"__comp":"17896441","content":"8cfb3d68"},"/docs/concepts/mental-model-0a9":{"__comp":"17896441","content":"98537bc7"},"/docs/concepts/RFCs-301":{"__comp":"17896441","content":"1d6f08a2"},"/docs/concepts/RFCs/M0-template-c4e":{"__comp":"17896441","content":"2fbc816e"},"/docs/guides/contributing-39f":{"__comp":"17896441","content":"aac7f9f5"},"/docs/guides/external-functions-bde":{"__comp":"17896441","content":"1f54f6f7"},"/docs/guides/files-upload-0b9":{"__comp":"17896441","content":"26137cf5"},"/docs/guides/import-external-modules-495":{"__comp":"17896441","content":"6dc80b66"},"/docs/guides/programmatic-deployment-0b9":{"__comp":"17896441","content":"95183ce9"},"/docs/guides/rest-433":{"__comp":"17896441","content":"a0248338"},"/docs/guides/securing-requests-86e":{"__comp":"17896441","content":"42ecd3be"},"/docs/guides/self-hosting-f2f":{"__comp":"17896441","content":"062e3798"},"/docs/guides/test-your-typegraph-abf":{"__comp":"17896441","content":"fd15d584"},"/docs/guides/wasm-functions-c76":{"__comp":"17896441","content":"e1da19f3"},"/docs/reference/changelog-783":{"__comp":"17896441","content":"a70287ac"},"/docs/reference/ecosystem-343":{"__comp":"17896441","content":"ad20ab3b"},"/docs/reference/meta-cli-b6c":{"__comp":"17896441","content":"4ab57ea6"},"/docs/reference/meta-cli/available-commands-a05":{"__comp":"17896441","content":"295b9a18"},"/docs/reference/meta-cli/configuration-file-549":{"__comp":"17896441","content":"aafba6b7"},"/docs/reference/meta-cli/embedded-typegate-86d":{"__comp":"17896441","content":"eb6f68a0"},"/docs/reference/metagen-293":{"__comp":"17896441","content":"cd86e9b3"},"/docs/reference/policies-113":{"__comp":"17896441","content":"2df24393"},"/docs/reference/rest-870":{"__comp":"17896441","content":"5e023c59"},"/docs/reference/runtimes-86b":{"__comp":"17896441","content":"5360c792"},"/docs/reference/runtimes/deno-7ef":{"__comp":"17896441","content":"474845f3"},"/docs/reference/runtimes/graphql-cfd":{"__comp":"17896441","content":"3f66bcd5"},"/docs/reference/runtimes/grpc-dae":{"__comp":"17896441","content":"c367b882"},"/docs/reference/runtimes/http-d1d":{"__comp":"17896441","content":"3169f45d"},"/docs/reference/runtimes/kv-927":{"__comp":"17896441","content":"05cbd4da"},"/docs/reference/runtimes/prisma-637":{"__comp":"17896441","content":"929c1f2b"},"/docs/reference/runtimes/python-c7a":{"__comp":"17896441","content":"5a33aa61"},"/docs/reference/runtimes/random-a6c":{"__comp":"17896441","content":"e66bdb87"},"/docs/reference/runtimes/s3-5f4":{"__comp":"17896441","content":"18b50fbb"},"/docs/reference/runtimes/substantial-a9d":{"__comp":"17896441","content":"a4f64869"},"/docs/reference/runtimes/temporal-0d3":{"__comp":"17896441","content":"b8f4db82"},"/docs/reference/runtimes/wasm-b3e":{"__comp":"17896441","content":"c02ff0d2"},"/docs/reference/typegate-1fd":{"__comp":"17896441","content":"6f622e55"},"/docs/reference/typegate/authentication-e71":{"__comp":"17896441","content":"0c88aa32"},"/docs/reference/typegate/cors-a93":{"__comp":"17896441","content":"d89a9c00"},"/docs/reference/typegate/rate-limiting-5b3":{"__comp":"17896441","content":"d8f8b671"},"/docs/reference/typegate/synchronization-de4":{"__comp":"17896441","content":"c523e930"},"/docs/reference/typegraph-6d7":{"__comp":"17896441","content":"e3ef7410"},"/docs/reference/types-eb9":{"__comp":"17896441","content":"9d3370bc"},"/docs/reference/types/comparison-67a":{"__comp":"17896441","content":"c2bbfad4"},"/docs/reference/types/functions-ee1":{"__comp":"17896441","content":"c1c441c4"},"/docs/reference/types/injections-5c1":{"__comp":"17896441","content":"efb264ae"},"/docs/reference/types/parameter-transformations-8e5":{"__comp":"17896441","content":"16d8d440"},"/docs/tutorials/metatype-basics-35a":{"__comp":"17896441","content":"ad5e0346"},"/docs/tutorials/quick-start-1ba":{"__comp":"17896441","content":"6c4588a6"},"/use-cases-922":{"__comp":"5e95c892","__context":{"plugin":"32f95329"}},"/use-cases-4f9":{"__comp":"a7bd4aaa","__props":"058898d2"},"/use-cases-e5c":{"__comp":"a94703ab"},"/use-cases/automatic-crud-validation-da8":{"__comp":"17896441","content":"6baad3d0"},"/use-cases/backend-for-frontend-9b1":{"__comp":"17896441","content":"af072c69"},"/use-cases/faas-runner-cfd":{"__comp":"17896441","content":"c843538e"},"/use-cases/graphql-server-68c":{"__comp":"17896441","content":"33e4627d"},"/use-cases/iam-provider-940":{"__comp":"17896441","content":"99c4cb86"},"/use-cases/microservice-orchestration-c6e":{"__comp":"17896441","content":"cda5b2c7"},"/use-cases/orm-for-the-edge-e3f":{"__comp":"17896441","content":"bbc54dbf"},"/use-cases/programmable-api-gateway-a64":{"__comp":"17896441","content":"289ade6e"},"/-e5f":{"__comp":"1df93b7f","__context":{"plugin":"a7456010"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[1869],(()=>{return t=7881,e(e.s=t);var t}));e.O()}]);
\ No newline at end of file
diff --git a/assets/js/main.e46f5def.js.LICENSE.txt b/assets/js/main.917a1c89.js.LICENSE.txt
similarity index 100%
rename from assets/js/main.e46f5def.js.LICENSE.txt
rename to assets/js/main.917a1c89.js.LICENSE.txt
diff --git a/assets/js/main.e46f5def.js b/assets/js/main.e46f5def.js
deleted file mode 100644
index 3cae1f6aee..0000000000
--- a/assets/js/main.e46f5def.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! For license information please see main.e46f5def.js.LICENSE.txt */
-(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8792],{45433:(e,t,n)=>{var r={"./":46532};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=45433},68384:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});n(30758);var r=n(57316),o=n.n(r),a=n(84054);const i={"058898d2":[()=>n.e(8595).then(n.t.bind(n,50568,19)),"@generated/docusaurus-plugin-content-docs/use-cases/p/use-cases-fc6.json",50568],"05cbd4da":[()=>Promise.all([n.e(1869),n.e(2076),n.e(9568)]).then(n.bind(n,17981)),"@site/docs/reference/runtimes/kv/index.mdx",17981],"062e3798":[()=>Promise.all([n.e(2076),n.e(2311)]).then(n.bind(n,66578)),"@site/docs/guides/self-hosting.md",66578],"068acb3c":[()=>Promise.all([n.e(1869),n.e(2076),n.e(8789)]).then(n.bind(n,31281)),"@site/blog/2023-06-18-programmable-glue/index.mdx?truncated=true",31281],"0c88aa32":[()=>Promise.all([n.e(1869),n.e(2076),n.e(1201)]).then(n.bind(n,88079)),"@site/docs/reference/typegate/authentication/index.mdx",88079],"10a64d3a":[()=>Promise.all([n.e(2076),n.e(8977)]).then(n.bind(n,68234)),"@site/docs/concepts/comparisons/index.mdx",68234],"127f5bd6":[()=>Promise.all([n.e(2076),n.e(3610)]).then(n.bind(n,13543)),"@site/blog/2024-08-26-python-on-webassembly/index.mdx?truncated=true",13543],"16d8d440":[()=>Promise.all([n.e(1869),n.e(2076),n.e(7330)]).then(n.bind(n,90079)),"@site/docs/reference/types/parameter-transformations.mdx",90079],17896441:[()=>Promise.all([n.e(1869),n.e(2076),n.e(4145),n.e(8401)]).then(n.bind(n,75936)),"@theme/DocItem",75936],"18b50fbb":[()=>Promise.all([n.e(1869),n.e(2076),n.e(7401)]).then(n.bind(n,42684)),"@site/docs/reference/runtimes/s3/index.mdx",42684],"1d6f08a2":[()=>Promise.all([n.e(2076),n.e(8461)]).then(n.bind(n,95370)),"@site/docs/concepts/RFCs/index.mdx",95370],"1df93b7f":[()=>Promise.all([n.e(1869),n.e(2076),n.e(8271),n.e(4583)]).then(n.bind(n,26175)),"@site/src/pages/index.tsx",26175],"1f391b9e":[()=>Promise.all([n.e(1869),n.e(2076),n.e(4145),n.e(6061)]).then(n.bind(n,43685)),"@theme/MDXPage",43685],"1f54f6f7":[()=>Promise.all([n.e(1869),n.e(2076),n.e(4404)]).then(n.bind(n,43053)),"@site/docs/guides/external-functions/index.mdx",43053],"26137cf5":[()=>Promise.all([n.e(1869),n.e(2076),n.e(7050)]).then(n.bind(n,52897)),"@site/docs/guides/files-upload/index.mdx",52897],"289ade6e":[()=>Promise.all([n.e(1869),n.e(2076),n.e(7525)]).then(n.bind(n,92809)),"@site/use-cases/programmable-api-gateway/index.mdx",92809],"295b9a18":[()=>Promise.all([n.e(2076),n.e(3052)]).then(n.bind(n,18668)),"@site/docs/reference/meta-cli/available-commands.mdx",18668],"2df24393":[()=>Promise.all([n.e(1869),n.e(2076),n.e(8598)]).then(n.bind(n,77162)),"@site/docs/reference/policies/index.mdx",77162],"2fbc816e":[()=>Promise.all([n.e(2076),n.e(3680)]).then(n.bind(n,31940)),"@site/docs/concepts/RFCs/M0-template.mdx",31940],"3169f45d":[()=>Promise.all([n.e(1869),n.e(2076),n.e(3597)]).then(n.bind(n,16678)),"@site/docs/reference/runtimes/http/index.mdx",16678],"32f95329":[()=>n.e(7956).then(n.t.bind(n,93279,19)),"@generated/docusaurus-plugin-content-docs/use-cases/__plugin.json",93279],"33e4627d":[()=>Promise.all([n.e(1869),n.e(2076),n.e(2731)]).then(n.bind(n,62719)),"@site/use-cases/graphql-server/index.mdx",62719],"3f66bcd5":[()=>Promise.all([n.e(1869),n.e(2076),n.e(7868)]).then(n.bind(n,34801)),"@site/docs/reference/runtimes/graphql/index.mdx",34801],"42ecd3be":[()=>Promise.all([n.e(1869),n.e(2076),n.e(2829)]).then(n.bind(n,23233)),"@site/docs/guides/securing-requests/index.mdx",23233],"474845f3":[()=>Promise.all([n.e(1869),n.e(2076),n.e(5364)]).then(n.bind(n,16086)),"@site/docs/reference/runtimes/deno/index.mdx",16086],"49f06b57":[()=>n.e(912).then(n.t.bind(n,82028,19)),"~blog/blog/blogMetadata-blog.json",82028],"4ab57ea6":[()=>Promise.all([n.e(1869),n.e(2076),n.e(96)]).then(n.bind(n,88570)),"@site/docs/reference/meta-cli/index.mdx",88570],"4b100ba1":[()=>n.e(6838).then(n.t.bind(n,54415,19)),"@generated/docusaurus-plugin-content-docs/docs/__plugin.json",54415],"4edc808e":[()=>Promise.all([n.e(1869),n.e(2076),n.e(308)]).then(n.bind(n,39223)),"@site/docs/index.mdx",39223],"4f68146b":[()=>Promise.all([n.e(1869),n.e(2076),n.e(1732)]).then(n.bind(n,53919)),"@site/blog/2024-08-27-distributed-execution-flow-paradigms/index.mdx?truncated=true",53919],"5360c792":[()=>Promise.all([n.e(2076),n.e(986)]).then(n.bind(n,73519)),"@site/docs/reference/runtimes/index.mdx",73519],"5622ed62":[()=>Promise.all([n.e(2076),n.e(7417)]).then(n.bind(n,36037)),"@site/blog/2023-11-27-node-compatibility/index.mdx?truncated=true",36037],"5a33aa61":[()=>Promise.all([n.e(2076),n.e(4902)]).then(n.bind(n,99848)),"@site/docs/reference/runtimes/python/index.mdx",99848],"5e023c59":[()=>Promise.all([n.e(1869),n.e(2076),n.e(2091)]).then(n.bind(n,2738)),"@site/docs/reference/rest/index.mdx",2738],"5e95c892":[()=>n.e(9647).then(n.bind(n,77704)),"@theme/DocsRoot",77704],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"6baad3d0":[()=>Promise.all([n.e(1869),n.e(2076),n.e(7010)]).then(n.bind(n,51092)),"@site/use-cases/automatic-crud-validation/index.mdx",51092],"6c4588a6":[()=>Promise.all([n.e(1869),n.e(2076),n.e(6686)]).then(n.bind(n,49447)),"@site/docs/tutorials/quick-start/index.mdx",49447],"6c5c337a":[()=>Promise.all([n.e(2076),n.e(2280)]).then(n.bind(n,2597)),"@site/blog/2024-08-26-python-on-webassembly/index.mdx",2597],"6dc80b66":[()=>Promise.all([n.e(1869),n.e(2076),n.e(6650)]).then(n.bind(n,87409)),"@site/docs/guides/import-external-modules/index.mdx",87409],"6e544dd5":[()=>Promise.all([n.e(1869),n.e(2076),n.e(3126)]).then(n.bind(n,2845)),"@site/blog/2024-08-27-distributed-execution-flow-paradigms/index.mdx",2845],"6f622e55":[()=>Promise.all([n.e(2076),n.e(2606)]).then(n.bind(n,36233)),"@site/docs/reference/typegate/index.mdx",36233],"80eba989":[()=>Promise.all([n.e(1869),n.e(2076),n.e(6101)]).then(n.bind(n,21153)),"@site/blog/2023-03-15-emulating-servers/index.mdx",21153],"878e8ee7":[()=>n.e(6800).then(n.t.bind(n,49362,19)),"@generated/docusaurus-plugin-content-docs/docs/p/docs-175.json",49362],"8cfb3d68":[()=>Promise.all([n.e(1869),n.e(2076),n.e(3599)]).then(n.bind(n,37214)),"@site/docs/concepts/features-overview/index.mdx",37214],"929c1f2b":[()=>Promise.all([n.e(1869),n.e(2076),n.e(619)]).then(n.bind(n,68642)),"@site/docs/reference/runtimes/prisma/index.mdx",68642],"95183ce9":[()=>Promise.all([n.e(1869),n.e(2076),n.e(6574)]).then(n.bind(n,28350)),"@site/docs/guides/programmatic-deployment/index.mdx",28350],"95b96bb9":[()=>n.e(6405).then(n.t.bind(n,7057,19)),"~blog/blog/blog-post-list-prop-blog.json",7057],"97787cbd":[()=>n.e(1922).then(n.t.bind(n,63961,19)),"@generated/docusaurus-plugin-content-blog/blog/p/blog-bd9.json",63961],"98537bc7":[()=>Promise.all([n.e(1869),n.e(2076),n.e(4877)]).then(n.bind(n,77031)),"@site/docs/concepts/mental-model/index.mdx",77031],"99c4cb86":[()=>Promise.all([n.e(1869),n.e(2076),n.e(8237)]).then(n.bind(n,68305)),"@site/use-cases/iam-provider/index.mdx",68305],"9cca6528":[()=>Promise.all([n.e(1869),n.e(2076),n.e(8102)]).then(n.bind(n,67076)),"@site/blog/2024-05-09-programmatic-deployment/index.mdx?truncated=true",67076],"9d3370bc":[()=>Promise.all([n.e(1869),n.e(2076),n.e(9594)]).then(n.bind(n,49079)),"@site/docs/reference/types/index.mdx",49079],"9e4087bc":[()=>n.e(2711).then(n.bind(n,95028)),"@theme/BlogArchivePage",95028],"9ef5846e":[()=>Promise.all([n.e(1869),n.e(2076),n.e(8097)]).then(n.bind(n,39615)),"@site/blog/2023-06-18-programmable-glue/index.mdx",39615],"9f09fab9":[()=>Promise.all([n.e(2076),n.e(9835)]).then(n.bind(n,99481)),"@site/docs/concepts/architecture/index.mdx",99481],a0248338:[()=>Promise.all([n.e(1869),n.e(2076),n.e(5028)]).then(n.bind(n,3894)),"@site/docs/guides/rest/index.mdx",3894],a6aa9e1f:[()=>Promise.all([n.e(1869),n.e(2076),n.e(4145),n.e(8860),n.e(7643)]).then(n.bind(n,42938)),"@theme/BlogListPage",42938],a70287ac:[()=>Promise.all([n.e(2076),n.e(2058)]).then(n.bind(n,77487)),"@site/docs/reference/changelog.mdx",77487],a7456010:[()=>n.e(1235).then(n.t.bind(n,88552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",88552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,35861)),"@theme/DocVersionRoot",35861],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,7173)),"@theme/DocRoot",7173],aac7f9f5:[()=>Promise.all([n.e(2076),n.e(1995)]).then(n.bind(n,94508)),"@site/docs/guides/contributing.mdx",94508],aafba6b7:[()=>Promise.all([n.e(2076),n.e(681)]).then(n.bind(n,42321)),"@site/docs/reference/meta-cli/configuration-file.mdx",42321],ac075c54:[()=>Promise.all([n.e(1869),n.e(2076),n.e(3855)]).then(n.bind(n,12728)),"@site/blog/2024-05-09-programmatic-deployment/index.mdx",12728],ad20ab3b:[()=>Promise.all([n.e(2076),n.e(3916)]).then(n.bind(n,11040)),"@site/docs/reference/ecosystem/index.mdx",11040],ad5e0346:[()=>Promise.all([n.e(1869),n.e(2076),n.e(11)]).then(n.bind(n,95459)),"@site/docs/tutorials/metatype-basics/index.mdx",95459],af072c69:[()=>Promise.all([n.e(1869),n.e(2076),n.e(4039)]).then(n.bind(n,31285)),"@site/use-cases/backend-for-frontend/index.mdx",31285],b3219b4c:[()=>n.e(3099).then(n.t.bind(n,83890,19)),"@generated/docusaurus-plugin-content-blog/blog/p/blog-archive-f05.json",83890],b8f4db82:[()=>Promise.all([n.e(1869),n.e(2076),n.e(4619)]).then(n.bind(n,96996)),"@site/docs/reference/runtimes/temporal/index.mdx",96996],bbc54dbf:[()=>Promise.all([n.e(1869),n.e(2076),n.e(2427)]).then(n.bind(n,10148)),"@site/use-cases/orm-for-the-edge/index.mdx",10148],c02ff0d2:[()=>Promise.all([n.e(1869),n.e(2076),n.e(5190)]).then(n.bind(n,78294)),"@site/docs/reference/runtimes/wasm/index.mdx",78294],c1c441c4:[()=>Promise.all([n.e(2076),n.e(8958)]).then(n.bind(n,12)),"@site/docs/reference/types/functions.mdx",12],c2bbfad4:[()=>Promise.all([n.e(2076),n.e(8103)]).then(n.bind(n,29836)),"@site/docs/reference/types/comparison.mdx",29836],c367b882:[()=>Promise.all([n.e(1869),n.e(2076),n.e(7100)]).then(n.bind(n,66922)),"@site/docs/reference/runtimes/grpc/index.mdx",66922],c523e930:[()=>Promise.all([n.e(2076),n.e(6941)]).then(n.bind(n,88156)),"@site/docs/reference/typegate/synchronization/index.mdx",88156],c843538e:[()=>Promise.all([n.e(1869),n.e(2076),n.e(2384)]).then(n.bind(n,15404)),"@site/use-cases/faas-runner/index.mdx",15404],ccc49370:[()=>Promise.all([n.e(1869),n.e(2076),n.e(4145),n.e(8860),n.e(3249)]).then(n.bind(n,57440)),"@theme/BlogPostPage",57440],cd86e9b3:[()=>Promise.all([n.e(1869),n.e(2076),n.e(4947)]).then(n.bind(n,98143)),"@site/docs/reference/metagen/index.mdx",98143],cda5b2c7:[()=>Promise.all([n.e(1869),n.e(2076),n.e(9742)]).then(n.bind(n,75431)),"@site/use-cases/microservice-orchestration/index.mdx",75431],d2f8c7b3:[()=>Promise.all([n.e(2076),n.e(5140)]).then(n.bind(n,95411)),"@site/blog/2023-11-27-node-compatibility/index.mdx",95411],d89a9c00:[()=>Promise.all([n.e(1869),n.e(2076),n.e(5253)]).then(n.bind(n,24331)),"@site/docs/reference/typegate/cors/index.mdx",24331],d8f8b671:[()=>Promise.all([n.e(1869),n.e(2076),n.e(8349)]).then(n.bind(n,37860)),"@site/docs/reference/typegate/rate-limiting/index.mdx",37860],da9cdc83:[()=>Promise.all([n.e(1869),n.e(2076),n.e(2378)]).then(n.bind(n,18224)),"@site/blog/2023-03-15-emulating-servers/index.mdx?truncated=true",18224],dce22fdb:[()=>Promise.all([n.e(2076),n.e(8343)]).then(n.bind(n,90707)),"@site/src/pages/legal/terms.md",90707],e1da19f3:[()=>Promise.all([n.e(1869),n.e(2076),n.e(4191)]).then(n.bind(n,48372)),"@site/docs/guides/wasm-functions/index.mdx",48372],e3ef7410:[()=>Promise.all([n.e(1869),n.e(2076),n.e(9164)]).then(n.bind(n,22004)),"@site/docs/reference/typegraph/index.mdx",22004],e66bdb87:[()=>Promise.all([n.e(1869),n.e(2076),n.e(4591)]).then(n.bind(n,4391)),"@site/docs/reference/runtimes/random/index.mdx",4391],e8113c3c:[()=>Promise.all([n.e(2076),n.e(2254)]).then(n.bind(n,46127)),"@site/src/pages/legal/privacy-policy.md",46127],eb6f68a0:[()=>Promise.all([n.e(2076),n.e(4991)]).then(n.bind(n,38189)),"@site/docs/reference/meta-cli/embedded-typegate/index.mdx",38189],efb264ae:[()=>Promise.all([n.e(1869),n.e(2076),n.e(4834)]).then(n.bind(n,97649)),"@site/docs/reference/types/injections.mdx",97649],f1c506b7:[()=>n.e(2467).then(n.t.bind(n,6737,19)),"@generated/docusaurus-plugin-content-blog/blog/__plugin.json",6737],fd15d584:[()=>Promise.all([n.e(1869),n.e(2076),n.e(4762)]).then(n.bind(n,55303)),"@site/docs/guides/test-your-typegraph/index.mdx",55303]};var s=n(86070);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(7771),u=n(17832);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(2940).then(n.bind(n,32940)),modules:["@theme/NotFound"],webpack:()=>[32940],render(e,t){const n=e.default;return(0,s.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],h=(0,c.A)(r);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;delete o.__context;const l=o.__props;return delete o.__props,(0,s.jsx)(u.W,{value:i,children:(0,s.jsx)(a,{...o,...l,...n})})}})}const p=[{path:"/blog",component:d("/blog","b71"),exact:!0},{path:"/blog/2023/03/15/emulating-servers",component:d("/blog/2023/03/15/emulating-servers","0e6"),exact:!0},{path:"/blog/2023/06/18/programmable-glue",component:d("/blog/2023/06/18/programmable-glue","3bd"),exact:!0},{path:"/blog/2023/11/27/node-compatibility",component:d("/blog/2023/11/27/node-compatibility","b09"),exact:!0},{path:"/blog/2024/05/09/programmatic-deployment",component:d("/blog/2024/05/09/programmatic-deployment","c79"),exact:!0},{path:"/blog/2024/08/26/python-on-webassembly",component:d("/blog/2024/08/26/python-on-webassembly","d29"),exact:!0},{path:"/blog/2024/08/27/distributed-execution-flow-paradigms",component:d("/blog/2024/08/27/distributed-execution-flow-paradigms","ca6"),exact:!0},{path:"/blog/archive",component:d("/blog/archive","d1d"),exact:!0},{path:"/legal/privacy-policy",component:d("/legal/privacy-policy","4fe"),exact:!0},{path:"/legal/terms",component:d("/legal/terms","aed"),exact:!0},{path:"/docs",component:d("/docs","8cb"),routes:[{path:"/docs",component:d("/docs","3f1"),routes:[{path:"/docs",component:d("/docs","17f"),routes:[{path:"/docs",component:d("/docs","e81"),exact:!0,sidebar:"docs"},{path:"/docs/concepts/architecture",component:d("/docs/concepts/architecture","5a3"),exact:!0,sidebar:"docs"},{path:"/docs/concepts/comparisons",component:d("/docs/concepts/comparisons","c09"),exact:!0,sidebar:"docs"},{path:"/docs/concepts/features-overview",component:d("/docs/concepts/features-overview","196"),exact:!0,sidebar:"docs"},{path:"/docs/concepts/mental-model",component:d("/docs/concepts/mental-model","0a9"),exact:!0,sidebar:"docs"},{path:"/docs/concepts/RFCs",component:d("/docs/concepts/RFCs","301"),exact:!0,sidebar:"docs"},{path:"/docs/concepts/RFCs/M0-template",component:d("/docs/concepts/RFCs/M0-template","c4e"),exact:!0,sidebar:"docs"},{path:"/docs/guides/contributing",component:d("/docs/guides/contributing","39f"),exact:!0,sidebar:"docs"},{path:"/docs/guides/external-functions",component:d("/docs/guides/external-functions","bde"),exact:!0,sidebar:"docs"},{path:"/docs/guides/files-upload",component:d("/docs/guides/files-upload","0b9"),exact:!0,sidebar:"docs"},{path:"/docs/guides/import-external-modules",component:d("/docs/guides/import-external-modules","495"),exact:!0,sidebar:"docs"},{path:"/docs/guides/programmatic-deployment",component:d("/docs/guides/programmatic-deployment","0b9"),exact:!0,sidebar:"docs"},{path:"/docs/guides/rest",component:d("/docs/guides/rest","433"),exact:!0,sidebar:"docs"},{path:"/docs/guides/securing-requests",component:d("/docs/guides/securing-requests","86e"),exact:!0,sidebar:"docs"},{path:"/docs/guides/self-hosting",component:d("/docs/guides/self-hosting","f2f"),exact:!0,sidebar:"docs"},{path:"/docs/guides/test-your-typegraph",component:d("/docs/guides/test-your-typegraph","abf"),exact:!0,sidebar:"docs"},{path:"/docs/guides/wasm-functions",component:d("/docs/guides/wasm-functions","c76"),exact:!0,sidebar:"docs"},{path:"/docs/reference/changelog",component:d("/docs/reference/changelog","783"),exact:!0,sidebar:"docs"},{path:"/docs/reference/ecosystem",component:d("/docs/reference/ecosystem","343"),exact:!0,sidebar:"docs"},{path:"/docs/reference/meta-cli",component:d("/docs/reference/meta-cli","b6c"),exact:!0,sidebar:"docs"},{path:"/docs/reference/meta-cli/available-commands",component:d("/docs/reference/meta-cli/available-commands","a05"),exact:!0,sidebar:"docs"},{path:"/docs/reference/meta-cli/configuration-file",component:d("/docs/reference/meta-cli/configuration-file","549"),exact:!0,sidebar:"docs"},{path:"/docs/reference/meta-cli/embedded-typegate",component:d("/docs/reference/meta-cli/embedded-typegate","86d"),exact:!0,sidebar:"docs"},{path:"/docs/reference/metagen",component:d("/docs/reference/metagen","293"),exact:!0,sidebar:"docs"},{path:"/docs/reference/policies",component:d("/docs/reference/policies","113"),exact:!0,sidebar:"docs"},{path:"/docs/reference/rest",component:d("/docs/reference/rest","870"),exact:!0,sidebar:"docs"},{path:"/docs/reference/runtimes",component:d("/docs/reference/runtimes","86b"),exact:!0,sidebar:"docs"},{path:"/docs/reference/runtimes/deno",component:d("/docs/reference/runtimes/deno","7ef"),exact:!0,sidebar:"docs"},{path:"/docs/reference/runtimes/graphql",component:d("/docs/reference/runtimes/graphql","cfd"),exact:!0,sidebar:"docs"},{path:"/docs/reference/runtimes/grpc",component:d("/docs/reference/runtimes/grpc","dae"),exact:!0,sidebar:"docs"},{path:"/docs/reference/runtimes/http",component:d("/docs/reference/runtimes/http","d1d"),exact:!0,sidebar:"docs"},{path:"/docs/reference/runtimes/kv",component:d("/docs/reference/runtimes/kv","927"),exact:!0,sidebar:"docs"},{path:"/docs/reference/runtimes/prisma",component:d("/docs/reference/runtimes/prisma","637"),exact:!0,sidebar:"docs"},{path:"/docs/reference/runtimes/python",component:d("/docs/reference/runtimes/python","c7a"),exact:!0,sidebar:"docs"},{path:"/docs/reference/runtimes/random",component:d("/docs/reference/runtimes/random","a6c"),exact:!0,sidebar:"docs"},{path:"/docs/reference/runtimes/s3",component:d("/docs/reference/runtimes/s3","5f4"),exact:!0,sidebar:"docs"},{path:"/docs/reference/runtimes/temporal",component:d("/docs/reference/runtimes/temporal","0d3"),exact:!0,sidebar:"docs"},{path:"/docs/reference/runtimes/wasm",component:d("/docs/reference/runtimes/wasm","b3e"),exact:!0,sidebar:"docs"},{path:"/docs/reference/typegate",component:d("/docs/reference/typegate","1fd"),exact:!0,sidebar:"docs"},{path:"/docs/reference/typegate/authentication",component:d("/docs/reference/typegate/authentication","e71"),exact:!0,sidebar:"docs"},{path:"/docs/reference/typegate/cors",component:d("/docs/reference/typegate/cors","a93"),exact:!0,sidebar:"docs"},{path:"/docs/reference/typegate/rate-limiting",component:d("/docs/reference/typegate/rate-limiting","5b3"),exact:!0,sidebar:"docs"},{path:"/docs/reference/typegate/synchronization",component:d("/docs/reference/typegate/synchronization","de4"),exact:!0,sidebar:"docs"},{path:"/docs/reference/typegraph",component:d("/docs/reference/typegraph","6d7"),exact:!0,sidebar:"docs"},{path:"/docs/reference/types",component:d("/docs/reference/types","eb9"),exact:!0,sidebar:"docs"},{path:"/docs/reference/types/comparison",component:d("/docs/reference/types/comparison","67a"),exact:!0,sidebar:"docs"},{path:"/docs/reference/types/functions",component:d("/docs/reference/types/functions","ee1"),exact:!0,sidebar:"docs"},{path:"/docs/reference/types/injections",component:d("/docs/reference/types/injections","5c1"),exact:!0,sidebar:"docs"},{path:"/docs/reference/types/parameter-transformations",component:d("/docs/reference/types/parameter-transformations","8e5"),exact:!0,sidebar:"docs"},{path:"/docs/tutorials/metatype-basics",component:d("/docs/tutorials/metatype-basics","35a"),exact:!0,sidebar:"docs"},{path:"/docs/tutorials/quick-start",component:d("/docs/tutorials/quick-start","1ba"),exact:!0,sidebar:"docs"}]}]}]},{path:"/use-cases",component:d("/use-cases","922"),routes:[{path:"/use-cases",component:d("/use-cases","4f9"),routes:[{path:"/use-cases",component:d("/use-cases","e5c"),routes:[{path:"/use-cases/automatic-crud-validation",component:d("/use-cases/automatic-crud-validation","da8"),exact:!0,sidebar:"useCases"},{path:"/use-cases/backend-for-frontend",component:d("/use-cases/backend-for-frontend","9b1"),exact:!0,sidebar:"useCases"},{path:"/use-cases/faas-runner",component:d("/use-cases/faas-runner","cfd"),exact:!0,sidebar:"useCases"},{path:"/use-cases/graphql-server",component:d("/use-cases/graphql-server","68c"),exact:!0,sidebar:"useCases"},{path:"/use-cases/iam-provider",component:d("/use-cases/iam-provider","940"),exact:!0,sidebar:"useCases"},{path:"/use-cases/microservice-orchestration",component:d("/use-cases/microservice-orchestration","c6e"),exact:!0,sidebar:"useCases"},{path:"/use-cases/orm-for-the-edge",component:d("/use-cases/orm-for-the-edge","e3f"),exact:!0,sidebar:"useCases"},{path:"/use-cases/programmable-api-gateway",component:d("/use-cases/programmable-api-gateway","a64"),exact:!0,sidebar:"useCases"}]}]}]},{path:"/",component:d("/","e5f"),exact:!0},{path:"*",component:d("*")}]},95143:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>i});var r=n(30758),o=n(86070);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},7881:(e,t,n)=>{"use strict";var r=n(30758),o=n(99576),a=n(70248),i=n(41742),l=n(4784),c=n(25283);const u=[n(94127),n(16636),n(58493),n(96213),n(98222)];var d=n(68384),p=n(25557),f=n(70389),h={561:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getAttributes=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:["id","class","length"],n=e.attributes;return[].concat(function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t{Object.defineProperty(t,"__esModule",{value:!0}),t.getParents=function(e){for(var t=[],n=e;(0,r.isElement)(n);)t.push(n),n=n.parentNode;return t};var r=n(440)},970:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getTag=function(e){return e.tagName.toLowerCase().replace(/:/g,"\\:")}},924:(e,t,n)=>{t.A=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.selectorTypes,r=void 0===n?["ID","Class","Tag","NthChild"]:n,o=t.attributesToIgnore,a=void 0===o?["id","class","length"]:o,i=t.excludeRegex,s=void 0===i?null:i,l=[],d=(0,u.getParents)(e),p=!0,f=!1,m=void 0;try{for(var g,v=d[Symbol.iterator]();!(p=(g=v.next()).done);p=!0){var y=h(g.value,r,a,s);Boolean(y)&&l.push(y)}}catch(L){f=!0,m=L}finally{try{!p&&v.return&&v.return()}finally{if(f)throw m}}var b=[],w=!0,x=!1,k=void 0;try{for(var S,C=l[Symbol.iterator]();!(w=(S=C.next()).done);w=!0){var E=S.value;b.unshift(E);var T=b.join(" > ");if((0,c.isUnique)(e,T))return T}}catch(L){x=!0,k=L}finally{try{!w&&C.return&&C.return()}finally{if(x)throw k}}return null};var r=n(169),o=n(770),a=n(584),i=n(561),s=n(64),l=n(970),c=n(213),u=n(175);function d(e,t){var n=e.parentNode.querySelectorAll(t);return 1===n.length&&n[0]===e}function p(e,t){return t.find(d.bind(null,e))}function f(e,t,n){var r=(0,a.getCombinations)(t,3),o=p(e,r);return Boolean(o)||Boolean(n)&&(o=p(e,r=r.map((function(e){return n+e}))),Boolean(o))?o:null}function h(e,t,n,a){var c=void 0,u=function(e,t,n){var a={Tag:l.getTag,NthChild:s.getNthChild,Attributes:function(e){return(0,i.getAttributes)(e,n)},Class:o.getClassSelectors,ID:r.getID};return t.reduce((function(t,n){return t[n]=a[n](e),t}),{})}(e,t,n);a&&a instanceof RegExp&&(u.ID=a.test(u.ID)?null:u.ID,u.Class=u.Class.filter((function(e){return!a.test(e)})));var p=!0,h=!1,m=void 0;try{for(var g,v=t[Symbol.iterator]();!(p=(g=v.next()).done);p=!0){var y=g.value,b=u.ID,w=u.Tag,x=u.Class,k=u.Attributes,S=u.NthChild;switch(y){case"ID":if(Boolean(b)&&d(e,b))return b;break;case"Tag":if(Boolean(w)&&d(e,w))return w;break;case"Class":if(Boolean(x)&&x.length&&(c=f(e,x,w)))return c;break;case"Attributes":if(Boolean(k)&&k.length&&(c=f(e,k,w)))return c;break;case"NthChild":if(Boolean(S))return S}}}catch(C){h=!0,m=C}finally{try{!p&&v.return&&v.return()}finally{if(h)throw m}}return"*"}},440:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.isElement=function(e){return"object"===("undefined"==typeof HTMLElement?"undefined":n(HTMLElement))?e instanceof HTMLElement:!!e&&"object"===(void 0===e?"undefined":n(e))&&1===e.nodeType&&"string"==typeof e.nodeName}},213:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isUnique=function(e,t){if(!Boolean(t))return!1;var n=e.ownerDocument.querySelectorAll(t);return 1===n.length&&n[0]===e}}},m={};function g(e){var t=m[e];if(void 0!==t)return t.exports;var n=m[e]={exports:{}};return h[e](n,n.exports,g),n.exports}g.d=(e,t)=>{for(var n in t)g.o(t,n)&&!g.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},g.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var v={};(()=>{function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(e,t){for(var n=0;n