1"use strict";(self.webpackChunkwww=self.webpackChunkwww||[]).push([["27444"],{53248(s,l,a){a.r(l),a.d(l,{metadata:()=>n,default:()=>F,frontMatter:()=>p,contentTitle:()=>t,toc:()=>r,assets:()=>c});var n=JSON.parse('{"id":"server/metadata","title":"Metadata","description":"Procedure metadata allows you to add an optional procedure specific meta property which will be available in all middleware function parameters.","source":"@site/versioned_docs/version-10.x/server/metadata.md","sourceDirName":"server","slug":"/server/metadata","permalink":"/docs/v10/server/metadata","draft":false,"unlisted":false,"editUrl":"https://github.com/trpc/trpc/tree/main/www/versioned_docs/version-10.x/server/metadata.md","tags":[],"version":"10.x","frontMatter":{"id":"metadata","title":"Metadata","sidebar_label":"Metadata","slug":"/server/metadata"},"sidebar":"docs","previous":{"title":"Data Transformers","permalink":"/docs/v10/server/data-transformers"},"next":{"title":"Response Caching","permalink":"/docs/v10/server/caching"}}'),o=a(27968),e=a(77334);let p={id:"metadata",title:"Metadata",sidebar_label:"Metadata",slug:"/server/metadata"},t,c={},r=[{value:"Create router with typed metadata",id:"create-router-with-typed-metadata",level:2},{value:"Example with per route authentication settings",id:"example-with-per-route-authentication-settings",level:2},{value:"Default meta, chaining, and shallow merging",id:"default-meta-chaining-and-shallow-merging",level:2}];function i(s){let l={a:"a",admonition:"admonition",code:"code",div:"div",h2:"h2",p:"p",...(0,e.R)(),...s.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(l.p,{children:["Procedure metadata allows you to add an optional procedure specific ",(0,o.jsx)(l.code,{children:"meta"})," property which will be available in all ",(0,o.jsx)(l.a,{href:"middlewares",children:"middleware"})," function parameters."]}),"\n",(0,o.jsx)(l.admonition,{type:"tip",children:(0,o.jsxs)(l.p,{children:["Use metadata together with ",(0,o.jsx)(l.a,{href:"https://github.com/jlalmes/trpc-openapi",children:(0,o.jsx)(l.code,{children:"trpc-openapi"})})," if you want to expose REST-compatible endpoints for your application."]})}),"\n",(0,o.jsx)(l.h2,{id:"create-router-with-typed-metadata",children:"Create router with typed metadata"}),"\n",(0,o.jsx)(l.div,{dangerouslySetInnerHTML:{__html:'<pre class="shiki min-light" style="background-color: #ffffff; color: #24292eff"><div class="language-id">tsx</div><div class=\'code-container\'><code><div class=\'line\'><span style="color: #D32F2F">import</span><span style="color: #24292EFF"> { initTRPC } </span><span style="color: #D32F2F">from</span><span style="color: #24292EFF"> </span><span style="color: #22863A">\'@trpc/server\'</span><span style="color: #24292EFF">;</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #C2C3C5">// [...]</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #D32F2F">interface</span><span style="color: #24292EFF"> </span><span style="color: #6F42C1">Meta</span><span style="color: #24292EFF"> {</span></div><div class=\'line\'><span style="color: #24292EFF"> authRequired</span><span style="color: #D32F2F">:</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">boolean</span><span style="color: #24292EFF">;</span></div><div class=\'line\'><span style="color: #24292EFF">}</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #D32F2F">export</span><span style="color: #24292EFF"> </span><span style="color: #D32F2F">const</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">t</span><span style="color: #24292EFF"> </span><span style="color: #D32F2F">=</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">initTRPC</span><span style="color: #6F42C1">.context</span><span style="color: #24292EFF"><</span><span style="color: #6F42C1">Context</span><span style="color: #24292EFF">>()</span><span style="color: #6F42C1">.meta</span><span style="color: #24292EFF"><</span><span style="color: #6F42C1">Meta</span><span style="color: #24292EFF">>()</span><span style="color: #6F42C1">.create</span><span style="color: #24292EFF">();</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #D32F2F">export</span><span style="color: #24292EFF"> </span><span style="color: #D32F2F">const</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">appRouter</span><span style="color: #24292EFF"> </span><span style="color: #D32F2F">=</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">t</span><span style="color: #6F42C1">.router</span><span style="color: #24292EFF">({</span></div><div class=\'line\'><span style="color: #24292EFF"> </span><span style="color: #C2C3C5">// [...]</span></div><div class=\'line\'><span style="color: #24292EFF">});
1</span></div></code></div><button type="button" aria-label="Copy code to clipboard" class="copy-button" onclick="navigator.clipboard.writeText(this.previousSibling.innerText);this.classList.add(\'copied\');this.textContent = \'Copied\';setTimeout(() => {this.classList.remove(\'copied\');this.textContent = \'Copy\'}, 2000)">Copy</button></pre>\n<pre class="shiki github-dark" style="background-color: #0d1117; color: #c9d1d9"><div class="language-id">tsx</div><div class=\'code-container\'><code><div class=\'line\'><span style="color: #FF7B72">import</span><span style="color: #C9D1D9"> { initTRPC } </span><span style="color: #FF7B72">from</span><span style="color: #C9D1D9"> </span><span style="color: #A5D6FF">\'@trpc/server\'</span><span style="color: #C9D1D9">;</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #8B949E">// [...]</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #FF7B72">interface</span><span style="color: #C9D1D9"> </span><span style="color: #FFA657">Meta</span><span style="color: #C9D1D9"> {</span></div><div class=\'line\'><span style="color: #C9D1D9"> </span><span style="color: #FFA657">authRequired</span><span style="color: #FF7B72">:</span><span style="color: #C9D1D9"> </span><span style="color: #79C0FF">boolean</span><span style="color: #C9D1D9">;</span></div><div class=\'line\'><span style="color: #C9D1D9">}</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #FF7B72">export</span><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">const</span><span style="color: #C9D1D9"> </span><span style="color: #79C0FF">t</span><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">=</span><span style="color: #C9D1D9"> initTRPC.</span><span style="color: #D2A8FF">context</span><span style="color: #C9D1D9"><</span><span style="color: #FFA657">Context</span><span style="color: #C9D1D9">>().</span><span style="color: #D2A8FF">meta</span><span style="color: #C9D1D9"><</span><span style="color: #FFA657">Meta</span><span style="color: #C9D1D9">>().</span><span style="color: #D2A8FF">create</span><span style="color: #C9D1D9">();</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #FF7B72">export</span><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">const</span><span style="color: #C9D1D9"> </span><span style="color: #79C0FF">appRouter</span><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">=</span><span style="color: #C9D1D9"> t.</span><span style="color: #D2A8FF">router</span><span style="color: #C9D1D9">({</span></div><div class=\'line\'><span style="color: #C9D1D9"> </span><span style="color: #8B949E">// [...]</span></div><div class=\'line\'><span style="color: #C9D1D9">});</span></div></code></div><button type="button" aria-label="Copy code to clipboard" class="copy-button" onclick="navigator.clipboard.writeText(this.previousSibling.innerText);this.classList.add(\'copied\');this.textContent = \'Copied\';setTimeout(() => {this.classList.remove(\'copied\');this.textContent = \'Copy\'}, 2000)">Copy</button></pre>'}}),"\n",(0,o.jsx)(l.h2,{id:"example-with-per-route-authentication-settings",children:"Example with per route authentication settings"}),"\n",(0,o.jsx)(l.div,{dangerouslySetInnerHTML:{__html:'<pre class="shiki min-light with-title" style="background-color: #ffffff; color: #24292eff" title="server.ts"><div class=\'code-title\'>server.ts</div><div class="language-id">tsx</div><div class=\'code-container\'><code><div class=\'line\'><span style="color: #D32F2F">import</span><span style="color: #24292EFF"> { initTRPC } </span><span style="color: #D32F2F">from</span><span style="color: #24292EFF"> </span><span style="color: #22863A">\'@trpc/server\'</span><span style="color: #24292EFF">;</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #C2C3C5">// [...]</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #D32F2F">interface</span><span style="color: #24292EFF"> </span><span style="color: #6F42C1">Meta</span><span style="color: #24292EFF"> {</span></div><div class=\'line\'><span style="color: #24292EFF"> authRequired</span><span style="color: #D32F2F">:</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">boolean</span><span style="color: #24292EFF">;</span></div><div class=\'line\'><span style="color: #24292EFF">}</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #D32F2F">export</span><span style="color: #24292EFF"> </span><span style="color: #D32F2F">const</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">t</span><span style="color: #24292EFF"> </span><span style="color: #D32F2F">=</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">initTRPC</span><span style="color: #6F42C1">.context</span><span style="color: #24292EFF"><</span><span style="color: #6F42C1">Context</span><span style="color: #24292EFF">>()</span><span style="color: #6F42C1">.meta</span><span style="color: #24292EFF"><</span><span style="color: #6F42C1">Meta</span><span style="color: #24292EFF">>()</span><span style="color: #6F42C1">.create</span><span style="color: #24292EFF">();</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #D32F2F">export</span><span style="color: #24292EFF"> </span><span style="color: #D32F2F">const</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">authedProcedure</span><span style="color: #24292EFF"> </span><span style="color: #D32F2F">=</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">t</span><span style="color: #6F42C1">.</span><span style="color: #1976D2">procedure</span><span style="color: #6F42C1">.use</span><span style="color: #24292EFF">(</span><span style="color: #D32F2F">async</span><span style="color: #24292EFF"> (opts) </span><span style="color: #D32F2F">=></span><span style="color: #24292EFF"> {</span></div><div class=\'line\'><span style="color: #24292EFF"> </span><span style="color: #D32F2F">const</span><span style="color: #24292EFF"> { </span><span style="color: #1976D2">meta</span><span style="color: #212121">,</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">next</span><span style="color: #212121">,</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">ctx</span><span style="color: #24292EFF"> } </span><span style="color: #D32F2F">=</span><span style="color: #24292EFF"> opts;</span></div><div class=\'line\'><span style="color: #24292EFF"> </span><span style="color: #C2C3C5">// only check authorization if enabled</span></div><div class=\'line\'><span style="color: #24292EFF"> </span><span style="color: #D32F2F">if</span><span style="color: #24292EFF"> (</span><span style="color: #1976D2">meta</span><span style="color: #24292EFF">?.authRequired </span><span style="color: #D32F2F">&&</span><span style="color: #24292EFF"> </span><span style="color: #D32F2F">!</span><span style="color: #1976D2">ctx</span><span style="color: #24292EFF">.user) {</span></div><div class=\'line\'><span style="color: #24292EFF"> </span><span style="color: #D32F2F">throw</span><span style="color: #24292EFF"> </span><span style="color: #D32F2F">new</span><span style="color: #24292EFF"> </span><span style="color: #6F42C1">TRPCError</span><span style="color: #24292EFF">
1({ code</span><span style="color: #D32F2F">:</span><span style="color: #24292EFF"> </span><span style="color: #22863A">\'UNAUTHORIZED\'</span><span style="color: #24292EFF"> });</span></div><div class=\'line\'><span style="color: #24292EFF"> }</span></div><div class=\'line\'><span style="color: #24292EFF"> </span><span style="color: #D32F2F">return</span><span style="color: #24292EFF"> </span><span style="color: #6F42C1">next</span><span style="color: #24292EFF">();</span></div><div class=\'line\'><span style="color: #24292EFF">});</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #D32F2F">export</span><span style="color: #24292EFF"> </span><span style="color: #D32F2F">const</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">appRouter</span><span style="color: #24292EFF"> </span><span style="color: #D32F2F">=</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">t</span><span style="color: #6F42C1">.router</span><span style="color: #24292EFF">({</span></div><div class=\'line\'><span style="color: #24292EFF"> hello</span><span style="color: #D32F2F">:</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">authedProcedure</span><span style="color: #6F42C1">.meta</span><span style="color: #24292EFF">({ authRequired</span><span style="color: #D32F2F">:</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">false</span><span style="color: #24292EFF"> })</span><span style="color: #6F42C1">.query</span><span style="color: #24292EFF">(() </span><span style="color: #D32F2F">=></span><span style="color: #24292EFF"> {</span></div><div class=\'line\'><span style="color: #24292EFF"> </span><span style="color: #D32F2F">return</span><span style="color: #24292EFF"> {</span></div><div class=\'line\'><span style="color: #24292EFF"> greeting</span><span style="color: #D32F2F">:</span><span style="color: #24292EFF"> </span><span style="color: #22863A">\'hello world\'</span><span style="color: #212121">,</span></div><div class=\'line\'><span style="color: #24292EFF"> };</span></div><div class=\'line\'><span style="color: #24292EFF"> })</span><span style="color: #212121">,</span></div><div class=\'line\'><span style="color: #24292EFF"> protectedHello</span><span style="color: #D32F2F">:</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">authedProcedure</span><span style="color: #6F42C1">.meta</span><span style="color: #24292EFF">({ authRequired</span><span style="color: #D32F2F">:</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">true</span><span style="color: #24292EFF"> })</span><span style="color: #6F42C1">.query</span><span style="color: #24292EFF">(() </span><span style="color: #D32F2F">=></span><span style="color: #24292EFF"> {</span></div><div class=\'line\'><span style="color: #24292EFF"> </span><span style="color: #D32F2F">return</span><span style="color: #24292EFF"> {</span></div><div class=\'line\'><span style="color: #24292EFF"> greeting</span><span style="color: #D32F2F">:</span><span style="color: #24292EFF"> </span><span style="color: #22863A">\'hello-world\'</span><span style="color: #212121">,</span></div><div class=\'line\'><span style="color: #24292EFF"> };</span></div><div class=\'line\'><span style="color: #24292EFF"> })</span><span style="color: #212121">,</span></div><div class=\'line\'><span style="color: #24292EFF">});
1</span></div></code></div><button type="button" aria-label="Copy code to clipboard" class="copy-button" onclick="navigator.clipboard.writeText(this.previousSibling.innerText);this.classList.add(\'copied\');this.textContent = \'Copied\';setTimeout(() => {this.classList.remove(\'copied\');this.textContent = \'Copy\'}, 2000)">Copy</button></pre>\n<pre class="shiki github-dark with-title" style="background-color: #0d1117; color: #c9d1d9" title="server.ts"><div class=\'code-title\'>server.ts</div><div class="language-id">tsx</div><div class=\'code-container\'><code><div class=\'line\'><span style="color: #FF7B72">import</span><span style="color: #C9D1D9"> { initTRPC } </span><span style="color: #FF7B72">from</span><span style="color: #C9D1D9"> </span><span style="color: #A5D6FF">\'@trpc/server\'</span><span style="color: #C9D1D9">;</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #8B949E">// [...]</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #FF7B72">interface</span><span style="color: #C9D1D9"> </span><span style="color: #FFA657">Meta</span><span style="color: #C9D1D9"> {</span></div><div class=\'line\'><span style="color: #C9D1D9"> </span><span style="color: #FFA657">authRequired</span><span style="color: #FF7B72">:</span><span style="color: #C9D1D9"> </span><span style="color: #79C0FF">boolean</span><span style="color: #C9D1D9">;</span></div><div class=\'line\'><span style="color: #C9D1D9">}</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #FF7B72">export</span><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">const</span><span style="color: #C9D1D9"> </span><span style="color: #79C0FF">t</span><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">=</span><span style="color: #C9D1D9"> initTRPC.</span><span style="color: #D2A8FF">context</span><span style="color: #C9D1D9"><</span><span style="color: #FFA657">Context</span><span style="color: #C9D1D9">>().</span><span style="color: #D2A8FF">meta</span><span style="color: #C9D1D9"><</span><span style="color: #FFA657">Meta</span><span style="color: #C9D1D9">>().</span><span style="color: #D2A8FF">create</span><span style="color: #C9D1D9">();</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #FF7B72">export</span><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">const</span><span style="color: #C9D1D9"> </span><span style="color: #79C0FF">authedProcedure</span><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">=</span><span style="color: #C9D1D9"> t.procedure.</span><span style="color: #D2A8FF">use</span><span style="color: #C9D1D9">(</span><span style="color: #FF7B72">async</span><span style="color: #C9D1D9"> (</span><span style="color: #FFA657">opts</span><span style="color: #C9D1D9">) </span><span style="color: #FF7B72">=></span><span style="color: #C9D1D9"> {</span></div><div class=\'line\'><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">const</span><span style="color: #C9D1D9"> { </span><span style="color: #79C0FF">meta</span><span style="color: #C9D1D9">, </span><span style="color: #79C0FF">next</span><span style="color: #C9D1D9">, </span><span style="color: #79C0FF">ctx</span><span style="color: #C9D1D9"> } </span><span style="color: #FF7B72">=</span><span style="color: #C9D1D9"> opts;</span></div><div class=\'line\'><span style="color: #C9D1D9"> </span><span style="color: #8B949E">// only check authorization if enabled</span></div><div class=\'line\'><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">if</span><span style="color: #C9D1D9"> (meta?.authRequired </span><span style="color: #FF7B72">&&</span><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">!</span><span style="color: #C9D1D9">ctx.user) {</span></div><div class=\'line\'><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">throw</span><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">new</span><span style="color: #C9D1D9"> </span><span style="color: #D2A8FF">TRPCError</span><span style="color: #C9D1D9">({ code: </span><span style="color: #A5D6FF">\'UNAUTHORIZED\'</span><span style="color: #C9D1D9"> });</span></div><div class=\'line\'><span style="color: #C9D1D9"> }</span></div><div class=\'line\'><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">return</span><span style="color: #C9D1D9"> </span><span style="color: #D2A8FF">next</span><span style="color: #C9D1D9">();</span></div><div class=\'line\'><span style="color: #C9D1D9">});
1</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #FF7B72">export</span><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">const</span><span style="color: #C9D1D9"> </span><span style="color: #79C0FF">appRouter</span><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">=</span><span style="color: #C9D1D9"> t.</span><span style="color: #D2A8FF">router</span><span style="color: #C9D1D9">({</span></div><div class=\'line\'><span style="color: #C9D1D9"> hello: authedProcedure.</span><span style="color: #D2A8FF">meta</span><span style="color: #C9D1D9">({ authRequired: </span><span style="color: #79C0FF">false</span><span style="color: #C9D1D9"> }).</span><span style="color: #D2A8FF">query</span><span style="color: #C9D1D9">(() </span><span style="color: #FF7B72">=></span><span style="color: #C9D1D9"> {</span></div><div class=\'line\'><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">return</span><span style="color: #C9D1D9"> {</span></div><div class=\'line\'><span style="color: #C9D1D9"> greeting: </span><span style="color: #A5D6FF">\'hello world\'</span><span style="color: #C9D1D9">,</span></div><div class=\'line\'><span style="color: #C9D1D9"> };</span></div><div class=\'line\'><span style="color: #C9D1D9"> }),</span></div><div class=\'line\'><span style="color: #C9D1D9"> protectedHello: authedProcedure.</span><span style="color: #D2A8FF">meta</span><span style="color: #C9D1D9">({ authRequired: </span><span style="color: #79C0FF">true</span><span style="color: #C9D1D9"> }).</span><span style="color: #D2A8FF">query</span><span style="color: #C9D1D9">(() </span><span style="color: #FF7B72">=></span><span style="color: #C9D1D9"> {</span></div><div class=\'line\'><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">return</span><span style="color: #C9D1D9"> {</span></div><div class=\'line\'><span style="color: #C9D1D9"> greeting: </span><span style="color: #A5D6FF">\'hello-world\'</span><span style="color: #C9D1D9">,</span></div><div class=\'line\'><span style="color: #C9D1D9"> };</span></div><div class=\'line\'><span style="color: #C9D1D9"> }),</span></div><div class=\'line\'><span style="color: #C9D1D9">});</span></div></code></div><button type="button" aria-label="Copy code to clipboard" class="copy-button" onclick="navigator.clipboard.writeText(this.previousSibling.innerText);this.classList.add(\'copied\');this.textContent = \'Copied\';setTimeout(() => {this.classList.remove(\'copied\');this.textContent = \'Copy\'}, 2000)">Copy</button></pre>'}}),"\n",(0,o.jsx)(l.h2,{id:"default-meta-chaining-and-shallow-merging",children:"Default meta, chaining, and shallow merging"}),"\n",(0,o.jsx)(l.p,{children:"You can set default values for your meta type, and if you chain meta on top of a base procedure it will be shallow merged."}),"\n",(0,o.jsx)(l.div,{dangerouslySetInnerHTML:{__html:'<pre class="shiki min-light" style="background-color: #ffffff; color: #24292eff"><div class="language-id">tsx</div><div class=\'code-container\'><code><div class=\'line\'><span style="color: #D32F2F">import</span><span style="color: #24292EFF"> { initTRPC } </span><span style="color: #D32F2F">from</span><span style="color: #24292EFF"> </span><span style="color: #22863A">\'@trpc/server\'</span><span style="color: #24292EFF">;</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #D32F2F">interface</span><span style="color: #24292EFF"> </span><span style="color: #6F42C1">Meta</span><span style="color: #24292EFF"> {</span></div><div class=\'line\'><span style="color: #24292EFF"> authRequired</span><span style="color: #D32F2F">:</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">boolean</span><span style="color: #24292EFF">;</span></div><div class=\'line\'><span style="color: #24292EFF"> role</span><span style="color: #D32F2F">?:</span><span style="color: #24292EFF"> </span><span style="color: #22863A">\'user\'</span><span style="color: #24292EFF"> </span><span style="color: #D32F2F">|</span><span style="color: #24292EFF"> </span><span style="color: #22863A">\'admin\'</span></div><div class=\'line\'><span style="color: #24292EFF">}</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #D32F2F">export</span><span style="color: #24292EFF"> </span><span style="color: #D32F2F">const</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">t</span><span style="color: #24292EFF"> </span><span style="color: #D32F2F">=</span><span style="color: #24292EFF"> initTRPC</span></div><div class=\'line\'><span style="color: #24292EFF"> </span><span style="color: #6F42C1">.context</span><span style="color: #24292EFF"><</span><span style="color: #6F42C1">Context</span><span style="color: #24292EFF">>()</span></div><div class=\'line\'><span style="color: #24292EFF"> </span><span style="color: #6F42C1">.meta</span><span style="color: #24292EFF"><</span><span style="color: #6F42C1">Meta</span><span style="color: #24292EFF">>()</span></div><div class=\'line\'><span style="color: #24292EFF"> </span><span style="color: #6F42C1">.create</span><span style="color: #24292EFF">({</span></div><div class=\'line\'><span style="color: #24292EFF"> </span><span style="color: #C2C3C5">// Set a default value</span></div><div class=\'line\'><span style="color: #24292EFF"> defaultMeta</span><span style="color: #D32F2F">:</span><span style="color: #24292EFF"> { authRequired</span><span style="color: #D32F2F">:</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">
1false</span><span style="color: #24292EFF"> }</span></div><div class=\'line\'><span style="color: #24292EFF"> });</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #D32F2F">const</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">publicProcedure</span><span style="color: #24292EFF"> </span><span style="color: #D32F2F">=</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">t</span><span style="color: #24292EFF">.procedure</span></div><div class=\'line\'><span style="color: #C2C3C5">// ^ Default Meta: { authRequired: false }</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #D32F2F">const</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">authProcedure</span><span style="color: #24292EFF"> </span><span style="color: #D32F2F">=</span><span style="color: #24292EFF"> publicProcedure</span></div><div class=\'line\'><span style="color: #24292EFF"> </span><span style="color: #6F42C1">.use</span><span style="color: #24292EFF">(authMiddleware)</span></div><div class=\'line\'><span style="color: #24292EFF"> </span><span style="color: #6F42C1">.meta</span><span style="color: #24292EFF">({</span></div><div class=\'line\'><span style="color: #24292EFF"> authRequired</span><span style="color: #D32F2F">:</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">true</span><span style="color: #24292EFF">;</span></div><div class=\'line\'><span style="color: #24292EFF"> role: </span><span style="color: #22863A">\'user\'</span></div><div class=\'line\'><span style="color: #24292EFF"> });</span></div><div class=\'line\'><span style="color: #C2C3C5">// ^ Meta: { authRequired: true, role: \'user\' }</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #D32F2F">const</span><span style="color: #24292EFF"> </span><span style="color: #1976D2">adminProcedure</span><span style="color: #24292EFF"> </span><span style="color: #D32F2F">=</span><span style="color: #24292EFF"> authProcedure</span></div><div class=\'line\'><span style="color: #24292EFF"> </span><span style="color: #6F42C1">.meta</span><span style="color: #24292EFF">({</span></div><div class=\'line\'><span style="color: #24292EFF"> role</span><span style="color: #D32F2F">:</span><span style="color: #24292EFF"> </span><span style="color: #22863A">\'admin\'</span></div><div class=\'line\'><span style="color: #24292EFF"> });</span></div><div class=\'line\'><span style="color: #C2C3C5">// ^ Meta: { authRequired: true, role: \'admin\' }</span></div></code></div><button type="button" aria-label="Copy code to clipboard" class="copy-button" onclick="navigator.clipboard.writeText(this.previousSibling.innerText);this.classList.add(\'copied\');this.textContent = \'Copied\';setTimeout(() => {this.classList.remove(\'copied\');this.textContent = \'Copy\'}, 2000)">Copy</button></pre>\n<pre class="shiki github-dark" style="background-color: #0d1117; color: #c9d1d9"><div class="language-id">tsx</div><div class=\'code-container\'><code><div class=\'line\'><span style="color: #FF7B72">import</span><span style="color: #C9D1D9"> { initTRPC } </span><span style="color: #FF7B72">from</span><span style="color: #C9D1D9"> </span><span style="color: #A5D6FF">\'@trpc/server\'</span><span style="color: #C9D1D9">;</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #FF7B72">interface</span><span style="color: #C9D1D9"> </span><span style="color: #FFA657">Meta</span><span style="color: #C9D1D9"> {</span></div><div class=\'line\'><span style="color: #C9D1D9"> </span><span style="color: #FFA657">authRequired</span><span style="color: #FF7B72">:</span><span style="color: #C9D1D9"> </span><span style="color: #79C0FF">boolean</span><span style="color: #C9D1D9">;</span></div><div class=\'line\'><span style="color: #C9D1D9"> </span><span style="color: #FFA657">role</span><span style="color: #FF7B72">?:</span><span style="color: #C9D1D9"> </span><span style="color: #A5D6FF">\'user\'</span><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">|</span><span style="color: #C9D1D9"> </span><span style="color: #A5D6FF">\'admin\'</span></div><div class=\'line\'><span style="color: #C9D1D9">}</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #FF7B72">export</span><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">const</span><span style="color: #C9D1D9"> </span><span style="color: #79C0FF">t</span><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">=</span><span style="color: #C9D1D9"> initTRPC</span></div><div class=\'line\'><span style="color: #C9D1D9"> .</span><span style="color: #D2A8FF">context</span><span style="color: #C9D1D9"><</span><span style="color: #FFA657">Context</span><span style="color: #C9D1D9">>()</span></div><div class=\'line\'><span style="color: #C9D1D9"> .</span><span style="color: #D2A8FF">meta</span><span style="color: #C9D1D9"><</span><span style="color: #FFA657">Meta</span><span style="color: #C9D1D9">>()</span></div><div class=\'line\'><span style="color: #C9D1D9"> .</span><span style="color: #D2A8FF">create</span><span style="color: #C9D1D9">
1({</span></div><div class=\'line\'><span style="color: #C9D1D9"> </span><span style="color: #8B949E">// Set a default value</span></div><div class=\'line\'><span style="color: #C9D1D9"> defaultMeta: { authRequired: </span><span style="color: #79C0FF">false</span><span style="color: #C9D1D9"> }</span></div><div class=\'line\'><span style="color: #C9D1D9"> });</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #FF7B72">const</span><span style="color: #C9D1D9"> </span><span style="color: #79C0FF">publicProcedure</span><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">=</span><span style="color: #C9D1D9"> t.procedure</span></div><div class=\'line\'><span style="color: #8B949E">// ^ Default Meta: { authRequired: false }</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #FF7B72">const</span><span style="color: #C9D1D9"> </span><span style="color: #79C0FF">authProcedure</span><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">=</span><span style="color: #C9D1D9"> publicProcedure</span></div><div class=\'line\'><span style="color: #C9D1D9"> .</span><span style="color: #D2A8FF">use</span><span style="color: #C9D1D9">(authMiddleware)</span></div><div class=\'line\'><span style="color: #C9D1D9"> .</span><span style="color: #D2A8FF">meta</span><span style="color: #C9D1D9">({</span></div><div class=\'line\'><span style="color: #C9D1D9"> authRequired: </span><span style="color: #79C0FF">true</span><span style="color: #C9D1D9">;</span></div><div class=\'line\'><span style="color: #C9D1D9"> role: </span><span style="color: #A5D6FF">\'user\'</span></div><div class=\'line\'><span style="color: #C9D1D9"> });</span></div><div class=\'line\'><span style="color: #8B949E">// ^ Meta: { authRequired: true, role: \'user\' }</span></div><div class=\'line\'></div><div class=\'line\'><span style="color: #FF7B72">const</span><span style="color: #C9D1D9"> </span><span style="color: #79C0FF">adminProcedure</span><span style="color: #C9D1D9"> </span><span style="color: #FF7B72">=</span><span style="color: #C9D1D9"> authProcedure</span></div><div class=\'line\'><span style="color: #C9D1D9"> .</span><span style="color: #D2A8FF">meta</span><span style="color: #C9D1D9">({</span></div><div class=\'line\'><span style="color: #C9D1D9"> role: </span><span style="color: #A5D6FF">\'admin\'</span></div><div class=\'line\'><span style="color: #C9D1D9"> });</span></div><div class=\'line\'><span style="color: #8B949E">// ^ Meta: { authRequired: true, role: \'admin\' }</span></div></code></div><button type="button" aria-label="Copy code to clipboard" class="copy-button" onclick="navigator.clipboard.writeText(this.previousSibling.innerText);this.classList.add(\'copied\');this.textContent = \'Copied\';setTimeout(() => {this.classList.remove(\'copied\');this.textContent = \'Copy\'}, 2000)">Copy</button></pre>'}})]})}function F(s={}){let{wrapper:l}={...(0,e.R)(),...s.components};return l?(0,o.jsx)(l,{...s,children:(0,o.jsx)(i,{...s})}):i(s)}},77334(s,l,a){a.d(l,{R:()=>p,x:()=>t});var n=a(64700);let o={},e=n.createContext(o);function p(s){let l=n.useContext(e);return n.useMemo(function(){return"function"==typeof s?s(l):{...l,...s}},[l,s])}function t(s){let l;return l=s.disableParentContext?"function"==typeof s.components?s.components(o):s.components||o:p(s.components),n.createElement(e.Provider,{value:l},s.children)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.