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 2535ce636c..397dddac0f 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.
QueryGraph
",id:"querygraph",level:3},{value:"Transports",id:"transports",level:3},{value:"GraphQLTransport
",id:"graphqltransport",level:4},{value:"HostcallTransport
",id:"hostcalltransport",level:4},{value:"Requests",id:"requests",level:3},{value:"Nested arguments",id:"nested-arguments",level:3},{value:"Selecting fields",id:"selecting-fields",level:3},{value:"Preparing requests",id:"preparing-requests",level:3},{value:"Aliases",id:"aliases",level:3},{value:"Unions",id:"unions",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"client",children:"Client"}),"\n",(0,s.jsx)(n.admonition,{title:"Beta",type:"warning",children:(0,s.jsx)(n.p,{children:"The following feature isn't yet stable."})}),"\n",(0,s.jsxs)(n.p,{children:["The typegraph client provides a code-first alternative for querying typegraphs.\nIt contains types generated from typegraph definitions to ensure type safety.\nThe ",(0,s.jsx)(n.a,{href:"/docs/reference/metagen",children:"metagen"})," suite provides the client code-generators under the following names:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"client_ts"}),": client code-generator for Typescript for use in browsers and other Javascript runtimes"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"client_py"}),": client code-generator for Python"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"client_rs"}),": client code-generator for Rust."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Refer to the metagen documentation on how to access the generators."}),"\n",(0,s.jsx)(n.h2,{id:"guide",children:"Guide"}),"\n",(0,s.jsx)(n.p,{children:"Even though there are minor differences across language implementations, the generated clients adhere to a common design that contains the following elements."}),"\n",(0,s.jsx)(n.h3,{id:"querygraph",children:(0,s.jsx)(n.code,{children:"QueryGraph"})}),"\n",(0,s.jsx)(n.p,{children:"The root type generated for the client, it includes:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Query builders for all the root functions"}),"\n",(0,s.jsx)(n.li,{children:"Transport constructors for all the transports exposed by the typegraph"}),"\n"]}),"\n",(0,s.jsx)(i.A,{python:{content:"\nfrom client import QueryGraph\n\nqg = new QueryGraph();"},typescript:{content:'import { QueryGraph } from "./client.ts" ;\n\nconst qg = new QueryGraph();'},rust:{content:'use client::*;\n\nlet api1 = QueryGraph::new(format!("http://localhost:7890/sample").parse()?);'},disablePlayground:!0}),"\n",(0,s.jsx)(n.h3,{id:"transports",children:"Transports"}),"\n",(0,s.jsxs)(n.p,{children:["Different transport implementations are used to send the requests to the typegate for different use cases.\nThe ",(0,s.jsx)(n.code,{children:"QueryGraph"})," will sport methods to construct transports supported by the typegraph (see examples below).\nNot all transports have the same feature sets."]}),"\n",(0,s.jsx)(n.h4,{id:"graphqltransport",children:(0,s.jsx)(n.code,{children:"GraphQLTransport"})}),"\n",(0,s.jsx)(n.p,{children:"This transport converts to equivalent GraphQL query strings that get sent over http.\nIt includes the following features for all implementations:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Sync or async queries and mutations"}),"\n",(0,s.jsx)(n.li,{children:"Multiple queries or mutations in one request"}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"hostcalltransport",children:(0,s.jsx)(n.code,{children:"HostcallTransport"})}),"\n",(0,s.jsx)(n.p,{children:"This transport uses host functions exposed by the typegate for use with custom functions."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Sync queries and mutations"}),"\n",(0,s.jsx)(n.li,{children:"Multiple queries or mutations in one request"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"requests",children:"Requests"}),"\n",(0,s.jsx)(n.p,{children:"Requests consist of two parts:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Describe the operations using methods on ",(0,s.jsx)(n.code,{children:"QueryGraph"}),".","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Methods are typesafe according to each typegraph root functions."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Transport methods that take the query description and perform request to the typegate.","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Mutations and queries use separate methods and types."}),"\n",(0,s.jsxs)(n.li,{children:["Some transports like the ",(0,s.jsx)(n.code,{children:"GraphQLTransport"})," support multiple operations in one request"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.A,{python:{content:'qg = QueryGraph()\ngql_client = qg.graphql_sync("http://localhost:7890/sample")\n\n# describe the query\n\n# there\'s a different method available for mutations\n\nout = gql_client.query(\n{\n"user": qg.get_user( # the function takes arguments\nUserArgs(id="1234"),\nUserSelections( # choose which fields get included\nid=True,\nemail=True,\n),\n), # add a second query in the request # this one doesn\'t take arguments so only # selections are provided\n"posts": qg.get_posts({ # both arguments and selections are TypedDicts # allowing use of dicts instead of the classes\n"slug": True,\n"title": True,\n}),\n}\n)\n\nuser = out["user"];\nposts = out["posts"]'},typescript:{content:'const api1 = new QueryGraph();\nconst gqlClient = api1.graphql("http://localhost:7890/sample");\n\n// describe the query\n// there\'s a different method available for mutations\nconst out = await gqlClient.query({\nuser: api1.getUser(\n// the function takes arguments\n{ id: "1234" },\n{\n// choose which fields get included\nid: true,\nemail: true,\n}),\n// add a second query in the request\n// this one doesn\'t take arguments so only\n// selections are provided\nposts: api1.getPosts(\n{ title: true, slug: true }\n),\n});\nconst user = out.user;\nconst posts = out.posts;'},rust:{content:'let api1 = QueryGraph::new("http://localhost:7890/sample".parse()?);\nlet gql_sync = api1.graphql_sync();\n\n// describe the query\n// there\'s a different method available for mutations\nlet out = gql_sync.query((\n// the function takes arguments\napi1.get_user(UserArgs { id: "1234".into() })\n.select(UserSelections {\n// choose which fields get included\n// in rust, selection functions are\n// used instead of booleans.\nid: get(),\nslug: get(),\n}),\n// add a second query in the request\n// note: rust uses tuples for multi-requests\n// this one doesn\'t take arguments\napi1.get_posts()\n.select(PostSelections {\nid: get(),\nslug: get(),\ntitle: get(),\n}),\n)).unwrap();\n\nlet (user, posts) = out;'},disablePlayground:!0}),"\n",(0,s.jsx)(n.h3,{id:"nested-arguments",children:"Nested arguments"}),"\n",(0,s.jsx)(n.p,{children:"Some fields are themselves composite types that have fields that also require selection.\nAnd functions are used to resolve certain fields which require arguments."}),"\n",(0,s.jsx)(i.A,{python:{content:'\nout = gql_client.query(\n {\n "user": qg.get_user(\n UserArgs(id="1234"),\n UserSelections(\n id=True,\n email=True,\n # the posts field takes an argument\n # and is also a composite\n # selection and arguments are combined\n # with tuples in such cases\n posts=(\n PostArgs(filter="top"), \n PostSelections(\n slug=True, \n title=True\n )\n ),\n # this nested composite doesn\'t\n # take arguments so no tuple\n comments=CommentSelections(\n body=True\n )\n ),\n ),\n }\n)\n'},typescript:{content:'\nconst { user } = await gqlClient.query({\n user: api1.getUser(\n { id: "1234" }, \n {\n // posts field takes an argument\n // and is also a composite\n // selection and arguments are combined\n // with array tuples in such cases\n posts: [\n { filter: "top" }, \n { title: true, slug: true }\n ],\n // this nested composite doesn\'t\n // take arguments so no tuple\n // required\n comments: { body: true }\n }\n ),\n});\n '},rust:{content:'let user = gql_sync.query(\n api1.get_user(UserArgs { id: "1234".into() })\n .select(UserSelections {\n id: get(),\n slug: get(),\n // posts nested field takes an argument\n // and is also a composite type\n // requiring the arg_select select function\n posts: arg_select(\n PostArgs { filter: "top".into() },\n PostSelections {\n id: get(),\n slug: get(),\n title: get(),\n }\n ),\n // this nested composite doesn\'t\n // take arguments so the select function\n // is used instead\n comments: select(CommentSelections {\n body: get()\n }),\n }),\n).unwrap();\n'},disablePlayground:!0}),"\n",(0,s.jsx)(n.h3,{id:"selecting-fields",children:"Selecting fields"}),"\n",(0,s.jsx)(n.p,{children:"Booleans indicate interest when selecting fields on an object.\nBy default a field isn't included if it's null, or unspecified.\nSelections can include selection flags to flip the default so that all unspecified fields get included.\nThis won't apply if the field requires an argument explicitly requiring them for inclusion."}),"\n",(0,s.jsxs)(n.p,{children:["Note that these patterns are different in the ",(0,s.jsx)(n.code,{children:"client_rs"})," implementations as demonstrated below:"]}),"\n",(0,s.jsx)(i.A,{python:{content:'\nout = gql_client.query(\n {\n "user": qg.get_user(\n UserArgs(id="1234"),\n UserSelections(\n # seletion flags are set on the underscore\n # field. The select_all flg flips the\n # semantics for unspecified fields\n _=SelectionFlags(select_all=True),\n # False excludes fields explicitly\n id=False,\n # the posts field takes an argument\n # so the select_all flag doesn\'t apply\n # it still must be provided\n # if intending to include it\n posts=(\n PostArgs(filter="top"), \n # TypedDict form\n {"_": SelectionFlags(select_all=True)},\n ),\n # comments is a nested composite but\n # doesn\'t take args so select_all flag applies\n # comments=CommentSelections(\n # body=True\n # )\n ),\n ),\n }\n)\n'},typescript:{content:'\nconst { user } = await gqlClient.query({\n user: api1.getUser(\n { id: "1234" }, \n {\n // posts field takes an argument\n // and is also a composite\n // selection and arguments are combined\n // with array tuples in such cases\n posts: [\n { filter: "top" }, \n { title: true, slug: true }\n ],\n // this nested composite doesn\'t\n // take arguments so no tuple\n // required\n }\n ),\n});\nconst { user } = await gqlClient.query({\n user: api1.getUser(\n { id: "1234" }, \n {\n // seletion flags are set on the underscore\n // field. The selectAll flg flips the\n // semantics for unspecified fields\n _: "selectAll",\n // false excludes fields explicitly \n id: false,\n // post field takes an argument\n // so the selectAll flag doesn\'t apply\n // it still must be provided\n // if intending to include it\n posts: [\n { filter: "top" }, \n { _: "selectAll" }\n ],\n // comments is a nested composite but\n // doesnt\'t take args so selectAll flag applies\n // comments: { body: true }\n }\n ),\n});\n '},rust:{content:'let user = gql_sync.query(\n api1.get_user(UserArgs { id: "1234".into() })\n .select(UserSelections {\n // skip excludes fields explicitly \n id: skip(),\n\n // post field takes an argument\n // so the all() down below still\n // won\'t include it\n // it must be provided explicitly\n // if intending to include it\n posts: arg_select(\n PostArgs { filter: "top".into() },\n // we use all top\n all()\n ),\n\n // comments is a nested composite but\n // doesnt\'t take args so the all() down\n // below includes it\n // comments: select(CommentSelections::all())\n\n // filling the missing fields with the results\n // of all() using the struct update syntax\n // ensures they\'re all get()\n // use default() to get a selection that is full\n // of skip()\n ..all()\n }),\n\n).unwrap();\n'},disablePlayground:!0}),"\n",(0,s.jsx)(n.p,{children:"Note that this only applies to scalar fields and those that require arguments or are structs must still be explicitly included."}),"\n",(0,s.jsx)(n.h3,{id:"preparing-requests",children:"Preparing requests"}),"\n",(0,s.jsxs)(n.p,{children:["Some transports like the ",(0,s.jsx)(n.code,{children:"GraphQLTransport"})," allows one to prepare requests before hand and reuse them.\nThis isn't immediately useful but will be critical when persisted queries are available in Metatype."]}),"\n",(0,s.jsx)(i.A,{python:{content:'\nprepared = gql_client.prepare_query(\n # the args object will contain placholder value of the arguments\n # the lambda will then return a request description as\n # usual\n lambda args: {\n "user": qg.get_user(\n # use only values from args for arguments\n # no branching should be done\n { "id": args.get("userId") },\n {\n "id": True,\n "email": True,\n "posts": (\n { "filter": args.get("postFilter") }, \n { "_": SelectionFlags(select_all=True) },\n ),\n },\n ),\n },\n)\n\n# execute the actual query\n\n# the input here must contain every key\n\n# used from the lambda arg above\n\nout = prepared.perform({\n"userId": "1234",\n"postFilter": "top",\n})\nout2 = prepared.perform({\n"userId": "5678",\n"postFilter": "hot",\n})\n'},typescript:{content:'\nconst prepared = gqlClient.prepareQuery(\n// the args object will contain placholder value of the arguments\n// the closure will then return a request description as\n// usual\n(\n// types can be provided as hints\nargs: PreparedArgs<{\nuserId: string;\npostFilter: string;\n}>,\n) => ({\n\n user: api1.getUser(\n // use only values from args for arguments\n // no branching should be done\n { id: args.userId },\n {\n id: true,\n email: true,\n posts: [\n { filter: args.postFilter },\n { title: true, slug: true }\n ],\n }),\n\n})\n);\n\n// execute the actual query\n// the input here must contain every key\n// used from the closure arg above\nconst { posts } = await prepared.perform({\nuserId: "1234"\npostFilter: "top"\n});\nconst { posts: posts2 } = await prepared.perform({\nuserId: "5678"\npostFilter: "hot"\n});\n'},rust:{content:'\nlet prepared_m = gql_sync.prepare_mutation(\n// the args object will contain placholder value of the arguments\n// the closure will then return a request description as\n// usual\n|args| {\n(\n// for each placholder value, we provide a closure that returns\n// argument structs according to the value\n// this closure will be used for each use of the prepared\n// request\napi1.scalar_args(args.get("userId", |id: String| UserArgs { id })),\n.select(UserSelections {\nid: get(),\nslug: get(),\nposts: arg_select(\n// the placholder closures can take any parameter\n// that implements serde::DeserializeOwned\n// the closure here does no transformation\nargs.get("postFilter", |val: PostArgs| val)\nPostSelections {\nid: get(),\nslug: get(),\ntitle: get(),\n}\n),\n}),\n)\n}\n);\n\n// execute the actual query\n// the input here must contain every key\n// used from the closure arg above\nlet user1 = prepared_clone.perform([\n(\n"userId",\n// perform takes an IntoQueryGraph
",id:"querygraph",level:3},{value:"Transports",id:"transports",level:3},{value:"GraphQLTransport
",id:"graphqltransport",level:4},{value:"HostcallTransport
",id:"hostcalltransport",level:4},{value:"Requests",id:"requests",level:3},{value:"Nested arguments",id:"nested-arguments",level:3},{value:"Selecting fields",id:"selecting-fields",level:3},{value:"Preparing requests",id:"preparing-requests",level:3},{value:"Aliases",id:"aliases",level:3},{value:"Unions",id:"unions",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"client",children:"Client"}),"\n",(0,s.jsx)(n.admonition,{title:"Beta",type:"warning",children:(0,s.jsx)(n.p,{children:"The following feature isn't yet stable."})}),"\n",(0,s.jsxs)(n.p,{children:["The typegraph client provides a code-first alternative for querying typegraphs.\nIt contains types generated from typegraph definitions to ensure type safety.\nThe ",(0,s.jsx)(n.a,{href:"/docs/reference/metagen",children:"metagen"})," suite provides the client code-generators under the following names:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"client_ts"}),": client code-generator for Typescript for use in browsers and other Javascript runtimes"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"client_py"}),": client code-generator for Python"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"client_rs"}),": client code-generator for Rust."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Refer to the metagen documentation on how to access the generators."}),"\n",(0,s.jsx)(n.h2,{id:"guide",children:"Guide"}),"\n",(0,s.jsx)(n.p,{children:"Even though there are minor differences across language implementations, the generated clients adhere to a common design that contains the following elements."}),"\n",(0,s.jsx)(n.h3,{id:"querygraph",children:(0,s.jsx)(n.code,{children:"QueryGraph"})}),"\n",(0,s.jsx)(n.p,{children:"The root type generated for the client, it includes:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Query builders for all the root functions"}),"\n",(0,s.jsx)(n.li,{children:"Transport constructors for all the transports exposed by the typegraph"}),"\n"]}),"\n",(0,s.jsx)(i.A,{python:{content:"\nfrom client import QueryGraph\n\nqg = new QueryGraph();"},typescript:{content:'import { QueryGraph } from "./client.ts" ;\n\nconst qg = new QueryGraph();'},rust:{content:'use client::*;\n\nlet api1 = QueryGraph::new(format!("http://localhost:7890/sample").parse()?);'},disablePlayground:!0}),"\n",(0,s.jsx)(n.h3,{id:"transports",children:"Transports"}),"\n",(0,s.jsxs)(n.p,{children:["Different transport implementations are used to send the requests to the typegate for different use cases.\nThe ",(0,s.jsx)(n.code,{children:"QueryGraph"})," will sport methods to construct transports supported by the typegraph (see examples below).\nNot all transports have the same feature sets."]}),"\n",(0,s.jsx)(n.h4,{id:"graphqltransport",children:(0,s.jsx)(n.code,{children:"GraphQLTransport"})}),"\n",(0,s.jsx)(n.p,{children:"This transport converts to equivalent GraphQL query strings that get sent over http.\nIt includes the following features for all implementations:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Sync or async queries and mutations"}),"\n",(0,s.jsx)(n.li,{children:"Multiple queries or mutations in one request"}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"hostcalltransport",children:(0,s.jsx)(n.code,{children:"HostcallTransport"})}),"\n",(0,s.jsx)(n.p,{children:"This transport uses host functions exposed by the typegate for use with custom functions."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Sync queries and mutations"}),"\n",(0,s.jsx)(n.li,{children:"Multiple queries or mutations in one request"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"requests",children:"Requests"}),"\n",(0,s.jsx)(n.p,{children:"Requests consist of two parts:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Describe the operations using methods on ",(0,s.jsx)(n.code,{children:"QueryGraph"}),".","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Methods are typesafe according to each typegraph root functions."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Transport methods that take the query description and perform request to the typegate.","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Mutations and queries use separate methods and types."}),"\n",(0,s.jsxs)(n.li,{children:["Some transports like the ",(0,s.jsx)(n.code,{children:"GraphQLTransport"})," support multiple operations in one request"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.A,{python:{content:'qg = QueryGraph()\ngql_client = qg.graphql_sync("http://localhost:7890/sample")\n\n# describe the query\n# there\'s a different method available for mutations\nout = gql_client.query(\n {\n "user": qg.get_user(\n # the function takes arguments\n UserArgs(id="1234"),\n UserSelections(\n # choose which fields get included\n id=True,\n email=True,\n ),\n ),\n # add a second query in the request\n # this one doesn\'t take arguments so only\n # selections are provided\n "posts": qg.get_posts({\n # both arguments and selections are TypedDicts\n # allowing use of dicts instead of the classes\n "slug": True,\n "title": True,\n }),\n }\n)\n\nuser = out["user"];\nposts = out["posts"]'},typescript:{content:'const api1 = new QueryGraph();\nconst gqlClient = api1.graphql("http://localhost:7890/sample");\n\n// describe the query\n// there\'s a different method available for mutations\nconst out = await gqlClient.query({\n user: api1.getUser(\n // the function takes arguments\n { id: "1234" }, \n {\n // choose which fields get included\n id: true,\n email: true,\n }),\n // add a second query in the request\n // this one doesn\'t take arguments so only\n // selections are provided\n posts: api1.getPosts(\n { title: true, slug: true }\n ),\n});\nconst user = out.user;\nconst posts = out.posts;'},rust:{content:'let api1 = QueryGraph::new("http://localhost:7890/sample".parse()?);\nlet gql_sync = api1.graphql_sync();\n\n// describe the query\n// there\'s a different method available for mutations\nlet out = gql_sync.query((\n // the function takes arguments\n api1.get_user(UserArgs { id: "1234".into() })\n .select(UserSelections {\n // choose which fields get included\n // in rust, selection functions are \n // used instead of booleans. \n id: get(),\n slug: get(),\n }),\n // add a second query in the request\n // note: rust uses tuples for multi-requests\n // this one doesn\'t take arguments\n api1.get_posts()\n .select(PostSelections {\n id: get(),\n slug: get(),\n title: get(),\n }),\n)).unwrap();\n\nlet (user, posts) = out;'},disablePlayground:!0}),"\n",(0,s.jsx)(n.h3,{id:"nested-arguments",children:"Nested arguments"}),"\n",(0,s.jsx)(n.p,{children:"Some fields are themselves composite types that have fields that also require selection.\nAnd functions are used to resolve certain fields which require arguments."}),"\n",(0,s.jsx)(i.A,{python:{content:'\nout = gql_client.query(\n {\n "user": qg.get_user(\n UserArgs(id="1234"),\n UserSelections(\n id=True,\n email=True,\n # the posts field takes an argument\n # and is also a composite\n # selection and arguments are combined\n # with tuples in such cases\n posts=(\n PostArgs(filter="top"), \n PostSelections(\n slug=True, \n title=True\n )\n ),\n # this nested composite doesn\'t\n # take arguments so no tuple\n comments=CommentSelections(\n body=True\n )\n ),\n ),\n }\n)\n'},typescript:{content:'\nconst { user } = await gqlClient.query({\n user: api1.getUser(\n { id: "1234" }, \n {\n // posts field takes an argument\n // and is also a composite\n // selection and arguments are combined\n // with array tuples in such cases\n posts: [\n { filter: "top" }, \n { title: true, slug: true }\n ],\n // this nested composite doesn\'t\n // take arguments so no tuple\n // required\n comments: { body: true }\n }\n ),\n});\n '},rust:{content:'let user = gql_sync.query(\n api1.get_user(UserArgs { id: "1234".into() })\n .select(UserSelections {\n id: get(),\n slug: get(),\n // posts nested field takes an argument\n // and is also a composite type\n // requiring the arg_select select function\n posts: arg_select(\n PostArgs { filter: "top".into() },\n PostSelections {\n id: get(),\n slug: get(),\n title: get(),\n }\n ),\n // this nested composite doesn\'t\n // take arguments so the select function\n // is used instead\n comments: select(CommentSelections {\n body: get()\n }),\n }),\n).unwrap();\n'},disablePlayground:!0}),"\n",(0,s.jsx)(n.h3,{id:"selecting-fields",children:"Selecting fields"}),"\n",(0,s.jsx)(n.p,{children:"Booleans indicate interest when selecting fields on an object.\nBy default a field isn't included if it's null, or unspecified.\nSelections can include selection flags to flip the default so that all unspecified fields get included.\nThis won't apply if the field requires an argument explicitly requiring them for inclusion."}),"\n",(0,s.jsxs)(n.p,{children:["Note that these patterns are different in the ",(0,s.jsx)(n.code,{children:"client_rs"})," implementations as demonstrated below:"]}),"\n",(0,s.jsx)(i.A,{python:{content:'\nout = gql_client.query(\n {\n "user": qg.get_user(\n UserArgs(id="1234"),\n UserSelections(\n # seletion flags are set on the underscore\n # field. The select_all flg flips the\n # semantics for unspecified fields\n _=SelectionFlags(select_all=True),\n # False excludes fields explicitly\n id=False,\n # the posts field takes an argument\n # so the select_all flag doesn\'t apply\n # it still must be provided\n # if intending to include it\n posts=(\n PostArgs(filter="top"), \n # TypedDict form\n {"_": SelectionFlags(select_all=True)},\n ),\n # comments is a nested composite but\n # doesn\'t take args so select_all flag applies\n # comments=CommentSelections(\n # body=True\n # )\n ),\n ),\n }\n)\n'},typescript:{content:'\nconst { user } = await gqlClient.query({\n user: api1.getUser(\n { id: "1234" }, \n {\n // posts field takes an argument\n // and is also a composite\n // selection and arguments are combined\n // with array tuples in such cases\n posts: [\n { filter: "top" }, \n { title: true, slug: true }\n ],\n // this nested composite doesn\'t\n // take arguments so no tuple\n // required\n }\n ),\n});\nconst { user } = await gqlClient.query({\n user: api1.getUser(\n { id: "1234" }, \n {\n // seletion flags are set on the underscore\n // field. The selectAll flg flips the\n // semantics for unspecified fields\n _: "selectAll",\n // false excludes fields explicitly \n id: false,\n // post field takes an argument\n // so the selectAll flag doesn\'t apply\n // it still must be provided\n // if intending to include it\n posts: [\n { filter: "top" }, \n { _: "selectAll" }\n ],\n // comments is a nested composite but\n // doesnt\'t take args so selectAll flag applies\n // comments: { body: true }\n }\n ),\n});\n '},rust:{content:'let user = gql_sync.query(\n api1.get_user(UserArgs { id: "1234".into() })\n .select(UserSelections {\n // skip excludes fields explicitly \n id: skip(),\n\n // post field takes an argument\n // so the all() down below still\n // won\'t include it\n // it must be provided explicitly\n // if intending to include it\n posts: arg_select(\n PostArgs { filter: "top".into() },\n // we use all top \n all()\n ),\n\n // comments is a nested composite but\n // doesnt\'t take args so the all() down\n // below includes it\n // comments: select(CommentSelections::all())\n\n // filling the missing fields with the results\n // of all() using the struct update syntax\n // ensures they\'re all get()\n // use default() to get a selection that is full\n // of skip()\n ..all()\n }),\n).unwrap();\n'},disablePlayground:!0}),"\n",(0,s.jsx)(n.p,{children:"Note that this only applies to scalar fields and those that require arguments or are structs must still be explicitly included."}),"\n",(0,s.jsx)(n.h3,{id:"preparing-requests",children:"Preparing requests"}),"\n",(0,s.jsxs)(n.p,{children:["Some transports like the ",(0,s.jsx)(n.code,{children:"GraphQLTransport"})," allows one to prepare requests before hand and reuse them.\nThis isn't immediately useful but will be critical when persisted queries are available in Metatype."]}),"\n",(0,s.jsx)(i.A,{python:{content:'\nprepared = gql_client.prepare_query(\n # the args object will contain placholder value of the arguments\n # the lambda will then return a request description as\n # usual\n lambda args: {\n "user": qg.get_user(\n # use only values from args for arguments\n # no branching should be done\n { "id": args.get("userId") },\n {\n "id": True,\n "email": True,\n "posts": (\n { "filter": args.get("postFilter") }, \n { "_": SelectionFlags(select_all=True) },\n ),\n },\n ),\n },\n)\n\n# execute the actual query\n# the input here must contain every key\n# used from the lambda arg above\nout = prepared.perform({\n "userId": "1234",\n "postFilter": "top",\n})\nout2 = prepared.perform({\n "userId": "5678",\n "postFilter": "hot",\n})\n'},typescript:{content:'\nconst prepared = gqlClient.prepareQuery(\n // the args object will contain placholder value of the arguments\n // the closure will then return a request description as\n // usual\n (\n // types can be provided as hints\n args: PreparedArgs<{\n userId: string;\n postFilter: string;\n }>,\n ) => ({\n\n user: api1.getUser(\n // use only values from args for arguments\n // no branching should be done\n { id: args.userId }, \n {\n id: true,\n email: true,\n posts: [\n { filter: args.postFilter }, \n { title: true, slug: true }\n ],\n }),\n\n })\n);\n\n// execute the actual query\n// the input here must contain every key\n// used from the closure arg above\nconst { posts } = await prepared.perform({ \n userId: "1234" \n postFilter: "top" \n});\nconst { posts: posts2 } = await prepared.perform({ \n userId: "5678" \n postFilter: "hot" \n});\n '},rust:{content:'\nlet prepared_m = gql_sync.prepare_mutation(\n // the args object will contain placholder value of the arguments\n // the closure will then return a request description as\n // usual\n |args| {\n (\n // for each placholder value, we provide a closure that returns\n // argument structs according to the value\n // this closure will be used for each use of the prepared\n // request\n api1.scalar_args(args.get("userId", |id: String| UserArgs { id })),\n .select(UserSelections {\n id: get(),\n slug: get(),\n posts: arg_select(\n // the placholder closures can take any parameter\n // that implements serde::DeserializeOwned\n // the closure here does no transformation\n args.get("postFilter", |val: PostArgs| val)\n PostSelections {\n id: get(),\n slug: get(),\n title: get(),\n }\n ),\n }),\n )\n }\n);\n\n// execute the actual query\n// the input here must contain every key\n// used from the closure arg above\nlet user1 = prepared_clone.perform([\n (\n "userId",\n // perform takes an IntoQuery
and Mutation
",id:"query-and-mutation",level:2},{value:"Variables",id:"variables",level:2},{value:"Types",id:"types",level:2},{value:"Scalars",id:"scalars",level:3},{value:"Files",id:"files",level:3},{value:"Structs",id:"structs",level:3},{value:"Lists",id:"lists",level:3},{value:"Functions",id:"functions",level:3},{value:"Unions and Eithers",id:"unions-and-eithers",level:3}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"graphql",children:"GraphQL"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://graphql.org/",children:"GraphQL"})," is the primary means of querying your typegraph.\nThis page documents all the semantics of how your typegraph translates into a GraphQL schema."]}),"\n",(0,i.jsxs)(n.h2,{id:"query-and-mutation",children:[(0,i.jsx)(n.code,{children:"Query"})," and ",(0,i.jsx)(n.code,{children:"Mutation"})]}),"\n",(0,i.jsxs)(n.p,{children:["The root functions passed to the ",(0,i.jsx)(n.code,{children:"expose"})," function will be added as fields to the ",(0,i.jsxs)(n.a,{href:"https://graphql.org/learn/schema/#the-query-and-mutation-types",children:["special ",(0,i.jsx)(n.code,{children:"query"})," and ",(0,i.jsx)(n.code,{children:"mutation"})]})," GraphQL objects.\nUnder which object a function is assigned depends on it's ",(0,i.jsx)(n.a,{href:"/docs/reference/types/functions",children:"effect"}),".\nNote that this assignment still holds for deeply nested functions so be sure to avoid including functions that have mutating effects under query responses or vice versa."]}),"\n",(0,i.jsx)(n.h2,{id:"variables",children:"Variables"}),"\n",(0,i.jsxs)(n.p,{children:["While ",(0,i.jsx)(n.a,{href:"https://graphql.org/learn/queries/#variables",children:"GraphQL Variables"})," work as expected for the most part, the typegate currently does not do type validation of variables for the provided query documents."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-graphql",children:'query ($varRight: String!, $varWrong: Int!) {\n foo1: foo(in: $varRight)\n foo2: foo(in: $varWrong)\n}\n{\n "varRight": "string",\n # request will work as long as varWrong is string\n # even if variable above was annotated as Int\n "varWrong": "AlsoString",\n}\n'})}),"\n",(0,i.jsx)(n.h2,{id:"types",children:"Types"}),"\n",(0,i.jsx)(n.h3,{id:"scalars",children:"Scalars"}),"\n",(0,i.jsxs)(n.p,{children:["The simple primitive typegraph types translate directly to their ",(0,i.jsx)(n.a,{href:"https://graphql.org/learn/schema/#scalar-types",children:"GraphQL equivalent"}),".\nThis includes standard scalar variants like ",(0,i.jsx)(n.code,{children:"t.uuid"})," or any user declared aliases with custom configurations.\nNo custom GraphQL scalars are generated for such types."]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"GraphQL type"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"t.integer()"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"Int"})}),(0,i.jsx)(n.td,{children:"Represents signed 32-bit integers."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"t.float()"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"Float"})}),(0,i.jsxs)(n.td,{children:["Represents signed double-precision values as specified by ",(0,i.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/IEEE_754",children:"IEEE 754"}),"."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"t.boolean()"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"Boolean"})}),(0,i.jsxs)(n.td,{children:["Represents ",(0,i.jsx)(n.code,{children:"true"})," or ",(0,i.jsx)(n.code,{children:"false"}),"."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"t.string()"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"String"})}),(0,i.jsx)(n.td,{children:"Represents textual data as UTF-8 character sequences."})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"files",children:"Files"}),"\n",(0,i.jsxs)(n.p,{children:["File types, primarily used through the ",(0,i.jsx)(n.a,{href:"/docs/reference/runtimes/s3",children:(0,i.jsx)(n.code,{children:"S3Runtime"})}),", translate to a custom scalar called ",(0,i.jsx)(n.code,{children:"File"})," in the GraphQL schema.\nThe ",(0,i.jsx)(n.code,{children:"S3Runtime"})," provides a set of helpers for all your file needs including support for ",(0,i.jsx)(n.a,{href:"/docs/guides/files-upload",children:"multipart HTTP requests"})," for file upload."]}),"\n",(0,i.jsx)(n.h3,{id:"structs",children:"Structs"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"t.structs"})," types translate to:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://graphql.org/learn/schema/#input-types",children:"GraphQL input types"})," when used as inputs to functions"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://graphql.org/learn/schema/#object-types-and-fields",children:"GraphQL object types"})," in any other place."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"lists",children:"Lists"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"t.list"})," types simply convert to ",(0,i.jsx)(n.a,{href:"https://graphql.org/learn/schema/#lists-and-non-null",children:"GraphQL list types"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"functions",children:"Functions"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"t.func"})," types are represented by their output type in the GraphQL schema.\nIf their input struct has fields present, these are converted to ",(0,i.jsx)(n.a,{href:"https://graphql.org/learn/schema/#arguments",children:"arguments"})," for the field."]}),"\n",(0,i.jsx)(n.h3,{id:"unions-and-eithers",children:"Unions and Eithers"}),"\n",(0,i.jsx)(n.p,{children:"Unions and either translate to a number of different forms depending on their usage in the graph and their composition."}),"\n",(0,i.jsx)(n.p,{children:"When used as a field in an input struct, unions/eithers are converted to custom scalars since the GraphQL spec doesn't allow GraphQL unions on input types.\nThese scalars expect the standard JSON representation of your value and that is all."}),"\n",(0,i.jsxs)(n.p,{children:["When querying union/either values, there are a few more details.\nFor struct variants, the standard GraphQL rules apply and ",(0,i.jsx)(n.a,{href:"https://graphql.org/learn/queries/#inline-fragments",children:"inline fragments"})," must be used.\nCurrently, all struct variants must have inline fragments present even if the user is not interested in them.\nAnd as per GraphQL spec, common field querying is not supported and any fields must be part of the inline fragment.\nUnlike the GraphQL spec, this includes the ",(0,i.jsx)(n.code,{children:"__typename"})," field which must be included in the fragments instead."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-graphql",children:"# introspection schema\nunion MyUnion = Struct1 | Struct2\n\ntype Struct1 {\n foo: String!\n bar: String!\n}\n\ntype Struct2 {\n foo: String!\n baz: String!\n}\n\n# introspection expected query (THIS IS WRONG)\nquery {\n myUnion {\n # common fields are not supported\n __typename\n foo\n ... on Struct1 {\n bar\n }\n ... on Struct2 {\n baz\n }\n }\n}\n\n# actual expected query (THIS IS RIGHT)\nquery {\n myUnion {\n ... on Struct1 {\n # common fields must be included each time\n __typename\n foo\n bar\n }\n ... on Struct2 {\n __typename\n foo\n baz\n }\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["For scalar variant, the introspected GraphQL schema will include a ",(0,i.jsx)(n.code,{children:"_NameOfScalar"})," variant in the introspection schema ",(0,i.jsx)(n.strong,{children:"but"})," the value is returned at the field level as a simple scalar.\nThat is, GraphQL API explorers will show union ",(0,i.jsx)(n.strong,{children:"object"})," members that include the scalar values and they'll prompt you to use ",(0,i.jsx)(n.a,{href:"https://graphql.org/learn/queries/#inline-fragments",children:"inline fragments"})," for querying the scalar members.\nBut the typegate will reject these kind of queries in preference to simple fields.\nLook at the following example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-graphql",children:'# introspection schema\nunion MyUnion = _String | _Integer\n\ntype _String {\n string: String!\n}\n\ntype _Integer {\n integer: Int!\n}\n\n# introspection expected query (THIS IS WRONG)\nquery {\n myUnion {\n ... on _String {\n string\n }\n ... on _Integer {\n integer\n }\n }\n}\n\n# actual expected query (THIS IS RIGHT)\nquery {\n # no subfield selection at all required\n # since all members are scalars\n myUnion\n}\n\n# received json\n{\n "myUnion": "string"\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"List members act accordingly to their wrapped times.\nLists of scalars are treated as scalars and lists of composites as a standard GraphQL composites list."}),"\n",(0,i.jsx)(n.p,{children:"The following playground shows all the different types of unions/eithers:"}),"\n",(0,i.jsx)(r.A,{typegraph:"union-either",typescript:t(67548),python:t(51626),query:t(82481)})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},65671:(e,n,t)=>{"use strict";t.d(n,{A:()=>r});var i=t(98302),s=(t(30758),t(86070));function r(e){let{python:n,typescript:t,rust:r,...a}=e;const l=[n&&{content:n.content,codeLanguage:"python",codeFileUrl:n.path},t&&{content:t.content,codeLanguage:"typescript",codeFileUrl:t.path},r&&{content:r.content,codeLanguage:"rust",codeFileUrl:r.path}].filter((e=>!!e));return(0,s.jsx)(i.A,{code:0==l.length?void 0:l,...a})}},82481:e=>{var n={kind:"Document",definitions:[{kind:"OperationDefinition",operation:"query",variableDefinitions:[],directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"Field",name:{kind:"Name",value:"outer"},arguments:[],directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"Field",name:{kind:"Name",value:"unionList"},arguments:[],directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"InlineFragment",typeCondition:{kind:"NamedType",name:{kind:"Name",value:"comp_1"}},directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"Field",name:{kind:"Name",value:"field1"},arguments:[],directives:[]}]}},{kind:"InlineFragment",typeCondition:{kind:"NamedType",name:{kind:"Name",value:"comp_2"}},directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"Field",name:{kind:"Name",value:"field2"},arguments:[],directives:[]}]}}]}},{kind:"Field",name:{kind:"Name",value:"union"},arguments:[],directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"InlineFragment",typeCondition:{kind:"NamedType",name:{kind:"Name",value:"comp_1"}},directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"Field",name:{kind:"Name",value:"field1"},arguments:[],directives:[]}]}},{kind:"InlineFragment",typeCondition:{kind:"NamedType",name:{kind:"Name",value:"comp_2"}},directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"Field",name:{kind:"Name",value:"field2"},arguments:[],directives:[]}]}}]}},{kind:"Field",name:{kind:"Name",value:"either"},arguments:[],directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"InlineFragment",typeCondition:{kind:"NamedType",name:{kind:"Name",value:"comp_1"}},directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"Field",name:{kind:"Name",value:"field1"},arguments:[],directives:[]}]}},{kind:"InlineFragment",typeCondition:{kind:"NamedType",name:{kind:"Name",value:"comp_2"}},directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"Field",name:{kind:"Name",value:"field2"},arguments:[],directives:[]}]}}]}}]}}]}}],loc:{start:0,end:532}};n.loc.source={body:"{\n outer {\n # scalar 1 and 2 don't need\n # type inline fragments\n unionList {\n ... on comp_1 {\n field1\n }\n ... on comp_2 {\n field2\n }\n }\n # we must include fragments\n # for all composites or it will fail\n union {\n ... on comp_1 {\n field1\n }\n ... on comp_2 {\n field2\n }\n }\n # rules are the same between unions and eithers\n either {\n ... on comp_1 {\n field1\n }\n ... on comp_2 {\n field2\n }\n }\n }\n}\n",name:"GraphQL request",locationOffset:{line:1,column:1}};function t(e,n){if("FragmentSpread"===e.kind)n.add(e.name.value);else if("VariableDefinition"===e.kind){var i=e.type;"NamedType"===i.kind&&n.add(i.name.value)}e.selectionSet&&e.selectionSet.selections.forEach((function(e){t(e,n)})),e.variableDefinitions&&e.variableDefinitions.forEach((function(e){t(e,n)})),e.definitions&&e.definitions.forEach((function(e){t(e,n)}))}var i={};n.definitions.forEach((function(e){if(e.name){var n=new Set;t(e,n),i[e.name.value]=n}})),e.exports=n},51626:e=>{e.exports={content:'@typegraph(\n)\ndef union_either(g: Graph):\n deno = DenoRuntime()\n members = [\n t.string().rename("scalar_1"),\n t.integer().rename("scalar_2"),\n t.struct(\n {\n "field1": t.string(),\n }\n ).rename("comp_1"),\n t.struct(\n {\n "field2": t.string(),\n }\n ).rename("comp_2"),\n t.list(t.string()).rename("scalar_list"),\n # # FIXME: list of composites is broken\n # t.list(\n # t.struct(\n # {\n # "listField": t.string(),\n # }\n # ),\n # ),\n ]\n g.expose(\n Policy.public(),\n outer=deno.func(\n t.struct(),\n t.struct(\n {\n "union": t.union(members),\n "either": t.either(members),\n "unionList": t.list(t.union(members)),\n }\n ),\n code="""() => ({\n either: {\n field1: "1",\n },\n union: {\n field2: "2",\n },\n unionList: [\n "scalar",\n 2,\n {\n field1: "1",\n },\n {\n field2: "2",\n },\n ["scalar_1", "scalar_2"],\n ],\n })""",\n ),\n )',path:"../examples/typegraphs/union-either.py"}},67548:e=>{e.exports={content:'typegraph(\n {\n name: "union-either",\n },\n (g) => {\n const deno = new DenoRuntime();\n const members = [\n t.string().rename("scalar_1"),\n t.integer().rename("scalar_2"),\n t.struct({\n field1: t.string(),\n }).rename("comp_1"),\n t.struct({\n field2: t.string(),\n }).rename("comp_2"),\n t.list(t.string()).rename("scalar_list"),\n /* FIXME: list of composites is broken\n t.list(\n t.struct({\n listField: t.string(),\n }),\n ), */\n ];\n g.expose({\n outer: deno.func(\n // input\n t.struct({}),\n // output\n t.struct({\n union: t.union(members),\n either: t.either(members),\n unionList: t.list(t.union(members)),\n }),\n {\n code: () => ({\n either: {\n field1: "1",\n },\n union: {\n field2: "2",\n },\n unionList: [\n "scalar",\n 2,\n {\n field1: "1",\n },\n {\n field2: "2",\n },\n ["scalar_1", "scalar_2"],\n ],\n }),\n },\n ),\n }, Policy.public());\n },\n);',path:"../examples/typegraphs/union-either.ts"}}}]);
\ No newline at end of file
diff --git a/assets/js/6b5a7be1.510e9cd3.js b/assets/js/6b5a7be1.7d9dbc23.js
similarity index 68%
rename from assets/js/6b5a7be1.510e9cd3.js
rename to assets/js/6b5a7be1.7d9dbc23.js
index 9530f8ccde..35e7f1cdd5 100644
--- a/assets/js/6b5a7be1.510e9cd3.js
+++ b/assets/js/6b5a7be1.7d9dbc23.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2920],{65977:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var i=n(86070),r=n(25710);const s={},o="Introducing gRPC Runtime",a={permalink:"/blog/2024/09/26/introducing-grpc-runtime",editUrl:"https://github.com/metatypedev/metatype/tree/main/docs/metatype.dev/blog/2024-09-26-introducing-grpc-runtime/index.mdx",source:"@site/blog/2024-09-26-introducing-grpc-runtime/index.mdx",title:"Introducing gRPC Runtime",description:"We're excited to announce the new gRPC Runtime feature in Metatype, further enhancing our platform's ability to create versatile and powerful backends through typegraphs.",date:"2024-09-26T00:00:00.000Z",tags:[],readingTime:4.4,hasTruncateMarker:!1,authors:[],frontMatter:{},unlisted:!1,nextItem:{title:"Distributed execution flow paradigms",permalink:"/blog/2024/08/27/distributed-execution-flow-paradigms"}},l={authorsImageUrls:[]},c=[{value:"What is gRPC?",id:"what-is-grpc",level:2},{value:"Why gRPC Matters for Metatype",id:"why-grpc-matters-for-metatype",level:2},{value:"Diagram: gRPC and Metatype Integration",id:"diagram-grpc-and-metatype-integration",level:2},{value:"Introducing gRPC Runtime in Metatype",id:"introducing-grpc-runtime-in-metatype",level:2},{value:"Key Technical Details",id:"key-technical-details",level:2},{value:"Architecture",id:"architecture",level:3},{value:"Implementation",id:"implementation",level:3},{value:"Benefits for Developers",id:"benefits-for-developers",level:2},{value:"Getting Started",id:"getting-started",level:2},{value:"Conclusion",id:"conclusion",level:2}];function h(e){const t={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"We're excited to announce the new gRPC Runtime feature in Metatype, further enhancing our platform's ability to create versatile and powerful backends through typegraphs."}),"\n",(0,i.jsx)(t.h2,{id:"what-is-grpc",children:"What is gRPC?"}),"\n",(0,i.jsxs)(t.p,{children:["gRPC, or ",(0,i.jsx)(t.strong,{children:"g"}),"oogle ",(0,i.jsx)(t.strong,{children:"R"}),"emote ",(0,i.jsx)(t.strong,{children:"P"}),"rocedure ",(0,i.jsx)(t.strong,{children:"C"}),"all, is a high-performance, open-source communication framework initially developed by Google. It enables ",(0,i.jsx)(t.strong,{children:"efficient and fast communication between microservices"})," in a distributed system, making it ideal for modern backend architectures."]}),"\n",(0,i.jsxs)(t.p,{children:["Unlike traditional HTTP APIs that use JSON, gRPC relies on ",(0,i.jsx)(t.strong,{children:"Protocol Buffers"})," (protobufs) for serializing data, which are more compact and faster to process. This approach allows gRPC to support high-throughput, low-latency communication, which is crucial for applications where speed and efficiency matter, such as in real-time data processing or large-scale distributed systems."]}),"\n",(0,i.jsx)(t.p,{children:"Key benefits of gRPC include:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Cross-language support"}),": gRPC supports multiple programming languages, allowing services written in different languages to communicate seamlessly."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Strong type safety"}),": Protocol Buffers ensure type-safe communication, catching errors early and improving reliability."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Bidirectional streaming"}),": gRPC allows for client and server streaming, enabling continuous data transfer in both directions, ideal for applications like real-time analytics."]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"In short, gRPC is well-suited for high-performance, scalable backend systems where speed and type safety are essential."}),"\n",(0,i.jsx)(t.h2,{id:"why-grpc-matters-for-metatype",children:"Why gRPC Matters for Metatype"}),"\n",(0,i.jsxs)(t.p,{children:["Metatype is a platform that enables developers to create ",(0,i.jsx)(t.strong,{children:"typegraphs"}),"\u2014strongly-typed, composable backend structures that can support multiple protocols and runtime environments. With the introduction of the gRPC Runtime, Metatype allows developers to incorporate gRPC services into these typegraphs, further enhancing the platform\u2019s versatility."]}),"\n",(0,i.jsx)(t.p,{children:"By integrating gRPC, Metatype empowers developers to:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Expose gRPC services via GraphQL or HTTP endpoints"}),", making them accessible to clients in a way that best suits their needs."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Compose gRPC services with other backend components"}),", such as databases or other APIs, to create powerful and cohesive backend systems."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"diagram-grpc-and-metatype-integration",children:"Diagram: gRPC and Metatype Integration"}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"gRPC and Metatype Integration Diagram",src:n(15602).A+"",width:"161",height:"681"})})}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.em,{children:"Metatype\u2019s gRPC Runtime allows developers to integrate gRPC services into their typegraphs, enabling seamless interaction with gRPC services in the backend."})}),"\n",(0,i.jsx)(t.h2,{id:"introducing-grpc-runtime-in-metatype",children:"Introducing gRPC Runtime in Metatype"}),"\n",(0,i.jsx)(t.p,{children:"The new gRPC Runtime is the latest addition to Metatype's suite of runtimes, joining existing options like the HTTP runtime. This expansion allows you to incorporate gRPC services into your typegraphs, further enhancing the versatility of your Metatype-powered backends."}),"\n",(0,i.jsx)(t.h2,{id:"key-technical-details",children:"Key Technical Details"}),"\n",(0,i.jsx)(t.h3,{id:"architecture",children:"Architecture"}),"\n",(0,i.jsx)(t.p,{children:"The gRPC Runtime integrates seamlessly with Metatype's existing architecture. It acts as a bridge between your typegraph and external gRPC services, allowing you to incorporate gRPC calls alongside other runtime operations in your backend logic."}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"GrpcRuntime Class"}),": The main interface for defining gRPC interactions within your typegraph."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"proto_file"}),": Path to the .proto file that defines the gRPC service."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"endpoint"}),": The gRPC server address in the format ",(0,i.jsx)(t.code,{children:"tcp://dev
subcommand",id:"1-dev-subcommand",level:3},{value:"2. typegate
subcommand",id:"2-typegate-subcommand",level:3}];function r(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h3:"h3",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.em,{children:"Meta CLI"})," comes with an embedded typegate packaged inside it. A ",(0,s.jsx)(n.a,{href:"/docs/reference/typegate",children:"typegate"})," instance is where you deploy your ",(0,s.jsx)(n.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,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["If you have not installed ",(0,s.jsx)(n.em,{children:"Meta CLI"})," or you have downloaded the ",(0,s.jsx)(n.em,{children:"thin"})," version, you can check ",(0,s.jsx)(n.a,{href:"/docs/reference/meta-cli#Installation",children:"this"})," installation guide of the ",(0,s.jsx)(n.em,{children:"CLI"}),"."]})}),"\n",(0,s.jsxs)(n.h3,{id:"1-dev-subcommand",children:["1. ",(0,s.jsx)(n.code,{children:"dev"})," subcommand"]}),"\n",(0,s.jsx)(n.p,{children:"You can start the embedded typegatxe easily with default configs using the following command."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"meta dev\n"})}),"\n",(0,s.jsx)(n.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,s.jsxs)(n.h3,{id:"2-typegate-subcommand",children:["2. ",(0,s.jsx)(n.code,{children:"typegate"})," subcommand"]}),"\n",(0,s.jsxs)(n.p,{children:["Set the ",(0,s.jsx)(n.code,{children:"tg_admin_password"})," and ",(0,s.jsx)(n.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,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"export tg_secret=a4lNi0PbEItlFZbus1oeH/+wyIxi9uH6TpL8AIqIaMBNvp7SESmuUBbfUwC0prxhGhZqHw8vMDYZAGMhSZ4fLw== tg_admin_password=password\n"})}),"\n",(0,s.jsx)(n.p,{children:"Run the instance"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"meta typegate\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The typegate instance runs on port ",(0,s.jsx)(n.code,{children:"7890"})," by default. You can check if the typegate node is running by accessing ",(0,s.jsx)(n.a,{href:"http://localhost:7890",children:"http://localhost:7890"})," in your browser."]})]})}function i(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(r,{...e})}):r(e)}},49447:(e,n,t)=>{"use strict";t.r(n),t.d(n,{assets:()=>v,contentTitle:()=>b,default:()=>T,frontMatter:()=>j,metadata:()=>w,toc:()=>k});var s=t(86070),a=t(25710),o=t(14344),r=t(96503),i=t(22356),c=t(65480),d=t(27676),l=t(7871),p=t(65671);function h(e){const n={a:"a",code:"code",em:"em",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["To bootstrap a python ",(0,s.jsx)(n.code,{children:"Metatype"})," project, run the following commands on your terminal."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# create startup files\nmeta new --template python\n\n# install dependencies\npoetry install\n\n# create and activate virtual environment\npoetry shell\n"})}),"\n",(0,s.jsx)(n.p,{children:"This will create the necessary files for development, some of which are:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:".graphqlrc.yaml"}),": configuration file to define settings and options related to GraphQL."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"compose.yml"}),": is where the typegate node and similar services are setup."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"metatype.yaml"}),": is where you configure different variables such as authentication, secrets... used by the backend."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The command also creates a directory called ",(0,s.jsx)(n.code,{children:"api"})," where you will be building much of your applications's business logic. Inside the ",(0,s.jsx)(n.code,{children:"api"})," directory, you will find a single file called ",(0,s.jsx)(n.code,{children:"example.py"})," which defines a simple ",(0,s.jsx)(n.a,{href:"/docs/reference/typegraph",children:"Typegraph"}),"."]}),"\n",(0,s.jsx)(l.A,{language:"python",children:t(25063).content}),"\n",(0,s.jsxs)(n.p,{children:["Let's break down the above code snippet. The ",(0,s.jsx)(n.code,{children:"example"})," function is where most of the logic lives. You need to decorate the function with ",(0,s.jsx)(n.code,{children:"@typegraph()"})," from the typegraph SDK. Inside the function, you have different components of your application."]}),"\n",(0,s.jsxs)(n.p,{children:["Metatype uses Policy Based ",(0,s.jsx)(n.a,{href:"/docs/reference/policies",children:"Access Control"})," for accessing resources in your backend and here you have defined a public access."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python3",children:"public = Policy.public()\n"})}),"\n",(0,s.jsxs)(n.p,{children:["There is a runtime defined namely ",(0,s.jsx)(n.a,{href:"/docs/reference/runtimes/python",children:"PythonRuntime"}),". You will be using the runtime to perform different data operations along with the other ",(0,s.jsx)(n.a,{href:"/docs/reference/runtimes",children:"runtimes"})," Metatype provides."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python3",children:"python = PythonRuntime()\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Now that you have runtimes to process data and you have specified access control, you need to define endpoints to communicate with your backend. This is where you use the ",(0,s.jsx)(n.code,{children:"g.expose"})," method to enumerate the endpoints you want in your application. From the starter file, you can see that you have defined an endpoint ",(0,s.jsx)(n.code,{children:"hello"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python3",children:'# custom functions\nhello = python.from_lambda(\n t.struct({"world": t.string()}),\n t.string(),\n lambda x: f"Hello {x[\'world\']}!",\n)\n\ng.expose(public, hello=hello)\n'})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"hello"})," endpoint is mapped with a ",(0,s.jsx)(n.code,{children:"custom function"})," which accepts a ",(0,s.jsx)(n.code,{children:"string"})," and returns ",(0,s.jsx)(n.strong,{children:"hello"})," concatinated with the ",(0,s.jsx)(n.code,{children:"string"}),". The processing of data is done using the ",(0,s.jsx)(n.code,{children:"PythonRuntime"}),". When you are defining the custom function, you pass the input type, output type and then a ",(0,s.jsx)(n.a,{href:"/docs/concepts/mental-model#functions",children:"function"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["That's it! You have created your first ",(0,s.jsx)(n.code,{children:"Metatype"})," app. It's as easy as this. Before you go ahead and test your app, let's add two more endpoints which peform basic ",(0,s.jsx)(n.code,{children:"Create"})," and ",(0,s.jsx)(n.code,{children:"Read"})," database operation."]}),"\n",(0,s.jsxs)(n.p,{children:["In order to exercise database capabilities, you need to build a table schema or a model. The typegraph SDK provides rich ",(0,s.jsx)(n.a,{href:"/docs/reference/types",children:"Types"})," which you can use to create any database table that fits to your usecase. Let's create a simple Message table which has fields ",(0,s.jsx)(n.code,{children:"id"}),", ",(0,s.jsx)(n.code,{children:"title"})," and ",(0,s.jsx)(n.code,{children:"body"}),". This is what it will look like in code."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python3",children:'message = t.struct(\n {\n id"": t.integer(as_id=True, config=["auto"]),\n "title": t.string(),\n "body": t.string(),\n },\n name="message",\n)\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Great! Now you need a runtime which processes database requests. You will be using another runtime that comes out of the box with ",(0,s.jsx)(n.code,{children:"Metatype"}),". i.e the ",(0,s.jsx)(n.a,{href:"/docs/reference/runtimes/prisma",children:"PrismaRuntime"}),". Let's go ahead and introduce the ",(0,s.jsx)(n.code,{children:"PrismaRuntime"})," to your app. You can add the following code below the ",(0,s.jsx)(n.code,{children:"PythonRuntime"})," that was predefined."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python3",children:'...\npython = PythonRuntime()\ndb = PrismaRuntime("database", "POSTGRES_CONN")\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Last, you need to expose a ",(0,s.jsx)(n.code,{children:"Create"})," and ",(0,s.jsx)(n.code,{children:"Read"})," endpoints to your database table. Let's add these two lines to ",(0,s.jsx)(n.code,{children:"g.expose"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python3",children:"...\ng.expose(\n public,\n hello=hello,\n create_message=db.create(message),\n list_messages=db.find_many(message),\n)\n"})}),"\n",(0,s.jsxs)(n.p,{children:["With these simple steps, you were able to build a basic backend with database capabilities. Finally, this is what your typegraph looks like in ",(0,s.jsx)(n.code,{children:"example.py"}),"."]}),"\n",(0,s.jsx)(l.A,{language:"python",children:t(12599).content}),"\n",(0,s.jsxs)(n.p,{children:["You are almost there to test your first ",(0,s.jsx)(n.code,{children:"Metatype"})," application. You now need to spin a ",(0,s.jsx)(n.a,{href:"/docs/reference/typegate",children:"Tyepgate"})," and deploy your typegraph to the instance. You can leverage the embedded typegate that comes with the ",(0,s.jsx)(n.em,{children:"Meta CLI"}),". To run the ",(0,s.jsx)(n.a,{href:"/docs/reference/meta-cli/embedded-typegate",children:"embedded typegate"}),", execute the following command from your terminal."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"meta dev\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Once you started your typegate instance using one of the available choice, if you open ",(0,s.jsx)(n.a,{href:"http://localhost:7890",children:"localhost:7890"})," in your browser, you will get a webpage similar to this one."]}),"\n",(0,s.jsx)("img",{src:"/images/tutorial/running-typegate.png",alt:"running typegate"}),"\n",(0,s.jsxs)(n.p,{children:["To deploy your typegraph to the typegate engine, there are two approaces you can follow. You can either use ",(0,s.jsx)(n.a,{href:"/docs/guides/programmatic-deployment",children:"self-deploy"})," which comes with the typegraph SDK or the ",(0,s.jsx)(n.a,{href:"/docs/reference/meta-cli",children:"Meta CLI"}),". For now, you will be deploying your typegraph using the ",(0,s.jsx)(n.code,{children:"Meta CLI"}),". Execute the command below on your terminal to deploy the typegraph."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"meta deploy -f api/example.py --allow-dirty --create-migration --target dev --gate http://localhost:7890\n"})}),"\n",(0,s.jsx)(n.p,{children:"Upon successful deployment of the typegraph, you should recieve a response similar like this."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-console",children:'(example-py3.11) user@pc first-project % meta deploy -f api/example.py --allow-dirty --create-migration --target dev --gate http://localhost:7890\n[INFO] Loading module "/Users/user/Documents/metatype-playground/projects/first-project/api/example.py"\n[INFO] Loaded 1 typegraph from "/Users/user/Documents/metatype-playground/projects/first-project/api/example.py": example\n[INFO] All modules have been loaded. Stopping the loader.\n[INFO] Pushing typegraph example (from \'/Users/user/Documents/metatype-playground/projects/first-project/api/example.py\')\n[INFO] \u2713 Successfully pushed typegraph example.\n'})}),"\n",(0,s.jsxs)(n.p,{children:["You have deployed your first typegraph. It's time to run and test your backend which is running on your typegate instance. Click ",(0,s.jsx)(n.a,{href:"http://localhost:7890/example",children:"here"})," to open a ",(0,s.jsx)(n.code,{children:"GraphiQL"})," interface and interact with your backend through ",(0,s.jsx)(n.code,{children:"graphql"})," queries from your browser. You should get a page similar to the one below."]}),"\n",(0,s.jsx)("img",{src:"/images/tutorial/tg-on-typegate.png",alt:"typegraph on typegate"}),"\n",(0,s.jsxs)(n.p,{children:["Now you can play with your app through the interface. You can try this ",(0,s.jsx)(n.code,{children:"graphql"})," query as a start."]}),"\n",(0,s.jsx)(n.p,{children:"Create a message using the following mutation."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-graphql",children:'mutation {\n create_message(\n data: {\n title: "First typegraph"\n body: "Congrats on your first typegraph."\n }\n ) {\n id\n }\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Then, fetch the created message using the query below."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-graphql",children:"query {\n list_messages\n}\n"})}),"\n",(0,s.jsx)(n.p,{children:"You should get a response from the typegate similar to then one below."}),"\n",(0,s.jsx)("img",{src:"/images/tutorial/query-result.png",alt:"query result"}),"\n",(0,s.jsx)(n.p,{children:"You can also try out what you have built so far here on this playground."}),"\n",(0,s.jsx)(p.A,{typegraph:"quick-start-project",python:t(12599),query:t(84443)})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}function m(e){const n={a:"a",code:"code",em:"em",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["There are two variations to write your app using Typescript. You can either use ",(0,s.jsx)(n.code,{children:"node"})," or ",(0,s.jsx)(n.code,{children:"deno"})," as the TypeScript runtime. For now, you will be using ",(0,s.jsx)(n.code,{children:"node"}),". To bootstrap a node ",(0,s.jsx)(n.code,{children:"Metatype"})," project, you can run the following commands."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# create startup files\nmeta new --template node\n\n# install dependencies\nnpm install\n"})}),"\n",(0,s.jsx)(n.p,{children:"This will create the necessary files for development, some of which are:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:".graphqlrc.yaml"}),": configuration file to define settings and options related to GraphQL."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"compose.yml"}),": is where the typegate node and similar services are setup."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"metatype.yaml"}),": is where you configure different variables such as authentication, secrets... used by the backend."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The command also creates a directory called ",(0,s.jsx)(n.code,{children:"api"})," where you will be building much of your applications's business logic. Inside the ",(0,s.jsx)(n.code,{children:"api"})," directory, you will find a single file called ",(0,s.jsx)(n.code,{children:"example.ts"})," which defines a simple ",(0,s.jsx)(n.a,{href:"/docs/reference/typegraph",children:"Typegraph"}),"."]}),"\n",(0,s.jsx)(l.A,{language:"typescript",children:t(1755).content}),"\n",(0,s.jsxs)(n.p,{children:["Let's break down the above code snippet. The ",(0,s.jsx)(n.code,{children:"typegraph"})," function is your building block and it encompasses most of the app logic inside. It takes a name and a callback function as an argument. All the magic is done inside the callback function."]}),"\n",(0,s.jsxs)(n.p,{children:["Metatype uses Policy Based ",(0,s.jsx)(n.a,{href:"/docs/reference/policies",children:"Access Control"})," for accessing resources in your backend and here you have defined a public access."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"const pub = Policy.public();\n"})}),"\n",(0,s.jsxs)(n.p,{children:["There are two runtimes defined namely ",(0,s.jsx)(n.a,{href:"/docs/reference/runtimes/python",children:"PythonRuntime"})," and ",(0,s.jsx)(n.a,{href:"/docs/reference/runtimes/deno",children:"DenoRuntime"}),". You will be using these two runtimes to perform different data operations along with the other ",(0,s.jsx)(n.a,{href:"/docs/reference/runtimes",children:"runtimes"})," Metatype provides."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"const deno = new DenoRuntime();\nconst python = new PythonRuntime();\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Now that you have runtimes to process data and you have specified your access control, you need to define endpoints to communicate with your backend. This is where you use the ",(0,s.jsx)(n.code,{children:"g.expose"})," method to enumerate the endpoints you want in your application. From the starter file, you can see that you have defined two endpoints, ",(0,s.jsx)(n.code,{children:"add"})," and ",(0,s.jsx)(n.code,{children:"multiply"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"g.expose({\n add: python\n .fromLambda(t.struct({ first: t.float(), second: t.float() }), t.float(), {\n code: \"lambda x: x['first'] + x['second']\",\n })\n .withPolicy(pub),\n multiply: deno\n .func(t.struct({ first: t.float(), second: t.float() }), t.float(), {\n code: \"({first, second}) => first * second\",\n })\n .withPolicy(pub),\n});\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Let's dive into what the ",(0,s.jsx)(n.code,{children:"add"})," endpoint is doing. The ",(0,s.jsx)(n.code,{children:"add"})," endpoint defines a ",(0,s.jsx)(n.code,{children:"custom function"})," which does data processing using the ",(0,s.jsx)(n.code,{children:"PythonRuntime"}),". When you are defining the custom function, you pass the input type, output type and then a ",(0,s.jsx)(n.a,{href:"/docs/concepts/mental-model#functions",children:"function"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["That's it! You have created your first ",(0,s.jsx)(n.code,{children:"Metatype"})," app. It's as easy as this. Before you go ahead and test your app, let's add two more endpoints which peform basic ",(0,s.jsx)(n.code,{children:"Create"})," and ",(0,s.jsx)(n.code,{children:"Read"})," database operation."]}),"\n",(0,s.jsxs)(n.p,{children:["In order to exercise database capabilities, you need to build a table schema or a model. The typegraph SDK provides rich ",(0,s.jsx)(n.a,{href:"/docs/reference/types",children:"Types"})," which you can use to create any database table that fits to your usecase. Let's create a simple Message table which has fields ",(0,s.jsx)(n.code,{children:"id"}),", ",(0,s.jsx)(n.code,{children:"title"})," and ",(0,s.jsx)(n.code,{children:"body"}),". This is what it will look like in code."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'const message = t.struct(\n {\n id: t.integer({}, { asId: true, config: { auto: true } }), // configuring your primary key\n title: t.string(),\n body: t.string(),\n },\n { name: "message" }, // the name of your type\n);\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Great! Now you need a runtime which processes database requests. You will be using another runtime that comes out of the box with ",(0,s.jsx)(n.code,{children:"Metatype"}),". i.e the ",(0,s.jsx)(n.a,{href:"/docs/reference/runtimes/prisma",children:"PrismaRuntime"}),". Let's go ahead and introduce the ",(0,s.jsx)(n.code,{children:"PrismaRuntime"})," to your app. You can add the following code below the two runtimes that were predefined."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'...\nconst python = new PythonRuntime();\nconst db = new PrismaRuntime("database", "POSTGRES_CONN");\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Last, you need to expose a ",(0,s.jsx)(n.code,{children:"Create"})," and ",(0,s.jsx)(n.code,{children:"Read"})," endpoints to your database table. Let's add these two lines to ",(0,s.jsx)(n.code,{children:"g.expose"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"...\ng.expose({\n ...,\n // add following to your typegraph\n create_message: db.create(message).withPolicy(pub),\n list_messages: db.findMany(message).withPolicy(pub),\n});\n"})}),"\n",(0,s.jsxs)(n.p,{children:["With these three simple steps, you were able to build a basic backend with database capabilities. Finally, this is what your typegraph looks like in ",(0,s.jsx)(n.code,{children:"example.ts"}),"."]}),"\n",(0,s.jsx)(l.A,{language:"typescript",children:t(5641).content}),"\n",(0,s.jsxs)(n.p,{children:["You are almost there to test your first ",(0,s.jsx)(n.code,{children:"Metatype"})," application. You now need to spin a ",(0,s.jsx)(n.a,{href:"/docs/reference/typegate",children:"Tyepgate"})," and deploy your typegraph to the instance. You can leverage the embedded typegate that comes with the ",(0,s.jsx)(n.em,{children:"Meta CLI"}),". To run the ",(0,s.jsx)(n.a,{href:"/docs/reference/meta-cli/embedded-typegate",children:"embedded typegate"}),", execute the following command from your terminal."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"meta dev\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Once you started your typegate instance using one of the available choice, if you open ",(0,s.jsx)(n.a,{href:"http://localhost:7890",children:"localhost:7890"})," in your browser, you will get a webpage similar to this one."]}),"\n",(0,s.jsx)("img",{src:"/images/tutorial/running-typegate.png",alt:"running typegate"}),"\n",(0,s.jsxs)(n.p,{children:["To deploy your typegraph to the typegate engine, there are two approaces you can follow. You can either use ",(0,s.jsx)(n.code,{children:"self-deploy"})," which comes with the typegraph SDK or the ",(0,s.jsx)(n.a,{href:"/docs/reference/meta-cli",children:"Meta CLI"}),". For now, you will be deploying your typegraph using the ",(0,s.jsx)(n.code,{children:"Meta CLI"}),". Execute the command below on your terminal to deploy the typegraph."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"meta deploy -f api/example.ts --allow-dirty --create-migration --target dev --gate http://localhost:7890\n"})}),"\n",(0,s.jsx)(n.p,{children:"Upon successful deployment of the typegraph, you should recieve a response similar like this."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-console",children:'(example-py3.11) user@pc first-project % meta deploy -f api/example.py --allow-dirty --create-migration --target dev --gate http://localhost:7890\n[INFO] Loading module "/Users/user/Documents/metatype-playground/projects/first-project/api/example.ts"\n[INFO] Loaded 1 typegraph from "/Users/user/Documents/metatype-playground/projects/first-project/api/example.ts": example\n[INFO] All modules have been loaded. Stopping the loader.\n[INFO] Pushing typegraph example (from \'/Users/user/Documents/metatype-playground/projects/first-project/api/example.ts\')\n[INFO] \u2713 Successfully pushed typegraph example.\n'})}),"\n",(0,s.jsxs)(n.p,{children:["You have deployed your first typegraph. It's time to run and test your backend which is running on the typegate instance. Click ",(0,s.jsx)(n.a,{href:"http://localhost:7890/example",children:"here"})," to open a ",(0,s.jsx)(n.code,{children:"GraphiQL"})," interface and interact with your backend through ",(0,s.jsx)(n.code,{children:"graphql"})," queries from your browser. You should get a page similar to the one below."]}),"\n",(0,s.jsx)("img",{src:"/images/tutorial/tg-on-typegate.png",alt:"typegraph on typegate"}),"\n",(0,s.jsxs)(n.p,{children:["Now you can play with your app through the interface. You can try this ",(0,s.jsx)(n.code,{children:"graphql"})," query as a start."]}),"\n",(0,s.jsx)(n.p,{children:"Create a message using the following mutation."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-graphql",children:'mutation {\n create_message(\n data: {\n title: "First typegraph"\n body: "Congrats on your first typegraph."\n }\n ) {\n id\n }\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Then, fetch the created message using the query below."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-graphql",children:"query {\n list_messages\n}\n"})}),"\n",(0,s.jsx)(n.p,{children:"You should get a response from the typegate similar to then one below."}),"\n",(0,s.jsx)("img",{src:"/images/tutorial/query-result.png",alt:"query result"}),"\n",(0,s.jsx)(n.p,{children:"You can also try out what you have built so far here on this playground."}),"\n",(0,s.jsx)(p.A,{typegraph:"quick-start-project",typescript:t(5641),query:t(84443)})]})}function y(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(m,{...e})}):m(e)}const g=[];function x(e){const n={a:"a",code:"code",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["Now you are ready to develop for your first app! You can use ",(0,s.jsx)(n.a,{href:"#4-verify-your-installation",children:"meta doctor"})," to check if neccessary components are installed. Let's start by creating a working directory for the project. Open your terminal and run the following commands."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"mkdir first-project\ncd first-project\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Now that you have your workspace and development environment setup, let's start building a simple ",(0,s.jsx)(n.code,{children:"CRUD"})," application."]}),"\n",(0,s.jsxs)(n.p,{children:["The SDK used for developing ",(0,s.jsx)(n.code,{children:"Metatype"})," applications is the ",(0,s.jsx)(n.a,{href:"/docs/reference/typegraph",children:"Typegraph"}),". Currently, it's available through Typescript and Python."]}),"\n",(0,s.jsxs)(c.Ay,{children:[(0,s.jsx)(d.A,{value:"typescript",children:(0,s.jsx)(y,{})}),(0,s.jsx)(d.A,{value:"python",children:(0,s.jsx)(u,{})})]})]})}function f(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(x,{...e})}):x(e)}const j={sidebar_position:1},b="Quick-start",w={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.",source:"@site/docs/tutorials/quick-start/index.mdx",sourceDirName:"tutorials/quick-start",slug:"/tutorials/quick-start/",permalink:"/docs/tutorials/quick-start/",draft:!1,unlisted:!1,editUrl:"https://github.com/metatypedev/metatype/tree/main/docs/metatype.dev/docs/tutorials/quick-start/index.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"docs",previous:{title:"Getting started",permalink:"/docs/"},next:{title:"Metatype Basics",permalink:"/docs/tutorials/metatype-basics/"}},v={},k=[{value:"1. Meta CLI",id:"1-meta-cli",level:2},...o.RM,{value:"2. Typegraph SDK",id:"2-typegraph-sdk",level:2},...i.RM,{value:"3. Typegate node",id:"3-typegate-node",level:2},...r.RM,{value:"4. Verify your installation",id:"4-verify-your-installation",level:2},{value:"Writing your First App",id:"writing-your-first-app",level:2},...g];function N(e){const n={admonition:"admonition",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"quick-start",children:"Quick-start"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"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."})}),"\n",(0,s.jsx)(n.admonition,{title:"You will learn",type:"note",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"how to install the Metatype SDKs and tools."}),"\n",(0,s.jsx)(n.li,{children:"how to create and run a Metatype app."}),"\n"]})}),"\n",(0,s.jsx)(n.h2,{id:"1-meta-cli",children:"1. Meta CLI"}),"\n",(0,s.jsx)(o.Ay,{}),"\n",(0,s.jsx)(n.h2,{id:"2-typegraph-sdk",children:"2. Typegraph SDK"}),"\n",(0,s.jsx)(i.Ay,{}),"\n",(0,s.jsx)(n.h2,{id:"3-typegate-node",children:"3. Typegate node"}),"\n",(0,s.jsx)(r.Ay,{}),"\n",(0,s.jsx)(n.h2,{id:"4-verify-your-installation",children:"4. Verify your installation"}),"\n",(0,s.jsx)(n.p,{children:"The doctor subcommand will attempt to detect all the components and report any potential issue. Please make sure to run it before opening an issue and include the output in your report."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"meta doctor\n"})}),"\n",(0,s.jsx)(n.p,{children:"After Sucessful installation, the above command produces an output somewhat similar to the one below."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-console",children:"user@first-project:~$ meta doctor\n\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014 Global \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\ncurr. directory /Users/user/Documents/metatype-playground/projects/first-project\nglobal config /Users/user/Library/Application Support/dev.metatype.meta/config.json\nmeta-cli version 0.3.6\ndocker version Docker version 24.0.7, build afdd53b\ncontainers bitnami/minio:2022 (Up 3 days), postgres:15 (Up 3 days), bitnami/redis:7.0 (Up 3 days), envoyproxy/envoy:v1.26-latest (Up 3 days), redis:7 (Up 3 days), rabbitmq:3-management (Up 45 hours)\n\n\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014 Project \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\nmetatype file metatype.yaml\ntargets [2] deploy (remote, 3 secrets), dev (local, 3 secrets)\ntypegraphs [0]\n\n\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014 Python SDK \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\npython version Python 3.11.3\npython bin ../../../../../../Library/Caches/pypoetry/virtualenvs/example-paIt3smx-py3.11/bin/python\nvenv folder not found\npyproject file pyproject.toml\npipfile file not found\nrequirements file not found\ntypegraph version 0.3.6\n\n\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014 Typescript SDK \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\ndeno version deno 1.39.4\nnode version v18.16.0\n\n\u250c\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2510\n| In case of issue or question, please raise a ticket on: |\n| https://github.com/metatypedev/metatype/issues |\n| Or browse the documentation: |\n| https://metatype.dev/docs |\n\u2514\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2518\n"})}),"\n",(0,s.jsx)(n.h2,{id:"writing-your-first-app",children:"Writing your First App"}),"\n",(0,s.jsx)(f,{})]})}function T(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(N,{...e})}):N(e)}},25459:(e,n,t)=>{"use strict";t.d(n,{A:()=>r});t(30758);var s=t(54133),a=t(56315),o=t(86070);function r(e){let{children:n}=e;const[t,r]=(0,s.d)();return(0,o.jsx)(a.mS,{choices:{poetry:"poetry",pip:"pip"},choice:t,onChange:r,children:n})}},65480:(e,n,t)=>{"use strict";t.d(n,{Ay:()=>r,gc:()=>i});t(30758);var s=t(3733),a=t(56315),o=t(86070);function r(e){let{children:n}=e;const[t,r]=(0,s.e)();return(0,o.jsx)(a.mS,{choices:{typescript:"Typescript SDK",python:"Python SDK"},choice:t,onChange:r,children:n})}function i(e){let{children:n}=e;const[t]=(0,s.e)();return(0,o.jsx)(a.q9,{choices:{typescript:"Typescript SDK",python:"Python SDK"},choice:t,children:n})}},65671:(e,n,t)=>{"use strict";t.d(n,{A:()=>o});var s=t(98302),a=(t(30758),t(86070));function o(e){let{python:n,typescript:t,rust:o,...r}=e;const i=[n&&{content:n.content,codeLanguage:"python",codeFileUrl:n.path},t&&{content:t.content,codeLanguage:"typescript",codeFileUrl:t.path},o&&{content:o.content,codeLanguage:"rust",codeFileUrl:o.path}].filter((e=>!!e));return(0,a.jsx)(s.A,{code:0==i.length?void 0:i,...r})}},9234:(e,n,t)=>{"use strict";t.d(n,{A:()=>r});t(30758);var s=t(54133),a=t(56315),o=t(86070);function r(e){let{children:n}=e;const[t,r]=(0,s.a)();return(0,o.jsx)(a.mS,{choices:{pnpm:"pnpm",npm:"npm",jsr:"jsr",deno:"deno",yarn:"yarn",bun:"bun"},choice:t,onChange:r,children:n})}},54133:(e,n,t)=>{"use strict";t.d(n,{a:()=>y,d:()=>g});var s=t(62104),a=t(12452),o=t(58346),r=t(40006),i=t(30758);const c="tsPackageManager",d="pythonPackageManager",l=(0,o.N)(),p=(0,s.eU)((e=>e(l).searchParams?.get(c)),((e,n,t)=>{const s=e(l).searchParams??new URLSearchParams;s.set(c,t),n(l,(e=>({...e,searchParams:s})))})),h=(0,s.eU)((e=>e(l).searchParams?.get(d)),((e,n,t)=>{const s=e(l).searchParams??new URLSearchParams;s.set(d,t),n(l,(e=>({...e,searchParams:s})))})),u=(0,r.tG)(c,"npm",(0,r.KU)((()=>sessionStorage))),m=(0,r.tG)(d,"poetry",(0,r.KU)((()=>sessionStorage)));function y(){const[e,n]=(0,a.fp)(p),[t,s]=(0,a.fp)(u);(0,i.useEffect)((()=>{e&&e!==t&&s(e)}),[e,s]);const o=(0,i.useCallback)((e=>{n(e),s(e)}),[n,s]);return[e??t,o]}function g(){const[e,n]=(0,a.fp)(h),[t,s]=(0,a.fp)(m);(0,i.useEffect)((()=>{e&&e!==t&&s(e)}),[e,s]);const o=(0,i.useCallback)((e=>{n(e),s(e)}),[n,s]);return[e??t,o]}},84443:e=>{var n={kind:"Document",definitions:[{kind:"OperationDefinition",operation:"mutation",name:{kind:"Name",value:"CreateMessage"},variableDefinitions:[],directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"Field",name:{kind:"Name",value:"create_message"},arguments:[{kind:"Argument",name:{kind:"Name",value:"data"},value:{kind:"ObjectValue",fields:[{kind:"ObjectField",name:{kind:"Name",value:"title"},value:{kind:"StringValue",value:"First typegraph",block:!1}},{kind:"ObjectField",name:{kind:"Name",value:"body"},value:{kind:"StringValue",value:"Congrats on your first typegraph.",block:!1}}]}}],directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"Field",name:{kind:"Name",value:"id"},arguments:[],directives:[]}]}}]}},{kind:"OperationDefinition",operation:"query",name:{kind:"Name",value:"ListMessages"},variableDefinitions:[],directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"Field",name:{kind:"Name",value:"list_messages"},arguments:[],directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"Field",name:{kind:"Name",value:"id"},arguments:[],directives:[]},{kind:"Field",name:{kind:"Name",value:"title"},arguments:[],directives:[]},{kind:"Field",name:{kind:"Name",value:"body"},arguments:[],directives:[]}]}}]}}],loc:{start:0,end:231}};n.loc.source={body:'mutation CreateMessage {\n create_message(\n data: {\n title: "First typegraph"\n body: "Congrats on your first typegraph."\n }\n ) {\n id\n }\n}\n\nquery ListMessages {\n list_messages {\n id\n title\n body\n }\n}\n',name:"GraphQL request",locationOffset:{line:1,column:1}};function t(e,n){if("FragmentSpread"===e.kind)n.add(e.name.value);else if("VariableDefinition"===e.kind){var s=e.type;"NamedType"===s.kind&&n.add(s.name.value)}e.selectionSet&&e.selectionSet.selections.forEach((function(e){t(e,n)})),e.variableDefinitions&&e.variableDefinitions.forEach((function(e){t(e,n)})),e.definitions&&e.definitions.forEach((function(e){t(e,n)}))}var s={};function a(e,n){for(var t=0;tdev
subcommand",id:"1-dev-subcommand",level:3},{value:"2. typegate
subcommand",id:"2-typegate-subcommand",level:3}];function r(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h3:"h3",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.em,{children:"Meta CLI"})," comes with an embedded typegate packaged inside it. A ",(0,s.jsx)(n.a,{href:"/docs/reference/typegate",children:"typegate"})," instance is where you deploy your ",(0,s.jsx)(n.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,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["If you have not installed ",(0,s.jsx)(n.em,{children:"Meta CLI"})," or you have downloaded the ",(0,s.jsx)(n.em,{children:"thin"})," version, you can check ",(0,s.jsx)(n.a,{href:"/docs/reference/meta-cli#Installation",children:"this"})," installation guide of the ",(0,s.jsx)(n.em,{children:"CLI"}),"."]})}),"\n",(0,s.jsxs)(n.h3,{id:"1-dev-subcommand",children:["1. ",(0,s.jsx)(n.code,{children:"dev"})," subcommand"]}),"\n",(0,s.jsx)(n.p,{children:"You can start the embedded typegatxe easily with default configs using the following command."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"meta dev\n"})}),"\n",(0,s.jsx)(n.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,s.jsxs)(n.h3,{id:"2-typegate-subcommand",children:["2. ",(0,s.jsx)(n.code,{children:"typegate"})," subcommand"]}),"\n",(0,s.jsxs)(n.p,{children:["Set the ",(0,s.jsx)(n.code,{children:"tg_admin_password"})," and ",(0,s.jsx)(n.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,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"export tg_secret=a4lNi0PbEItlFZbus1oeH/+wyIxi9uH6TpL8AIqIaMBNvp7SESmuUBbfUwC0prxhGhZqHw8vMDYZAGMhSZ4fLw== tg_admin_password=password\n"})}),"\n",(0,s.jsx)(n.p,{children:"Run the instance"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"meta typegate\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The typegate instance runs on port ",(0,s.jsx)(n.code,{children:"7890"})," by default. You can check if the typegate node is running by accessing ",(0,s.jsx)(n.a,{href:"http://localhost:7890",children:"http://localhost:7890"})," in your browser."]})]})}function i(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(r,{...e})}):r(e)}},49447:(e,n,t)=>{"use strict";t.r(n),t.d(n,{assets:()=>v,contentTitle:()=>b,default:()=>T,frontMatter:()=>j,metadata:()=>w,toc:()=>k});var s=t(86070),a=t(25710),o=t(14344),r=t(96503),i=t(22356),c=t(65480),d=t(27676),l=t(7871),p=t(65671);function h(e){const n={a:"a",code:"code",em:"em",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["To bootstrap a python ",(0,s.jsx)(n.code,{children:"Metatype"})," project, run the following commands on your terminal."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# create startup files\nmeta new --template python\n\n# install dependencies\npoetry install\n\n# create and activate virtual environment\npoetry shell\n"})}),"\n",(0,s.jsx)(n.p,{children:"This will create the necessary files for development, some of which are:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:".graphqlrc.yaml"}),": configuration file to define settings and options related to GraphQL."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"compose.yml"}),": is where the typegate node and similar services are setup."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"metatype.yaml"}),": is where you configure different variables such as authentication, secrets... used by the backend."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The command also creates a directory called ",(0,s.jsx)(n.code,{children:"api"})," where you will be building much of your applications's business logic. Inside the ",(0,s.jsx)(n.code,{children:"api"})," directory, you will find a single file called ",(0,s.jsx)(n.code,{children:"example.py"})," which defines a simple ",(0,s.jsx)(n.a,{href:"/docs/reference/typegraph",children:"Typegraph"}),"."]}),"\n",(0,s.jsx)(l.A,{language:"python",children:t(25063).content}),"\n",(0,s.jsxs)(n.p,{children:["Let's break down the above code snippet. The ",(0,s.jsx)(n.code,{children:"example"})," function is where most of the logic lives. You need to decorate the function with ",(0,s.jsx)(n.code,{children:"@typegraph()"})," from the typegraph SDK. Inside the function, you have different components of your application."]}),"\n",(0,s.jsxs)(n.p,{children:["Metatype uses Policy Based ",(0,s.jsx)(n.a,{href:"/docs/reference/policies",children:"Access Control"})," for accessing resources in your backend and here you have defined a public access."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python3",children:"public = Policy.public()\n"})}),"\n",(0,s.jsxs)(n.p,{children:["There is a runtime defined namely ",(0,s.jsx)(n.a,{href:"/docs/reference/runtimes/python",children:"PythonRuntime"}),". You will be using the runtime to perform different data operations along with the other ",(0,s.jsx)(n.a,{href:"/docs/reference/runtimes",children:"runtimes"})," Metatype provides."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python3",children:"python = PythonRuntime()\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Now that you have runtimes to process data and you have specified access control, you need to define endpoints to communicate with your backend. This is where you use the ",(0,s.jsx)(n.code,{children:"g.expose"})," method to enumerate the endpoints you want in your application. From the starter file, you can see that you have defined an endpoint ",(0,s.jsx)(n.code,{children:"hello"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python3",children:'# custom functions\nhello = python.from_lambda(\n t.struct({"world": t.string()}),\n t.string(),\n lambda x: f"Hello {x[\'world\']}!",\n)\n\ng.expose(public, hello=hello)\n'})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"hello"})," endpoint is mapped with a ",(0,s.jsx)(n.code,{children:"custom function"})," which accepts a ",(0,s.jsx)(n.code,{children:"string"})," and returns ",(0,s.jsx)(n.strong,{children:"hello"})," concatinated with the ",(0,s.jsx)(n.code,{children:"string"}),". The processing of data is done using the ",(0,s.jsx)(n.code,{children:"PythonRuntime"}),". When you are defining the custom function, you pass the input type, output type and then a ",(0,s.jsx)(n.a,{href:"/docs/concepts/mental-model#functions",children:"function"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["That's it! You have created your first ",(0,s.jsx)(n.code,{children:"Metatype"})," app. It's as easy as this. Before you go ahead and test your app, let's add two more endpoints which peform basic ",(0,s.jsx)(n.code,{children:"Create"})," and ",(0,s.jsx)(n.code,{children:"Read"})," database operation."]}),"\n",(0,s.jsxs)(n.p,{children:["In order to exercise database capabilities, you need to build a table schema or a model. The typegraph SDK provides rich ",(0,s.jsx)(n.a,{href:"/docs/reference/types",children:"Types"})," which you can use to create any database table that fits to your usecase. Let's create a simple Message table which has fields ",(0,s.jsx)(n.code,{children:"id"}),", ",(0,s.jsx)(n.code,{children:"title"})," and ",(0,s.jsx)(n.code,{children:"body"}),". This is what it will look like in code."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python3",children:'message = t.struct(\n {\n id"": t.integer(as_id=True, config=["auto"]),\n "title": t.string(),\n "body": t.string(),\n },\n name="message",\n)\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Great! Now you need a runtime which processes database requests. You will be using another runtime that comes out of the box with ",(0,s.jsx)(n.code,{children:"Metatype"}),". i.e the ",(0,s.jsx)(n.a,{href:"/docs/reference/runtimes/prisma",children:"PrismaRuntime"}),". Let's go ahead and introduce the ",(0,s.jsx)(n.code,{children:"PrismaRuntime"})," to your app. You can add the following code below the ",(0,s.jsx)(n.code,{children:"PythonRuntime"})," that was predefined."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python3",children:'...\npython = PythonRuntime()\ndb = PrismaRuntime("database", "POSTGRES_CONN")\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Last, you need to expose a ",(0,s.jsx)(n.code,{children:"Create"})," and ",(0,s.jsx)(n.code,{children:"Read"})," endpoints to your database table. Let's add these two lines to ",(0,s.jsx)(n.code,{children:"g.expose"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python3",children:"...\ng.expose(\n public,\n hello=hello,\n create_message=db.create(message),\n list_messages=db.find_many(message),\n)\n"})}),"\n",(0,s.jsxs)(n.p,{children:["With these simple steps, you were able to build a basic backend with database capabilities. Finally, this is what your typegraph looks like in ",(0,s.jsx)(n.code,{children:"example.py"}),"."]}),"\n",(0,s.jsx)(l.A,{language:"python",children:t(12599).content}),"\n",(0,s.jsxs)(n.p,{children:["You are almost there to test your first ",(0,s.jsx)(n.code,{children:"Metatype"})," application. You now need to spin a ",(0,s.jsx)(n.a,{href:"/docs/reference/typegate",children:"Tyepgate"})," and deploy your typegraph to the instance. You can leverage the embedded typegate that comes with the ",(0,s.jsx)(n.em,{children:"Meta CLI"}),". To run the ",(0,s.jsx)(n.a,{href:"/docs/reference/meta-cli/embedded-typegate",children:"embedded typegate"}),", execute the following command from your terminal."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"meta dev\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Once you started your typegate instance using one of the available choice, if you open ",(0,s.jsx)(n.a,{href:"http://localhost:7890",children:"localhost:7890"})," in your browser, you will get a webpage similar to this one."]}),"\n",(0,s.jsx)("img",{src:"/images/tutorial/running-typegate.png",alt:"running typegate"}),"\n",(0,s.jsxs)(n.p,{children:["To deploy your typegraph to the typegate engine, there are two approaces you can follow. You can either use ",(0,s.jsx)(n.a,{href:"/docs/guides/programmatic-deployment",children:"self-deploy"})," which comes with the typegraph SDK or the ",(0,s.jsx)(n.a,{href:"/docs/reference/meta-cli",children:"Meta CLI"}),". For now, you will be deploying your typegraph using the ",(0,s.jsx)(n.code,{children:"Meta CLI"}),". Execute the command below on your terminal to deploy the typegraph."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"meta deploy -f api/example.py --allow-dirty --create-migration --target dev --gate http://localhost:7890\n"})}),"\n",(0,s.jsx)(n.p,{children:"Upon successful deployment of the typegraph, you should recieve a response similar like this."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-console",children:'(example-py3.11) user@pc first-project % meta deploy -f api/example.py --allow-dirty --create-migration --target dev --gate http://localhost:7890\n[INFO] Loading module "/Users/user/Documents/metatype-playground/projects/first-project/api/example.py"\n[INFO] Loaded 1 typegraph from "/Users/user/Documents/metatype-playground/projects/first-project/api/example.py": example\n[INFO] All modules have been loaded. Stopping the loader.\n[INFO] Pushing typegraph example (from \'/Users/user/Documents/metatype-playground/projects/first-project/api/example.py\')\n[INFO] \u2713 Successfully pushed typegraph example.\n'})}),"\n",(0,s.jsxs)(n.p,{children:["You have deployed your first typegraph. It's time to run and test your backend which is running on your typegate instance. Click ",(0,s.jsx)(n.a,{href:"http://localhost:7890/example",children:"here"})," to open a ",(0,s.jsx)(n.code,{children:"GraphiQL"})," interface and interact with your backend through ",(0,s.jsx)(n.code,{children:"graphql"})," queries from your browser. You should get a page similar to the one below."]}),"\n",(0,s.jsx)("img",{src:"/images/tutorial/tg-on-typegate.png",alt:"typegraph on typegate"}),"\n",(0,s.jsxs)(n.p,{children:["Now you can play with your app through the interface. You can try this ",(0,s.jsx)(n.code,{children:"graphql"})," query as a start."]}),"\n",(0,s.jsx)(n.p,{children:"Create a message using the following mutation."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-graphql",children:'mutation {\n create_message(\n data: {\n title: "First typegraph"\n body: "Congrats on your first typegraph."\n }\n ) {\n id\n }\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Then, fetch the created message using the query below."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-graphql",children:"query {\n list_messages\n}\n"})}),"\n",(0,s.jsx)(n.p,{children:"You should get a response from the typegate similar to then one below."}),"\n",(0,s.jsx)("img",{src:"/images/tutorial/query-result.png",alt:"query result"}),"\n",(0,s.jsx)(n.p,{children:"You can also try out what you have built so far here on this playground."}),"\n",(0,s.jsx)(p.A,{typegraph:"quick-start-project",python:t(12599),query:t(84443)})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}function m(e){const n={a:"a",code:"code",em:"em",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["There are two variations to write your app using Typescript. You can either use ",(0,s.jsx)(n.code,{children:"node"})," or ",(0,s.jsx)(n.code,{children:"deno"})," as the TypeScript runtime. For now, you will be using ",(0,s.jsx)(n.code,{children:"node"}),". To bootstrap a node ",(0,s.jsx)(n.code,{children:"Metatype"})," project, you can run the following commands."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# create startup files\nmeta new --template node\n\n# install dependencies\nnpm install\n"})}),"\n",(0,s.jsx)(n.p,{children:"This will create the necessary files for development, some of which are:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:".graphqlrc.yaml"}),": configuration file to define settings and options related to GraphQL."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"compose.yml"}),": is where the typegate node and similar services are setup."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"metatype.yaml"}),": is where you configure different variables such as authentication, secrets... used by the backend."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The command also creates a directory called ",(0,s.jsx)(n.code,{children:"api"})," where you will be building much of your applications's business logic. Inside the ",(0,s.jsx)(n.code,{children:"api"})," directory, you will find a single file called ",(0,s.jsx)(n.code,{children:"example.ts"})," which defines a simple ",(0,s.jsx)(n.a,{href:"/docs/reference/typegraph",children:"Typegraph"}),"."]}),"\n",(0,s.jsx)(l.A,{language:"typescript",children:t(1755).content}),"\n",(0,s.jsxs)(n.p,{children:["Let's break down the above code snippet. The ",(0,s.jsx)(n.code,{children:"typegraph"})," function is your building block and it encompasses most of the app logic inside. It takes a name and a callback function as an argument. All the magic is done inside the callback function."]}),"\n",(0,s.jsxs)(n.p,{children:["Metatype uses Policy Based ",(0,s.jsx)(n.a,{href:"/docs/reference/policies",children:"Access Control"})," for accessing resources in your backend and here you have defined a public access."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"const pub = Policy.public();\n"})}),"\n",(0,s.jsxs)(n.p,{children:["There are two runtimes defined namely ",(0,s.jsx)(n.a,{href:"/docs/reference/runtimes/python",children:"PythonRuntime"})," and ",(0,s.jsx)(n.a,{href:"/docs/reference/runtimes/deno",children:"DenoRuntime"}),". You will be using these two runtimes to perform different data operations along with the other ",(0,s.jsx)(n.a,{href:"/docs/reference/runtimes",children:"runtimes"})," Metatype provides."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"const deno = new DenoRuntime();\nconst python = new PythonRuntime();\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Now that you have runtimes to process data and you have specified your access control, you need to define endpoints to communicate with your backend. This is where you use the ",(0,s.jsx)(n.code,{children:"g.expose"})," method to enumerate the endpoints you want in your application. From the starter file, you can see that you have defined two endpoints, ",(0,s.jsx)(n.code,{children:"add"})," and ",(0,s.jsx)(n.code,{children:"multiply"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"g.expose({\n add: python\n .fromLambda(t.struct({ first: t.float(), second: t.float() }), t.float(), {\n code: \"lambda x: x['first'] + x['second']\",\n })\n .withPolicy(pub),\n multiply: deno\n .func(t.struct({ first: t.float(), second: t.float() }), t.float(), {\n code: \"({first, second}) => first * second\",\n })\n .withPolicy(pub),\n});\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Let's dive into what the ",(0,s.jsx)(n.code,{children:"add"})," endpoint is doing. The ",(0,s.jsx)(n.code,{children:"add"})," endpoint defines a ",(0,s.jsx)(n.code,{children:"custom function"})," which does data processing using the ",(0,s.jsx)(n.code,{children:"PythonRuntime"}),". When you are defining the custom function, you pass the input type, output type and then a ",(0,s.jsx)(n.a,{href:"/docs/concepts/mental-model#functions",children:"function"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["That's it! You have created your first ",(0,s.jsx)(n.code,{children:"Metatype"})," app. It's as easy as this. Before you go ahead and test your app, let's add two more endpoints which peform basic ",(0,s.jsx)(n.code,{children:"Create"})," and ",(0,s.jsx)(n.code,{children:"Read"})," database operation."]}),"\n",(0,s.jsxs)(n.p,{children:["In order to exercise database capabilities, you need to build a table schema or a model. The typegraph SDK provides rich ",(0,s.jsx)(n.a,{href:"/docs/reference/types",children:"Types"})," which you can use to create any database table that fits to your usecase. Let's create a simple Message table which has fields ",(0,s.jsx)(n.code,{children:"id"}),", ",(0,s.jsx)(n.code,{children:"title"})," and ",(0,s.jsx)(n.code,{children:"body"}),". This is what it will look like in code."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'const message = t.struct(\n {\n id: t.integer({}, { asId: true, config: { auto: true } }), // configuring your primary key\n title: t.string(),\n body: t.string(),\n },\n { name: "message" }, // the name of your type\n);\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Great! Now you need a runtime which processes database requests. You will be using another runtime that comes out of the box with ",(0,s.jsx)(n.code,{children:"Metatype"}),". i.e the ",(0,s.jsx)(n.a,{href:"/docs/reference/runtimes/prisma",children:"PrismaRuntime"}),". Let's go ahead and introduce the ",(0,s.jsx)(n.code,{children:"PrismaRuntime"})," to your app. You can add the following code below the two runtimes that were predefined."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'...\nconst python = new PythonRuntime();\nconst db = new PrismaRuntime("database", "POSTGRES_CONN");\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Last, you need to expose a ",(0,s.jsx)(n.code,{children:"Create"})," and ",(0,s.jsx)(n.code,{children:"Read"})," endpoints to your database table. Let's add these two lines to ",(0,s.jsx)(n.code,{children:"g.expose"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:"...\ng.expose({\n ...,\n // add following to your typegraph\n create_message: db.create(message).withPolicy(pub),\n list_messages: db.findMany(message).withPolicy(pub),\n});\n"})}),"\n",(0,s.jsxs)(n.p,{children:["With these three simple steps, you were able to build a basic backend with database capabilities. Finally, this is what your typegraph looks like in ",(0,s.jsx)(n.code,{children:"example.ts"}),"."]}),"\n",(0,s.jsx)(l.A,{language:"typescript",children:t(5641).content}),"\n",(0,s.jsxs)(n.p,{children:["You are almost there to test your first ",(0,s.jsx)(n.code,{children:"Metatype"})," application. You now need to spin a ",(0,s.jsx)(n.a,{href:"/docs/reference/typegate",children:"Tyepgate"})," and deploy your typegraph to the instance. You can leverage the embedded typegate that comes with the ",(0,s.jsx)(n.em,{children:"Meta CLI"}),". To run the ",(0,s.jsx)(n.a,{href:"/docs/reference/meta-cli/embedded-typegate",children:"embedded typegate"}),", execute the following command from your terminal."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"meta dev\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Once you started your typegate instance using one of the available choice, if you open ",(0,s.jsx)(n.a,{href:"http://localhost:7890",children:"localhost:7890"})," in your browser, you will get a webpage similar to this one."]}),"\n",(0,s.jsx)("img",{src:"/images/tutorial/running-typegate.png",alt:"running typegate"}),"\n",(0,s.jsxs)(n.p,{children:["To deploy your typegraph to the typegate engine, there are two approaces you can follow. You can either use ",(0,s.jsx)(n.code,{children:"self-deploy"})," which comes with the typegraph SDK or the ",(0,s.jsx)(n.a,{href:"/docs/reference/meta-cli",children:"Meta CLI"}),". For now, you will be deploying your typegraph using the ",(0,s.jsx)(n.code,{children:"Meta CLI"}),". Execute the command below on your terminal to deploy the typegraph."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"meta deploy -f api/example.ts --allow-dirty --create-migration --target dev --gate http://localhost:7890\n"})}),"\n",(0,s.jsx)(n.p,{children:"Upon successful deployment of the typegraph, you should recieve a response similar like this."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-console",children:'(example-py3.11) user@pc first-project % meta deploy -f api/example.py --allow-dirty --create-migration --target dev --gate http://localhost:7890\n[INFO] Loading module "/Users/user/Documents/metatype-playground/projects/first-project/api/example.ts"\n[INFO] Loaded 1 typegraph from "/Users/user/Documents/metatype-playground/projects/first-project/api/example.ts": example\n[INFO] All modules have been loaded. Stopping the loader.\n[INFO] Pushing typegraph example (from \'/Users/user/Documents/metatype-playground/projects/first-project/api/example.ts\')\n[INFO] \u2713 Successfully pushed typegraph example.\n'})}),"\n",(0,s.jsxs)(n.p,{children:["You have deployed your first typegraph. It's time to run and test your backend which is running on the typegate instance. Click ",(0,s.jsx)(n.a,{href:"http://localhost:7890/example",children:"here"})," to open a ",(0,s.jsx)(n.code,{children:"GraphiQL"})," interface and interact with your backend through ",(0,s.jsx)(n.code,{children:"graphql"})," queries from your browser. You should get a page similar to the one below."]}),"\n",(0,s.jsx)("img",{src:"/images/tutorial/tg-on-typegate.png",alt:"typegraph on typegate"}),"\n",(0,s.jsxs)(n.p,{children:["Now you can play with your app through the interface. You can try this ",(0,s.jsx)(n.code,{children:"graphql"})," query as a start."]}),"\n",(0,s.jsx)(n.p,{children:"Create a message using the following mutation."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-graphql",children:'mutation {\n create_message(\n data: {\n title: "First typegraph"\n body: "Congrats on your first typegraph."\n }\n ) {\n id\n }\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Then, fetch the created message using the query below."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-graphql",children:"query {\n list_messages\n}\n"})}),"\n",(0,s.jsx)(n.p,{children:"You should get a response from the typegate similar to then one below."}),"\n",(0,s.jsx)("img",{src:"/images/tutorial/query-result.png",alt:"query result"}),"\n",(0,s.jsx)(n.p,{children:"You can also try out what you have built so far here on this playground."}),"\n",(0,s.jsx)(p.A,{typegraph:"quick-start-project",typescript:t(5641),query:t(84443)})]})}function y(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(m,{...e})}):m(e)}const g=[];function x(e){const n={a:"a",code:"code",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["Now you are ready to develop for your first app! You can use ",(0,s.jsx)(n.a,{href:"#4-verify-your-installation",children:"meta doctor"})," to check if neccessary components are installed. Let's start by creating a working directory for the project. Open your terminal and run the following commands."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"mkdir first-project\ncd first-project\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Now that you have your workspace and development environment setup, let's start building a simple ",(0,s.jsx)(n.code,{children:"CRUD"})," application."]}),"\n",(0,s.jsxs)(n.p,{children:["The SDK used for developing ",(0,s.jsx)(n.code,{children:"Metatype"})," applications is the ",(0,s.jsx)(n.a,{href:"/docs/reference/typegraph",children:"Typegraph"}),". Currently, it's available through Typescript and Python."]}),"\n",(0,s.jsxs)(c.Ay,{children:[(0,s.jsx)(d.A,{value:"typescript",children:(0,s.jsx)(y,{})}),(0,s.jsx)(d.A,{value:"python",children:(0,s.jsx)(u,{})})]})]})}function f(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(x,{...e})}):x(e)}const j={sidebar_position:1},b="Quick-start",w={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.",source:"@site/docs/tutorials/quick-start/index.mdx",sourceDirName:"tutorials/quick-start",slug:"/tutorials/quick-start/",permalink:"/docs/tutorials/quick-start/",draft:!1,unlisted:!1,editUrl:"https://github.com/metatypedev/metatype/tree/main/docs/metatype.dev/docs/tutorials/quick-start/index.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"docs",previous:{title:"Getting started",permalink:"/docs/"},next:{title:"Metatype Basics",permalink:"/docs/tutorials/metatype-basics/"}},v={},k=[{value:"1. Meta CLI",id:"1-meta-cli",level:2},...o.RM,{value:"2. Typegraph SDK",id:"2-typegraph-sdk",level:2},...i.RM,{value:"3. Typegate node",id:"3-typegate-node",level:2},...r.RM,{value:"4. Verify your installation",id:"4-verify-your-installation",level:2},{value:"Writing your First App",id:"writing-your-first-app",level:2},...g];function N(e){const n={admonition:"admonition",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"quick-start",children:"Quick-start"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"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."})}),"\n",(0,s.jsx)(n.admonition,{title:"You will learn",type:"note",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"how to install the Metatype SDKs and tools."}),"\n",(0,s.jsx)(n.li,{children:"how to create and run a Metatype app."}),"\n"]})}),"\n",(0,s.jsx)(n.h2,{id:"1-meta-cli",children:"1. Meta CLI"}),"\n",(0,s.jsx)(o.Ay,{}),"\n",(0,s.jsx)(n.h2,{id:"2-typegraph-sdk",children:"2. Typegraph SDK"}),"\n",(0,s.jsx)(i.Ay,{}),"\n",(0,s.jsx)(n.h2,{id:"3-typegate-node",children:"3. Typegate node"}),"\n",(0,s.jsx)(r.Ay,{}),"\n",(0,s.jsx)(n.h2,{id:"4-verify-your-installation",children:"4. Verify your installation"}),"\n",(0,s.jsx)(n.p,{children:"The doctor subcommand will attempt to detect all the components and report any potential issue. Please make sure to run it before opening an issue and include the output in your report."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"meta doctor\n"})}),"\n",(0,s.jsx)(n.p,{children:"After Sucessful installation, the above command produces an output somewhat similar to the one below."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-console",children:"user@first-project:~$ meta doctor\n\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014 Global \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\ncurr. directory /Users/user/Documents/metatype-playground/projects/first-project\nglobal config /Users/user/Library/Application Support/dev.metatype.meta/config.json\nmeta-cli version 0.3.6\ndocker version Docker version 24.0.7, build afdd53b\ncontainers bitnami/minio:2022 (Up 3 days), postgres:15 (Up 3 days), bitnami/redis:7.0 (Up 3 days), envoyproxy/envoy:v1.26-latest (Up 3 days), redis:7 (Up 3 days), rabbitmq:3-management (Up 45 hours)\n\n\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014 Project \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\nmetatype file metatype.yaml\ntargets [2] deploy (remote, 3 secrets), dev (local, 3 secrets)\ntypegraphs [0]\n\n\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014 Python SDK \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\npython version Python 3.11.3\npython bin ../../../../../../Library/Caches/pypoetry/virtualenvs/example-paIt3smx-py3.11/bin/python\nvenv folder not found\npyproject file pyproject.toml\npipfile file not found\nrequirements file not found\ntypegraph version 0.3.6\n\n\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014 Typescript SDK \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\ndeno version deno 1.39.4\nnode version v18.16.0\n\n\u250c\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2510\n| In case of issue or question, please raise a ticket on: |\n| https://github.com/metatypedev/metatype/issues |\n| Or browse the documentation: |\n| https://metatype.dev/docs |\n\u2514\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2518\n"})}),"\n",(0,s.jsx)(n.h2,{id:"writing-your-first-app",children:"Writing your First App"}),"\n",(0,s.jsx)(f,{})]})}function T(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(N,{...e})}):N(e)}},25459:(e,n,t)=>{"use strict";t.d(n,{A:()=>r});t(30758);var s=t(54133),a=t(56315),o=t(86070);function r(e){let{children:n}=e;const[t,r]=(0,s.d)();return(0,o.jsx)(a.mS,{choices:{poetry:"poetry",pip:"pip"},choice:t,onChange:r,children:n})}},65480:(e,n,t)=>{"use strict";t.d(n,{Ay:()=>r,gc:()=>i});t(30758);var s=t(3733),a=t(56315),o=t(86070);function r(e){let{children:n}=e;const[t,r]=(0,s.e)();return(0,o.jsx)(a.mS,{choices:{typescript:"Typescript SDK",python:"Python SDK"},choice:t,onChange:r,children:n})}function i(e){let{children:n}=e;const[t]=(0,s.e)();return(0,o.jsx)(a.q9,{choices:{typescript:"Typescript SDK",python:"Python SDK"},choice:t,children:n})}},65671:(e,n,t)=>{"use strict";t.d(n,{A:()=>o});var s=t(98302),a=(t(30758),t(86070));function o(e){let{python:n,typescript:t,rust:o,...r}=e;const i=[n&&{content:n.content,codeLanguage:"python",codeFileUrl:n.path},t&&{content:t.content,codeLanguage:"typescript",codeFileUrl:t.path},o&&{content:o.content,codeLanguage:"rust",codeFileUrl:o.path}].filter((e=>!!e));return(0,a.jsx)(s.A,{code:0==i.length?void 0:i,...r})}},9234:(e,n,t)=>{"use strict";t.d(n,{A:()=>r});t(30758);var s=t(54133),a=t(56315),o=t(86070);function r(e){let{children:n}=e;const[t,r]=(0,s.a)();return(0,o.jsx)(a.mS,{choices:{pnpm:"pnpm",npm:"npm",jsr:"jsr",deno:"deno",yarn:"yarn",bun:"bun"},choice:t,onChange:r,children:n})}},54133:(e,n,t)=>{"use strict";t.d(n,{a:()=>y,d:()=>g});var s=t(62104),a=t(12452),o=t(58346),r=t(40006),i=t(30758);const c="tsPackageManager",d="pythonPackageManager",l=(0,o.N)(),p=(0,s.eU)((e=>e(l).searchParams?.get(c)),((e,n,t)=>{const s=e(l).searchParams??new URLSearchParams;s.set(c,t),n(l,(e=>({...e,searchParams:s})))})),h=(0,s.eU)((e=>e(l).searchParams?.get(d)),((e,n,t)=>{const s=e(l).searchParams??new URLSearchParams;s.set(d,t),n(l,(e=>({...e,searchParams:s})))})),u=(0,r.tG)(c,"npm",(0,r.KU)((()=>sessionStorage))),m=(0,r.tG)(d,"poetry",(0,r.KU)((()=>sessionStorage)));function y(){const[e,n]=(0,a.fp)(p),[t,s]=(0,a.fp)(u);(0,i.useEffect)((()=>{e&&e!==t&&s(e)}),[e,s]);const o=(0,i.useCallback)((e=>{n(e),s(e)}),[n,s]);return[e??t,o]}function g(){const[e,n]=(0,a.fp)(h),[t,s]=(0,a.fp)(m);(0,i.useEffect)((()=>{e&&e!==t&&s(e)}),[e,s]);const o=(0,i.useCallback)((e=>{n(e),s(e)}),[n,s]);return[e??t,o]}},84443:e=>{var n={kind:"Document",definitions:[{kind:"OperationDefinition",operation:"mutation",name:{kind:"Name",value:"CreateMessage"},variableDefinitions:[],directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"Field",name:{kind:"Name",value:"create_message"},arguments:[{kind:"Argument",name:{kind:"Name",value:"data"},value:{kind:"ObjectValue",fields:[{kind:"ObjectField",name:{kind:"Name",value:"title"},value:{kind:"StringValue",value:"First typegraph",block:!1}},{kind:"ObjectField",name:{kind:"Name",value:"body"},value:{kind:"StringValue",value:"Congrats on your first typegraph.",block:!1}}]}}],directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"Field",name:{kind:"Name",value:"id"},arguments:[],directives:[]}]}}]}},{kind:"OperationDefinition",operation:"query",name:{kind:"Name",value:"ListMessages"},variableDefinitions:[],directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"Field",name:{kind:"Name",value:"list_messages"},arguments:[],directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"Field",name:{kind:"Name",value:"id"},arguments:[],directives:[]},{kind:"Field",name:{kind:"Name",value:"title"},arguments:[],directives:[]},{kind:"Field",name:{kind:"Name",value:"body"},arguments:[],directives:[]}]}}]}}],loc:{start:0,end:231}};n.loc.source={body:'mutation CreateMessage {\n create_message(\n data: {\n title: "First typegraph"\n body: "Congrats on your first typegraph."\n }\n ) {\n id\n }\n}\n\nquery ListMessages {\n list_messages {\n id\n title\n body\n }\n}\n',name:"GraphQL request",locationOffset:{line:1,column:1}};function t(e,n){if("FragmentSpread"===e.kind)n.add(e.name.value);else if("VariableDefinition"===e.kind){var s=e.type;"NamedType"===s.kind&&n.add(s.name.value)}e.selectionSet&&e.selectionSet.selections.forEach((function(e){t(e,n)})),e.variableDefinitions&&e.variableDefinitions.forEach((function(e){t(e,n)})),e.definitions&&e.definitions.forEach((function(e){t(e,n)}))}var s={};function a(e,n){for(var t=0;tdurable execution
blog",id:"fix-missing-images-for-durable-execution-blog",level:2},{value:"Migration notes",id:"migration-notes-15",level:4},{value:"Migration notes",id:"migration-notes-16",level:4},{value:"Documentation",id:"documentation-2",level:3},{value:"Migration notes",id:"migration-notes-17",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit",level:2},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-1",level:2},{value:"Migration notes",id:"migration-notes-18",level:4},{value:"Features",id:"features-2",level:3},{value:"Migration notes",id:"migration-notes-19",level:4},{value:"Migration notes",id:"migration-notes-20",level:4},{value:"Migration notes",id:"migration-notes-21",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-2",level:2},{value:"Migration notes",id:"migration-notes-22",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-3",level:2},{value:"Release Notes",id:"release-notes",level:2},{value:"Migration notes",id:"migration-notes-23",level:4},{value:"Migration notes",id:"migration-notes-24",level:4},{value:"Migration notes",id:"migration-notes-25",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-4",level:2},{value:"Release Notes",id:"release-notes-1",level:2},{value:"Migration notes",id:"migration-notes-26",level:4},{value:"Migration notes",id:"migration-notes-27",level:4},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-1",level:3},{value:"Migration notes",id:"migration-notes-28",level:4},{value:"Migration notes",id:"migration-notes-29",level:4},{value:"Refactor",id:"refactor",level:3},{value:"Migration notes",id:"migration-notes-30",level:4},{value:"Migration notes",id:"migration-notes-31",level:4},{value:"Migration notes",id:"migration-notes-32",level:4},{value:"Migration notes",id:"migration-notes-33",level:4},{value:"Migration notes",id:"migration-notes-34",level:4},{value:"Checklist",id:"checklist-1",level:4},{value:"Migration notes",id:"migration-notes-35",level:4},{value:"v0.4.10 - 2024-09-04",id:"v0410---2024-09-04",level:2},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-2",level:3},{value:"v0.4.10-rc1 - 2024-09-03",id:"v0410-rc1---2024-09-03",level:2},{value:"Bug Fixes",id:"bug-fixes-5",level:3},{value:"v0.4.9 - 2024-09-02",id:"v049---2024-09-02",level:2},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-3",level:3},{value:"v0.4.9-rc2 - 2024-09-02",id:"v049-rc2---2024-09-02",level:2},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-4",level:3},{value:"v0.4.9-rc1 - 2024-09-02",id:"v049-rc1---2024-09-02",level:2},{value:"Features",id:"features-3",level:3},{value:"Migration notes",id:"migration-notes-36",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-5",level:2},{value:"Migration notes",id:"migration-notes-37",level:4},{value:"Migration notes",id:"migration-notes-38",level:4},{value:"Refactor",id:"refactor-1",level:3},{value:"Ensure documentation is pushing for meta dev instead of meta typegate",id:"ensure-documentation-is-pushing-for-meta-dev-instead-of-meta-typegate",level:2},{value:"Migration notes",id:"migration-notes-39",level:4},{value:"Migration notes",id:"migration-notes-40",level:4},{value:"v0.4.8 - 2024-08-16",id:"v048---2024-08-16",level:2},{value:"Bug Fixes",id:"bug-fixes-6",level:3},{value:"Features",id:"features-4",level:3},{value:"Migration notes",id:"migration-notes-41",level:4},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-5",level:3},{value:"v0.4.7 - 2024-08-08",id:"v047---2024-08-08",level:2},{value:"Features",id:"features-5",level:3},{value:"Migration notes",id:"migration-notes-42",level:4},{value:"Migration notes",id:"migration-notes-43",level:4},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-6",level:3},{value:"Refactor",id:"refactor-2",level:3},{value:"Migration notes",id:"migration-notes-44",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-6",level:2},{value:"Migration notes",id:"migration-notes-45",level:4},{value:"v0.4.6 - 2024-08-01",id:"v046---2024-08-01",level:2},{value:"Features",id:"features-6",level:3},{value:"Migration notes",id:"migration-notes-46",level:4},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-7",level:3},{value:"Migration notes",id:"migration-notes-47",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-7",level:2},{value:"Refactor",id:"refactor-3",level:3},{value:"Improve the documentation on quick-start
page",id:"improve-the-documentation-on-quick-start-page",level:2},{value:"Migration notes",id:"migration-notes-48",level:4},{value:"v0.4.5 - 2024-07-18",id:"v045---2024-07-18",level:2},{value:"Bug Fixes",id:"bug-fixes-7",level:3},{value:"Migration notes",id:"migration-notes-49",level:4},{value:"Migration notes",id:"migration-notes-50",level:4},{value:"Migration notes",id:"migration-notes-51",level:4},{value:"Migration notes",id:"migration-notes-52",level:4},{value:"Features",id:"features-7",level:3},{value:"Migration notes",id:"migration-notes-53",level:4},{value:"Migration notes",id:"migration-notes-54",level:4},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-8",level:3},{value:"Migration notes",id:"migration-notes-55",level:4},{value:"v0.4.4 - 2024-07-05",id:"v044---2024-07-05",level:2},{value:"Bug Fixes",id:"bug-fixes-8",level:3},{value:"Documentation",id:"documentation-3",level:3},{value:"Migration notes",id:"migration-notes-56",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-8",level:2},{value:"Features",id:"features-8",level:3},{value:"Migration notes",id:"migration-notes-57",level:4},{value:"Migration notes",id:"migration-notes-58",level:4},{value:"Migration notes",id:"migration-notes-59",level:4},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-9",level:3},{value:"Add Programmatic deploy tests for the docs",id:"add-programmatic-deploy-tests-for-the-docs",level:2},{value:"Migration notes",id:"migration-notes-60",level:4},{value:"Migration notes",id:"migration-notes-61",level:4},{value:"Refactor",id:"refactor-4",level:3},{value:"Migration notes",id:"migration-notes-62",level:4},{value:"Migration notes",id:"migration-notes-63",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-9",level:2},{value:"Testing",id:"testing",level:3},{value:"Migration notes",id:"migration-notes-64",level:4},{value:"v0.4.3 - 2024-06-22",id:"v043---2024-06-22",level:2},{value:"Bug Fixes",id:"bug-fixes-9",level:3},{value:"Migration notes",id:"migration-notes-65",level:4},{value:"Migration notes",id:"migration-notes-66",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-10",level:2},{value:"Migration notes",id:"migration-notes-67",level:4},{value:"Migration notes",id:"migration-notes-68",level:4},{value:"Migration notes",id:"migration-notes-69",level:4},{value:"Documentation",id:"documentation-4",level:3},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-11",level:2},{value:"Migration notes",id:"migration-notes-70",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-12",level:2},{value:"Migration notes",id:"migration-notes-71",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-13",level:2},{value:"Features",id:"features-9",level:3},{value:"Migration notes",id:"migration-notes-72",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-14",level:2},{value:"Migration notes",id:"migration-notes-73",level:4},{value:"Migration notes",id:"migration-notes-74",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-15",level:2},{value:"Migration notes",id:"migration-notes-75",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-16",level:2},{value:"Migration notes",id:"migration-notes-76",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-17",level:2},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-18",level:2},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-10",level:3},{value:"Migration notes",id:"migration-notes-77",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-19",level:2},{value:"Migration notes",id:"migration-notes-78",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-20",level:2},{value:"Migration notes",id:"migration-notes-79",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-21",level:2},{value:"Migration notes",id:"migration-notes-80",level:4},{value:"Migration notes",id:"migration-notes-81",level:4},{value:"v0.4.2 - 2024-05-22",id:"v042---2024-05-22",level:2},{value:"Bug Fixes",id:"bug-fixes-10",level:3},{value:"v0.4.1 - 2024-05-20",id:"v041---2024-05-20",level:2},{value:"Bug Fixes",id:"bug-fixes-11",level:3},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-22",level:2},{value:"Features",id:"features-10",level:3},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-23",level:2},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-11",level:3},{value:"Migration notes",id:"migration-notes-82",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-24",level:2},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-25",level:2},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-26",level:2},{value:"v0.4.0 - 2024-05-09",id:"v040---2024-05-09",level:2},{value:"Documentation",id:"documentation-5",level:3},{value:"Migration notes",id:"migration-notes-83",level:4},{value:"Features",id:"features-11",level:3},{value:"Motivation and context",id:"motivation-and-context",level:4},{value:"Migration notes",id:"migration-notes-84",level:4},{value:"Checklist",id:"checklist-2",level:3},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-27",level:2},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-12",level:3},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-28",level:2},{value:"Refactor",id:"refactor-5",level:3},{value:"Migration notes",id:"migration-notes-85",level:4}];function x(e){const s={h1:"h1",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.h1,{id:""}),"\n",(0,i.jsx)(d,{})]})}function m(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(x,{...e})}):x(e)}}}]);
\ No newline at end of file
diff --git a/assets/js/a70287ac.e105dad1.js b/assets/js/a70287ac.e105dad1.js
deleted file mode 100644
index 84fb9c6d87..0000000000
--- a/assets/js/a70287ac.e105dad1.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2058],{77487:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>o,contentTitle:()=>c,default:()=>m,frontMatter:()=>a,metadata:()=>r,toc:()=>h});var i=n(86070),t=n(25710);function l(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",hr:"hr",img:"img",input:"input",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components},{Details:n}=s;return n||function(e,s){throw new Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.h1,{id:"changelog",children:"Changelog"}),"\n",(0,i.jsx)(s.p,{children:"All notable changes to this project will be documented in this file."}),"\n",(0,i.jsxs)(s.h2,{id:"v050-rc1---2024-10-22",children:[(0,i.jsx)(s.a,{href:"https://github.com/metatypedev/metatype/releases/tag/v0.5.0-rc.1",children:"v0.5.0-rc.1"})," - 2024-10-22"]}),"\n",(0,i.jsx)(s.h3,{id:"bug-fixes",children:"Bug Fixes"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(ci) Disable sccache when secrets not avail (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/874",children:"#874"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Makes sccache optional so PRs from dependabot and forks can still run\r\nthe test suite."}),"\n",(0,i.jsx)(s.li,{children:"Increases sccache allotment to 50g."}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(cli) Change default installation directory (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/873",children:"#873"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Remplacement PR for #843."}),"\n"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"..."}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(docs) Grpc docs (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/852",children:"#852"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-1",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(gate) Make __typename returns the variant name on unions (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/838",children:"#838"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Add missing implementation for static injection for parameter\r\ntransformations on the typegate"}),"\n",(0,i.jsxs)(s.li,{children:["Solves\r\n",(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-642/gate-typename-on-union-selections-should-hold-member-title",children:"MET-642"}),":\r\nFix the ",(0,i.jsx)(s.code,{children:"__typename"})," result on union variants: return the variant name\r\ninstead of the parent type name"]}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-2",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"N/A"}),(0,i.jsx)(s.h4,{id:"checklist",children:"Checklist"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(subs) Key collision on redis (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/865",children:"#865"}),")"]})}),(0,i.jsxs)(s.p,{children:["Follow up of #863\r\nWhen multiple start occurs for redis, some schedules can happen\r\n",(0,i.jsx)(s.strong,{children:"exactly"})," at the same time resulting into the same identifier (and\r\nleading to an inconsistent state)."]}),(0,i.jsxs)(s.p,{children:["This solution simply combines the ",(0,i.jsx)(s.code,{children:"schedule"})," with the run_id making it\r\nunique instead of using it as is."]}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-gql",children:"mutation AllAtOnce {\r\n a: start_retry(kwargs: { .. }) # => calls add_schedule( ... date ...)\r\n b: start_retry(kwargs: { .. })\r\n c: start_retry(kwargs: { .. })\r\n d: start_retry(kwargs: { .. }) \r\n e: start_retry(kwargs: { .. })\r\n f: start_retry(kwargs: { .. })\r\n # ..\r\n}\n"})}),(0,i.jsx)(s.h4,{id:"migration-notes-3",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"None"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Fix missing images (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/847",children:"#847"}),")"]})}),(0,i.jsxs)(s.h2,{id:"fix-missing-images-for-durable-execution-blog",children:["Fix missing images for ",(0,i.jsx)(s.code,{children:"durable execution"})," blog"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-4",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Improve name generation for prisma types (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/849",children:"#849"}),")"]})}),(0,i.jsxs)(s.p,{children:["Solve\r\n",(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-657/sdk-improve-generated-titles-for-prisma-types",children:"MET-657"})]}),(0,i.jsx)(s.h4,{id:"migration-notes-5",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsx)(s.h3,{id:"documentation",children:"Documentation"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(blog) Running python with WebAssembly part 1 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/823",children:"#823"}),")"]})}),(0,i.jsx)(s.p,{children:"Running python with webassembly (part 1)"}),(0,i.jsx)(s.h4,{id:"migration-notes-6",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"None"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit",children:"Summary by CodeRabbit"}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-1",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Introduced a comprehensive guide for integrating Python runtime with\r\nWebAssembly (WASI) in the Metatype ecosystem."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Detailed the advantages of using WebAssembly over Docker for platform\r\nindependence and resource management."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Provided technical requirements and a refined solution for executing\r\nPython scripts in a sandboxed environment."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Expanded vocabulary with new relevant terms for enhanced text\r\nprocessing and validation."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Documentation"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Updated YAML configuration structure in documentation for clarity on\r\ntype gate usage."}),"\n"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.code,{children:"/docs/reference/typegraph/client"})," (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/777",children:"#777"}),")"]})}),(0,i.jsx)(s.p,{children:"Pre-documentation for the code-first queries feature."}),(0,i.jsx)(s.h4,{id:"migration-notes-7",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsx)(s.h3,{id:"features",children:"Features"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(dev) Typegraph explorer (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/859",children:"#859"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Add a web version of tree-view which is more interactive"}),"\n",(0,i.jsxs)(s.li,{children:["Enable typegraph serialization without ",(0,i.jsx)(s.code,{children:"metatype.yml"})," config file"]}),"\n"]}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{src:"https://github.com/user-attachments/assets/81771c07-1f2a-493a-81df-969c8182f9bf",alt:"image"})})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(gate) Empty object as custom scalar (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/876",children:"#876"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Allow empty object on the output without any change"}),"\n",(0,i.jsxs)(s.li,{children:["Just like ",(0,i.jsx)(s.code,{children:"Int"}),", ",(0,i.jsx)(s.code,{children:"String"}),", and such, rightfully refer the constant\r\n",(0,i.jsx)(s.code,{children:"{}"})," as a scalar"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Any"})," empty object will now be refered as ",(0,i.jsx)(s.code,{children:"EmptyObject"})," scalar"]}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-8",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"None"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(mdk) Overridable templates (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/842",children:"#842"}),")"]})}),(0,i.jsxs)(s.p,{children:["Solve\r\n",(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-630/gen-add-parameter-to-replace-static-sections",children:"MET-630"})]}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Make templates in the ",(0,i.jsx)(s.em,{children:"static"})," sections overridable","\n",(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,i.jsx)(s.code,{children:"mdk_rust"})]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,i.jsx)(s.code,{children:"mdk_python"})]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ",(0,i.jsx)(s.code,{children:"mdk_typescript"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Add a CLI tool to generate extract the default template"]}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-9",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"No changes needed."}),(0,i.jsx)(s.hr,{}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(metagen) Union/either for clients (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/857",children:"#857"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Add union support for the ",(0,i.jsx)(s.code,{children:"client_xx"})," metagen implementations."]}),"\n"]}),(0,i.jsxs)(s.p,{children:["There are still some edge cases especially around variant identification\r\nin the client languages. I tried many things but our hands are tied by\r\nserde. Basically, users will have to be careful when designing their\r\nunion types to avoid ambiguity cases. Hopefully,\r\n",(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-674/graph-checksvalidation-on-teither",children:"674"}),"\r\nwill help there."]}),(0,i.jsx)(s.h4,{id:"migration-notes-10",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-2",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Introduced new methods for rendering union types in both TypeScript\r\nand Python."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Enhanced GraphQL query generation with support for multiple union\r\ntypes."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Added a new ",(0,i.jsx)(s.code,{children:"variants"})," property to the ",(0,i.jsx)(s.code,{children:"NodeMeta"})," type for improved\r\nselection handling."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Bug Fixes"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Improved error handling for node selections and argument processing."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Tests"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Updated test cases to reflect schema changes and added new tests for\r\nclient functionality."}),"\n"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(subs) Redis backend (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/855",children:"#855"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Redis Backend base logic port + some improvements"}),"\n",(0,i.jsxs)(s.li,{children:["Moved ",(0,i.jsx)(s.code,{children:"SUBSTANTIAL_POLL_INTERVAL_SEC"})," and\r\n",(0,i.jsx)(s.code,{children:"SUBSTANTIAL_LEASE_LIFESPAN_SEC"})," to config"]}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-11",children:"Migration notes"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Renamed ",(0,i.jsx)(s.code,{children:"Backend.fs()"})," and ",(0,i.jsx)(s.code,{children:"Backend.memory()"})," to ",(0,i.jsx)(s.code,{children:"Backend.dev_fs()"}),"\r\nand ",(0,i.jsx)(s.code,{children:"Backend.dev_memory()"})]}),"\n",(0,i.jsxs)(s.li,{children:["Removed ",(0,i.jsx)(s.code,{children:"SUBSTANTIAL_RELAUNCH_MS"})," as it was relevant only for purely\r\nworker-based runs, which rendered the new\r\n",(0,i.jsx)(s.code,{children:"SUBSTANTIAL_POLL_INTERVAL_SEC"})," redundant when an interrupt hits."]}),"\n"]}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-3",children:"Summary by CodeRabbit"}),(0,i.jsx)(s.h2,{id:"release-notes",children:"Release Notes"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Introduced Redis as a new backend option for enhanced data management."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Added Docker Compose configuration for a Redis service."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Implemented comprehensive testing for Redis functionality and backend\r\nintegration."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Bug Fixes"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Improved error handling during backend initialization."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Documentation"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Updated type definitions for backend configurations to streamline\r\nRedis integration."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Chores"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Refactored test cases for clarity and consistency across different\r\nbackend types."}),"\n"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(subs) Retry + timeout on save (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/863",children:"#863"}),")"]})}),(0,i.jsx)(s.p,{children:"Port and improve retry/timeout."}),(0,i.jsx)(s.h4,{id:"migration-notes-12",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"N/A"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(subs) Child workflows + docs (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/867",children:"#867"}),")"]})}),(0,i.jsx)(s.p,{children:"Support for child workflows."}),(0,i.jsx)(s.p,{children:"Solves MET-689 and MET-668."}),(0,i.jsx)(s.h4,{id:"migration-notes-13",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"Previously"}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-python",children:' sub = SubstantialRuntime(backend)\r\n hello = sub.deno(file="workflow.ts", name="sayHello", deps=[])\r\n\r\n g.expose(\r\n # each function start, stop, result, ... holds a copy of the workflow data\r\n start_hello = hello.start(...),\r\n stop_hello = hello.stop()\r\n )\n'})}),(0,i.jsxs)(s.p,{children:["This approach relied on workflow files being referenced in each\r\nmaterializer, but the constructs were too restrictive to support\r\nsomething like ",(0,i.jsx)(s.code,{children:'mutation { results(name: "nameManuallyGiven") }'}),"."]}),(0,i.jsx)(s.p,{children:"We now have instead"}),(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-python",children:' file = (\r\n WorkflowFile\r\n .deno(file="workflow.ts", deps=[])\r\n .import_(["sayHello"])\r\n .build()\r\n )\r\n\r\n # workflow data are refered only once\r\n sub = SubstantialRuntime(backend, [file])\r\n g.expose(\r\n start_hello = sub.start(...).reduce({ "name": "sayHello" }),\r\n stop = sub.stop()\r\n )\n'})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsx)(n,{children:(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(subs,gate) Substantial integration (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/844",children:"#844"}),")"]})})}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(subs,gate) Port agent concept (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/845",children:"#845"}),")"]})}),(0,i.jsx)(s.p,{children:"Continuation of #844"})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Well-defined type comparison semantics (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/846",children:"#846"}),")"]})}),(0,i.jsxs)(s.p,{children:["Solve\r\n",(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-655/sdk-improve-the-ensuresubtypeof-implementation",children:"MET-655"})]}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Document the type comparison semantics"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Improve the implementation (",(0,i.jsx)(s.code,{children:"EnsureSubtypeOf"})," trait)"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Add more test cases for type comparisons"]}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-14",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"No change is needed."})}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-4",children:"Summary by CodeRabbit"}),(0,i.jsx)(s.h2,{id:"release-notes-1",children:"Release Notes"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Introduced comprehensive type comparison rules and semantics for\r\nscalar types, optionals, lists, objects, and unions."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Added support for enumerated types in the type system, allowing for\r\nmore precise type definitions."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Enhanced parent injection mechanism documentation to clarify type\r\ncompatibility requirements."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Implemented a new suite of type comparison tests and validation\r\nmechanisms."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Bug Fixes"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Improved error reporting and handling in the type validation process."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Documentation"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Updated and expanded documentation for type comparisons, enumerations,\r\nand parent injections."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Tests"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Added new tests for type comparison and validation scenarios."}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Grpc runtime (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/819",children:"#819"}),")"]})}),(0,i.jsx)(s.h4,{id:"migration-notes-15",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Python hostcall (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/860",children:"#860"}),")"]})}),(0,i.jsx)(s.p,{children:"Dead lock on python worker"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-16",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsx)(s.h3,{id:"miscellaneous-tasks",children:"Miscellaneous Tasks"}),"\n",(0,i.jsxs)(n,{open:!0,children:[(0,i.jsxs)("summary",{children:[(0,i.jsxs)(s.p,{children:["Checks/validation on t.either (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/868",children:"#868"}),")"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["BREAKING: Checks/validation on t.either (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/868",children:"#868"}),")"]}),"\n"]})]}),(0,i.jsx)(s.p,{children:"Emit a warning or an error when a variant is a subtype of another one."}),(0,i.jsx)(s.h4,{id:"migration-notes-17",children:"Migration notes"}),(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"BREAKING CHANGE"}),": Previously valid typegraph might fail validation.\r\nYou will need to fix your types to add some consistency in\r\n",(0,i.jsx)(s.code,{children:"t.either"}),"/",(0,i.jsx)(s.code,{children:"t.union"})," types."]}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Update prisma + deno + rust deps (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/869",children:"#869"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Bump deno to 1.46.3"}),"\n",(0,i.jsx)(s.li,{children:"Update prisma-engines to 5.20"}),"\n",(0,i.jsx)(s.li,{children:"Update other rust deps."}),"\n"]}),(0,i.jsx)(s.p,{children:"Closes MET-669 and MET-622 and MET-680."}),(0,i.jsx)(s.h4,{id:"migration-notes-18",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsx)(s.h3,{id:"refactor",children:"Refactor"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(gate) Add err msg for missing env vars (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/827",children:"#827"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-19",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(gate) Use stream during artifact upload to s3 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/841",children:"#841"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-20",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(gen, doc) Rename mdk to fdk (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/851",children:"#851"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-21",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{open:!0,children:[(0,i.jsxs)("summary",{children:[(0,i.jsxs)(s.p,{children:["(sdk) Remove index based names (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/848",children:"#848"}),")"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["BREAKING: remove index based names (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/848",children:"#848"}),")"]}),"\n"]})]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Replace index based names for types by one that relies on type context\r\nin graph"}),"\n",(0,i.jsx)(s.li,{children:"Tests for type deduplication"}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-22",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"TODO"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{open:!0,children:[(0,i.jsxs)("summary",{children:[(0,i.jsxs)(s.p,{children:["Move as_id out of ",(0,i.jsx)(s.code,{children:"TypeNode"})," (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/866",children:"#866"}),")"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["BREAKING: Move as_id out of ",(0,i.jsx)(s.code,{children:"TypeNode"})," (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/866",children:"#866"}),")"]}),"\n"]})]}),(0,i.jsxs)(s.p,{children:["Solve\r\n",(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-684/store-the-id-field-in-tstruct-instead-of-in-the-target-type-as-id",children:"MET-684"}),"\r\nand\r\n",(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-471/parent-injection-use-property-name-instead-of-function-name",children:"MET-471"})]}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.strong,{children:"common/typegraph"})}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Store the id field in ",(0,i.jsx)(s.code,{children:"ObjectTypeData"})," instead of in the target\r\ntype (",(0,i.jsx)(s.code,{children:"as_id"}),")","\n",(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Add ",(0,i.jsx)(s.code,{children:"id()"})," method on ",(0,i.jsx)(s.code,{children:"t.integer"})," and ",(0,i.jsx)(s.code,{children:"t.string"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"typegraph/core"}),"\n",(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Store ",(0,i.jsx)(s.code,{children:"as_id"}),", ",(0,i.jsx)(s.code,{children:"injection"})," and ",(0,i.jsx)(s.code,{children:"policy"})," in ",(0,i.jsx)(s.code,{children:"TypeRef::attribute"})]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Add support for direct and link target in ",(0,i.jsx)(s.code,{children:"TypeRef"})]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Only allow name registration for ",(0,i.jsx)(s.code,{children:"TypeDef"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.li,{children:"Semantics"}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Use property name instead of type name in from_parent injection\r\nsource"]}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-23",children:"Migration notes"}),(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"BREAKING CHANGE"}),"\r\n",(0,i.jsx)(s.code,{children:"from_parent"})," injections source shall be changed to the key in the\r\nparent ",(0,i.jsx)(s.code,{children:"t.struct"})," instead of the type name."]}),(0,i.jsx)(s.h4,{id:"checklist-1",children:"Checklist"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Move injection data to ",(0,i.jsx)(s.code,{children:"t.func"})," (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/871",children:"#871"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-682/move-all-injection-data-to-tfunc",children:"MET-682"})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Move all injection data in ",(0,i.jsx)(s.code,{children:"ObjectTypeData"})," (i.e. ",(0,i.jsx)(s.code,{children:"t.func"}),")"]}),"\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-656/sdk-improve-generated-titles-from-applyreduce",children:"MET-656"})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Translate reduce to injection specification on ",(0,i.jsx)(s.code,{children:"t.func"})]}),"\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-94/remove-runtime-field-from-typenode",children:"MET-94"})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Remove runtime field from ",(0,i.jsx)(s.code,{children:"TypeNode"})," (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/858",children:"#858"}),")"]}),"\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-683/move-runtime-related-type-configs-out-of-typenode",children:"MET-683"})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Move runtime-related configs to ",(0,i.jsx)(s.code,{children:"MaterializerData"})," or\r\n",(0,i.jsx)(s.code,{children:"RuntimeData"})]}),"\n",(0,i.jsx)(s.li,{children:"Misc."}),"\n",(0,i.jsxs)(s.li,{children:["Enable random ports for the typegate (when ",(0,i.jsx)(s.code,{children:"TG_PORT=0"}),"); this will\r\nwork with ",(0,i.jsx)(s.code,{children:"meta dev"})," with embedded typegate if you set the ",(0,i.jsx)(s.code,{children:"--gate"}),"\r\noption with port ",(0,i.jsx)(s.code,{children:"0"}),"."]}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-24",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(s.h2,{id:"v0410---2024-09-04",children:[(0,i.jsx)(s.a,{href:"https://github.com/metatypedev/metatype/releases/tag/v0.4.10",children:"v0.4.10"})," - 2024-09-04"]}),"\n",(0,i.jsx)(s.h3,{id:"miscellaneous-tasks-1",children:"Miscellaneous Tasks"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Bump to v0.4.10 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/835",children:"#835"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Bump v0.4.10"}),"\n"]})]}),"\n",(0,i.jsxs)(s.h2,{id:"v0410-rc1---2024-09-03",children:[(0,i.jsx)(s.a,{href:"https://github.com/metatypedev/metatype/releases/tag/v0.4.10-rc1",children:"v0.4.10-rc1"})," - 2024-09-03"]}),"\n",(0,i.jsx)(s.h3,{id:"bug-fixes-1",children:"Bug Fixes"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Use import_map at runtime (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/833",children:"#833"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Bump to release v0.4.10-rc1"}),"\n",(0,i.jsx)(s.li,{children:"Use import_map.json at runtime since remote configs aren't supported"}),"\n"]})]}),"\n",(0,i.jsxs)(s.h2,{id:"v049---2024-09-02",children:[(0,i.jsx)(s.a,{href:"https://github.com/metatypedev/metatype/releases/tag/v0.4.9",children:"v0.4.9"})," - 2024-09-02"]}),"\n",(0,i.jsx)(s.h3,{id:"miscellaneous-tasks-2",children:"Miscellaneous Tasks"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Bump to v0.4.9 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/831",children:"#831"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Bump version to v0.4.9"}),"\n",(0,i.jsx)(s.li,{children:"Fix issue with cross config context"}),"\n"]})]}),"\n",(0,i.jsxs)(s.h2,{id:"v049-rc2---2024-09-02",children:[(0,i.jsx)(s.a,{href:"https://github.com/metatypedev/metatype/releases/tag/v0.4.9-rc2",children:"v0.4.9-rc2"})," - 2024-09-02"]}),"\n",(0,i.jsx)(s.h3,{id:"miscellaneous-tasks-3",children:"Miscellaneous Tasks"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(release) Prepare 0.4.9-rc2 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/829",children:"#829"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Fix the minor issues with rc1"}),"\n",(0,i.jsx)(s.li,{children:"Bump to rc2"}),"\n"]})]}),"\n",(0,i.jsxs)(s.h2,{id:"v049-rc1---2024-09-02",children:[(0,i.jsx)(s.a,{href:"https://github.com/metatypedev/metatype/releases/tag/v0.4.9-rc1",children:"v0.4.9-rc1"})," - 2024-09-02"]}),"\n",(0,i.jsx)(s.h3,{id:"features-1",children:"Features"}),"\n",(0,i.jsx)(n,{children:(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(docs) Post on ",(0,i.jsx)(s.code,{children:"Durable Execution"}),". (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/816",children:"#816"}),")"]})})}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(metagen) Client_ts (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/790",children:"#790"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Implements ",(0,i.jsx)(s.code,{children:"client_ts"})," as described in #777 ."]}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-25",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-5",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Bug Fixes"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Improved error handling in the ",(0,i.jsx)(s.code,{children:"typegraph"})," function to provide better\r\nerror messages."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Chores"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Updated Docker image references to use ",(0,i.jsx)(s.code,{children:"docker.io"})," prefix for\r\nconsistency."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Excluded unnecessary files from the VSCode settings."}),"\n",(0,i.jsx)(s.li,{children:"Enhanced configurability of Docker commands in development tasks."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Updated environment variable ",(0,i.jsx)(s.code,{children:"GHJK_VERSION"})," to reflect a semantic\r\nversioning format."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Introduced modules and methods for TypeScript and Python code\r\ngeneration in the ",(0,i.jsx)(s.code,{children:"metagen"})," library, enhancing client generation\r\ncapabilities."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Added ",(0,i.jsx)(s.code,{children:"test_typegraph_3"})," function for improved testing capabilities."]}),"\n",(0,i.jsx)(s.li,{children:"Included metadata for the package manager in the project settings."}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(sub) Sdk and typing (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/811",children:"#811"}),")"]})}),(0,i.jsx)(s.p,{children:"User side of substantial"}),(0,i.jsx)(s.h4,{id:"migration-notes-26",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"None"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Add caching to Secrets struct to improve performance (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/813",children:"#813"}),")"]})}),(0,i.jsx)(s.h4,{id:"migration-notes-27",children:"Migration notes"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsx)(s.h3,{id:"refactor-1",children:"Refactor"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(docs, gate) Push for ",(0,i.jsx)(s.code,{children:"meta dev"})," instead of ",(0,i.jsx)(s.code,{children:"meta typegate"})," on docs (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/822",children:"#822"}),")"]})}),(0,i.jsx)(s.h2,{id:"ensure-documentation-is-pushing-for-meta-dev-instead-of-meta-typegate",children:"Ensure documentation is pushing for meta dev instead of meta typegate"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","add a warning that envs are not set."]}),"\n"]}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-635/cli-ensure-documentation-is-pushing-for-meta-dev-instead-of-meta",children:"MET-635"})}),(0,i.jsx)(s.h4,{id:"migration-notes-28",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"No Migration Needed"})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Flatten deps and improve repo folder (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/821",children:"#821"}),")"]})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{children:["Renames ",(0,i.jsx)(s.code,{children:"libs/"})," to ",(0,i.jsx)(s.code,{children:"src/"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Moves ",(0,i.jsx)(s.code,{children:"typegate/"}),", ",(0,i.jsx)(s.code,{children:"meta-cli"}),", ",(0,i.jsx)(s.code,{children:"typegraph/"}),", ",(0,i.jsx)(s.code,{children:"meta-lsp/"})," to ",(0,i.jsx)(s.code,{children:"src/"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Renames ",(0,i.jsx)(s.code,{children:"dev/"})," to ",(0,i.jsx)(s.code,{children:"tools/"})]}),"\n",(0,i.jsxs)(s.li,{children:["Moves ",(0,i.jsx)(s.code,{children:"website/"})," to ",(0,i.jsx)(s.code,{children:"docs/metatype.dev"}),"/"]}),"\n",(0,i.jsxs)(s.li,{children:["Moves ",(0,i.jsx)(s.code,{children:"src/typegate/tests"})," to ",(0,i.jsx)(s.code,{children:"tests/"})]}),"\n",(0,i.jsxs)(s.li,{children:["Moves ",(0,i.jsx)(s.code,{children:"src/typegraph/deno/dev"})," to ",(0,i.jsx)(s.code,{children:"tools/jsr/"})]}),"\n",(0,i.jsxs)(s.li,{children:["Moves ",(0,i.jsx)(s.code,{children:"src/typegraph/deno/sdk"})," to ",(0,i.jsx)(s.code,{children:"src/typegraph/deno/"})]}),"\n",(0,i.jsxs)(s.li,{children:["Renames ",(0,i.jsx)(s.code,{children:"src/deno"})," to ",(0,i.jsx)(s.code,{children:"src/mt_deno"})]}),"\n",(0,i.jsxs)(s.li,{children:["Bumps deno to ",(0,i.jsx)(s.code,{children:"1.46.1"})]}),"\n",(0,i.jsxs)(s.li,{children:["Bumps rust toolchain to ",(0,i.jsx)(s.code,{children:"1.80.1"})]}),"\n",(0,i.jsx)(s.li,{children:"Moves all rust dependencies to workspace section"}),"\n",(0,i.jsxs)(s.li,{children:["Moves ",(0,i.jsx)(s.code,{children:"tools/task-*.ts"})," to ",(0,i.jsx)(s.code,{children:"tools/task/*.ts"})]}),"\n",(0,i.jsxs)(s.li,{children:["Moves ",(0,i.jsx)(s.code,{children:"cliff.toml"}),", ",(0,i.jsx)(s.code,{children:"Cross.toml"}),", ",(0,i.jsx)(s.code,{children:"ruff.toml"})," to ",(0,i.jsx)(s.code,{children:"tools/"})]}),"\n",(0,i.jsxs)(s.li,{children:["Uses deno\r\n",(0,i.jsx)(s.a,{href:"https://docs.deno.com/runtime/manual/basics/workspaces/",children:"workspaces"})," to\r\norganize ",(0,i.jsx)(s.code,{children:"src/typegraph/deno"}),", ",(0,i.jsx)(s.code,{children:"src/typegate"}),", ",(0,i.jsx)(s.code,{children:"tools/"}),", ",(0,i.jsx)(s.code,{children:"tests/"})," and\r\nmore."]}),"\n",(0,i.jsx)(s.li,{children:"Closes MET-607"}),"\n",(0,i.jsx)(s.li,{children:"Updates poetry to 1.8.3"}),"\n",(0,i.jsx)(s.li,{children:"Bumps metatype to version 0.4.9-rc1"}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Update CONTRIBUTING.md"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Fix CI workflows"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Fix Dockerfile"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Fix all tests"]}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-29",children:"Migration notes"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"No end user changes required"}),"\n"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(s.h2,{id:"v048---2024-08-16",children:[(0,i.jsx)(s.a,{href:"https://github.com/metatypedev/metatype/releases/tag/v0.4.8",children:"v0.4.8"})," - 2024-08-16"]}),"\n",(0,i.jsx)(s.h3,{id:"bug-fixes-2",children:"Bug Fixes"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Table method for kv runtime (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/815",children:"#815"}),")"]})}),(0,i.jsxs)(s.p,{children:["I discover an issue in the KV runtime documentation\r\n",(0,i.jsx)(s.a,{href:"https://metatype.dev/docs/reference/runtimes/kv",children:"kvruntime docs"})]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.code,{children:"wasm_backtrace"})," config bug (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/814",children:"#814"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"$WASM_BACKTRACE_DETAILS"})," was enabled in ",(0,i.jsx)(s.code,{children:"main"})," ghjk env which\r\naffected embedded wasm module compilation to have backtrace enabled.\r\nThis broke typegate runs without the flag enabled due to mismatch."]}),"\n",(0,i.jsx)(s.li,{children:"Fixes Cargo.lock not being used in Dockerfile."}),"\n",(0,i.jsx)(s.li,{children:"Prepare 0.4.8 release"}),"\n"]})]}),"\n",(0,i.jsx)(s.h3,{id:"features-2",children:"Features"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Kv runtime (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/797",children:"#797"}),")"]})}),(0,i.jsx)(s.h4,{id:"migration-notes-30",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n"]})]}),"\n",(0,i.jsx)(s.h3,{id:"miscellaneous-tasks-4",children:"Miscellaneous Tasks"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Bump to 0.4.8-0 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/810",children:"#810"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Bump prerelease"}),"\n",(0,i.jsx)(s.li,{children:"Fix minor issue with release pipeline"}),"\n"]})]}),"\n",(0,i.jsxs)(s.h2,{id:"v047---2024-08-08",children:[(0,i.jsx)(s.a,{href:"https://github.com/metatypedev/metatype/releases/tag/v0.4.7",children:"v0.4.7"})," - 2024-08-08"]}),"\n",(0,i.jsx)(s.h3,{id:"features-3",children:"Features"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(cli) Fix auto deployment (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/806",children:"#806"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Upgrade lade-sdk"}),"\n",(0,i.jsx)(s.li,{children:"Fix discovery"}),"\n",(0,i.jsx)(s.li,{children:"Remove obsolete dep: actix-web"}),"\n"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"lade-sdk"})," uses the main branch, which now has the fix for the\r\nfollowing issues:"]}),"\n",(0,i.jsxs)(s.li,{children:["dependency version conflict with\r\n",(0,i.jsx)(s.a,{href:"https://github.com/metatypedev/deno/blob/691f297537c4a3d9a12ce005c0478b4aee86287c/Cargo.toml#L179",children:"deno"}),":\r\n",(0,i.jsx)(s.code,{children:"url"})," is set at ",(0,i.jsx)(s.code,{children:"<2.5.0"}),";"]}),"\n",(0,i.jsx)(s.li,{children:"required ProjectID error for infisical: the project id is added\r\nexplicitly on the command."}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-31",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Cors headers on error (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/803",children:"#803"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-32",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsx)(s.h3,{id:"miscellaneous-tasks-5",children:"Miscellaneous Tasks"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Bump to 0.4.7-0 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/805",children:"#805"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Bump version to 0.4.7-0"}),"\n"]})]}),"\n",(0,i.jsx)(s.h3,{id:"refactor-2",children:"Refactor"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(docs) Add how to test typegraphs doc (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/798",children:"#798"}),")"]})}),(0,i.jsxs)(s.h1,{id:"how-to-test-your-typegraphs-documentation",children:[(0,i.jsx)(s.code,{children:"How to test your typegraphs"})," documentation"]}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","add python doc"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","add ts doc"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","upgrade bitnami/minIo image to 2024?"]}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-33",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"No Migrations Needed"})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-6",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Updated the Minio service to the latest version for improved\r\nperformance and potential new features."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Introduced comprehensive documentation for testing typegraphs in both\r\nTypeScript and Python, enhancing developer experience."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Documentation"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Enhanced readability of the ",(0,i.jsx)(s.code,{children:"Meta CLI"})," upgrade instructions."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Reformatted installation instructions for the ",(0,i.jsx)(s.code,{children:"typegraph"})," package for\r\nbetter clarity."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Chores"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Updated dependency management configuration for improved compatibility\r\nand performance across different platforms."}),"\n"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Improve JSR score (part 1) (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/807",children:"#807"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Add symbol documentations"}),"\n",(0,i.jsx)(s.li,{children:"Fix slow types"}),"\n"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-34",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(s.h2,{id:"v046---2024-08-01",children:[(0,i.jsx)(s.a,{href:"https://github.com/metatypedev/metatype/releases/tag/v0.4.6",children:"v0.4.6"})," - 2024-08-01"]}),"\n",(0,i.jsx)(s.h3,{id:"features-4",children:"Features"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Better arg split logic for MCLI_LOADER (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/799",children:"#799"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-35",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsx)(s.h3,{id:"miscellaneous-tasks-6",children:"Miscellaneous Tasks"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Prepare 0.4.6 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/795",children:"#795"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Bump version to 0.4.6-0"}),"\n",(0,i.jsx)(s.li,{children:"Add sanity tests for published SDKs"}),"\n",(0,i.jsx)(s.li,{children:"Bump deno to 1.45.2"}),"\n",(0,i.jsx)(s.li,{children:"Bump rust to 1.79.0"}),"\n",(0,i.jsx)(s.li,{children:"Fix myriad of bugs"}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-36",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-7",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Introduced new logging capabilities in the ",(0,i.jsx)(s.code,{children:"ConnectedEngine"})," with\r\nadjustable logging levels."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Implemented cleanup procedures in tests to enhance resource\r\nmanagement."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Bug Fixes"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Fixed import paths for permissions to ensure correct functionality in\r\ntests and applications."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Version Updates"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Incremented version numbers across multiple projects and packages to\r\nreflect ongoing development and improvements."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Documentation"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Added comments to clarify code behavior and potential future\r\nconsiderations in various modules."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Refactor"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Optimized string handling in several functions and adjusted method\r\nsignatures for improved clarity and efficiency."}),"\n"]}),"\n"]})]}),"\n",(0,i.jsx)(s.h3,{id:"refactor-3",children:"Refactor"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(docs) Better documentation on ",(0,i.jsx)(s.code,{children:"quick-start"})," page (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/793",children:"#793"}),")"]})}),(0,i.jsxs)(s.h2,{id:"improve-the-documentation-on-quick-start-page",children:["Improve the documentation on ",(0,i.jsx)(s.code,{children:"quick-start"})," page"]}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","add dev hunt result to homepage."]}),"\n"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-37",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(s.h2,{id:"v045---2024-07-18",children:[(0,i.jsx)(s.a,{href:"https://github.com/metatypedev/metatype/releases/tag/v0.4.5",children:"v0.4.5"})," - 2024-07-18"]}),"\n",(0,i.jsx)(s.h3,{id:"bug-fixes-3",children:"Bug Fixes"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Broken pipeline for 0.4.4 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/782",children:"#782"}),")"]})}),(0,i.jsxs)(s.p,{children:["Fixes erroneous usage of ",(0,i.jsx)(s.code,{children:"setup-deno"})," which has been replaced by ",(0,i.jsx)(s.code,{children:"ghjk"}),"\r\nitself."]}),(0,i.jsx)(s.h4,{id:"migration-notes-38",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Broken release pipeline 2 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/783",children:"#783"}),")"]})}),(0,i.jsx)(s.p,{children:"Fix issue with the three remaining failing jobs."}),(0,i.jsx)(s.h4,{id:"migration-notes-39",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Release pipeline 3 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/784",children:"#784"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Remove accidental dry-run from jsr publish"}),"\n",(0,i.jsx)(s.li,{children:"Fix cross dockerfile"}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-40",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Skip deno stack trace from error message (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/787",children:"#787"}),")"]})}),(0,i.jsx)(s.p,{children:"Skip the deno stack trace from the error message when tg_manage fails."}),(0,i.jsx)(s.h4,{id:"migration-notes-41",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"N/A"})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsx)(s.h3,{id:"features-5",children:"Features"}),"\n",(0,i.jsxs)(n,{open:!0,children:[(0,i.jsxs)("summary",{children:[(0,i.jsxs)(s.p,{children:["(cli) Configurable backoff (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/789",children:"#789"}),")"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["BREAKING: configurable backoff (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/789",children:"#789"}),")"]}),"\n"]})]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Make the backoff configurable through the ",(0,i.jsx)(s.code,{children:"--retry"})," and\r\n",(0,i.jsx)(s.code,{children:"--retry-interval-ms"})," options."]}),"\n",(0,i.jsx)(s.li,{children:"The default max retry count is changed to 0 on the default mode, and\r\nremains 3 on the watch mode."}),"\n",(0,i.jsxs)(s.li,{children:["The ",(0,i.jsx)(s.code,{children:"--max-parallel-loads"})," option has been renamed to ",(0,i.jsx)(s.code,{children:"--threads"}),"."]}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-42",children:"Migration notes"}),(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.code,{children:"--max-parallel-loads"})," option has been renamed to ",(0,i.jsx)(s.code,{children:"--threads"}),"."]}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Add list subcommand features to meta_cli (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/775",children:"#775"}),")"]})}),(0,i.jsx)(s.p,{children:"new branch after conflict with main branch"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-43",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsx)(n,{children:(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Upgrade www and gha (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/786",children:"#786"}),")"]})})}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Add back gleap (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/791",children:"#791"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Gleap.io was removed a while back"}),"\n",(0,i.jsx)(s.li,{children:"this adds it back so visitors can open ticket and suggest feedback"}),"\n",(0,i.jsx)(s.li,{children:"internally, we will use this to fine tune the documentation"}),"\n"]})]}),"\n",(0,i.jsx)(s.h3,{id:"miscellaneous-tasks-7",children:"Miscellaneous Tasks"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Bump v0.4.5 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/792",children:"#792"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Bumps metatype version to 0.4.5"}),"\n",(0,i.jsx)(s.li,{children:"Bumps ghjk to latest commit"}),"\n",(0,i.jsxs)(s.li,{children:["Fixes ",(0,i.jsx)(s.code,{children:"setup"})," whiz task to avoid issues on macos"]}),"\n",(0,i.jsx)(s.li,{children:"Fixes release pipeline to publish JSR"}),"\n"]}),(0,i.jsx)(s.p,{children:"MET-614 MET-606 MET-605 MET-613"}),(0,i.jsx)(s.h4,{id:"migration-notes-44",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"No changes required."})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(s.h2,{id:"v044---2024-07-05",children:[(0,i.jsx)(s.a,{href:"https://github.com/metatypedev/metatype/releases/tag/v0.4.4",children:"v0.4.4"})," - 2024-07-05"]}),"\n",(0,i.jsx)(s.h3,{id:"bug-fixes-4",children:"Bug Fixes"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(gate) Ensure all deps are defined in import_map.json (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/768",children:"#768"}),")"]})}),(0,i.jsxs)(s.p,{children:["Ensure that all deps are defined in ",(0,i.jsx)(s.code,{children:"import_map.json"})," with a specific\r\nversion."]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Missing typegraphs (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/755",children:"#755"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"fix the typegraphs that were incorrectly formatted"}),"\n"]}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Stable formatting and uniformize the code-loader (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/766",children:"#766"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"add prettier to avoid doc formatting issue"}),"\n",(0,i.jsxs)(s.li,{children:["now explicitly require ",(0,i.jsx)(s.code,{children:"!!code-loader!"})," to load code inside the\r\ndocumentation (will hopefully help also with the missing typegraphs\r\nissues, still under investigation)"]}),"\n"]}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsx)(s.h3,{id:"documentation-1",children:"Documentation"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Generate clients from openapi (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/778",children:"#778"}),")"]})}),(0,i.jsx)(s.p,{children:"Demonstrate how to use the openapi spec to generate clients in most\r\nlanguages/frameworks."}),(0,i.jsx)(s.h4,{id:"migration-notes-45",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"None"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-8",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.strong,{children:"Documentation"})}),"\n",(0,i.jsx)(s.li,{children:"Updated REST API documentation URLs with placeholders for easier\r\nconfiguration."}),"\n",(0,i.jsx)(s.li,{children:"Added information on generating and using OpenAPI clients, including\r\nTypeScript fetch client generation."}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.strong,{children:"Bug Fixes"})}),"\n",(0,i.jsx)(s.li,{children:"Corrected a regular expression in import handling to ensure accurate\r\nreplacements."}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.strong,{children:"Chores"})}),"\n",(0,i.jsx)(s.li,{children:"Improved file writing by appending a newline character to JSON\r\nstrings."}),"\n"]})]}),"\n",(0,i.jsx)(s.h3,{id:"features-6",children:"Features"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Move all the configs to one single file (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/733",children:"#733"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Move all the configs to one single file"}),"\n",(0,i.jsxs)(s.li,{children:["Remove some specific configs from the global config variable and make\r\nthem accessible on the ",(0,i.jsx)(s.code,{children:"Typegate"})," instance, to improve test\r\nconfigurability."]}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-46",children:"Migration notes"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.code,{children:"SYNC_REDIS_PASSWORD"})," has been removed, can only be set on the\r\n",(0,i.jsx)(s.code,{children:"SYNC_REDIS_URL"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Remove restrictions for union/either types (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/761",children:"#761"}),")"]})}),(0,i.jsx)(s.p,{children:"In the previous versions, we restricted the variant types allowed in\r\nunion/either to be all in the same category (after flattening\r\nmulti-level unions):"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.em,{children:"Category 1"})," - ",(0,i.jsx)(s.strong,{children:"GraphQL leaf types"}),": scalar type, or array of scalar\r\ntype, which require no selection set on GraphQL."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.em,{children:"Category 2"})," - ",(0,i.jsx)(s.strong,{children:"GraphQL non-leaf types"}),": object type or array of\r\nobject type, which require a selection set on GraphQL (aka selectable\r\ntypes in the codebase)."]}),"\n"]}),(0,i.jsxs)(s.p,{children:["Those restrictions can be lifted, and the selection field of an\r\nunion-type field will have inline fragments with type conditions for\r\neach ",(0,i.jsx)(s.em,{children:"Category 2"})," variant. No type condition is required for ",(0,i.jsx)(s.em,{children:"Category\r\n1"})," types, the selection sets are not relevant."]}),(0,i.jsx)(s.p,{children:"The case that is not handled by this PR is when one of the variants is\r\nan array of union type."}),(0,i.jsx)(s.h4,{id:"migration-notes-47",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"N/A"})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Typegate in meta dev, upgrade test (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/776",children:"#776"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Test the typegate upgrade from the latest published version to the\r\ncurrent version."}),"\n",(0,i.jsxs)(s.li,{children:["Add a flag to run an instance of the typegate with the target\r\nconfiguration (port, admin passsword) to ",(0,i.jsx)(s.code,{children:"meta deploy"}),", enabled by\r\ndefault for ",(0,i.jsx)(s.code,{children:"meta dev"}),"."]}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-48",children:"Migration notes"}),(0,i.jsxs)(s.p,{children:["If you have a script that runs ",(0,i.jsx)(s.code,{children:"meta dev"}),", add the flag ",(0,i.jsx)(s.code,{children:"--no-typegate"}),"\r\nif you already have a typegate."]}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsx)(s.h3,{id:"miscellaneous-tasks-8",children:"Miscellaneous Tasks"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Add programmatic deploy tests (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/769",children:"#769"}),")"]})}),(0,i.jsx)(s.h2,{id:"add-programmatic-deploy-tests-for-the-docs",children:"Add Programmatic deploy tests for the docs"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Add programmatic typegraph deploy/remove tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","refactor tg_remove to accept ",(0,i.jsx)(s.code,{children:"typegraph_name"})," instead of\r\n",(0,i.jsx)(s.code,{children:"TypegraphOutput"})," obj."]}),"\n"]}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-591/docstest-test-example-script-for-tg-deploy",children:"MET-591"})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-49",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"No Migrations Needed"})}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Bump to version 0.4.4 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/779",children:"#779"}),")"]})}),(0,i.jsx)(s.p,{children:"Prepare release of the 0.4.4 version."}),(0,i.jsx)(s.h4,{id:"migration-notes-50",children:"Migration notes"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsx)(s.h3,{id:"refactor-4",children:"Refactor"}),"\n",(0,i.jsxs)(n,{open:!0,children:[(0,i.jsxs)("summary",{children:[(0,i.jsxs)(s.p,{children:["(sdk) Back to deno + jsr exploration (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/760",children:"#760"}),")"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["BREAKING: back to deno + jsr exploration (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/760",children:"#760"}),")"]}),"\n"]})]}),(0,i.jsx)(s.p,{children:"Try reverting back to deno runtime for the typescript sdk in hope of\r\nmaking the dx easier.\r\nHosting a custom node/npm project adds more layer of indirection which\r\nmay result in cryptic issues sometimes."}),(0,i.jsxs)(s.p,{children:["This should also facilitate publishing on jsr although additional work\r\nare still required on the ",(0,i.jsx)(s.code,{children:"jco"})," codegen side."]}),(0,i.jsx)(s.h4,{id:"migration-notes-51",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"N/A"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Move to ghjk 0.2.0 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/754",children:"#754"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Refactors the ghjk.ts, CI to the latest version of ghjk"}),"\n",(0,i.jsx)(s.li,{children:"Bumps version to 0.4.4-0"}),"\n",(0,i.jsx)(s.li,{children:"Fixes race bug in python_sync tests"}),"\n",(0,i.jsxs)(s.li,{children:["Fixes flakeout of wasm ",(0,i.jsx)(s.code,{children:"build.sh"})," scripts due to wasm-tools EOF issue"]}),"\n",(0,i.jsx)(s.li,{children:"#763"}),"\n",(0,i.jsx)(s.li,{children:"#746"}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-52",children:"Migration notes"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-9",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.strong,{children:"Chores"})}),"\n",(0,i.jsxs)(s.li,{children:["Updated GitHub Actions workflows to use the latest version of\r\n",(0,i.jsx)(s.code,{children:"metatypedev/setup-ghjk"})," for improved stability and performance."]}),"\n",(0,i.jsxs)(s.li,{children:["Modified ",(0,i.jsx)(s.code,{children:"GHJK_VERSION"})," and various environment variables across\r\nmultiple configuration files to ensure compatibility with updated\r\ndependencies."]}),"\n",(0,i.jsx)(s.li,{children:"Revised Dockerfiles to streamline environment setup and improve build\r\nefficiency."}),"\n",(0,i.jsxs)(s.li,{children:["Updated dependency management in ",(0,i.jsx)(s.code,{children:"pyproject.toml"})," for better security\r\nand performance.","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Enhanced logging and error handling in test scripts."}),"\n"]}),"\n"]}),"\n"]}),(0,i.jsx)(s.p,{children:"These updates collectively optimize the development environment,\r\nensuring smoother builds and more reliable workflows."}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsx)(s.h3,{id:"testing",children:"Testing"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(full) Update test runner (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/705",children:"#705"}),")"]})}),(0,i.jsx)(s.p,{children:"New test runner, by default:"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Less verbose"}),"\n",(0,i.jsx)(s.li,{children:"No output for successful tests"}),"\n"]}),(0,i.jsx)(s.p,{children:"Parallel tests re-enabled."}),(0,i.jsx)(s.h4,{id:"migration-notes-53",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"N/A"})})]}),"\n",(0,i.jsxs)(s.h2,{id:"v043---2024-06-22",children:[(0,i.jsx)(s.a,{href:"https://github.com/metatypedev/metatype/releases/tag/v0.4.3",children:"v0.4.3"})," - 2024-06-22"]}),"\n",(0,i.jsx)(s.h3,{id:"bug-fixes-5",children:"Bug Fixes"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(ci) Poetry lockfile (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/732",children:"#732"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Fixes poetry lockfile and adds pre-commit hook to prevent issue from\nhappening"}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(docs) Fix demo typegraphs 2 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/756",children:"#756"}),")"]})}),(0,i.jsx)(s.p,{children:"Fix example typegraphs on metatype.dev."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","reduce.ts"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","policies.ts"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","graphql.ts"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","authentication.ts"]}),"\n"]}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-574/docs-fix-demo-typegraphs-2",children:"MET_574"})}),(0,i.jsx)(s.h4,{id:"migration-notes-54",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"No Migrations Needed"})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(docs) Fix programmatic deployment guides (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/762",children:"#762"}),")"]})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Fix typo"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","fix/test tg deploy"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","fix/test tg remove"]}),"\n"]}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-587/docs-fix-programmatic-deployment-guides",children:"MET-587"})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-55",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"No Migration Needed"})}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Only build xtask once for the tests (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/720",children:"#720"}),")"]})}),(0,i.jsx)(s.p,{children:"Use the xtask binary to run the tests."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-10",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Updated platform compatibility to ",(0,i.jsx)(s.code,{children:"x86_64-linux"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Added new configuration entry for enhanced versioning and platform\r\nsupport."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Improvements"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Modified test script to use a custom build script for better test\r\nmanagement."}),"\n"]}),"\n"]}),(0,i.jsx)(s.p,{children:"These changes improve platform compatibility and streamline the testing\r\nprocess."}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Missing typegraphs (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/741",children:"#741"}),")"]})}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Fix Missing Typegraphs"})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"attempt to fix the missing typegraphs on metatype.dev."}),"\n"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-563/docs-complete-missing-typegraphs",children:"MET-563"})}),(0,i.jsx)(s.h4,{id:"migration-notes-56",children:"Migration notes"}),(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.em,{children:"No Migrations Needed"}),"\r\n..."]}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Upload url path and add logging in the SDK (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/740",children:"#740"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Fix upload url: prepare-upload returns upload tokens instead of upload\r\nurls"}),"\n",(0,i.jsx)(s.li,{children:"Add logging in the typegraph SDK"}),"\n",(0,i.jsx)(s.li,{children:"Refactor the actor system in the CLI"}),"\n",(0,i.jsx)(s.li,{children:"Use jsonrpc for communication between the CLI and typegraph processes\r\n(over stdin/stdout)"}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-57",children:"Migration notes"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.code,{children:"typegraphs.deno"})," section of the ",(0,i.jsx)(s.code,{children:"metatype.yaml"})," config file has\r\nbeen replaced by ",(0,i.jsx)(s.code,{children:"typegraphs.typescript"})," and ",(0,i.jsx)(s.code,{children:"typegraphs.javascript"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.code,{children:"tg_deploy"})," params has changed."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Failed typegraph deployment (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/758",children:"#758"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Fix casing typo in the typescript sdk"}),"\n",(0,i.jsx)(s.li,{children:"Fix error reporting in the typescript sdk"}),"\n",(0,i.jsx)(s.li,{children:"Display the retry number"}),"\n",(0,i.jsx)(s.li,{children:"Warning on cancelled retry"}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-58",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"N/A"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsx)(s.h3,{id:"documentation-2",children:"Documentation"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.code,{children:"/docs/concepts/features-overview/"})," (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/725",children:"#725"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Re-does the feature overview page of the documentation."}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-11",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:'Added a "Features Roadmap" component to the website, displaying a list\r\nof features with details and links.'}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Documentation"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Updated various guides and reference documents to improve clarity and\r\npresentation of code examples."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Added new sections for various features such as Typegate, Typegraph,\r\nRuntimes, Prisma, Auth, Tooling, and SDK."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Bug Fixes"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Corrected a typo in the GraphQL runtimes reference documentation."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Refactor"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Replaced ",(0,i.jsx)(s.code,{children:"SDKTabs"})," and ",(0,i.jsx)(s.code,{children:"TabItem"})," components with ",(0,i.jsx)(s.code,{children:"TGExample"})," for\r\nbetter code example presentation."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Adjusted the ",(0,i.jsx)(s.code,{children:"MiniQL"})," component to handle optional properties and\r\ndefault settings."]}),"\n"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.code,{children:"/docs/reference/metagen"})," + ",(0,i.jsx)(s.code,{children:"/docs/guides/wasm-functions"})," (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/751",children:"#751"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Adds ",(0,i.jsx)(s.code,{children:"/docs/reference/metagen"})]}),"\n",(0,i.jsxs)(s.li,{children:["Adds ",(0,i.jsx)(s.code,{children:"/docs/guides/wasm-functions"})]}),"\n",(0,i.jsxs)(s.li,{children:["Adds a codegen section to ",(0,i.jsx)(s.code,{children:"/docs/guides/external-functions"})]}),"\n"]}),(0,i.jsx)(s.p,{children:"MDK-492."}),(0,i.jsx)(s.h4,{id:"migration-notes-59",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-12",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Added new targets for ",(0,i.jsx)(s.code,{children:"metagen"})," with different generators and paths\r\nfor TypeScript, Python, and Rust."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Introduced new functionality for defining and exposing typegraphs with\r\npolicies in various environments (Deno, Python, Rust)."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Added automated Rust WebAssembly project generation and compilation\r\nscript."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Enhanced documentation with new sections and updated code examples\r\nusing ",(0,i.jsx)(s.code,{children:"TGExample"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Bug Fixes"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Updated ",(0,i.jsx)(s.code,{children:".gitignore"})," to exclude ",(0,i.jsx)(s.code,{children:"*.wasm"})," files."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Documentation"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Updated links and added detailed instructions for generating types\r\nusing ",(0,i.jsx)(s.code,{children:"metagen"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Refactor"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Switched from ",(0,i.jsx)(s.code,{children:"HashMap"})," to ",(0,i.jsx)(s.code,{children:"BTreeMap"})," and ",(0,i.jsx)(s.code,{children:"HashSet"})," to ",(0,i.jsx)(s.code,{children:"BTreeSet"})," in\r\nvarious modules for better data structure handling."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Added logging enhancements in the ",(0,i.jsx)(s.code,{children:"Typegate"})," class."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Chores"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Updated build script for Rust WebAssembly target."}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Programmatic deployment blogpost (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/752",children:"#752"}),")"]})}),(0,i.jsx)(s.p,{children:"Blogpost to help discover programmatic deployment additions."}),(0,i.jsx)(s.h4,{id:"migration-notes-60",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-13",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Introduced programmatic deployment feature for deploying typegraphs\nwithin the Metatype ecosystem using TypeScript/Python SDKs."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Added new configuration options and deployment functions to enhance\nautomation and flexibility in deployment processes."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Documentation"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Added a new blog post detailing the programmatic deployment feature\nand its usage."}),"\n"]}),"\n"]})]}),"\n",(0,i.jsx)(s.h3,{id:"features-7",children:"Features"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(SDK) Add ",(0,i.jsx)(s.code,{children:"globs"})," and ",(0,i.jsx)(s.code,{children:"dir"})," support for artifact deps. (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/698",children:"#698"}),")"]})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Include glob and dir support for ",(0,i.jsx)(s.code,{children:"PythonRuntime"})," deps."]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Include glob and dir support for ",(0,i.jsx)(s.code,{children:"DenoRuntime"})," deps."]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","add tests"]}),"\n"]}),(0,i.jsxs)(s.p,{children:["The change includes support for declaring artifact dependencies through\r\n",(0,i.jsx)(s.code,{children:"globs"})," and ",(0,i.jsx)(s.code,{children:"dirs"})]}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-441/sdk-support-globs-and-directories-in-artifact-dependencies",children:"MET-441"})}),(0,i.jsx)(s.h4,{id:"migration-notes-61",children:"Migration notes"}),(0,i.jsxs)(s.p,{children:["In the ",(0,i.jsx)(s.code,{children:"deps"})," parameter for ",(0,i.jsx)(s.code,{children:"python.import(...)"})," and ",(0,i.jsx)(s.code,{children:"deno.import(...)"}),",\r\nglobs and dirs can be passed in addition to files."]}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change come with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-14",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Introduced functionality for defining and deploying Typegraphs for\r\nDeno and Python runtimes."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Added support for defining a Deno runtime dependency graph with\r\npolicies for test scenarios."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Bug Fixes"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Corrected the structure of the ",(0,i.jsx)(s.code,{children:"Deno.serve"})," call in the ",(0,i.jsx)(s.code,{children:"serve"}),"\r\nfunction."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Refactor"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Enhanced method chaining for better readability in the ",(0,i.jsx)(s.code,{children:"MetaTest"}),"\r\nclass."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Tests"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Updated test coverage reporting to include new Deno runtime test\r\nfiles."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Commented out and removed outdated test cases in Deno runtime tests."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Chores"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Updated platform specification in configuration files."}),"\n"]}),"\n"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(docs) Add ",(0,i.jsx)(s.code,{children:"embedded typegate"})," page (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/747",children:"#747"}),")"]})}),(0,i.jsx)(s.h1,{id:"embedded-typegate-docs-page",children:"Embedded typegate docs page"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","need a page under meta-cli/embedded typegate to explain how that\r\nworks"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","tutorials should take advantage of the embedded one"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","the embedded one should be the default everything"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","explain that there is 2 flavors in reference/meta-cli"]}),"\n"]}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-562/docs-use-embedded-whenever-possible-in-the-docs-and-examples",children:"MET-562"})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-62",children:"Migration notes"}),(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.em,{children:"No Migrations Needed"}),"\r\n..."]}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(mdk) Mdk python (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/707",children:"#707"}),")"]})}),(0,i.jsx)(s.p,{children:"Mdk for python runtime"}),(0,i.jsx)(s.h4,{id:"migration-notes-63",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"None"}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-15",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Introduced new functionalities for generating Python code based on\r\nconfigurations, including handling of templates and required objects."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Added Python script templates for defining typed functions and\r\nstructured objects with comprehensive data type handling."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Enhanced type management and priority handling in utility functions."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Documentation"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Provided detailed summaries and documentation for new functionalities\r\nand templates."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Refactor"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Implemented new structures and methods for efficient code generation\r\nand type handling."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Tests"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Added tests for defining typegraph structures and policies in Python."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Chores"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Updated URLs in the ",(0,i.jsx)(s.code,{children:".ghjk/deno.lock"})," file to reflect new changes in\r\nthe codebase."]}),"\n"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{open:!0,children:[(0,i.jsxs)("summary",{children:[(0,i.jsxs)(s.p,{children:["(mdk) ",(0,i.jsx)(s.code,{children:"mdk_typescript"})," (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/739",children:"#739"}),")"]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["BREAKING: ",(0,i.jsx)(s.code,{children:"mdk_typescript"})," (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/739",children:"#739"}),")"]}),"\n"]})]}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Implements the ",(0,i.jsx)(s.code,{children:"mdk_typescript"})," code generator for typescript type\ninference on Deno runtime external modules."]}),"\n",(0,i.jsx)(s.li,{children:"Ports the very simple generator already present in meta-cli."}),"\n",(0,i.jsx)(s.li,{children:"Removes old codegen from cli and sdk."}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-64",children:"Migration notes"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Metagen section of ",(0,i.jsx)(s.code,{children:"metatype.yaml"})," has changed. Targets are now lists\ninstead of maps, items no sporting ",(0,i.jsx)(s.code,{children:"generator"})," field instead of key\nacting as ref to generator."]}),"\n",(0,i.jsxs)(s.li,{children:["(sdk) WasmRuntime's ",(0,i.jsx)(s.code,{children:"fromExport"})," method has been renamed to ",(0,i.jsx)(s.code,{children:"export"}),"\nto make it more uniform to handler."]}),"\n",(0,i.jsxs)(s.li,{children:["(sdk) WasmRuntime ",(0,i.jsx)(s.code,{children:"export"})," and ",(0,i.jsx)(s.code,{children:"handler"})," method's now expect\nhandler/func name under ",(0,i.jsx)(s.code,{children:"name"})," instead of ",(0,i.jsx)(s.code,{children:"func"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["(sdk) ",(0,i.jsx)(s.code,{children:"codegen"})," flag has been removed from ",(0,i.jsx)(s.code,{children:"ArtifactsConfig"})," object."]}),"\n",(0,i.jsxs)(s.li,{children:["(cli) ",(0,i.jsx)(s.code,{children:"gen mod/mdk"})," has been simplified to just ",(0,i.jsx)(s.code,{children:"gen"})," as the previous\nmod option is no longer avail."]}),"\n"]}),(0,i.jsx)(s.hr,{}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(mdk,gate) Hostcall (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/706",children:"#706"}),")"]})}),(0,i.jsx)(s.p,{children:"Introduces a mechanism for wasm materializers to access hostgate\r\nfunctions."}),(0,i.jsxs)(s.p,{children:["This implements a pretty basic JSON wire interface, a singular\r\n",(0,i.jsx)(s.code,{children:"hostcall"})," function that's exposed to materializers. The only\r\nimplemented function on this interface are ",(0,i.jsx)(s.code,{children:"gql"})," queries."]}),(0,i.jsx)(s.p,{children:"This is a stacked PR on top of #687."}),(0,i.jsx)(s.p,{children:"MET-473."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change come with new or modified tests"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-16",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Added an import statement for ",(0,i.jsx)(s.code,{children:"std_url"})," and a new task for installing\r\nWASI adapter related files."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Introduced new functionalities in the application's runtime to support\r\nadditional parameters and error handling."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Enhancements"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Improved the application's handling of GraphQL queries with new error\r\ntypes and display methods."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Enhanced the WASM runtime build process to target a more appropriate\r\narchitecture."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Bug Fixes"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Fixed issues in Python and WASM runtime tests to ensure reliability\r\nand performance."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Documentation"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Updated internal documentation to reflect new command interfaces and\r\nenvironmental interactions in the application's CLI tools."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Refactor"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Refactored various internal APIs to improve code maintainability and\r\nefficiency."}),"\n"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(meta-test) Update ",(0,i.jsx)(s.code,{children:"t.engine()"})," impl (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/716",children:"#716"}),")"]})}),(0,i.jsxs)(s.p,{children:["Update the implementation of ",(0,i.jsx)(s.code,{children:"t.engine()"})]}),(0,i.jsxs)(s.p,{children:["The change comes with removing the different spin-offs of ",(0,i.jsx)(s.code,{children:"t.engine"}),"\r\nwhich arose from the previous impl of t.engine incompatibility with\r\nartifact upload protocol. The change will make ",(0,i.jsx)(s.code,{children:"t.engine"})," deploy the\r\nartifacts in Artifact Resolution mode by running a shell command to\r\ndeploy the typegraph."]}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-500/test-update-the-implementation-of-tengine",children:"MET-500"})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","remove different versions of ",(0,i.jsx)(s.code,{children:"t.engine"})]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","add tg_deploy caller script which imports typegraphs dynamically\r\nand deploys them."]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","make changes to make ",(0,i.jsx)(s.code,{children:"t.engine"})," run in artifact resolution mode"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","update existing tests to adhere to the current change"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","pass unique different ",(0,i.jsx)(s.code,{children:"tempDir"}),"s to all the typegate instances\r\ncreated during test."]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","add support for authoring multiple typegraphs in a single file in\r\n",(0,i.jsx)(s.code,{children:"meta-test"})," and add multi typegraph tests."]}),"\n"]}),(0,i.jsx)(s.h4,{id:"migration-notes-65",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"python SDK test typegraphs' function names should be the same with the\r\nfilename of the typegraph file, for dynamic import compatibility\r\nreasons."}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-17",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Introduced a new function ",(0,i.jsx)(s.code,{children:"wasm_duplicate"})," to handle WebAssembly\r\nruntimes with specific policies."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Refactor"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Renamed and refactored functions and test setups to align with updated\r\ntest frameworks and improve code clarity."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Bug Fixes"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Added error handling in the ",(0,i.jsx)(s.code,{children:"getLocalPath"})," function to log warnings if\r\nlinking errors occur."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Tests"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Updated test scripts to reflect changes in function calls, imports,\r\nand engine instantiation for better test accuracy and reliability."}),"\n"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Doc polish (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/735",children:"#735"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"doc polish and cleanup"}),"\n",(0,i.jsx)(s.li,{children:"upgrade website except Docusaurus as the css issue is stil present"}),"\n",(0,i.jsx)(s.li,{children:"bump to next pre-release"}),"\n",(0,i.jsx)(s.li,{children:"not everything is done, but let's iterate!"}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-18",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Added platform compatibility for ",(0,i.jsx)(s.code,{children:"x86_64-linux"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Introduced new functionalities for generating Python code and enhanced\r\ntype management."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Added import statement for ",(0,i.jsx)(s.code,{children:"std_url"})," and new task for installing WASI\r\nadapter files."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Enhanced runtime support for additional parameters and error handling."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Improvements"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Enhanced GraphQL query handling with new error types and display\r\nmethods."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Improved WASM runtime build process for better architecture targeting."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Documentation"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:'Updated feature overview and added a "Features Roadmap" component.'}),"\n",(0,i.jsx)(s.li,{children:"Enhanced various guides and references for better clarity."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Added new sections for Typegate, Typegraph, Runtimes, Prisma, Auth,\r\nTooling, and SDK."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Corrected typos and improved code example presentation."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Bug Fixes"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Fixed issues in Python and WASM runtime tests to ensure reliability."}),"\n"]}),"\n"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsx)(s.h3,{id:"miscellaneous-tasks-9",children:"Miscellaneous Tasks"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(docs) Replace term materializer with function for user facing concepts (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/736",children:"#736"}),")"]})}),(0,i.jsx)(s.p,{children:"Materializer and function might introduce confusion as they are pretty\r\nmuch the same thing from the user point of view, one can be defined in\r\nterms of the other."}),(0,i.jsx)(s.h4,{id:"migration-notes-66",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"None"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-19",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.strong,{children:"Documentation"})}),"\n",(0,i.jsx)(s.li,{children:'Updated terminology from "materializers" to "functions" across various\r\ndocumentation files to reflect a semantic shift and provide clearer\r\ndescriptions.'}),"\n",(0,i.jsx)(s.li,{children:"Improved clarity in descriptions of custom functions, runtimes, and\r\ntheir roles in the Metatype computing model."}),"\n",(0,i.jsx)(s.li,{children:"Corrected typos and refined explanations in multiple guides and\r\nreference documents."}),"\n"]}),(0,i.jsx)(s.p,{children:"These changes enhance the readability and consistency of our\r\ndocumentation, making it easier for users to understand and implement\r\nthe features and concepts within the system."})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(docs) Embedded typegate (v0.3.x) blog (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/750",children:"#750"}),")"]})}),(0,i.jsx)(s.h1,{id:"add-a-blog-about-embedded-typegate",children:"Add a blog about Embedded Typegate."}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-564/docs-embedded-typegate-v03x",children:"MET-564"})}),(0,i.jsx)(s.h4,{id:"migration-notes-67",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"No Migrations Needed"})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-20",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Introduced a new blog post on emulating server nodes locally using the\r\nEmbedded Typegate feature in Meta CLI."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Added a new ",(0,i.jsx)(s.code,{children:"BlogIntro"})," component to the website for displaying styled\r\nblog introductions."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Documentation"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Updated documentation to explain how to spin up a local instance of\r\nTypegate for testing and development."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Chores"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:'Updated platform compatibility from "x86_64-linux" to\r\n"aarch64-darwin".'}),"\n"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(website) ",(0,i.jsx)(s.code,{children:"g.rest"})," reference at ",(0,i.jsx)(s.code,{children:"/docs/reference/rest"})," (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/734",children:"#734"}),")"]})}),(0,i.jsxs)(s.p,{children:["Add reference page for ",(0,i.jsx)(s.code,{children:"g.rest(..)"})]}),(0,i.jsx)(s.h4,{id:"migration-notes-68",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"None"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-21",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Documentation"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Added a reference to the REST reference section in the REST guide."}),"\n",(0,i.jsx)(s.li,{children:"Introduced new documentation for consuming APIs using Metatype."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Included examples in Python and TypeScript for interacting with REST\r\nAPIs.","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Explained query types, dynamic queries, and endpoint access."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.li,{children:"Provided guidance on accessing auto-generated documentation and\r\ndownloading the OpenAPI spec."}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Bump deno to 1.43.6 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/737",children:"#737"}),")"]})}),(0,i.jsx)(s.p,{children:"Update deno to 1.43.6 and make requisite changes."}),(0,i.jsx)(s.p,{children:"Required because of dep conflicts with latest lade-sdk."}),(0,i.jsx)(s.h4,{id:"migration-notes-69",children:"Migration notes"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Update ",(0,i.jsx)(s.code,{children:"rust"})," dependencies (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/748",children:"#748"}),")"]})}),(0,i.jsx)(s.p,{children:"update Rust dependencies"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-479/sdkgate-update-rust-dependencies",children:"MET-479"})}),(0,i.jsx)(s.h4,{id:"migration-notes-70",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"No Migrations Needed"})}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change comes with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsx)(n,{children:(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Bump ",(0,i.jsx)(s.code,{children:"METATYPE_VERSION"})," to 0.4.3 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/764",children:"#764"}),")"]})})}),"\n",(0,i.jsxs)(s.h2,{id:"v042---2024-05-22",children:[(0,i.jsx)(s.a,{href:"https://github.com/metatypedev/metatype/releases/tag/v0.4.2",children:"v0.4.2"})," - 2024-05-22"]}),"\n",(0,i.jsx)(s.h3,{id:"bug-fixes-6",children:"Bug Fixes"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(release) Fix fat CLI compilation (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/730",children:"#730"}),")"]})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Fix fat CLI compilation"}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Bump to 0.4.2"}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Bump wasmtime to 21"}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Bump rust to 1.78.0"}),"\n"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change comes with new or modified tests"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(s.h2,{id:"v041---2024-05-20",children:[(0,i.jsx)(s.a,{href:"https://github.com/metatypedev/metatype/releases/tag/v0.4.1",children:"v0.4.1"})," - 2024-05-20"]}),"\n",(0,i.jsx)(s.h3,{id:"bug-fixes-7",children:"Bug Fixes"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(SDK) Artifact upload fails when same file referred multiple times (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/715",children:"#715"}),")"]})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","fix the bug where duplicate artifact references causing failure\r\nduring artifact resolution(typegate) during runtime."]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","add sync mode tests for Python and Deno runtime."]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","add other edge test cases to artifact upload.","\n",(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","test for no artifact in typegraph"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","test for duplicate artifact reference in the same typegraph"]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(gate) Improve logging and responses, prepare 0.4.1 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/714",children:"#714"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Logging before and after each faillible operation","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Runtimes: foreign resolvers"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.li,{children:"Always log before reporting error: HTTP response"}),"\n",(0,i.jsx)(s.li,{children:"Fix error code in artifact_service"}),"\n",(0,i.jsxs)(s.li,{children:["Add ",(0,i.jsx)(s.code,{children:"BaseError"})," class for structured messages in responses"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-22",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Updated Docker image versions and dependency versions to ensure\r\ncompatibility and stability."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Added a search functionality to the app."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Bug Fixes"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Enhanced error handling with specific error classes for more detailed\r\nerror messages."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Refactor"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Replaced generic ",(0,i.jsx)(s.code,{children:"Error"})," instances with specific error classes for\r\nbetter error categorization."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Refactored error handling in HTTP response functions to use a\r\n",(0,i.jsx)(s.code,{children:"BaseError"})," class."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Chores"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Updated version numbers across multiple configuration files to\r\n",(0,i.jsx)(s.code,{children:"0.4.1-0"}),"."]}),"\n"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsx)(s.h3,{id:"features-8",children:"Features"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Polish documentation and project (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/696",children:"#696"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"update the headline, the overviews and many other documentation areas"}),"\n",(0,i.jsx)(s.li,{children:"upgrades the dependencies."}),"\n"]}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change come with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-23",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Bug Fixes"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Updated Docker image version for the ",(0,i.jsx)(s.code,{children:"typegate"})," service to ensure\r\nstability and compatibility."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Documentation"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Revised ",(0,i.jsx)(s.code,{children:"TAGLINE"})," for better clarity on supported languages: WASM,\r\nTypescript, and Python."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Updated version declarations for improved consistency and\r\nfunctionality across multiple files."}),"\n"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsx)(s.h3,{id:"miscellaneous-tasks-10",children:"Miscellaneous Tasks"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(docs) Final polish to comparison table. (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/709",children:"#709"}),")"]})}),(0,i.jsx)(s.p,{children:"some changes to comparison table(docs)"}),(0,i.jsx)(s.h4,{id:"migration-notes-71",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"No Migrations Needed"})}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-24",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.strong,{children:"Documentation"})}),"\n",(0,i.jsx)(s.li,{children:"Introduced a new section on Artifact Tracking Protocol in the\r\narchitecture documentation, explaining artifact classification and\r\ntracking modes in Metatype."}),"\n",(0,i.jsx)(s.li,{children:"Updated comparisons documentation with additional platforms, criteria\r\nfor choosing Metatype, and detailed feature comparison tables."}),"\n",(0,i.jsx)(s.li,{children:"Renamed project directory for clarity and consistency in project setup\r\ndocumentation."}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Bug Fixes"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Removed outdated ",(0,i.jsx)(s.code,{children:"TODO"})," comment in installation documentation."]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Bump to version 0.4.1-0 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/713",children:"#713"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Bumps version to 0.4.1-0."}),"\n",(0,i.jsx)(s.li,{children:"Fixes broken release CI."}),"\n",(0,i.jsx)(s.li,{children:"#719"}),"\n",(0,i.jsx)(s.li,{children:"Adds 20 minutes to test-full timeout."}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-25",children:"Summary by CodeRabbit"}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-26",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:'Updated platform support for better compatibility with "x86_64-linux".'}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Bug Fixes"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Minor version updates across multiple configurations to enhance\r\nstability."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Chores"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:'Updated version numbers from "0.4.0" to "0.4.1-0" across various files\r\nand configurations.'}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Refactor"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Adjusted build and test scripts for improved efficiency and\r\ncompatibility."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Documentation"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Enhanced internal documentation to reflect version and platform\r\nchanges."}),"\n"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(s.h2,{id:"v040---2024-05-09",children:[(0,i.jsx)(s.a,{href:"https://github.com/metatypedev/metatype/releases/tag/v0.4.0",children:"v0.4.0"})," - 2024-05-09"]}),"\n",(0,i.jsx)(s.h3,{id:"bug-fixes-8",children:"Bug Fixes"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(gh-tests) Fix local npm registry config (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/692",children:"#692"}),")"]})}),(0,i.jsx)(s.p,{children:"Fix the NPM registry config in the Github tests."}),(0,i.jsx)(s.h4,{id:"migration-notes-72",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"N/A"})})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Website and headline (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/691",children:"#691"}),")"]})}),(0,i.jsx)(s.h4,{id:"motivation-and-context",children:"Motivation and context"}),(0,i.jsxs)(s.p,{children:["Fix the CSS issue introduced by docusaurus 3.2.0\r\n(",(0,i.jsx)(s.a,{href:"https://github.com/facebook/docusaurus/issues/10005",children:"https://github.com/facebook/docusaurus/issues/10005"}),"). 3.2.1 should fix\r\nit but the affected version maybe loaded by dependencies, so we will\r\nhave to wait a bit more."]}),(0,i.jsx)(s.h3,{id:"checklist-2",children:"Checklist"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change come with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Do not override log level when no verbosity flag is present (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/694",children:"#694"}),")"]})}),(0,i.jsx)(s.p,{children:"Remove log level override by the verbosity flag when no flag is present.\r\nIt will default to the configured env_logger default level (or env\r\nvariable)."}),(0,i.jsx)(s.p,{children:"..."}),(0,i.jsxs)(s.p,{children:['The default log level became "error" after #664, and ',(0,i.jsx)(s.code,{children:"RUST_LOG"}),"\r\nenvironment variable where ignored."]}),(0,i.jsx)(s.h4,{id:"migration-notes-73",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"N/A"})})]}),"\n",(0,i.jsx)(s.h3,{id:"documentation-3",children:"Documentation"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Add examples for each command (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/684",children:"#684"}),")"]})}),(0,i.jsx)(s.h4,{id:"motivation-and-context-1",children:"Motivation and context"}),(0,i.jsxs)(s.p,{children:["Getting started with ",(0,i.jsx)(s.code,{children:"meta"})," cli should be easy"]}),(0,i.jsx)(s.h4,{id:"migration-notes-74",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"None"}),(0,i.jsx)(s.h3,{id:"checklist-3",children:"Checklist"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change come with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Improve ",(0,i.jsx)(s.code,{children:"/tutorials/quick-start"})," section. (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/681",children:"#681"}),")"]})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Improve Layout"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Include a simple project."]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Add the result/outputs to running CLI commands."]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Remove Metatype cloud registration form."]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Separate the CLI commands to separate code blocks"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Add links to references and concepts."]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Add playground."]}),"\n"]}),(0,i.jsx)(s.h4,{id:"motivation-and-context-2",children:"Motivation and context"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-440/docs-meta-task",children:"Docs\r\nMeta-task"})}),(0,i.jsx)(s.h4,{id:"migration-notes-75",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"No Migration Needed"})}),(0,i.jsx)(s.h3,{id:"checklist-4",children:"Checklist"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Test the commands and the examples."]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change come with new or modified tests"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Improve ",(0,i.jsx)(s.code,{children:"/docs/tutorials/metatype-basics"})," (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/688",children:"#688"}),")"]})}),(0,i.jsxs)(s.p,{children:["Improve ",(0,i.jsx)(s.code,{children:"/docs/tutorials/metatype-basics"})]}),(0,i.jsx)(s.h4,{id:"motivation-and-context-3",children:"Motivation and context"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-440/docs-meta-task",children:"Docs\r\nMeta-task"})}),(0,i.jsx)(s.h4,{id:"migration-notes-76",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"No Migrations Needed"})}),(0,i.jsx)(s.h3,{id:"checklist-5",children:"Checklist"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change come with new or modified tests"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Improve ",(0,i.jsx)(s.code,{children:"/reference/runtimes/"})," (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/676",children:"#676"}),")"]})}),(0,i.jsx)(s.h4,{id:"motivation-and-context-4",children:"Motivation and context"}),(0,i.jsx)(s.p,{children:"Better documentation"}),(0,i.jsx)(s.h4,{id:"migration-notes-77",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"N/A"}),(0,i.jsx)(s.h3,{id:"checklist-6",children:"Checklist"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change come with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Improve ",(0,i.jsx)(s.code,{children:"/guides/external-functions"})," (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/677",children:"#677"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Improvements to the ",(0,i.jsx)(s.code,{children:"/guides/external-functions"})," page."]}),"\n",(0,i.jsx)(s.li,{children:"Adds a configuration file for git-town"}),"\n"]}),(0,i.jsx)(s.h4,{id:"motivation-and-context-5",children:"Motivation and context"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"N/A"})}),(0,i.jsx)(s.h4,{id:"migration-notes-78",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"N/A"})}),(0,i.jsx)(s.h3,{id:"checklist-7",children:"Checklist"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change come with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Improve ",(0,i.jsx)(s.code,{children:"docs/reference/types"})," (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/685",children:"#685"}),")"]})}),(0,i.jsxs)(s.p,{children:["Improves ",(0,i.jsx)(s.code,{children:"docs/reference/types"})]}),(0,i.jsx)(s.h4,{id:"motivation-and-context-6",children:"Motivation and context"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"N/A"})}),(0,i.jsx)(s.h4,{id:"migration-notes-79",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"N/A"})}),(0,i.jsx)(s.h3,{id:"checklist-8",children:"Checklist"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change come with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Add a comparison b/n metatype and other similar solutions/products. (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/697",children:"#697"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Adds a comparison table between metatype and other similar services."}),"\n",(0,i.jsxs)(s.li,{children:["Add artifact upload protocol to ",(0,i.jsx)(s.code,{children:"Architecture"})," section in docs."]}),"\n"]}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-443/include-comparisons-with-other-products-similar-to-metatype",children:"MET-443"})}),(0,i.jsx)(s.h4,{id:"migration-notes-80",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"No Migration Needed"})})]}),"\n",(0,i.jsx)(s.h3,{id:"features-9",children:"Features"}),"\n",(0,i.jsx)(n,{children:(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(cli) Timeout loader process (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/693",children:"#693"}),")"]})})}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(cli,sdk) Better error messages (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/689",children:"#689"}),")"]})}),(0,i.jsx)(s.h4,{id:"motivation-and-context-7",children:"Motivation and context"}),(0,i.jsx)(s.p,{children:"Make it more clear where failures happen"}),(0,i.jsx)(s.h4,{id:"migration-notes-81",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"None"}),(0,i.jsx)(s.h3,{id:"checklist-9",children:"Checklist"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","The change come with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Upload artifacts to s3 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/638",children:"#638"}),")"]})}),(0,i.jsx)(s.p,{children:"Upload artifacts to S3 when sync-mode is enabled"}),(0,i.jsx)(s.h4,{id:"motivation-and-context-8",children:"Motivation and context"}),(0,i.jsx)(s.p,{children:"Sharing artifacts between replicas without including it in the typegraph\r\n(and sync through redis)"}),(0,i.jsx)(s.h4,{id:"migration-notes-82",children:"Migration notes"}),(0,i.jsx)(s.p,{children:"No changes needed."}),(0,i.jsx)(s.h3,{id:"checklist-10",children:"Checklist"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change come with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Upload ",(0,i.jsx)(s.code,{children:"PythonRuntime"})," artifacts and deps (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/672",children:"#672"}),")"]})}),(0,i.jsx)(s.h4,{id:"motivation-and-context-9",children:"Motivation and context"}),(0,i.jsxs)(s.p,{children:["Track artifact/module dependencis for ",(0,i.jsx)(s.code,{children:"PythonRuntime"})]}),(0,i.jsx)(s.h4,{id:"migration-notes-83",children:"Migration notes"}),(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.code,{children:"python.import(...)"})," and ",(0,i.jsx)(s.code,{children:"python.import_(...)"})," accept an optional parameter ",(0,i.jsx)(s.code,{children:"deps"})," that accepts list of dependencies for the python module."]}),(0,i.jsx)(s.h3,{id:"checklist-11",children:"Checklist"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change come with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Upload ",(0,i.jsx)(s.code,{children:"DenoRuntime"})," artifacts and deps (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/674",children:"#674"}),")"]})}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Track deno runtime artifacts(also dependencies)"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Upload artifacts during deploy to either local(single replica) or\r\nshared(s3)"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","resolve artifacts(module and deps) upon typegate runtime."]}),"\n"]}),(0,i.jsx)(s.h4,{id:"motivation-and-context-10",children:"Motivation and context"}),(0,i.jsx)(s.p,{children:"Persisting deno runtime artifacts to a local/shared storage."}),(0,i.jsx)(s.h4,{id:"migration-notes-84",children:"Migration notes"}),(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.code,{children:"deno.import(...)"})," and ",(0,i.jsx)(s.code,{children:"deno.import_(...)"})," accept an optional parameter\r\nthat accepts list of dependencies for the deno/ts module."]}),(0,i.jsx)(s.h3,{id:"checklist-12",children:"Checklist"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change come with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Enable batch prisma queries in the typegate runtime (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/682",children:"#682"}),")"]})}),(0,i.jsx)(s.p,{children:"Enable batch prisma queries (and transaction) in the typegate runtime"}),(0,i.jsx)(s.h4,{id:"motivation-and-context-11",children:"Motivation and context"}),(0,i.jsx)(s.p,{children:"Console"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-381/console-collections",children:"MET-381"})}),(0,i.jsx)(s.h4,{id:"migration-notes-85",children:"Migration notes"}),(0,i.jsx)(s.h3,{id:"checklist-13",children:"Checklist"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change come with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["Artifact removal (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/668",children:"#668"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Add GC: remove artifacts when unreferenced by any deployed typegraph"}),"\n",(0,i.jsxs)(s.li,{children:["Improve resource management: use ",(0,i.jsx)(s.code,{children:"AsyncDisposable"})," and\r\n",(0,i.jsx)(s.code,{children:"AsyncDisposableStack"})]}),"\n",(0,i.jsxs)(s.li,{children:["Improve testability (for parallel testing): always read the tmpDir\r\nconfig from the ",(0,i.jsx)(s.code,{children:"Typegate"})," object"]}),"\n"]}),(0,i.jsx)(s.h4,{id:"motivation-and-context-12",children:"Motivation and context"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://linear.app/metatypedev/issue/MET-433/file-removal",children:"MET-433"})}),(0,i.jsx)(s.h4,{id:"migration-notes-86",children:"Migration notes"}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"N/A"})}),(0,i.jsx)(s.h3,{id:"checklist-14",children:"Checklist"}),(0,i.jsxs)(s.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","The change come with new or modified tests"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","Hard-to-understand functions have explanatory comments"]}),"\n",(0,i.jsxs)(s.li,{className:"task-list-item",children:[(0,i.jsx)(s.input,{type:"checkbox",checked:!0,disabled:!0})," ","End-user documentation is updated to reflect the change"]}),"\n"]}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-27",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Enhanced search functionality with the addition of a new search bar."}),"\n",(0,i.jsx)(s.li,{children:"Introduced new test configurations to improve script execution."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Updated artifact storage documentation to clarify management\r\nprocesses."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Added new extensions to support improved code commenting."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Bug Fixes"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Removed outdated Deno import mapping settings to streamline\r\ndevelopment environment setup."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Documentation"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Expanded documentation on artifact tracking and management, including\r\nreference counting and garbage collection mechanisms."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Refactor"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Implemented interface changes in ",(0,i.jsx)(s.code,{children:"QueryEngine"})," for better async\r\ndisposal management."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Code restructuring in artifact management for enhanced performance and\r\nmaintainability."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Chores"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Adjusted settings and configurations in the development environment to\r\nalign with current best practices."}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Tests"})}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsx)(s.p,{children:"Introduced new test cases for artifact upload and management\r\nfunctionalities."}),"\n"]}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsx)(s.h3,{id:"miscellaneous-tasks-11",children:"Miscellaneous Tasks"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(release) Prepare 0.4.0 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/710",children:"#710"}),")"]})}),(0,i.jsx)(s.p,{children:"Bumps version to release 0.4.0."}),(0,i.jsx)(s.h2,{id:"summary-by-coderabbit-28",children:"Summary by CodeRabbit"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.strong,{children:"New Features"})}),"\n",(0,i.jsx)(s.li,{children:"Updated the software across various components to version 0.4.0,\r\nenhancing functionality and potentially introducing new features or\r\nfixes."}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.strong,{children:"Documentation"})}),"\n",(0,i.jsx)(s.li,{children:"Updated version documentation in multiple configuration files to\r\nreflect new version 0.4.0."}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.strong,{children:"Bug Fixes"})}),"\n",(0,i.jsx)(s.li,{children:"Adjusted version constants and dependencies to ensure compatibility\r\nand stability with the new software version 0.4.0."}),"\n"]}),(0,i.jsx)(s.hr,{})]}),"\n",(0,i.jsx)(n,{children:(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(sdk,gate) Bump wasmtime to 20.0.0 and wit-bindgen to 0.24.0 (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/695",children:"#695"}),")"]})})}),"\n",(0,i.jsx)(s.h3,{id:"refactor-5",children:"Refactor"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(gate) Wasi 0.2 pyrt (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/687",children:"#687"}),")"]})}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Rewrites the PythonRuntime host using a ",(0,i.jsx)(s.code,{children:"componentize-py"})," based\r\ncomponent."]}),"\n",(0,i.jsxs)(s.li,{children:["Leaf through this\r\n",(0,i.jsx)(s.a,{href:"https://hackmd.io/@SC-qT-WXTROceKYdNA-Lpg/ryyAXiQlC/edit",children:"memo"})," for a\r\nmental model."]}),"\n"]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:(0,i.jsxs)(s.p,{children:["(libs/xtask,gate) Remove xtask/codegen (",(0,i.jsx)("a",{href:"https://github.com/metatypedev/metatype/pull/700",children:"#700"}),")"]})}),(0,i.jsx)(s.p,{children:"Faster build time"}),(0,i.jsx)(s.h4,{id:"migration-notes-87",children:"Migration notes"}),(0,i.jsxs)(s.p,{children:["Make sure to sync ",(0,i.jsx)(s.code,{children:"typegate/src/types.ts"})," when an update is made on the\r\ntypegraph schema."]})]})]})}function d(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}const a={title:"Changelog",comments:!1,sidebar_position:1e3},c="",r={id:"reference/changelog",title:"Changelog",description:"",source:"@site/docs/reference/changelog.mdx",sourceDirName:"reference",slug:"/reference/changelog",permalink:"/docs/reference/changelog",draft:!1,unlisted:!1,editUrl:"https://github.com/metatypedev/metatype/tree/main/docs/metatype.dev/docs/reference/changelog.mdx",tags:[],version:"current",sidebarPosition:1e3,frontMatter:{title:"Changelog",comments:!1,sidebar_position:1e3},sidebar:"docs",previous:{title:"Embedded Typegate",permalink:"/docs/reference/meta-cli/embedded-typegate/"},next:{title:"index",permalink:"/docs/reference/metagen/"}},o={},h=[{value:"v0.5.0-rc.1 - 2024-10-22",id:"v050-rc1---2024-10-22",level:2},{value:"Bug Fixes",id:"bug-fixes",level:3},{value:"Migration notes",id:"migration-notes",level:4},{value:"Migration notes",id:"migration-notes-1",level:4},{value:"Migration notes",id:"migration-notes-2",level:4},{value:"Checklist",id:"checklist",level:4},{value:"Migration notes",id:"migration-notes-3",level:4},{value:"Fix missing images for durable execution
blog",id:"fix-missing-images-for-durable-execution-blog",level:2},{value:"Migration notes",id:"migration-notes-4",level:4},{value:"Migration notes",id:"migration-notes-5",level:4},{value:"Documentation",id:"documentation",level:3},{value:"Migration notes",id:"migration-notes-6",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit",level:2},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-1",level:2},{value:"Migration notes",id:"migration-notes-7",level:4},{value:"Features",id:"features",level:3},{value:"Migration notes",id:"migration-notes-8",level:4},{value:"Migration notes",id:"migration-notes-9",level:4},{value:"Migration notes",id:"migration-notes-10",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-2",level:2},{value:"Migration notes",id:"migration-notes-11",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-3",level:2},{value:"Release Notes",id:"release-notes",level:2},{value:"Migration notes",id:"migration-notes-12",level:4},{value:"Migration notes",id:"migration-notes-13",level:4},{value:"Migration notes",id:"migration-notes-14",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-4",level:2},{value:"Release Notes",id:"release-notes-1",level:2},{value:"Migration notes",id:"migration-notes-15",level:4},{value:"Migration notes",id:"migration-notes-16",level:4},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks",level:3},{value:"Migration notes",id:"migration-notes-17",level:4},{value:"Migration notes",id:"migration-notes-18",level:4},{value:"Refactor",id:"refactor",level:3},{value:"Migration notes",id:"migration-notes-19",level:4},{value:"Migration notes",id:"migration-notes-20",level:4},{value:"Migration notes",id:"migration-notes-21",level:4},{value:"Migration notes",id:"migration-notes-22",level:4},{value:"Migration notes",id:"migration-notes-23",level:4},{value:"Checklist",id:"checklist-1",level:4},{value:"Migration notes",id:"migration-notes-24",level:4},{value:"v0.4.10 - 2024-09-04",id:"v0410---2024-09-04",level:2},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-1",level:3},{value:"v0.4.10-rc1 - 2024-09-03",id:"v0410-rc1---2024-09-03",level:2},{value:"Bug Fixes",id:"bug-fixes-1",level:3},{value:"v0.4.9 - 2024-09-02",id:"v049---2024-09-02",level:2},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-2",level:3},{value:"v0.4.9-rc2 - 2024-09-02",id:"v049-rc2---2024-09-02",level:2},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-3",level:3},{value:"v0.4.9-rc1 - 2024-09-02",id:"v049-rc1---2024-09-02",level:2},{value:"Features",id:"features-1",level:3},{value:"Migration notes",id:"migration-notes-25",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-5",level:2},{value:"Migration notes",id:"migration-notes-26",level:4},{value:"Migration notes",id:"migration-notes-27",level:4},{value:"Refactor",id:"refactor-1",level:3},{value:"Ensure documentation is pushing for meta dev instead of meta typegate",id:"ensure-documentation-is-pushing-for-meta-dev-instead-of-meta-typegate",level:2},{value:"Migration notes",id:"migration-notes-28",level:4},{value:"Migration notes",id:"migration-notes-29",level:4},{value:"v0.4.8 - 2024-08-16",id:"v048---2024-08-16",level:2},{value:"Bug Fixes",id:"bug-fixes-2",level:3},{value:"Features",id:"features-2",level:3},{value:"Migration notes",id:"migration-notes-30",level:4},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-4",level:3},{value:"v0.4.7 - 2024-08-08",id:"v047---2024-08-08",level:2},{value:"Features",id:"features-3",level:3},{value:"Migration notes",id:"migration-notes-31",level:4},{value:"Migration notes",id:"migration-notes-32",level:4},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-5",level:3},{value:"Refactor",id:"refactor-2",level:3},{value:"Migration notes",id:"migration-notes-33",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-6",level:2},{value:"Migration notes",id:"migration-notes-34",level:4},{value:"v0.4.6 - 2024-08-01",id:"v046---2024-08-01",level:2},{value:"Features",id:"features-4",level:3},{value:"Migration notes",id:"migration-notes-35",level:4},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-6",level:3},{value:"Migration notes",id:"migration-notes-36",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-7",level:2},{value:"Refactor",id:"refactor-3",level:3},{value:"Improve the documentation on quick-start
page",id:"improve-the-documentation-on-quick-start-page",level:2},{value:"Migration notes",id:"migration-notes-37",level:4},{value:"v0.4.5 - 2024-07-18",id:"v045---2024-07-18",level:2},{value:"Bug Fixes",id:"bug-fixes-3",level:3},{value:"Migration notes",id:"migration-notes-38",level:4},{value:"Migration notes",id:"migration-notes-39",level:4},{value:"Migration notes",id:"migration-notes-40",level:4},{value:"Migration notes",id:"migration-notes-41",level:4},{value:"Features",id:"features-5",level:3},{value:"Migration notes",id:"migration-notes-42",level:4},{value:"Migration notes",id:"migration-notes-43",level:4},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-7",level:3},{value:"Migration notes",id:"migration-notes-44",level:4},{value:"v0.4.4 - 2024-07-05",id:"v044---2024-07-05",level:2},{value:"Bug Fixes",id:"bug-fixes-4",level:3},{value:"Documentation",id:"documentation-1",level:3},{value:"Migration notes",id:"migration-notes-45",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-8",level:2},{value:"Features",id:"features-6",level:3},{value:"Migration notes",id:"migration-notes-46",level:4},{value:"Migration notes",id:"migration-notes-47",level:4},{value:"Migration notes",id:"migration-notes-48",level:4},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-8",level:3},{value:"Add Programmatic deploy tests for the docs",id:"add-programmatic-deploy-tests-for-the-docs",level:2},{value:"Migration notes",id:"migration-notes-49",level:4},{value:"Migration notes",id:"migration-notes-50",level:4},{value:"Refactor",id:"refactor-4",level:3},{value:"Migration notes",id:"migration-notes-51",level:4},{value:"Migration notes",id:"migration-notes-52",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-9",level:2},{value:"Testing",id:"testing",level:3},{value:"Migration notes",id:"migration-notes-53",level:4},{value:"v0.4.3 - 2024-06-22",id:"v043---2024-06-22",level:2},{value:"Bug Fixes",id:"bug-fixes-5",level:3},{value:"Migration notes",id:"migration-notes-54",level:4},{value:"Migration notes",id:"migration-notes-55",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-10",level:2},{value:"Migration notes",id:"migration-notes-56",level:4},{value:"Migration notes",id:"migration-notes-57",level:4},{value:"Migration notes",id:"migration-notes-58",level:4},{value:"Documentation",id:"documentation-2",level:3},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-11",level:2},{value:"Migration notes",id:"migration-notes-59",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-12",level:2},{value:"Migration notes",id:"migration-notes-60",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-13",level:2},{value:"Features",id:"features-7",level:3},{value:"Migration notes",id:"migration-notes-61",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-14",level:2},{value:"Migration notes",id:"migration-notes-62",level:4},{value:"Migration notes",id:"migration-notes-63",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-15",level:2},{value:"Migration notes",id:"migration-notes-64",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-16",level:2},{value:"Migration notes",id:"migration-notes-65",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-17",level:2},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-18",level:2},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-9",level:3},{value:"Migration notes",id:"migration-notes-66",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-19",level:2},{value:"Migration notes",id:"migration-notes-67",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-20",level:2},{value:"Migration notes",id:"migration-notes-68",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-21",level:2},{value:"Migration notes",id:"migration-notes-69",level:4},{value:"Migration notes",id:"migration-notes-70",level:4},{value:"v0.4.2 - 2024-05-22",id:"v042---2024-05-22",level:2},{value:"Bug Fixes",id:"bug-fixes-6",level:3},{value:"v0.4.1 - 2024-05-20",id:"v041---2024-05-20",level:2},{value:"Bug Fixes",id:"bug-fixes-7",level:3},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-22",level:2},{value:"Features",id:"features-8",level:3},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-23",level:2},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-10",level:3},{value:"Migration notes",id:"migration-notes-71",level:4},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-24",level:2},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-25",level:2},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-26",level:2},{value:"v0.4.0 - 2024-05-09",id:"v040---2024-05-09",level:2},{value:"Bug Fixes",id:"bug-fixes-8",level:3},{value:"Migration notes",id:"migration-notes-72",level:4},{value:"Motivation and context",id:"motivation-and-context",level:4},{value:"Checklist",id:"checklist-2",level:3},{value:"Migration notes",id:"migration-notes-73",level:4},{value:"Documentation",id:"documentation-3",level:3},{value:"Motivation and context",id:"motivation-and-context-1",level:4},{value:"Migration notes",id:"migration-notes-74",level:4},{value:"Checklist",id:"checklist-3",level:3},{value:"Motivation and context",id:"motivation-and-context-2",level:4},{value:"Migration notes",id:"migration-notes-75",level:4},{value:"Checklist",id:"checklist-4",level:3},{value:"Motivation and context",id:"motivation-and-context-3",level:4},{value:"Migration notes",id:"migration-notes-76",level:4},{value:"Checklist",id:"checklist-5",level:3},{value:"Motivation and context",id:"motivation-and-context-4",level:4},{value:"Migration notes",id:"migration-notes-77",level:4},{value:"Checklist",id:"checklist-6",level:3},{value:"Motivation and context",id:"motivation-and-context-5",level:4},{value:"Migration notes",id:"migration-notes-78",level:4},{value:"Checklist",id:"checklist-7",level:3},{value:"Motivation and context",id:"motivation-and-context-6",level:4},{value:"Migration notes",id:"migration-notes-79",level:4},{value:"Checklist",id:"checklist-8",level:3},{value:"Migration notes",id:"migration-notes-80",level:4},{value:"Features",id:"features-9",level:3},{value:"Motivation and context",id:"motivation-and-context-7",level:4},{value:"Migration notes",id:"migration-notes-81",level:4},{value:"Checklist",id:"checklist-9",level:3},{value:"Motivation and context",id:"motivation-and-context-8",level:4},{value:"Migration notes",id:"migration-notes-82",level:4},{value:"Checklist",id:"checklist-10",level:3},{value:"Motivation and context",id:"motivation-and-context-9",level:4},{value:"Migration notes",id:"migration-notes-83",level:4},{value:"Checklist",id:"checklist-11",level:3},{value:"Motivation and context",id:"motivation-and-context-10",level:4},{value:"Migration notes",id:"migration-notes-84",level:4},{value:"Checklist",id:"checklist-12",level:3},{value:"Motivation and context",id:"motivation-and-context-11",level:4},{value:"Migration notes",id:"migration-notes-85",level:4},{value:"Checklist",id:"checklist-13",level:3},{value:"Motivation and context",id:"motivation-and-context-12",level:4},{value:"Migration notes",id:"migration-notes-86",level:4},{value:"Checklist",id:"checklist-14",level:3},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-27",level:2},{value:"Miscellaneous Tasks",id:"miscellaneous-tasks-11",level:3},{value:"Summary by CodeRabbit",id:"summary-by-coderabbit-28",level:2},{value:"Refactor",id:"refactor-5",level:3},{value:"Migration notes",id:"migration-notes-87",level:4}];function x(e){const s={h1:"h1",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.h1,{id:""}),"\n",(0,i.jsx)(d,{})]})}function m(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(x,{...e})}):x(e)}}}]);
\ No newline at end of file
diff --git a/assets/js/ad5e0346.8ab824fd.js b/assets/js/ad5e0346.5ca5f6ad.js
similarity index 86%
rename from assets/js/ad5e0346.8ab824fd.js
rename to assets/js/ad5e0346.5ca5f6ad.js
index c1f8ccdb35..6fc65b4c5a 100644
--- a/assets/js/ad5e0346.8ab824fd.js
+++ b/assets/js/ad5e0346.5ca5f6ad.js
@@ -1 +1 @@
-(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[11],{14344:(e,n,t)=>{"use strict";t.d(n,{Ay:()=>s,RM:()=>r});var a=t(86070),i=t(25710);const r=[];function o(e){const n={a:"a",admonition:"admonition",code:"code",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.admonition,{type:"info",children:(0,a.jsxs)(n.p,{children:["Metatype is only supported on macOS and Linux. Windows users should use ",(0,a.jsx)(n.a,{href:"https://learn.microsoft.com/windows/wsl/install",children:"Linux on Windows with WSL"}),"."]})}),"\n",(0,a.jsxs)(n.p,{children:["You can download the binary from the\n",(0,a.jsx)(n.a,{href:"https://github.com/metatypedev/metatype/releases/",children:"releases page"}),", make it\nexecutable and add it to your ",(0,a.jsx)(n.code,{children:"PATH"})," or use the automated method below."]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"An installer script is also provided for the CLI in our repository. Curl and install in it with the following one-liner. The installer may ask for your password."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"curl -fsSL https://raw.githubusercontent.com/metatypedev/metatype/main/installer.sh | bash\n"})}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.admonition,{type:"info",children:(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:["For later use, you can run the following command to upgrade ",(0,a.jsx)(n.code,{children:"Meta CLI"})," to a newer version. If your Meta CLI is up to date, you will get an ",(0,a.jsx)(n.code,{children:"Already up to date!"})," response."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"meta upgrade\n"})}),"\n"]}),"\n"]})}),"\n",(0,a.jsxs)(n.p,{children:["That's it! You are done installing ",(0,a.jsx)(n.code,{children:"Meta CLI"}),"."]})]})}function s(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(o,{...e})}):o(e)}},95459:(e,n,t)=>{"use strict";t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>c,default:()=>m,frontMatter:()=>d,metadata:()=>l,toc:()=>p});var a=t(86070),i=t(25710),r=t(65480),o=t(27676),s=t(65671);t(14344),t(7871);const d={sidebar_position:3},c="Metatype Basics",l={id:"tutorials/metatype-basics/index",title:"Metatype Basics",description:"This page will walk you through a real world API with data storage and authorization.",source:"@site/docs/tutorials/metatype-basics/index.mdx",sourceDirName:"tutorials/metatype-basics",slug:"/tutorials/metatype-basics/",permalink:"/docs/tutorials/metatype-basics/",draft:!1,unlisted:!1,editUrl:"https://github.com/metatypedev/metatype/tree/main/docs/metatype.dev/docs/tutorials/metatype-basics/index.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"docs",previous:{title:"Quick-start",permalink:"/docs/tutorials/quick-start/"},next:{title:"Custom functions",permalink:"/docs/guides/external-functions/"}},u={},p=[{value:"What are you building?",id:"what-are-you-building",level:2},{value:"Setup",id:"setup",level:2},{value:"Create a new project",id:"create-a-new-project",level:3},{value:"Launch typegate",id:"launch-typegate",level:3},{value:"Make sure it's all working",id:"make-sure-its-all-working",level:3},{value:"Building our Models",id:"building-our-models",level:2},{value:"Exposing our application",id:"exposing-our-application",level:2},{value:"The Prisma Runtime",id:"the-prisma-runtime",level:3},{value:"Policies",id:"policies",level:2},{value:"More Customization for our app",id:"more-customization-for-our-app",level:2},{value:"Preventing Unauthorized Creation of Related Objects",id:"preventing-unauthorized-creation-of-related-objects",level:3},{value:"Restrict Update Operation on Selected Fields",id:"restrict-update-operation-on-selected-fields",level:3},{value:"Creating REST endpoints",id:"creating-rest-endpoints",level:3}];function h(e){const n={a:"a",admonition:"admonition",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,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"metatype-basics",children:"Metatype Basics"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"This page will walk you through a real world API with data storage and authorization."})}),"\n",(0,a.jsx)(n.admonition,{title:"You will learn",type:"note",children:(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"How to setup your development for metatype projects."}),"\n",(0,a.jsx)(n.li,{children:"How to run the typegate on the docker runtime."}),"\n",(0,a.jsx)(n.li,{children:"How to create/read/update/delete data."}),"\n",(0,a.jsx)(n.li,{children:"How to write custom business logic."}),"\n",(0,a.jsx)(n.li,{children:"How to authenticate requests."}),"\n",(0,a.jsx)(n.li,{children:"How to protect data with policies."}),"\n"]})}),"\n",(0,a.jsx)(n.h2,{id:"what-are-you-building",children:"What are you building?"}),"\n",(0,a.jsxs)(n.p,{children:["For this tutorial, we'll be implementing an API to power a simple feature roadmap/request hybrid as can be seen on ",(0,a.jsx)(n.a,{href:"https://productlane.com/roadmap",children:"Productlane"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"Looking through the app we can see that the api should allow:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:'Unauthenticated users to submit new "ideas" or vote on any of those already listed.'}),"\n",(0,a.jsx)(n.li,{children:'Specify or vote on the importance of an "idea" from "medium" to "critical" or even submit text with more description.'}),"\n",(0,a.jsx)(n.li,{children:'Admins will be able to move ideas across buckets like "Backlog", "Planned", "In Progress".'}),"\n"]}),"\n","\n",(0,a.jsx)(n.h2,{id:"setup",children:"Setup"}),"\n",(0,a.jsxs)(n.p,{children:["To setup your Metatype development environment, please follow the installation guide ",(0,a.jsx)(n.a,{href:"/docs/tutorials/quick-start#1-meta-cli",children:"here"})]}),"\n",(0,a.jsx)(n.h3,{id:"create-a-new-project",children:"Create a new project"}),"\n",(0,a.jsx)(n.p,{children:"Metatype projects are composed of modular bundles of types, logic and policies called typegraphs. We author typegraphs using modern programming languages & environments. Python and Typescript are currently available for use. The meta-cli allows us to create a new project based on pre-existing templates."}),"\n",(0,a.jsxs)(r.Ay,{children:[(0,a.jsxs)(o.A,{value:"typescript",children:[(0,a.jsxs)(n.p,{children:["Run one the following commands to create a new project under a new directory titled ",(0,a.jsx)(n.code,{children:"tg_roadmap"}),"."]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# using Node/Bun runtimes\nmeta new --template node tg_roadmap\n# ^ project name\n# ^ Use `meta new --help` find out more available templates.\n"})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# using Deno\nmeta new --template deno tg_roadmap\n"})}),(0,a.jsxs)(n.p,{children:["When using Typescript, the ",(0,a.jsx)(n.code,{children:"@typegraph/sdk"})," package exposes all the necessary functions and types we'll need to describe our typegraph. The templates already specify it as as a dependency so all we need to do now is run the following command to download it:"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# using Deno\ndeno cache api/example.ts # cache dependencies\n\n# using Bun\nbun install\n\n# using pnpm\npnpm install\n\n# using npm\nnpm install\n\n# using yarn\nyarn install\n"})})]}),(0,a.jsxs)(o.A,{value:"python",children:[(0,a.jsxs)(n.p,{children:["Run the following command to create a new project under a new directory titled ",(0,a.jsx)(n.code,{children:"tg_roadmap"}),"."]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"meta new --template python tg_roadmap\n# ^ project name\n# ^ Use `meta new --help` find out more available templates.\n"})}),(0,a.jsxs)(n.p,{children:["When using python, the ",(0,a.jsx)(n.code,{children:"typegraph"})," package exposes all the necessary functions and types we'll need to describe our typegraph. We'll need to run the following command to install it:"]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# virtual env\npython3 -m venv .venv\n# other activate scripts should be available for non bash shells\nsource .venv/bin/activate\n\n# using pip\npip3 install typegraph\n\n# using poetry\n# the template has included `typegraph` in the poetry manifest\npoetry install\n"})})]})]}),"\n",(0,a.jsx)(n.h3,{id:"launch-typegate",children:"Launch typegate"}),"\n",(0,a.jsxs)(n.p,{children:["The typegate is a program that runs and orchestrates our typegraphs. We can run it locally for development purposes. Typegate currently requires the Redis database to function and to make it easy to run both, we'll make use of a linux container runtime for this. The Docker runtime to be specific which has installation guides located ",(0,a.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"here"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["We'll also need the Docker Compose orchestrator which usually comes by default with the ",(0,a.jsx)(n.code,{children:"docker"})," command. Use the following command to check if it is available:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"docker compose version\n# Docker Compose version 2.23.0\n"})}),"\n",(0,a.jsxs)(n.p,{children:["...and if not, the official installation guide can be found ",(0,a.jsx)(n.a,{href:"https://docs.docker.com/compose/install/",children:"here"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["If you have your docker runtime installed and running correctly, you will be able to launch the ",(0,a.jsx)(n.code,{children:"compose.yml"})," file that's bundled in every template.\nThe compose file also includes the ",(0,a.jsx)(n.code,{children:"postgres"})," databases that we'll be using."]}),"\n",(0,a.jsx)(n.p,{children:"To launch the services, navigate your shell to the project directory and run the following command:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"docker compose up --detach\n# ^ detach means it'll run in the background.\n# Omit to get the all logs in the current terminal\n"})}),"\n",(0,a.jsx)(n.p,{children:"This should download and start typegate and its dependent services."}),"\n",(0,a.jsx)(n.p,{children:"We can observe their log of typegate or any of the other services with the following command. It has to be run from the same project directory."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"docker compose logs typegate --follow\n# ^ Omit service name to look at the combined logs of all services\n"})}),"\n",(0,a.jsx)(n.h3,{id:"make-sure-its-all-working",children:"Make sure it's all working"}),"\n",(0,a.jsx)(n.p,{children:"Run the following to make sure everything's up and running."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"meta doctor\n"})}),"\n",(0,a.jsxs)(n.p,{children:["After running the command, you should get a result similar to then one ",(0,a.jsx)(n.a,{href:"/docs/tutorials/quick-start#4-verify-your-installation",children:"here"}),"."]}),"\n",(0,a.jsx)(n.h2,{id:"building-our-models",children:"Building our Models"}),"\n",(0,a.jsxs)(n.p,{children:["We will be using the ",(0,a.jsx)(n.a,{href:"/docs/reference/types",children:"type system"}),' from the typegraph SDK to describe the shape of the data that flows through our application. In this case, we\'ll build our typegraph around types that represent "ideas", "votes" and "buckets".']}),"\n",(0,a.jsxs)(r.Ay,{children:[(0,a.jsxs)(o.A,{value:"typescript",children:[(0,a.jsxs)(n.p,{children:["Modify the file at ",(0,a.jsx)(n.code,{children:"api/example.ts"})," to look something like the following."]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-typescript",children:'// we\'ll need the following imports\nimport { t, typegraph } from "@typegraph/sdk.js";\n\ntypegraph("roadmap", (g) => {\n // ^ each typegraph has a name\n\n const bucket = t.struct({\n // asId and other config items describe the logical properties\n // of our types beyond just the shape\n id: t.integer({}, { asId: true }),\n name: t.string(),\n });\n const idea = t.struct({\n // uuid is just a shorthand alias for `t.string({format: "uuid"})`\n id: t.uuid({ asId: true }),\n name: t.string(),\n // another string shorthand\n authorEmail: t.email(),\n });\n const vote = t.struct({\n id: t.uuid(),\n authorEmail: t.email(),\n // `enum_` is also a shorthand over `t.string`\n importance: t.enum_(["medium", "important", "critical"]).optional(),\n // makes it optional\n desc: t.string().optional(),\n });\n});\n'})})]}),(0,a.jsxs)(o.A,{value:"python",children:[(0,a.jsxs)(n.p,{children:["Modify the file at ",(0,a.jsx)(n.code,{children:"api/example.py"})," to look something like the following."]}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:'# we\'ll need the following imports\nfrom typegraph import typegraph, t, Graph\n\n# the typegraph will carry the name of the defining function by default\n@typegraph()\ndef roadmap(g: Graph):\n bucket = t.struct({\n # asId and other config items describe the logical properties\n # of our types beyond just the shape\n "id": t.integer(as_id=True),\n "name": t.string(),\n });\n idea = t.struct({\n # email is just a shorthand alias for `t.string({format: "uuid"})`\n "id": t.uuid(as_id=True),\n "name": t.string(),\n # another string shorthand\n "authorEmail": t.email(),\n });\n vote = t.struct({\n "id": t.uuid(),\n "authorEmail": t.email(),\n # `enum` is also a shorthand over `t.string`\n "importance": t.enum(["medium", "important", "critical"]).optional(),\n # makes it optional\n "desc": t.string().optional(),\n });\n\n'})})]})]}),"\n",(0,a.jsx)(n.p,{children:"The types here are very simple and we haven't yet added any thing that models their relationships but they should do for our purposes."}),"\n",(0,a.jsx)(n.h2,{id:"exposing-our-application",children:"Exposing our application"}),"\n",(0,a.jsx)(n.p,{children:"Typegraphs expose an API to the external world using Function objects. Functions describe the operation that transform some input type into an output type and we define them in scope of different Runtimes, where the actual logic runs. At this early stage, we can make use of the Random runtime which allows us to generate random test data for our types to get a feel of our API."}),"\n",(0,a.jsxs)(r.Ay,{children:[(0,a.jsx)(o.A,{value:"typescript",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-typescript",children:'// add need the following imports\nimport { Policy } from "@typegraph/sdk/index.js";\nimport { RandomRuntime } from "@typegraph/sdk/runtimes/random.js";\n\ntypegraph("roadmap", (g) => {\n // ...\n // every exposed function requires access control policies\n // for now, just use the public policy, anyone can access it\n const pub = Policy.public();\n const random = new RandomRuntime({});\n g.expose({\n // generates a random object in the shape of idea\n get_idea: random.gen(idea).withPolicy(pub),\n });\n});\n'})})}),(0,a.jsx)(o.A,{value:"python",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:"# add need the following imports\nfrom typegraph.runtimes.random import RandomRuntime\nfrom typegraph import Policy\n\n@typegraph() def roadmap(g: Graph): # every exposed function requires access control policies # for now, just use the public policy, anyone can access it pub = Policy.public() random = RandomRuntime() g.expose( # generates a random object in the shape of idea get_idea=random.gen(idea).with_policy(pub) )\n\n"})})})]}),"\n",(0,a.jsx)(n.p,{children:"At this point, we can push our typegraph to the locally running typegate node and access it. Run the following command in your project root:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# features auto-reload on any changes to your source files\nmeta dev\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Typegate has first-class support for consuming the API through a GraphQl interface and it is enabled by default. It also bundles the GrahpiQl API explorer and you should be able to access it at ",(0,a.jsx)(n.a,{href:"http://localhost:7890/roadmap",children:"http://localhost:7890/roadmap"})," once meta-cli has successfully pushed your typegraph."]}),"\n",(0,a.jsxs)(n.p,{children:["You can go ahead and try out the following ",(0,a.jsx)(n.code,{children:"graphql"})," on the interface and get a feel for it."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-graphql",children:"query {\n get_idea {\n id\n name\n authorEmail\n }\n}\n"})}),"\n",(0,a.jsx)(n.p,{children:"Or, you can mess around on the playground below."}),"\n",(0,a.jsx)(s.A,{typegraph:"first-typegraph",python:t(84986),typescript:t(24204),query:t(10374)}),"\n",(0,a.jsx)(n.h3,{id:"the-prisma-runtime",children:"The Prisma Runtime"}),"\n",(0,a.jsxs)(n.p,{children:["Now that we have created a simple endpoint that generates random values for our ",(0,a.jsx)(n.code,{children:"idea"})," model/type, let's add a CRUD support to our app. A runtime most apps will be depend on is the ",(0,a.jsx)(n.a,{href:"/docs/reference/runtimes/prisma",children:"Prisma Runtime"})," which allows us to connect to different databases and peform database operations."]}),"\n",(0,a.jsxs)(n.p,{children:["For this tutorial, we'll be making use of the ",(0,a.jsx)(n.code,{children:"PostgreSQL"})," database. If you made use of the ",(0,a.jsx)(n.code,{children:"compose.yml"})," to run typegate as outlined in this tutorial, there should be an instance of Postgres already up. You can check if postgres container is currently running by using the ",(0,a.jsx)(n.code,{children:"meta doctor"})," command."]}),"\n",(0,a.jsxs)(n.p,{children:["If a typegraph needs to access a database, it first needs to be made aware of its address. This is done through secrets. In the root of your project directory, you'll find a file titled ",(0,a.jsx)(n.code,{children:"metatype.yaml"}),". It contains metatype specific configuration for our project such as the top level ",(0,a.jsx)(n.code,{children:"typegates"})," object which we use to specify the location and credentials of the different typegate nodes we'll be using. Each typegate entry also takes an ",(0,a.jsx)(n.a,{href:"/docs/reference/meta-cli/configuration-file#named-secrets",children:(0,a.jsx)(n.code,{children:"secrets"})})," object where we can specify secret to be passed to our typegraphs."]}),"\n",(0,a.jsxs)(n.p,{children:["The keys in the ",(0,a.jsx)(n.code,{children:"secrets"})," object are the names of the typegraphs and the values are objects mapping secret names to their values/sources."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"metatype.yaml"})," should already have a few sample environment variables. Add an entry like the following to give our typegraph access to the database's address:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:'typegates:\n dev:\n # ..\n secrets:\n TG_ROADMAP_POSTGRES: "postgresql://postgres:password@postgres:5432/db"\n'})}),"\n",(0,a.jsxs)(n.p,{children:["Meta-cli will auto-reload when it detects changes to ",(0,a.jsx)(n.code,{children:"metatype.yaml"}),". This is because Meta-cli was run in ",(0,a.jsx)(n.code,{children:"dev"})," mode(through the ",(0,a.jsx)(n.code,{children:"meta dev"})," command)."]}),"\n",(0,a.jsx)(n.p,{children:"We can add the Prisma runtime to our typegraph now."}),"\n",(0,a.jsxs)(r.Ay,{children:[(0,a.jsx)(o.A,{value:"typescript",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-typescript",children:'// new imports\nimport { PrismaRuntime } from "@typegraph/sdk/providers/prisma.js";\n\ntypegraph("roadmap", (g) => {\n // ...\n\n // the constructor takes the name of the env var directly\n const db = new PrismaRuntime("db", "POSTGRES");\n // ...\n});\n'})})}),(0,a.jsx)(o.A,{value:"python",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:'# new imports\nfrom typegraph.providers.prisma import PrismaRuntime\n\n@typegraph()\ndef roadmap(g: Graph):\n # ..\n\n # the constructor takes the name of the env var directly\n db = PrismaRuntime("db", "POSTGRES")\n # ..\n\n'})})})]}),"\n",(0,a.jsxs)(n.p,{children:["One of the features that the Prisma runtime allows us to implement is relationships. Here, we are creating a one to many relationship between bucket and ideas, also another one to many between ideas and vote. We will be specifiying relationships by using the ",(0,a.jsx)(n.code,{children:"t.list"})," List type and ",(0,a.jsx)(n.code,{children:"g.ref"}),"(method which accepts the name of the model/entity as a parameter) for creating the link. Check the example below for better understanding."]}),"\n",(0,a.jsxs)(r.Ay,{children:[(0,a.jsx)(o.A,{value:"typescript",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-typescript",children:'import { PrismaRuntime } from "@typegraph/sdk/providers/prisma.js";\n\ntypegraph("roadmap", (g) => {\n // ...\n\n const db = new PrismaRuntime("db", "POSTGRES");\n\n const bucket = t\n .struct({\n id: t.integer(\n {},\n {\n asId: true,\n // auto generate ids during creation\n config: { auto: true },\n },\n ),\n name: t.string(),\n // one-to many relationship\n ideas: t.list(g.ref("idea")),\n })\n // explicitly naming our types makes reference later easier\n .rename("bucket");\n\n const idea = t\n .struct({\n id: t.uuid({ asId: true, config: { auto: true } }),\n name: t.string(),\n authorEmail: t.email(),\n // we need to specify the relationships on both types\n bucket: g.ref("bucket"),\n votes: t.list(g.ref("vote")),\n })\n .rename("idea");\n\n const vote = t\n .struct({\n id: t.uuid({ asId: true, config: { auto: true } }),\n authorEmail: t.email(),\n importance: t.enum_(["medium", "important", "critical"]).optional(),\n desc: t.string().optional(),\n idea: g.ref("idea"),\n })\n .rename("vote");\n\n // ...\n});\n'})})}),(0,a.jsx)(o.A,{value:"python",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:'from typegraph.providers.prisma import PrismaRuntime\n\n@typegraph()\ndef roadmap(g: Graph):\n # ..\n db = PrismaRuntime("db", "POSTGRES")\n\n bucket = t.struct(\n {\n "id": t.integer(\n as_id=True,\n # auto generate ids during creation\n config={"auto": True}\n ),\n "name": t.string(),\n # one-to many relationship\n "ideas": t.list(g.ref("idea")),\n },\n # explicitly naming our types makes reference later easier\n name="bucket"\n )\n idea = t.struct(\n {\n "id": t.uuid(as_id=True, config={"auto": True}),\n "name": t.string(),\n "authorEmail": t.email(),\n "votes": t.list(g.ref("vote")),\n "bucket": g.ref("bucket"),\n },\n name="idea"\n )\n vote = t.struct(\n {\n "id": t.uuid(as_id=True, config={"auto": True}),\n "authorEmail": t.email(),\n "importance": t.enum(["medium", "important", "critical"]).optional(),\n "desc": t.string().optional(),\n "idea": g.ref("idea"),\n },\n name="vote"\n )\n # ..\n'})})})]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"g.ref"})," declares logical relationships between our types which the Prisma runtime will be able to pick up. If you need more control on what the relationships will look like on the database, you can use the ",(0,a.jsx)(n.code,{children:"db.link"})," function. More information can be found on the Prisma runtime ",(0,a.jsx)(n.a,{href:"/docs/reference/runtimes/prisma",children:"reference"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["When we save our file at this point, the ",(0,a.jsx)(n.code,{children:"meta dev"})," watcher should automatically create and push the necessary migrations to our database to get it in its intended shape. You should see a new subdirectory in your project called ",(0,a.jsx)(n.code,{children:"prisma"}),". It's where the generated migrations are contained."]}),"\n",(0,a.jsx)(n.p,{children:"If you mess something up in the migrations and want a clean slate, you can reset everything by recreating the containers like so:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# remove all containers and their volumes\ndocker compose down -v\n# launch\ndocker compose up --detach\n# meta dev will auto apply any pending changes to databases\nmeta dev\n"})}),"\n",(0,a.jsx)(n.p,{children:"At this point, we're ready to add functions to expose database queries to create or read data. The Prisma runtime allows us to run raw queries directly on the database but it also provides handy functions we can use for basic CRUD operations. We'll make use of those."}),"\n",(0,a.jsxs)(r.Ay,{children:[(0,a.jsx)(o.A,{value:"typescript",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-typescript",children:'import { PrismaRuntime } from "@typegraph/sdk/providers/prisma.js";\n\ntypegraph("roadmap", (g) => {\n // ...\n const pub = Policy.public();\n const db = new PrismaRuntime("db", "POSTGRES");\n // ...\n g.expose(\n {\n get_buckets: db.findMany(bucket),\n create_bucket: db.create(bucket),\n get_idea: db.findFirst(idea),\n create_ideas: db.create(idea),\n },\n pub, // make all functions public by default\n );\n});\n'})})}),(0,a.jsx)(o.A,{value:"python",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:'from typegraph.providers.prisma import PrismaRuntime\n\n@typegraph()\ndef roadmap(g: Graph):\n # ..\n pub = Policy.public()\n db = PrismaRuntime("db", "POSTGRES")\n # ..\n g.expose(\n pub, # make all functions public by default\n get_buckets=db.find_many(bucket),\n create_bucket=db.create(bucket),\n get_idea=db.find_many(bucket),\n create_idea=db.create(bucket),\n get_vote=db.create(vote),\n )\n\n'})})})]}),"\n",(0,a.jsx)(n.p,{children:"We should be able to add a few buckets and ideas now."}),"\n",(0,a.jsx)(s.A,{typegraph:"roadmap-prisma",python:t(37745),typescript:t(72839),query:t(1532)}),"\n",(0,a.jsx)(n.h2,{id:"policies",children:"Policies"}),"\n",(0,a.jsx)(n.p,{children:"We now have the tools enough to allow coarse CRUD of our data. The next thing we usually add at this point is authorization. A way to control who can read or write what. The primary mechanism typegraphs use for this purpose are policies."}),"\n",(0,a.jsx)(n.p,{children:"Policies are small functions that get the context of a request as input and return a boolean signaling weather access should be granted."}),"\n",(0,a.jsx)(n.p,{children:"Metatype currently supports policies based on javascript functions that are run on the Deno runtime."}),"\n",(0,a.jsxs)(n.p,{children:['For this tutorial, we\'ll be making use of the basic auth extractor. It expects a string in the format "Basic token" to be set in the ',(0,a.jsx)(n.code,{children:"Authorization"})," http header. The token is expected to be a base64 encoded string in the format ",(0,a.jsx)(n.code,{children:"username:secret"}),"."]}),"\n",(0,a.jsxs)(r.Ay,{children:[(0,a.jsx)(o.A,{value:"typescript",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-typescript",children:'import { DenoRuntime } from "@typegraph/sdk/runtimes/deno.js";\nimport { Auth } from "@typegraph/sdk/params.js";\n\ntypegraph("roadmap", (g) => {\n // ...\n\n const deno = new DenoRuntime();\n\n // The basic extractor only populates the context when\n // it recognizes the username and the secret matches\n g.auth(Auth.basic(["andim" /*more users*/]));\n\n // the `username` value is only availaible if the basic\n // extractor was successful\n const admins = deno.policy(\n "admins",\n `\n (_args, { context }) => !!context.username\n`,\n );\n\n g.expose(\n {\n // ..\n // only admins are allowed to create new buckets\n create_bucket: db.create(bucket).withPolicy(admins),\n // ..\n },\n pub,\n );\n\n // ...\n});\n'})})}),(0,a.jsx)(o.A,{value:"python",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:'from typegraph.providers.prisma import PrismaRuntime\nfrom typegraph.graph.params import Auth\n\n@typegraph()\ndef roadmap(g: Graph):\n # ..\n # The basic extractor only populates the context when\n # it recognizes the username and the secret matches\n g.auth(Auth.basic(["andim"]))\n\n deno = DenoRuntime()\n\n # the username value is only available if the basic\n # extractor was successful\n admins = deno.policy("admins", """\n (_args, { context }) => !!context.username\n""")\n\n g.expose(\n pub,\n # ..\n # only admins are allowed to create new buckets\n create_bucket=db.create(bucket).with_policy(admins),\n # ..\n )\n\n'})})})]}),"\n",(0,a.jsxs)(n.p,{children:["The basic extractors expects the secrets in environment variables named in a specific format. Add the following entries to the ",(0,a.jsx)(n.code,{children:"metatype.yaml"})," file:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"typegates:\n dev:\n # ..\n secrets:\n roadmap: # your typegraph name\n # ..\n # the basic extractor secret format\n # BASIC_[username]\n BASIC_ADMIN: hunter2\n"})}),"\n",(0,a.jsxs)(n.p,{children:["When you save the files, meta-cli will reload the new additions to your typegraph. ",(0,a.jsx)(n.code,{children:"create_bucket"})," is now only accessible to requests bearing the right tokens (For the provided example, ",(0,a.jsx)(n.code,{children:"Basic YW5kaW06aHVudGVyMg=="}),' should work). If you are using the GraphiQl interface from earlier, there should be a panel in the bottom left called "Headers" for setting http headers']}),"\n",(0,a.jsx)(s.A,{typegraph:"roadmap-policies",python:t(41764),typescript:t(2386),query:t(38798)}),"\n",(0,a.jsx)(n.h2,{id:"more-customization-for-our-app",children:"More Customization for our app"}),"\n",(0,a.jsx)(n.h3,{id:"preventing-unauthorized-creation-of-related-objects",children:"Preventing Unauthorized Creation of Related Objects"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Reference"}),": ",(0,a.jsx)(n.a,{href:"/docs/reference/types/parameter-transformations",children:"Parameter transformations"})]}),"\n",(0,a.jsxs)(n.p,{children:["By default, Prisma generates types that supports the whole suite of usecases one might have on a CRUD operation such as allowing creation of objects of related types in a single operation. We don't always want this and in our case, we want to prevent users from being able to create buckets, which are protected, through the ",(0,a.jsx)(n.code,{children:"create_idea"})," function which's public. We can use the ",(0,a.jsx)(n.code,{children:"reduce"})," method to modify the input types of functions."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-graphql",children:'mutation CIdea {\n create_idea(\n data: {\n # we want to prevent bucket creation through `create_idea`\n bucket: { create: { name: "Backlog" } }\n authorEmail: "asdf@as.df"\n name: "Add support for WASM GC"\n }\n ) {\n id\n name\n }\n}\n'})}),"\n",(0,a.jsxs)(n.p,{children:["Even though the ",(0,a.jsx)(n.code,{children:"reduce"})," method doesn't allow us to change the shape of the type, we can change the types of members and importantly here, hide the ones we don't need."]}),"\n",(0,a.jsxs)(r.Ay,{children:[(0,a.jsx)(o.A,{value:"typescript",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-typescript",children:'typegraph("roadmap", (g) => {\n // ...\n g.expose(\n {\n // ..\n create_idea: db.create(idea).reduce({\n data: {\n // `g.inherit` specifies that we keep the member\n // type of the original\n name: g.inherit(),\n authorEmail: g.inherit(),\n votes: g.inherit(),\n bucket: {\n connect: g.inherit(),\n // by omitting the `create` member, we hide it\n },\n },\n }),\n // ..\n },\n pub,\n );\n});\n'})})}),(0,a.jsx)(o.A,{value:"python",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:'@typegraph()\ndef roadmap(g: Graph):\n # ..\n g.expose(\n pub,\n # ..\n create_idea=db.create(idea).reduce({\n "data": {\n # `g.inherit` specifies that we keep the member\n # type of the original\n "name": g.inherit(),\n "authorEmail": g.inherit(),\n "votes": g.inherit(),\n "bucket": {\n "connect": g.inherit(),\n # by omitting the `create` member, we hide it\n }\n }\n }),\n # ..\n )\n\n'})})})]}),"\n",(0,a.jsxs)(n.p,{children:["Requests are now only able to ",(0,a.jsx)(n.code,{children:"connect"})," new ideas with pre-existing buckets and won't be able to create them. If you try to ",(0,a.jsx)(n.code,{children:"create"})," new bucket through ",(0,a.jsx)(n.code,{children:"create_idea"}),", the typgate will return this response."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json",children:'{\n "errors": [\n {\n "message": "Unexpected property \'create\' for argument \'data.bucket\' of type \'object\' (\'object_288\') at create_idea; valid properties are: connect",\n "locations": [],\n "path": [],\n "extensions": {\n "timestamp": "2024-04-21T09:46:33.177Z"\n }\n }\n ]\n}\n'})}),"\n",(0,a.jsxs)(n.p,{children:["As you will be linking existing buckets when creating ideas, you need to create at least one bucket in your database. To do that you need to execute the following graphql query with admin privileges. You should add ",(0,a.jsx)(n.code,{children:'Authorization: "Basic YW5kaW06cGFzc3dvcmQ="'})," in your headers when sending the request."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-graphql",children:'mutation CBucket {\n create_bucket(data: { name: "Backlog" }) {\n id\n name\n }\n}\n'})}),"\n",(0,a.jsx)(n.p,{children:"Now, If you try using this mutation, it will work as expected. You can only specify buckets that are already created."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-graphql",children:'mutation {\n create_idea(\n data: {\n # we want to prevent bucket creation through `create_idea`\n bucket: { connect: { id: 1 } }\n authorEmail: "asdf@as.df"\n name: "Add support for WASM GC"\n }\n ) {\n id\n name\n bucket {\n id\n name\n }\n }\n}\n'})}),"\n",(0,a.jsx)(s.A,{typegraph:"roadmap-reduce",python:t(39047),typescript:t(55385),query:t(11642),headers:{Authorization:"Basic YW5kaW06cGFzc3dvcmQ="},tab:"headers"}),"\n",(0,a.jsx)(n.h3,{id:"restrict-update-operation-on-selected-fields",children:"Restrict Update Operation on Selected Fields"}),"\n",(0,a.jsxs)(n.p,{children:["You'll notice that we had set the ",(0,a.jsx)(n.code,{children:"importance"})," field on votes as optional. This is to allow users to just up-vote an idea from the main list without opening a form. If they want to add importance or a description to their vote at a later point, we want to update their already existing vote. It should be easy to expose a function for this using Prisma's ",(0,a.jsx)(n.code,{children:"db.update"})," helper and ",(0,a.jsx)(n.code,{children:"reduce"})," to restrict changes to only those field. But we'll take this opportunity to explore the feature of the Prisma runtime to execute raw queries."]}),"\n",(0,a.jsxs)(r.Ay,{children:[(0,a.jsx)(o.A,{value:"typescript",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-typescript",children:'import * as effects from "@typegraph/sdk/effects.js";\n\ntypegraph("roadmap", (g) => {\n // ...\n g.expose(\n {\n // ..\n set_vote_importance: db.execute(\n // query parameters are matched by name from the input type\n \'UPDATE "vote" SET importance = ${importance} WHERE id = ${vote_id}::uuid\',\n // our input type\n t.struct({\n vote_id: t.uuid(),\n importance: t.enum_(["medium", "important", "critical"]),\n }),\n // we use effects to signal what kind of operation we\'re doing\n // updates and creates will be exposed as mutations in GraphQl\n // the boolean signals that the query is idempotent\n effects.update(true),\n ),\n // ..\n },\n pub,\n );\n});\n'})})}),(0,a.jsx)(o.A,{value:"python",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:'from typegraph.gen.exports.runtimes import EffectUpdate\n\n@typegraph()\ndef roadmap(g: Graph):\n # ..\n g.expose(\n pub,\n # ..\n set_vote_importance=db.execute(\n # query parameters are matched by name from the input typ\n \'UPDATE "vote" SET importance = ${importance} WHERE id = ${vote_id}::uuid\',\n # our input type\n t.struct({\n "vote_id": t.uuid(),\n "importance": t.enum(["medium", "important", "critical"]),\n }),\n # we use effects to signal what kind of operation we\'re doing\n # updates and creates will be exposed as mutations in GraphQl\n # the boolean signals that the query is idempotent\n EffectUpdate(True),\n ),\n # ..\n )\n\n'})})})]}),"\n",(0,a.jsx)(n.p,{children:"Our query is exposed like any other function in the GraphQl api."}),"\n",(0,a.jsx)(s.A,{typegraph:"roadmap-execute",python:t(49198),typescript:t(25544),query:t(85779)}),"\n",(0,a.jsx)(n.h3,{id:"creating-rest-endpoints",children:"Creating REST endpoints"}),"\n",(0,a.jsxs)(n.p,{children:["We can easily expose an HTTP API for our typegraph using the ",(0,a.jsx)(n.code,{children:"g.rest"})," method. It takes a string describe a graphql query to be executed when the http path is requested."]}),"\n",(0,a.jsxs)(r.Ay,{children:[(0,a.jsx)(o.A,{value:"typescript",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-typescript",children:'typegraph("roadmap", (g) => {\n // ...\n\n g.rest(\n `\n query get_buckets {\n get_buckets {\n id\n name\n ideas {\n id\n name\n authorEmail\n }\n }\n }\n `,\n );\n g.rest(\n // query parameters present\n // expects a request of the type `roadmap/rest/get_bucket?id=uuidstr`\n `\n query get_bucket($id: Integer) {\n get_bucket(where:{\n id: $id\n }) {\n id\n name\n ideas {\n id\n name\n authorEmail\n }\n }\n }\n `,\n );\n});\n'})})}),(0,a.jsx)(o.A,{value:"python",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:'@typegraph()\ndef roadmap(g: Graph):\n # ..\n g.rest(\n """\n query get_buckets {\n get_buckets {\n id\n name\n ideas {\n id\n name\n authorEmail\n }\n }\n }\n """\n )\n g.rest(\n # query parameters present\n # expects a request of the type `roadmap/rest/get_bucket?id=uuidstr`\n """\n query get_bucket($id: Integer) {\n get_bucket(where:{\n id: $id\n }) {\n id\n name\n ideas {\n id\n name\n authorEmail\n }\n }\n }\n """\n )\n\n'})})})]}),"\n",(0,a.jsxs)(n.p,{children:["The exposed query is served at the path ",(0,a.jsx)(n.code,{children:"{typegate_url}/{typegraph_name}/rest/{query_name}"}),". Any parameters that the query takes are processed from the search params of the request. You can check this ",(0,a.jsx)(n.a,{href:"http://localhost:7890/roadmap/rest/get_buckets",children:"link"})," on your local machine and check the results. "]}),"\n",(0,a.jsx)(n.p,{children:"This is it for this tutorial and thanks for following till the end! This was a long one but we hope it gave you an overview to the vast capabilties of Metatype. We ecourage you to keep exploring!"})]})}function m(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},65480:(e,n,t)=>{"use strict";t.d(n,{Ay:()=>o,gc:()=>s});t(30758);var a=t(3733),i=t(56315),r=t(86070);function o(e){let{children:n}=e;const[t,o]=(0,a.e)();return(0,r.jsx)(i.mS,{choices:{typescript:"Typescript SDK",python:"Python SDK"},choice:t,onChange:o,children:n})}function s(e){let{children:n}=e;const[t]=(0,a.e)();return(0,r.jsx)(i.q9,{choices:{typescript:"Typescript SDK",python:"Python SDK"},choice:t,children:n})}},65671:(e,n,t)=>{"use strict";t.d(n,{A:()=>r});var a=t(98302),i=(t(30758),t(86070));function r(e){let{python:n,typescript:t,rust:r,...o}=e;const s=[n&&{content:n.content,codeLanguage:"python",codeFileUrl:n.path},t&&{content:t.content,codeLanguage:"typescript",codeFileUrl:t.path},r&&{content:r.content,codeLanguage:"rust",codeFileUrl:r.path}].filter((e=>!!e));return(0,i.jsx)(a.A,{code:0==s.length?void 0:s,...o})}},85779:e=>{var n={kind:"Document",definitions:[{kind:"OperationDefinition",operation:"mutation",name:{kind:"Name",value:"UVote"},variableDefinitions:[],directives:[],selectionSet:{kind:"SelectionSet",selections:[{kind:"Field",name:{kind:"Name",value:"set_vote_importance"},arguments:[{kind:"Argument",name:{kind:"Name",value:"vote_id"},value:{kind:"StringValue",value:"2f3207e0-6cb6-4aaf-a759-037cdfe48f0c",block:!1}},{kind:"Argument",name:{kind:"Name",value:"importance"},value:{kind:"StringValue",value:"medium",block:!1}}],directives:[]}]}}],loc:{start:0,end:123}};n.loc.source={body:'mutation UVote {\n set_vote_importance(\n vote_id: "2f3207e0-6cb6-4aaf-a759-037cdfe48f0c"\n importance: "medium"\n )\n}\n',name:"GraphQL request",locationOffset:{line:1,column:1}};function t(e,n){if("FragmentSpread"===e.kind)n.add(e.name.value);else if("VariableDefinition"===e.kind){var a=e.type;"NamedType"===a.kind&&n.add(a.name.value)}e.selectionSet&&e.selectionSet.selections.forEach((function(e){t(e,n)})),e.variableDefinitions&&e.variableDefinitions.forEach((function(e){t(e,n)})),e.definitions&&e.definitions.forEach((function(e){t(e,n)}))}var a={};function i(e,n){for(var t=0;t