1<!DOCTYPE html><html class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/GeistMono_Variable.p.42jdkyb02hb3d.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/Geist_Variable-s.p.38tal-0yzr82m.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/chunks/1781sbja7e0bq.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/37v5ulr6qjozi.js"/>
1<script src="/_next/static/chunks/3s3-q6usvffkv.js" async=""></script>
1<script src="/_next/static/chunks/0023m_286zbl8.js" async=""></script>
1<script src="/_next/static/chunks/2niun102n800c.js" async=""></script>
1<script src="/_next/static/chunks/3nc6x0_y5iwnk.js" async=""></script>
1<script src="/_next/static/chunks/turbopack-3xo_0s9yo6p4o.js" async=""></script>
1<script src="/_next/static/chunks/2ap1fvadncvz3.js" async=""></script>
1<script src="/_next/static/chunks/02_uo_bw4zs_c.js" async=""></script>
1<script src="/_next/static/chunks/0ud1d1a31uilc.js" async=""></script>
1<script src="/_next/static/chunks/0dcuc-_nnvwsq.js" async=""></script>
1<script src="/_next/static/chunks/1ntn7efqc-iiw.js" async=""></script>
1<script src="/_next/static/chunks/2x_fbhg2m9d65.js" async=""></script>
1<script src="/_next/static/chunks/1buygnwj9jkxn.js" async=""></script>
1<script src="/_next/static/chunks/2yl3qg5sau_m1.js" async=""></script>
1<script src="/_next/static/chunks/3q7cnnq64z-47.js" async=""></script>
1<script src="/_next/static/chunks/0ysnn4qn15cl9.js" async=""></script>
1<script src="/_next/static/chunks/2hkj29w79i1yj.js" async=""></script>
1<script src="/_next/static/chunks/0zn7bsfaggbks.js" async=""></script>
1<script src="/_next/static/chunks/0k01ihl9igxe4.js" async=""></script>
1<script src="/_next/static/chunks/2l26d-3l2mfkz.js" async=""></script>
1<meta name="next-size-adjust" content=""/><title>AdonisJS Shopkeeper - Introduction</title><meta name="description" content="AdonisJS Shopkeeper gives Stripe billing a fluent, expressive API so you can add subscriptions, trials, one-off charges, and invoices in minutes."/><meta name="application-name" content="Friends Of Adonis"/><link rel="author" href="https://github.com/FriendsOfAdonis"/><meta name="author" content="Friends Of Adonis"/><meta name="keywords" content="AdonisJS,Adonis,TypeScript,Node.js,AdonisJS packages"/><meta name="robots" content="index, follow"/><meta name="googlebot" content="index, follow, max-image-preview:large, max-snippet:-1"/><link rel="canonical" href="https://friendsofadonis.com/docs/shopkeeper"/><meta property="og:title" content="AdonisJS Shopkeeper - Introduction"/><meta property="og:description" content="AdonisJS Shopkeeper gives Stripe billing a fluent, expressive API so you can add subscriptions, trials, one-off charges, and invoices in minutes."/><meta property="og:url" content="https://friendsofadonis.com/docs/shopkeeper"/><meta property="og:site_name" content="Friends Of Adonis"/><meta property="og:locale" content="en_US"/><meta property="og:image" content="https://friendsofadonis.com/og/shopkeeper/image.webp"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta property="og:image:alt" content="AdonisJS Shopkeeper - Introduction"/><meta property="og:type" content="article"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:site" content="@PaucotMartin"/><meta name="twitter:creator" content="@PaucotMartin"/><meta name="twitter:title" content="AdonisJS Shopkeeper - Introduction"/><meta name="twitter:description" content="AdonisJS Shopkeeper gives Stripe billing a fluent, expressive API so you can add subscriptions, trials, one-off charges, and invoices in minutes."/><meta name="twitter:image" content="https://friendsofadonis.com/og/shopkeeper/image.webp"/><meta name="twitter:image:alt" content="AdonisJS Shopkeeper - Introduction"/><meta name="twitter:image:width" content="1200"/><meta name="twitter:image:height" content="630"/>
1<script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script>
1</head><body class="shopkeeper relative flex min-h-screen flex-col"><div hidden=""><!--$--><!--/$--></div>
1<script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","system",null,["light","dark"],null,true,true)</script>
1<!--$--><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><!--/$--><!--/$--><div id="nd-notebook-layout" data-sidebar-collapsed="false" data-column-changed="false" style="grid-template:"sidebar sidebar header header ." 2"sidebar sidebar toc-popover toc-popover ." 3"sidebar sidebar main toc ." 1fr / minmax(min-content, 1fr) var(--fd-sidebar-col) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-col) - var(--fd-toc-width))) var(--fd-toc-width) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)" class="grid overflow-x-clip min-h-(--fd-docs-height) auto-cols-auto auto-rows-auto [--fd-docs-height:100dvh] [--fd-header-height:0px] [--fd-toc-popover-height:0px] [--fd-sidebar-width:0px] [--fd-toc-width:0px] data-[column-changed=true]:transition-[grid-template-columns]"><header id="nd-subnav" data-transparent="false" class="sticky [grid-area:header] flex flex-col top-(--fd-docs-row-1) z-10 backdrop-blur-sm transition-colors data-[transparent=false]:bg-fd-background/80 layout:[--fd-header-height:--spacing(14)]"><div data-header-body="" class="flex border-b px-4 gap-2 h-14 md:px-6"><div class="items-center hidden has-data-[collapsed=true]:md:flex max-md:flex"><button type="button" aria-label="Collapse Sidebar" data-collapsed="false" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring hover:bg-fd-accent hover:text-fd-accent-foreground p-1.5 [&_svg]:size-4.5 -ms-1.5 text-fd-muted-foreground data-[collapsed=false]:hidden max-md:hidden"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-panel-left" aria-hidden="true"><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M9 3v18"></path></svg></button><a class="inline-flex items-center gap-2.5 font-semibold md:hidden" href="/docs"><div class="flex items-center gap-3 my-2"><img alt="Friends Of Adonis" loading="lazy" width="32" height="32" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=%2Flogo.png&w=32&q=75 1x, /_next/image?url=%2Flogo.png&w=64&q=75 2x" src="/_next/image?url=%2Flogo.png&w=64&q=75"/>Friends Of Adonis</div></a></div><button type="button" data-search-full="" class="inline-flex items-center gap-2 rounded-lg border bg-fd-secondary/50 p-1.5 ps-2 text-sm text-fd-muted-foreground transition-colors hover:bg-fd-accent hover:text-fd-accent-foreground w-full my-auto max-md:hidden max-w-[240px]"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search size-4" aria-hidden="true"><path d="m21 21-4.34-4.34"></path><circle cx="11" cy="11" r="8"></circle></svg>Search<div class="ms-auto inline-flex gap-0.5"><kbd class="rounded-md border bg-fd-background px-1.5">â</kbd><kbd class="rounded-md border bg-fd-background px-1.5">K</kbd></div></button><div class="flex flex-1 items-center justify-end md:gap-2"><div class="flex items-center gap-6 empty:hidden max-lg:hidden"><button type="button" aria-haspopup="dialog" aria-expanded="false" data-state="closed" class="inline-flex items-center gap-1.5 p-1 text-sm text-fd-muted-foreground transition-colors has-data-[active=true]:text-fd-primary data-[state=open]:text-fd-accent-foreground focus-visible:outline-none"><a data-active="false" href="/docs">Packages</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down size-3" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button><a class="text-sm text-fd-muted-foreground transition-colors hover:text-fd-accent-foreground data-[active=true]:text-fd-primary" data-active="false" href="/blog">Blog</a><a href="https://github.com/FriendsOfAdonis/FriendsOfAdonis" rel="noreferrer noopener" target="_blank" class="flex flex-col gap-1.5 p-2 rounded-lg text-sm text-fd-foreground
3/80 transition-colors lg:flex-row lg:items-center lg:justify-center hover:text-fd-accent-foreground hover:bg-fd-accent"><p class="flex items-center gap-2 truncate"><svg class="size-3.5" fill="currentColor" viewBox="0 0 24 24"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg>FriendsOfAdonis</p><p class="flex text-xs items-center gap-1 text-fd-muted-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-star size-3" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg>164</p></a></div><div class="flex items-center md:hidden"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring hover:bg-fd-accent hover:text-fd-accent-foreground [&_svg]:size-4.5 p-2" data-search="" aria-label="Open Search"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search" aria-hidden="true"><path d="m21 21-4.34-4.34"></path><circle cx="11" cy="11" r="8"></circle></svg></button><button type="button" aria-label="Open Sidebar" aria-expanded="false" aria-controls="nd-sidebar-mobile" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring hover:bg-fd-accent hover:text-fd-accent-foreground [&_svg]:size-4.5 p-2 -me-1.5"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-panel-left" aria-hidden="true"><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M9 3v18"></path></svg></button></div><div class="flex items-center gap-2 max-md:hidden"><button class="inline-flex items-center rounded-full border p-1 overflow-hidden *:rounded-full" aria-label="Toggle Theme" data-theme-toggle=""><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sun size-6.5 p-1.5 text-fd-muted-foreground" aria-hidden="true"><circle cx="12" cy="12" r="4"></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-moon size-6.5 p-1.5 text-fd-muted-foreground" aria-hidden="true"><path d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"></path></svg></button></div></div></div></header><div data-sidebar-placeholder="" class="sticky z-20 [grid-area:sidebar] pointer-events-none *:pointer-events-auto md:layout:[--fd-sidebar-width:268px] max-md:hidden top-(--fd-docs-row-1) h-[calc(var(--fd-docs-height)-var(--fd-docs-row-1))]"><aside id="nd-sidebar" data-collapsed="false" data-hovered="false" class="absolute flex flex-col w-full inset-s-0 inset-y-0 items-end text-sm duration-250 *:w-(--fd-sidebar-width) bg-fd-card border-e"><div class="flex flex-col gap-3 p-4 pb-2 empty:hidden"><div class="flex justify-between"><a class="inline-flex items-center gap-2.5 font-medium" href="/docs"><div class="flex items-center gap-3 my-2"><img alt="Friends Of Adonis" loading="lazy" width="32" height="32" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=%2Flogo.png&w=32&q=75 1x, /_next/image?url=%2Flogo.png&w=64&q=75 2x" src="/_next/image?url=%2Flogo.png&w=64&q=75"/>Friends Of Adonis</div></a><button type="button" aria-label="Collapse Sidebar" data-collapsed="false" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring hover:bg-fd-accent hover:text-fd-accent-foreground p-1.5 [&_svg]:size-4.5 mt-px mb-auto text-fd-muted-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-panel-left" aria-hidden="true"><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M9 3v18"></path></svg></button></div><button type="button" aria-haspopup="dialog" aria-expanded="false" data-state="closed" class="flex items-center gap-2 rounded-lg p-2 border bg-fd-secondary/50 text-start text-fd-secondary-foreground transition-colors hover:bg-fd-accent data-[state=open]:bg-fd-accent data-[state=open]:text-fd-accent-foreground"><div class="size-9 shrink-0 empty:hidden md:size-5"><div class="[&_svg]:size-full rounded-lg size-full text-(--tab-color) max-md:bg-(--tab-color)/10 max-md:border max-md:p-1.5" style="--tab-color:var(--shopkeeper-color, var(--color-fd-foreground))"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-dollar-sign" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8"></path><path d="M12 18V6"></path></svg></div></div><div><p class="text-sm font-medium">Shopkeeper</p><p class="text-sm text-fd-muted-foreground empty:hidden md:hidden">Expressive, fluent Stripe billing for AdonisJS: subscriptions, checkout, invoices, and webhooks</p></div><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevrons-up-down shrink-0 ms-auto size-4 text-fd-muted-foreground" aria-hidden="true"><path d="m7 15 5 5 5-5"></path><path d="m7 9 5-5 5 5"></path></svg></button></div><div dir="ltr" class="overflow-hidden min-h-0 flex-1" style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full rounded-[inherit] *:flex! *:flex-col! *:gap-0.5! p-4 overscroll-contain mask-[linear-gradient(to_bottom,transparent,white_12px,white_calc(100%-12px),transparent)]" style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div data-state="closed" class="lg:hidden"><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&_svg]:size-4 [&_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground
3/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors w-full" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs">Packages<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down ms-auto transition-transform -rotate-90 rtl:rotate-90" aria-hidden="true" data-icon="true"><path d="m6 9 6 6 6-6"></path></svg></a><div data-state="closed" id="radix-_R_5j9knqjb_" hidden="" class="overflow-hidden relative before:content-[''] before:absolute before:w-px before:inset-y-1 before:bg-fd-border before:inset-s-2.5"></div></div><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&_svg]:size-4 [&_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors lg:hidden" style="padding-inline-start:calc(2 * var(--spacing))" href="/blog"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-album" aria-hidden="true"><rect width="18" height="18" x="3" y="3" rx="2" ry="2"></rect><polyline points="11 3 11 11 14 8 17 11 17 3"></polyline></svg>Blog</a><div class="lg:hidden mb-3"><a href="https://github.com/FriendsOfAdonis/FriendsOfAdonis" rel="noreferrer noopener" target="_blank" class="flex flex-col gap-1.5 p-2 rounded-lg text-sm text-fd-foreground/80 transition-colors lg:flex-row lg:items-center lg:justify-center hover:text-fd-accent-foreground hover:bg-fd-accent"><p class="flex items-center gap-2 truncate"><svg class="size-3.5" fill="currentColor" viewBox="0 0 24 24"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg>FriendsOfAdonis</p><p class="flex text-xs items-center gap-1 text-fd-muted-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-star size-3" aria-hidden="true"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"></path></svg>164</p></a></div><a data-active="true" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&_svg]:size-4 [&_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/shopkeeper"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-album" aria-hidden="true"><rect width="18" height="18" x="3" y="3" rx="2" ry="2"></rect><polyline points="11 3 11 11 14 8 17 11 17 3"></polyline></svg>Introduction</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&_svg]:size-4 [&_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground
3/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/shopkeeper/getting-started"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-rocket" aria-hidden="true"><path d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z"></path><path d="m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z"></path><path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0"></path><path d="M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5"></path></svg>Getting Started</a><p class="inline-flex items-center gap-2 mb-1.5 px-2 mt-6 empty:mb-0 [&_svg]:size-4 [&_svg]:shrink-0 first:mt-0" style="padding-inline-start:calc(2 * var(--spacing))"> Payments </p><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&_svg]:size-4 [&_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/shopkeeper/accepting-payments"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-shopping-cart" aria-hidden="true"><circle cx="8" cy="21" r="1"></circle><circle cx="19" cy="21" r="1"></circle><path d="M2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12"></path></svg>Accepting Payments</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&_svg]:size-4 [&_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/shopkeeper/single-charges"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-dollar-sign" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8"></path><path d="M12 18V6"></path></svg>Single Charges</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&_svg]:size-4 [&_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/shopkeeper/invoices-and-receipts"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-receipt" aria-hidden="true"><path d="M4 2v20l2-1 2 1 2-1 2 1 2-1 2 1 2-1 2 1V2l-2 1-2-1-2 1-2-1-2 1-2-1-2 1Z"></path><path d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8"></path><path d="M12 17.5v-11"></path></svg>Invoices & Receipts</a><p class="inline-flex items-center gap-2 mb-1.5 px-2 mt-6 empty:mb-0 [&_svg]:size-4 [&_svg]:shrink-0 first:mt-0" style="padding-inline-start:calc(2 * var(--spacing))"> Subscriptions </p><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&_svg]:size-4 [&_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground
3/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/shopkeeper/managing-subscriptions"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-repeat" aria-hidden="true"><path d="m17 2 4 4-4 4"></path><path d="M3 11v-1a4 4 0 0 1 4-4h14"></path><path d="m7 22-4-4 4-4"></path><path d="M21 13v1a4 4 0 0 1-4 4H3"></path></svg>Managing Subscriptions</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&_svg]:size-4 [&_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/shopkeeper/offering-trials"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clock" aria-hidden="true"><path d="M12 6v6l4 2"></path><circle cx="12" cy="12" r="10"></circle></svg>Offering Trials</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&_svg]:size-4 [&_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/shopkeeper/metered-billing"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chart-bar" aria-hidden="true"><path d="M3 3v16a2 2 0 0 0 2 2h16"></path><path d="M7 16h8"></path><path d="M7 11h12"></path><path d="M7 6h3"></path></svg>Metered Billing</a><p class="inline-flex items-center gap-2 mb-1.5 px-2 mt-6 empty:mb-0 [&_svg]:size-4 [&_svg]:shrink-0 first:mt-0" style="padding-inline-start:calc(2 * var(--spacing))"> Configuration </p><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&_svg]:size-4 [&_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/shopkeeper/handling-webhooks"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-webhook" aria-hidden="true"><path d="M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2"></path><path d="m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06"></path><path d="m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8"></path></svg>Handling Webhooks</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&_svg]:size-4 [&_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/shopkeeper/managing-customers"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-users" aria-hidden="true"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"></path><path d="M16 3.128a4 4 0 0 1 0 7.744"></path><path d="M22 21v-2a4 4 0 0 0-3-3.87"></path><circle cx="9" cy="7" r="4"></circle></svg>Managing Customers</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&_svg]:size-4 [&_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground
3/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/shopkeeper/managing-payment-methods"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-credit-card" aria-hidden="true"><rect width="20" height="14" x="2" y="5" rx="2"></rect><line x1="2" x2="22" y1="10" y2="10"></line></svg>Managing Payment Methods</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&_svg]:size-4 [&_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/shopkeeper/taxes"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-landmark" aria-hidden="true"><path d="M10 18v-7"></path><path d="M11.12 2.198a2 2 0 0 1 1.76.006l7.866 3.847c.476.233.31.949-.22.949H3.474c-.53 0-.695-.716-.22-.949z"></path><path d="M14 18v-7"></path><path d="M18 18v-7"></path><path d="M3 22h18"></path><path d="M6 18v-7"></path></svg>Taxes</a><p class="inline-flex items-center gap-2 mb-1.5 px-2 mt-6 empty:mb-0 [&_svg]:size-4 [&_svg]:shrink-0 first:mt-0" style="padding-inline-start:calc(2 * var(--spacing))"></p><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&_svg]:size-4 [&_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/shopkeeper/migration"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up" aria-hidden="true"><path d="m5 12 7-7 7 7"></path><path d="M12 19V5"></path></svg>Migrate to 1.0.0</a></div></div></div><div class="hidden flex-row text-fd-muted-foreground items-center border-t px-4 py-2.5"></div></aside></div><div data-state="closed" data-toc-popover="" class="sticky top-(--fd-docs-row-2) z-10 [grid-area:toc-popover] h-(--fd-toc-popover-height) xl:hidden max-xl:layout:[--fd-toc-popover-height:--spacing(10)]"><header class="border-b backdrop-blur-sm transition-colors bg-fd-background/80"><button type="button" aria-expanded="false" data-state="closed" class="flex w-full h-10 items-center text-sm text-fd-muted-foreground gap-2.5 px-4 py-2.5 text-start focus-visible:outline-none [&_svg]:size-4 md:px-6" data-toc-popover-trigger=""><svg role="progressbar" viewBox="0 0 18 18" aria-valuenow="0" aria-valuemin="0" aria-valuemax="1" style="width:18px;height:18px" class="shrink-0"><circle cx="9" cy="9" r="7.5" fill="none" stroke-width="1.5" class="stroke-current/25"></circle><circle cx="9" cy="9" r="7.5" fill="none" stroke-width="1.5" stroke="currentColor" stroke-dasharray="47.12388980384689" stroke-dashoffset="47.12388980384689" stroke-linecap="round" transform="rotate(-90 9 9)" class="transition-all"></circle></svg><span class="grid flex-1 *:my-auto *:row-start-1 *:col-start-1"><span class="truncate transition-[opacity,translate,color]">Introduction</span><span class="truncate transition-[opacity,translate] opacity-0 translate-y-full pointer-events-none"></span></span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down shrink-0 transition-transform mx-0.5" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button><div data-state="closed" id="radix-_R_anpfsnqjb_" hidden="" data-toc-popover-content="" class="overflow-hidden"></div></header></div><article id="nd-page" data-full="false" class="flex flex-col [grid-area:main] px-4 py-6 gap-4 md:px-6 md:pt-8 xl:px-8 xl:pt-14 *:max-w-[900px]"><h1 class="text-[1.75em] font-semibold">Introduction</h1><p class="mb-8 text-lg text-fd-muted-foreground">AdonisJS Shopkeeper gives Stripe billing a fluent, expressive API so you can add subscriptions, trials, one-off charges, and invoices in minutes.</p><div class="flex flex-row flex-wrap gap-2 items-center border-b pb-6"><button class="inline-flex items-center justify-center rounded-md p-2 font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring border bg-fd-secondary text-fd-secondary-foreground hover:bg-fd-accent hover:text-fd-accent-foreground px-2 py-1.5 text-xs gap-2 [&_svg]:size-3.5 [&_svg]:text-fd-muted-foreground" type="button"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-copy" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg>Copy Markdown</button><button type="button" aria-haspopup="dialog" aria-expanded="false" data-state="closed" class="inline-flex items-center justify-center rounded-md p-2 font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring border bg-fd-secondary text-fd-secondary-foreground hover:bg-fd-accent hover:text-fd-accent-foreground px-2 py-1.5 text-xs gap-2">Open<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down size-3.5 text-fd-muted-foreground" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></div>
3<div class="prose flex-1 text-fd-foreground/80"><p>Adonis Shopkeeper provides an expressive, fluent interface to <a href="https://stripe.com" rel="noreferrer noopener" target="_blank">Stripe's</a> billing services. It handles the boilerplate subscription billing code you are dreading writing, so you can focus on building your product.</p> 4<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes catppuccin-latte catppuccin-mocha" style="--shiki-light:#4c4f69;--shiki-dark:#cdd6f4;--shiki-light-bg:#eff1f5;--shiki-dark-bg:#1e1e2e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clipboard" aria-hidden="true"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[0.8125rem] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7">import</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4"> router </span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7">from</span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1"> '@adonisjs/core/services/router'</span></span> 5<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7">import</span><span style="--shiki-light:#7C7F93;--shiki-dark:#9399B2"> {</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4"> urlFor </span><span style="--shiki-light:#7C7F93;--shiki-dark:#9399B2">}</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7"> from</span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1"> '@adonisjs/core/services/url_builder'</span></span> 6<span class="line"></span> 7<span class="line"><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4">router</span><span style="--shiki-light:#179299;--shiki-dark:#94E2D5">.</span><span style="--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">get</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4">(</span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1">'/subscribe'</span><span style="--shiki-light:#7C7F93;--shiki-dark:#9399B2">,</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7"> async</span><span style="--shiki-light:#7C7F93;--shiki-dark:#9399B2"> ({</span><span style="--shiki-light:#E64553;--shiki-light-font-style:italic;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic"> auth</span><span style="--shiki-light:#7C7F93;--shiki-dark:#9399B2">,</span><span style="--shiki-light:#E64553;--shiki-light-font-style:italic;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic"> response</span><span style="--shiki-light:#7C7F93;--shiki-dark:#9399B2"> })</span><span style="--shiki-light:#179299;--shiki-dark:#94E2D5"> =></span><span style="--shiki-light:#7C7F93;--shiki-dark:#9399B2"> {</span></span> 8<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7"> const</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4"> user </span><span style="--shiki-light:#179299;--shiki-dark:#94E2D5">=</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4"> auth</span><span style="--shiki-light:#179299;--shiki-dark:#94E2D5">.</span><span style="--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">getUserOrFail</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4">()</span></span> 9<span class="line"></span> 10<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7"> const</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4"> checkout </span><span style="--shiki-light:#179299;--shiki-dark:#94E2D5">=</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7"> await</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4"> user</span></span> 11<span class="line"><span style="--shiki-light:#179299;--shiki-dark:#94E2D5"> .</span><span style="--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">newSubscription</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4">(</span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1">'default'</span><span style="--shiki-light:#7C7F93;--shiki-dark:#9399B2">,</span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1"> 'price_monthly'</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4">)</span></span> 12<span class="line"><span style="--shiki-light:#179299;--shiki-dark:#94E2D5"> .</span><span style="--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">allowPromotionCodes</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4">()</span></span> 13<span class="line"><span style="--shiki-light:#179299;--shiki-dark:#94E2D5"> .</span><span style="--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">checkout</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4">(</span><span style="--shiki-light:#7C7F93;--shiki-dark:#9399B2">{</span></span> 14<span class="line"><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4"> success_url</span><span style="--shiki-light:#179299;--shiki-dark:#94E2D5">:</span><span style="--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> urlFor</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4">(</span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1">'checkout.success'</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4">)</span><span style="--shiki-light:#7C7F93;--shiki-dark:#9399B2">,</span></span> 15<span class="line"><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4"> cancel_url</span><span style="--shiki-light:#179299;--shiki-dark:#94E2D5">:</span><span style="--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic"> urlFor</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4">(</span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1">'checkout.cancel'</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4">)</span><span style="--shiki-light:#7C7F93;--shiki-dark:#9399B2">,</span></span> 16<span class="line"><span style="--shiki-light:#7C7F93;--shiki-dark:#9399B2"> }</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4">)</span></span> 17<span class="line"></span> 18<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7"> return</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4"> response</span><span style="--shiki-light:#179299;--shiki-dark:#94E2D5">.</span><span style="--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">redirect</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4">()</span><span style="--shiki-light:#179299;--shiki-dark:#94E2D5">.</span><span style="--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">status</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4">(</span><span style="--shiki-light:#FE640B;--shiki-dark:#FAB387">303</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4">)</span><span style="--shiki-light:#179299;--shiki-dark:#94E2D5">.</span><span style="--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">toPath</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4">(checkout</span><span style="--shiki-light:#179299;--shiki-dark:#94E2D5">.</span><span style="--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic">asStripeSession</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4">()</span><span style="--shiki-light:#179299;--shiki-dark:#94E2D5">.</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4">url)</span></span> 19<span class="line"><span style="--shiki-light:#7C7F93;--shiki-dark:#9399B2">}</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4">)</span></span></code></pre></div></figure> 20<h2 id="features" class="group/heading flex scroll-m-28 flex-row items-center gap-1"><a data-card="" href="#features">Features</a><button aria-label="Copy Anchor Link" class="inline-flex items-center justify-center rounded-md text-sm font-medium duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring hover:bg-fd-accent hover:text-fd-accent-foreground p-1 [&_svg]:size-4 not-prose shrink-0 text-fd-muted-foreground opacity-0 transition-opacity group-hover/heading:opacity-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></button></h2> 21<p>Shopkeeper takes care of the most common billing scenarios out of the box:</p> 22<ul> 23<li><strong>Stripe Checkout:</strong> Redirect your customers to Stripe's hosted payment page with a few lines of code</li> 24<li><strong>Subscriptions:</strong>
24 Create, swap, cancel, and resume subscriptions</li> 25<li><strong>Trial periods:</strong> Offer free trials with or without collecting a payment method</li> 26<li><strong>One-off charges:</strong> Charge customers for individual products or services</li> 27<li><strong>Invoices:</strong> Retrieve and display invoices for your customers</li> 28<li><strong>Webhooks:</strong> Sync subscription state with opt-in idempotent webhook handling</li> 29<li><strong>Payment methods:</strong> Store, update, and manage customer payment methods</li> 30<li><strong>Coupons & promotions:</strong> Apply discounts and promotion codes to subscriptions and checkouts</li> 31<li><strong>Metered billing:</strong> Charge customers based on usage during a billing cycle</li> 32<li><strong>Taxes:</strong> Handle tax rates manually or automatically with <a href="https://stripe.com/tax" rel="noreferrer noopener" target="_blank">Stripe Tax</a></li> 33</ul> 34<h2 id="next-steps" class="group/heading flex scroll-m-28 flex-row items-center gap-1"><a data-card="" href="#next-steps">Next steps</a><button aria-label="Copy Anchor Link" class="inline-flex items-center justify-center rounded-md text-sm font-medium duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring hover:bg-fd-accent hover:text-fd-accent-foreground p-1 [&_svg]:size-4 not-prose shrink-0 text-fd-muted-foreground opacity-0 transition-opacity group-hover/heading:opacity-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></button></h2> 35<p>Ready to get started? Head over to the <a href="/docs/shopkeeper/getting-started">Getting Started</a> guide to install Shopkeeper and accept your first payment in minutes.</p></div><div class="flex flex-row flex-wrap items-center justify-between gap-4 empty:hidden"></div><div class="@container grid gap-4 grid-cols-1"><a class="flex flex-col gap-2 rounded-lg border p-4 text-sm transition-colors hover:bg-fd-accent/80 hover:text-fd-accent-foreground @max-lg:col-span-full text-end" href="/docs/shopkeeper/getting-started"><div class="inline-flex items-center gap-1.5 font-medium flex-row-reverse"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right -mx-1 size-4 shrink-0 rtl:rotate-180" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg><p>Getting Started</p></div><p class="text-fd-muted-foreground truncate">Take a first Stripe payment from AdonisJS: add @foadonis/shopkeeper, run its billing migrations, then compose the billable() mixin into your User model.</p></a></div></article><div id="nd-toc" class="sticky top-(--fd-docs-row-3) [grid-area:toc] h-[calc(var(--fd-docs-height)-var(--fd-docs-row-3))] flex flex-col w-(--fd-toc-width) pt-12 pe-4 pb-2 xl:layout:[--fd-toc-width:268px] max-xl:hidden"><h3 id="toc-title" class="inline-flex items-center gap-1.5 text-sm text-fd-muted-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-text-align-start size-4" aria-hidden="true"><path d="M21 5H3"></path><path d="M15 12H3"></path><path d="M17 19H3"></path></svg>On this page</h3><div class="relative min-h-0 text-sm ms-px overflow-auto [scrollbar-width:none] mask-[linear-gradient(to_bottom,transparent,white_16px,white_calc(100%-16px),transparent)] py-3"><div class="relative flex flex-col"><a data-active="false" href="#features" class="prose relative py-1.5 text-sm scroll-m-4 text-fd-muted-foreground hover:text-fd-accent-foreground transition-colors wrap-anywhere data-[active=true]:text-fd-primary pt-0" style="padding-inline-start:20px"><svg xmlns="http://www.w3.org/2000/svg" class="absolute -top-1.5 inset-s-0 bottom-0 h-[calc(100%+--spacing(1.5))] -z-1 rtl:-scale-x-100" style="width:17px"><line x1="8.5" y1="6" x2="8.5" y2="100%" stroke-width="1" class="stroke-fd-foreground
35/10"></line></svg>Features</a><a data-active="false" href="#next-steps" class="prose relative py-1.5 text-sm scroll-m-4 text-fd-muted-foreground hover:text-fd-accent-foreground transition-colors wrap-anywhere data-[active=true]:text-fd-primary pb-0" style="padding-inline-start:20px"><svg xmlns="http://www.w3.org/2000/svg" class="absolute -top-1.5 inset-s-0 bottom-0 h-[calc(100%+--spacing(1.5))] -z-1 rtl:-scale-x-100" style="width:17px"><line x1="8.5" y1="6" x2="8.5" y2="100%" stroke-width="1" class="stroke-fd-foreground/10"></line></svg>Next steps</a></div></div></div><!--$--><!--/$--></div><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><!--/$-->
35<script src="/_next/static/chunks/37v5ulr6qjozi.js" id="_R_" async=""></script>
35<script>(self.__next_f=self.__next_f||[]).push([0])</script>
35<script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n3:I[541310,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\",\"/_next/static/chunks/2yl3qg5sau_m1.js\",\"/_next/static/chunks/3q7cnnq64z-47.js\",\"/_next/static/chunks/0ysnn4qn15cl9.js\"],\"LayoutBody\"]\n37:I[635770,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\",\"/_next/static/chunks/2yl3qg5sau_m1.js\",\"/_next/static/chunks/3q7cnnq64z-47.js\",\"/_next/static/chunks/0ysnn4qn15cl9.js\"],\"CustomSidebarFolder\"]\n46:I[168027,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/1781sbja7e0bq.css\",\"style\"]\n:HL[\"/_next/static/media/GeistMono_Variable.p.42jdkyb02hb3d.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/Geist_Variable-s.p.38tal-0yzr82m.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n"])</script>
35<script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"docs\",\"shopkeeper\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"docs\",{\"children\":[[\"slug\",\"shopkeeper\",\"c\",null],{\"children\":[\"__PAGE__\",{}]}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1781sbja7e0bq.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/2ap1fvadncvz3.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/0ud1d1a31uilc.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-4\",{\"src\":\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-5\",{\"src\":\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-6\",{\"src\":\"/_next/static/chunks/1buygnwj9jkxn.js\",\"async\":true,\"nonce\":\"$undefined\"}]],\"$L2\"]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/2yl3qg5sau_m1.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/3q7cnnq64z-47.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/0ysnn4qn15cl9.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L3\",null,{\"tree\":{\"type\":\"root\",\"$ref\":{\"folder\":\"\",\"meta\":\"meta.json\"},\"$id\":\"root\",\"name\":\"Docs\",\"description\":\"Guides and API references for the Friends Of Adonis packages: GraphQL, OpenAPI, Stripe billing, search, feature flags, actions and maintenance mode for AdonisJS.\",\"children\":[{\"type\":\"folder\",\"name\":\"Magnify\",\"root\":true,\"defaultOpen\":\"$undefined\",\"description\":\"Full-text search for your Lucid models with Algolia, Meilisearch or Typesense, kept in sync automatically\",\"collapsible\":\"$undefined\",\"children\":[{\"$id\":\"magnify/index.mdx\",\"type\":\"page\",\"name\":\"Introduction\",\"description\":\"AdonisJS Magnify adds driver based full-text search to your Lucid models: a Searchable mixin keeps Algolia, Meilisearch and Typesense indexes in sync.\",\"icon\":[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-album\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"rect\",\"1m3agn\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\",\"ry\":\"2\"}],[\"$\",\"polyline\",\"1wcwz3\",{\"points\":\"11 3 11 11 14 8 17 11 17 3\"}],\"$undefined\"]}],\"url\":\"/docs/magnify\",\"$ref\":\"magnify/index.mdx\"},{\"$id\":\"magnify/getting-started.mdx\",\"type\":\"page\",\"name\":\"Getting Started\",\"description\":\"Add @foadonis/magnify to AdonisJS, compose the Searchable mixin into a Lucid model, then connect Meilisearch, Typesense or Algolia in config/magnify.ts.\",\"icon\":[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-rocket\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"m3kijz\",{\"d\":\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z\"}],[\"$\",\"path\",\"1fmvmk\",{\"d\":\"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\"}],[\"$\",\"path\",\"1f8sc4\",{\"d\":\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\"}],[\"$\",\"path\",\"qeys4\",{\"d\":\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\"}],\"$undefined\"]}],\"url\":\"/docs/magnify/getting-started\",\"$ref\":\"magnify/getting-started.mdx\"},{\"type\":\"folder\",\"name\":\"Engines\",\"root\":\"$undefined\",\"defaultOpen\":\"$undefined\",\"description\":\"$undefined\",\"collapsible\":\"$undefined\",\"children\":[{\"$id\":\"magnify/engines/algolia.mdx\",\"type\":\"page\",\"name\":\"Algolia\",\"description\":\"Connect Magnify to Algolia: install algoliasearch, set ALGOLIA_APP_ID and ALGOLIA_API_KEY, then register engines.algolia in config/magnify.ts.\",\"icon\":\"$undefined\",\"url\":\"/docs/magnify/engines/algolia\",\"$ref\":\"magnify/engines/algolia.mdx\"},{\"$id\":\"magnify/engines/meilisearch.mdx\",\"type\":\"page\",\"name\":\"Meilisearch\",\"description\":\"Run Magnify on Meilisearch: install the meilisearch client, register engines.meilisearch, and declare filterable and sortable indexSettings.\",\"
35icon\":\"$undefined\",\"url\":\"/docs/magnify/engines/meilisearch\",\"$ref\":\"magnify/engines/meilisearch.mdx\"},{\"$id\":\"magnify/engines/typesense.mdx\",\"type\":\"page\",\"name\":\"Typesense\",\"description\":\"Back your Magnify search with Typesense: install typesense, configure nodes and apiKey, then declare collectionSettings fields and queryBy.\",\"icon\":\"$undefined\",\"url\":\"/docs/magnify/engines/typesense\",\"$ref\":\"magnify/engines/typesense.mdx\"}],\"$id\":\"magnify/engines\",\"$ref\":{\"folder\":\"magnify/engines\",\"meta\":\"$undefined\"},\"index\":{\"$id\":\"magnify/engines/index.mdx\",\"type\":\"page\",\"name\":\"Engines\",\"description\":\"Pick the search engine backing Magnify: Algolia, Meilisearch or Typesense, each with its own config/magnify.ts setup walkthrough.\",\"icon\":\"$L4\",\"url\":\"/docs/magnify/engines\",\"$ref\":\"magnify/engines/index.mdx\"},\"icon\":\"$4\"},{\"$id\":\"_0\",\"type\":\"separator\",\"icon\":\"$undefined\",\"name\":\"Guide\"},{\"$id\":\"magnify/(guides)/searching.mdx\",\"type\":\"page\",\"name\":\"Searching\",\"description\":\"Query Searchable models with search(), refine using where, whereIn and whereNotIn, sort with orderBy, and page results through paginate.\",\"icon\":\"$undefined\",\"url\":\"/docs/magnify/searching\",\"$ref\":\"magnify/(guides)/searching.mdx\"},{\"$id\":\"magnify/(guides)/custom-search-engine.mdx\",\"type\":\"page\",\"name\":\"Custom Search Engine\",\"description\":\"Build your own Magnify engine by extending MagnifyEngine with update, delete, search, map, paginate and flush, then register it in config/magnify.ts.\",\"icon\":\"$undefined\",\"url\":\"/docs/magnify/custom-search-engine\",\"$ref\":\"magnify/(guides)/custom-search-engine.mdx\"},{\"$id\":\"_1\",\"type\":\"separator\",\"icon\":\"$undefined\",\"name\":\"References\"},{\"$id\":\"magnify/(references)/commands.mdx\",\"type\":\"page\",\"name\":\"Commands\",\"description\":\"Reference for the Magnify Ace commands: magnify:import, magnify:flush and magnify:sync-index-settings for loading, clearing and configuring search indexes.\",\"icon\":\"$undefined\",\"url\":\"/docs/magnify/commands\",\"$ref\":\"magnify/(references)/commands.mdx\"}],\"$id\":\"magnify\",\"$ref\":{\"folder\":\"magnify\",\"meta\":\"magnify/meta.json\"},\"icon\":\"$L5\"},{\"type\":\"folder\",\"name\":\"Shopkeeper\",\"root\":true,\"defaultOpen\":\"$undefined\",\"description\":\"Expressive, fluent Stripe billing for AdonisJS: subscriptions, checkout, invoices, and webhooks\",\"collapsible\":\"$undefined\",\"children\":[{\"$id\":\"shopkeeper/index.mdx\",\"type\":\"page\",\"name\":\"Introduction\",\"description\":\"AdonisJS Shopkeeper gives Stripe billing a fluent, expressive API so you can add subscriptions, trials, one-off charges, and invoices in minutes.\",\"icon\":\"$L6\",\"url\":\"/docs/shopkeeper\",\"$ref\":\"shopkeeper/index.mdx\"},{\"$id\":\"shopkeeper/getting-started.mdx\",\"type\":\"page\",\"name\":\"Getting Started\",\"description\":\"Take a first Stripe payment from AdonisJS: add @foadonis/shopkeeper, run its billing migrations, then compose the billable() mixin into your User model.\",\"icon\":\"$L7\",\"url\":\"/docs/shopkeeper/getting-started\",\"$ref\":\"shopkeeper/getting-started.mdx\"},{\"$id\":\"_2\",\"type\":\"separator\",\"icon\":\"$undefined\",\"name\":\" Payments \"},{\"$id\":\"shopkeeper/(guides)/accepting-payments.mdx\",\"type\":\"page\",\"name\":\"Accepting Payments\",\"description\":\"Redirect customers to Stripe Checkout from AdonisJS: product and subscription sessions, promotion codes, checkoutCharge, tax IDs, and guest checkouts.\",\"icon\":\"$L8\",\"url\":\"/docs/shopkeeper/accepting-payments\",\"$ref\":\"shopkeeper/(guides)/accepting-payments.mdx\"},{\"$id\":\"shopkeeper/(guides)/single-charges.mdx\",\"type\":\"page\",\"name\":\"Single Charges\",\"description\":\"Charge outside of a subscription using charge(), the invoice builder, pay() and payWith() payment intents, and issue refunds by payment intent ID.\",\"icon\":\"$L9\",\"url\":\"/docs/shopkeeper/single-charges\",\"$ref\":\"shopkeeper/(guides)/single-charges.mdx\"},{\"$id\":\"shopkeeper/(guides)/invoices-and-receipts.mdx\",\"type\":\"page\",\"name\":\"Invoices \u0026 Receipts\",\"description\":\"Retrieve a customer's invoices, create new ones with InvoiceBuilder, and preview upcoming charges or price swaps before a plan change in AdonisJS Shopkeeper.\",\"icon\":\"$La\",\"url\":\"/docs/shopkeeper/invoices-and-receipts\",\"$ref\":\"shopkeeper/(guides)/invoices-and-receipts.mdx\"},{\"$id\":\"_3\",\"type\":\"separator\",\"icon\":\"$undefined\",\"name\":\" Subscriptions \"},{\"$id\":\"shopkeeper/(guides)/managing-subscriptions.mdx\",\"type\":\"page\",\"name\":\"Managing Subscriptions\",\"description\":\"Check
35subscribed() status, swap plans, adjust quantities, cancel and resume, and manage multi-price Stripe subscriptions with AdonisJS Shopkeeper.\",\"icon\":\"$Lb\",\"url\":\"/docs/shopkeeper/managing-subscriptions\",\"$ref\":\"shopkeeper/(guides)/managing-subscriptions.mdx\"},{\"$id\":\"shopkeeper/(guides)/offering-trials.mdx\",\"type\":\"page\",\"name\":\"Offering Trials\",\"description\":\"Offer free trials in AdonisJS with trialDays() and trialUntil(), or a card-free generic trial via trialEndsAt, then end or extend them at any time.\",\"icon\":\"$Lc\",\"url\":\"/docs/shopkeeper/offering-trials\",\"$ref\":\"shopkeeper/(guides)/offering-trials.mdx\"},{\"$id\":\"shopkeeper/(guides)/metered-billing.mdx\",\"type\":\"page\",\"name\":\"Metered Billing\",\"description\":\"Bill by usage in AdonisJS: create meteredPrice() subscriptions, send Stripe Billing Meter events with reportUsage(), and read back usageRecords().\",\"icon\":\"$Ld\",\"url\":\"/docs/shopkeeper/metered-billing\",\"$ref\":\"shopkeeper/(guides)/metered-billing.mdx\"},{\"$id\":\"_4\",\"type\":\"separator\",\"icon\":\"$undefined\",\"name\":\" Configuration \"},{\"$id\":\"shopkeeper/(guides)/handling-webhooks.mdx\",\"type\":\"page\",\"name\":\"Handling Webhooks\",\"description\":\"Keep your database in sync with Stripe via registerRoutes() and registerWebhookListeners(), the shopkeeper:webhook Ace command, and idempotent webhookAudit().\",\"icon\":\"$Le\",\"url\":\"/docs/shopkeeper/handling-webhooks\",\"$ref\":\"shopkeeper/(guides)/handling-webhooks.mdx\"},{\"$id\":\"shopkeeper/(guides)/managing-customers.mdx\",\"type\":\"page\",\"name\":\"Managing Customers\",\"description\":\"Create and sync Stripe customers from your AdonisJS models, adjust customer balances, manage tax IDs, and send users to the Stripe billing portal.\",\"icon\":\"$Lf\",\"url\":\"/docs/shopkeeper/managing-customers\",\"$ref\":\"shopkeeper/(guides)/managing-customers.mdx\"},{\"$id\":\"shopkeeper/(guides)/managing-payment-methods.mdx\",\"type\":\"page\",\"name\":\"Managing Payment Methods\",\"description\":\"Collect cards with createSetupIntent() and Stripe.js, then list, add, delete, and set the default payment method on any Shopkeeper billable model.\",\"icon\":\"$L10\",\"url\":\"/docs/shopkeeper/managing-payment-methods\",\"$ref\":\"shopkeeper/(guides)/managing-payment-methods.mdx\"},{\"$id\":\"shopkeeper/(guides)/taxes.mdx\",\"type\":\"page\",\"name\":\"Taxes\",\"description\":\"Enable Stripe Tax with the calculateTaxes config flag, or define taxRates() and priceTaxRates() on your billable model, and check tax exemption status.\",\"icon\":\"$L11\",\"url\":\"/docs/shopkeeper/taxes\",\"$ref\":\"shopkeeper/(guides)/taxes.mdx\"},{\"$id\":\"_5\",\"type\":\"separator\",\"icon\":\"$undefined\",\"name\":\"$undefined\"},{\"$id\":\"shopkeeper/migration.mdx\",\"type\":\"page\",\"name\":\"Migrate to 1.0.0\",\"description\":\"Upgrade @foadonis/shopkeeper from 0.1.x to 1.0.0: factory mixins such as billable(), the new checkout and invoice builders, and Stripe SDK v20 changes.\",\"icon\":\"$L12\",\"url\":\"/docs/shopkeeper/migration\",\"$ref\":\"shopkeeper/migration.mdx\"}],\"$id\":\"shopkeeper\",\"$ref\":{\"folder\":\"shopkeeper\",\"meta\":\"shopkeeper/meta.json\"},\"icon\":\"$L13\"},{\"type\":\"folder\",\"name\":\"OpenAPI\",\"root\":true,\"defaultOpen\":\"$undefined\",\"description\":\"Generate OpenAPI V3 documentation from your AdonisJS controllers and models using TypeScript decorators.\",\"collapsible\":\"$undefined\",\"children\":[{\"$id\":\"openapi/index.mdx\",\"type\":\"page\",\"name\":\"Introduction\",\"description\":\"AdonisJS OpenAPI turns decorated controllers and models into an OpenAPI V3 specification, served through Scalar, Swagger UI or Rapidoc.\",\"icon\":\"$L14\",\"url\":\"/docs/openapi\",\"$ref\":\"openapi/index.mdx\"},{\"$id\":\"openapi/getting-started.mdx\",\"type\":\"page\",\"name\":\"Getting Started\",\"description\":\"Decorate an AdonisJS controller and model with @foadonis/openapi, call registerRoutes(), then browse the generated specification on /api, /api.json or /api.yaml.\",\"icon\":\"$L15\",\"url\":\"/docs/openapi/getting-started\",\"$ref\":\"openapi/getting-started.mdx\"},{\"$id\":\"_6\",\"type\":\"separator\",\"icon\":\"$undefined\",\"name\":\" Guide \"},{\"$id\":\"openapi/types-and-parameters.mdx\",\"type\":\"page\",\"name\":\"Defining Schemas\",\"description\":\"Turn TypeScript classes into OpenAPI schemas with @ApiProperty and @ApiPropertyOptional, plus primitives, arrays, enums, raw schemas and circular types.\",\"icon\":\"$undefined\",\"url\":\"/docs/openapi/types-and-parameters\",\"$ref\":\"openapi/types-and-parameters.mdx\"},{\"$id\":\"openapi/operations.mdx\",\"type\":\"page\",\"name\":\"Defining Endpoints\",\"description\":\"Describe endpoints with @ApiTags, @ApiHeader and @ApiResponse, and switch the media type on a body to document multipart file uploads in AdonisJS.\",\"icon\":\"$undefined\",\"url\":\"/docs/openapi/operations\",\"$ref\":\"openapi/operations.mdx\"},{\"$id\":\"openapi/validators.mdx\",\"type\":\"page\",\"name\":\"Schema from Validators\",\"description\":\"Pass a VineJS or Zod validator to @ApiSchema and it documents the params, query and body of the operation from the schema you already validate with.\",\"icon\":\"$undefined\",\"url\":\"/docs/openapi/validators\",\"$ref\":\"openapi/validators.mdx\"},{\"$id\":\"openapi/transformers.mdx\",\"type\":\"page\",\"name\":\"Using Transformers\",\"description\":\"Extend OpenAPISerializer and register TransformerTypeLoader to build response schemas from AdonisJS transformers, including collections and pagination.\",\"icon\":\"$undefined\",\"url\":\"/docs/openapi/transformers\",\"$ref\":\"openapi/transformers.mdx\"},{\"$id\":\"openapi/frontend.mdx\",\"type\":\"page\",\"name\":\"Typesafe Frontend\",\"description\":\"Feed the schema generated by AdonisJS OpenAPI to openapi-fetch or Hey API for fully typed frontend calls, with a comparison to help you pick one.\",\"icon\":\"$undefined\",\"url\":\"/docs/openapi/frontend\",\"$ref\":\"openapi/frontend.mdx\"},{\"$id\":\"_7\",\"type\":\"separator\",\"icon\":\"$undefined\",\"name\":\"References\"},{\"$id\":\"openapi/(references)/configuration.mdx\",\"type\":\"page\",\"name\":\"Configuration\",\"description\":\"Reference for config/openapi.ts in @foadonis/openapi: the ui renderer, document info metadata, custom type loaders and extra controller registration.\",\"icon\":\"$undefined\",\"url\":\"/docs/openapi/configuration\",\"$ref\":\"openapi/(references)/configuration.mdx\"},{\"$id\":\"openapi/(references)/decorators.mdx\",\"type\":\"page\",\"name\":\"Decorators\",\"description\":\"Full decorator reference for @foadonis/openapi, from @ApiOperation and @ApiResponse through @ApiSecurity, @ApiExtraModels and @ApiHideProperty.\",\"icon\":\"$undefined\",\"url\":\"/docs/openapi/decorators\",\"$ref\":\"openapi/(references)/decorators.mdx\"},{\"$id\":\"_8\",\"type\":\"separator\",\"icon\":\"$undefined\",\"name\":\"Advanced\"},{\"$id\":\"openapi/(advanced)/generic-types.mdx\",\"type\":\"page\",\"name\":\"Generic Types\",\"description\":\"Mixins let a single PaginatedResponse factory build reusable AdonisJS OpenAPI schemas, shown here wrapping Lucid paginator meta around any model.\",\"icon\":\"$undefined\",\"url\":\"/docs/openapi/generic-types\",\"$ref\":\"openapi/(advanced)/generic-types.mdx\"},{\"$id\":\"openapi/(advanced)/mapped-types.mdx\",\"type\":\"page\",\"name\":\"Mapped Types (Soon)\",\"description\":\"Mapped types will let you derive a schema by picking or omitting properties of an existing one. Documentation lands with the feature itself.\",\"icon\":\"$undefined\",\"url\":\"/docs/openapi/mapped-types\",\"$ref\":\"openapi/(advanced)/mapped-types.mdx\"},{\"$id\":\"openapi/(advanced)/custom-type-loaders.mdx\",\"type\":\"page\",\"name\":\"Custom Type Loaders\",\"description\":\"A TypeLoaderFn turns a constructor the generator does not know, such as Luxon DateTime, into a SchemaObject, or stores a component and returns a $ref.\",\"icon\":\"$undefined\",\"url\":\"/docs/openapi/custom-type-loaders\",\"$ref\":\"openapi/(advanced)/custom-type-loaders.mdx\"}],\"$id\":\"openapi\",\"$ref\":{\"folder\":\"openapi\",\"meta\":\"openapi/meta.json\"},\"icon\":\"$L16\"},{\"type\":\"folder\",\"name\":\"GraphQL\",\"root\":true,\"defaultOpen\":\"$undefined\",\"description\":\"Build code-first GraphQL APIs in AdonisJS with decorators, Apollo or Yoga, auth and realtime subscriptions\",\"collapsible\":\"$undefined\",\"children\":[{\"$id\":\"_9\",\"type\":\"separator\",\"icon\":\"$undefined\",\"name\":\"Guide\"},{\"$id\":\"graphql/index.mdx\",\"type\":\"page\",\"name\":\"Introduction\",\"description\":\"@foadonis/graphql turns your Lucid models and resolver classes into a GraphQL schema, on top of TypeGraphQL, with Bouncer authorization and subscriptions\",\"icon\":\"$L17\",\"url\":\"/docs/graphql\",\"$ref\":\"graphql/index.mdx\"},{\"$id\":\"graphql/getting-started.mdx\",\"type\":\"page\",\"name\":\"Getting Started\",\"description\":\"Bootstrap a code-first API with @foadonis/graphql: choose the Yoga or Apollo driver, then write a Recipe type, a resolver and a query in the playground.\",\"icon\":\"$L18\",\"url\":\"/docs/graphql/getting-started\",\"$ref\":\"graphql/getting-started.mdx\"},{\"type\":\"folder\",\"name\":\"Drivers\",\"root\":\"$undefined\",\"defaultOpen\":\"$undefined\",\"description\":\"Choose between the Apollo Server and GraphQL Yoga drivers and configure them in config/graphql.ts\",\"collapsible\":\"$undefined\",\"children\":[{\"$id\":\"graphql/drivers/apollo.mdx\",\"type\":\"page\",\"name\":\"Apollo Driver\",\"description\":\"Configure Apollo Server with drivers.apollo() in config/graphql.ts, toggle introspection and the playground, and register Apollo Server plugins\",\"icon\":\"$undefined\",\"url\":\"/docs/graphql/drivers/apollo\",\"$ref\":\"graphql/drivers/apollo.mdx\"},{\"$id\":\"graphql/drivers/yoga.mdx\",\"type\":\"page\",\"name\":\"Yoga Driver\",\"description\":\"Set up GraphQL Yoga through drivers.yoga(), enable file uploads with the AdonisJS bodyparser processManually list and a File scalar, and add Yoga plugins\",\"icon\":\"$undefined\",\"url\":\"/docs/graphql/drivers/yoga\",\"$ref\":\"graphql/drivers/yoga.mdx\"}],\"$id\":\"graphql/drivers\",\"$ref\":{\"folder\":\"graphql/drivers\",\"meta\":\"graphql/drivers/meta.json\"},\"icon\":\"$L19\"},{\"$id\":\"_10\",\"type\":\"separator\",\"icon\":\"$undefined\",\"name\":\"Concepts\"},{\"$id\":\"graphql/(concepts)/types-and-fields.mdx\",\"type\":\"page\",\"name\":\"Types and Fields\",\"description\":\"Map TypeScript classes to GraphQL types with the @ObjectType and @Field decorators, covering nullable fields, arrays, custom scalars and enums\",\"icon\":\"$undefined\",\"url\":\"/docs/graphql/types-and-fields\",\"$ref\":\"graphql/(concepts)/types-and-fields.mdx\"},{\"$id\":\"graphql/(concepts)/resolvers.mdx\",\"type\":\"page\",\"name\":\"Resolvers\",\"description\":\"Define queries, mutations and field resolvers as class methods using @Resolver, @Query, @Mutation and @Arg, with AdonisJS depen
35dency injection built in\",\"icon\":\"$undefined\",\"url\":\"/docs/graphql/resolvers\",\"$ref\":\"graphql/(concepts)/resolvers.mdx\"},{\"$id\":\"graphql/(concepts)/authorization.mdx\",\"type\":\"page\",\"name\":\"Authorization\",\"description\":\"Protect queries, mutations and object fields with @Authorized, AdonisJS Bouncer abilities and policies, and read the logged in user via @CurrentUser or @Ctx\",\"icon\":\"$undefined\",\"url\":\"/docs/graphql/authorization\",\"$ref\":\"graphql/(concepts)/authorization.mdx\"},{\"$id\":\"graphql/(concepts)/middlewares.mdx\",\"type\":\"page\",\"name\":\"Middlewares\",\"description\":\"Intercept GraphQL operations in AdonisJS with middleware classes and guards, added with @UseMiddleware on methods, resolvers and fields or registered globally\",\"icon\":\"$undefined\",\"url\":\"/docs/graphql/middlewares\",\"$ref\":\"graphql/(concepts)/middlewares.mdx\"},{\"$id\":\"graphql/(concepts)/subscriptions.mdx\",\"type\":\"page\",\"name\":\"Subscriptions\",\"description\":\"Push realtime updates from AdonisJS with the @Subscription decorator, native or Redis PubSub drivers, WebSocket transport and typed PubSubEvents\",\"icon\":\"$undefined\",\"url\":\"/docs/graphql/subscriptions\",\"$ref\":\"graphql/(concepts)/subscriptions.mdx\"},{\"$id\":\"graphql/(concepts)/testing.mdx\",\"type\":\"page\",\"name\":\"Testing\",\"description\":\"Test your AdonisJS GraphQL API with Japa: send queries and mutations with client.query and client.mutate, then assert data and errors with GraphQL-aware assertions\",\"icon\":\"$undefined\",\"url\":\"/docs/graphql/testing\",\"$ref\":\"graphql/(concepts)/testing.mdx\"},{\"$id\":\"_11\",\"type\":\"separator\",\"icon\":\"$undefined\",\"name\":\"References\"},{\"$id\":\"graphql/(references)/configuration.mdx\",\"type\":\"page\",\"name\":\"Configuration\",\"description\":\"Reference for config/graphql.ts, from resolver autoloading with HMR and emitSchemaFile SDL output to schema generation options and a custom scalarsMap.\",\"icon\":\"$undefined\",\"url\":\"/docs/graphql/configuration\",\"$ref\":\"graphql/(references)/configuration.mdx\"},{\"$id\":\"graphql/(references)/decorators.mdx\",\"type\":\"page\",\"name\":\"Decorators\",\"description\":\"A reference table of the @foadonis/graphql decorators, from @ObjectType, @Field and @Resolver to @Arg, @Ctx, @Root, @Directive and @UseMiddleware\",\"icon\":\"$undefined\",\"url\":\"/docs/graphql/decorators\",\"$ref\":\"graphql/(references)/decorators.mdx\"},{\"$id\":\"_12\",\"type\":\"separator\",\"icon\":\"$undefined\",\"name\":\"Advanced\"},{\"$id\":\"graphql/(advanced)/custom-decorators.mdx\",\"type\":\"page\",\"name\":\"Custom Decorators\",\"description\":\"Cut boilerplate by composing your own decorators: a FieldID wrapper, createMethodMiddlewareDecorator, and class level middleware decorators for resolvers\",\"icon\":\"$undefined\",\"url\":\"/docs/graphql/custom-decorators\",\"$ref\":\"graphql/(advanced)/custom-decorators.mdx\"},{\"$id\":\"graphql/(advanced)/validation.mdx\",\"type\":\"page\",\"name\":\"Validation\",\"description\":\"Validate GraphQL inputs and args with class-validator decorators and the validate config option, and note that VineJS is not supported out of the box yet\",\"icon\":\"$undefined\",\"url\":\"/docs/graphql/validation\",\"$ref\":\"graphql/(advanced)/validation.mdx\"},{\"$id\":\"_13\",\"type\":\"page\",\"icon\":\"$undefined\",\"name\":\"Generic Types\",\"url\":\"https://typegraphql.com/docs/generic-types.html\",\"external\":\"$undefined\"}],\"$id\":\"graphql\",\"$ref\":{\"folder\":\"graphql\",\"meta\":\"graphql/meta.json\"},\"icon\":\"$L1a\"},{\"type\":\"folder\",\"name\":\"Actions\",\"root\":true,\"defaultOpen\":\"$undefined\",\"description\":\"One action class per use case, invoked as a route handler, an Ace command or an event listener, with the business logic living in handle\",\"collapsible\":\"$undefined\",\"children\":[{\"$id\":\"actions/index.mdx\",\"type\":\"page\",\"name\":\"Introduction\",\"description\":\"AdonisJS Actions encapsulates business logic in single-purpose BaseAction classes you can reuse as HTTP controllers, Ace commands and event listeners\",\"icon\":\"$L1b\",\"url\":\"/docs/actions\",\"$ref\":\"actions/index.mdx\"},{\"$id\":\"actions/getting-started.mdx\",\"type\":\"page\",\"name\":\"Getting Started\",\"description\":\"Add @foadonis/actions to AdonisJS, scaffold a class with make:action, then run it through the static run method or bind it straight to a route handler.\",\"icon\":\"$L1c\",\"url\":\"/docs/actions/getting-started\",\"$ref\":\"actions/getting-started.mdx\"},{\"$id\":\"actions/reference.mdx\",\"type\":\"page\",\"name\":\"Reference\",\"description\":\"API reference for AdonisJS Actions: BaseAction, the AsController, AsCommand and AsListener interfaces, loader, ActionsRunner, make:action and indexActions\",\"icon\":\"$L1d\",\"url\":\"/docs/actions/reference\",\"$ref\":\"actions/reference.mdx\"},{\"$id\":\"actions/best-practices.mdx\",\"type\":\"page\",\"name\":\"Be
35st Practices\",\"description\":\"Naming conventions, folder layout and composition patterns for actions, plus keeping business logic in handle and calling actions instead of emitting events\",\"icon\":\"$L1e\",\"url\":\"/docs/actions/best-practices\",\"$ref\":\"actions/best-practices.mdx\"},{\"$id\":\"_14\",\"type\":\"separator\",\"icon\":\"$undefined\",\"name\":\"Guides\"},{\"$id\":\"actions/(guides)/as-controller.mdx\",\"type\":\"page\",\"name\":\"Using Actions as Controllers\",\"description\":\"Implement AsController to turn an action into an AdonisJS route handler, validate the request from HttpContext and inject services through the container\",\"icon\":\"$undefined\",\"url\":\"/docs/actions/as-controller\",\"$ref\":\"actions/(guides)/as-controller.mdx\"},{\"$id\":\"actions/(guides)/as-command.mdx\",\"type\":\"page\",\"name\":\"Using Actions as Commands\",\"description\":\"The AsCommand interface registers an action as an Ace command: customize commandName and description, then use prompts and logger inside asCommand\",\"icon\":\"$undefined\",\"url\":\"/docs/actions/as-command\",\"$ref\":\"actions/(guides)/as-command.mdx\"},{\"$id\":\"actions/(guides)/as-listener.mdx\",\"type\":\"page\",\"name\":\"Using Actions as Listeners\",\"description\":\"Wire actions to AdonisJS events with the AsListener interface, register them through emitter.on and type payloads with a BaseEvent class\",\"icon\":\"$undefined\",\"url\":\"/docs/actions/as-listener\",\"$ref\":\"actions/(guides)/as-listener.mdx\"},{\"$id\":\"actions/(guides)/telemetry.mdx\",\"type\":\"page\",\"name\":\"Telemetry\",\"description\":\"Add ActionsInstrumentation to bin/otel.ts so @foadonis/actions emits an OpenTelemetry span per action execution through the @adonisjs/otel package\",\"icon\":\"$undefined\",\"url\":\"/docs/actions/telemetry\",\"$ref\":\"actions/(guides)/telemetry.mdx\"}],\"$id\":\"actions\",\"$ref\":{\"folder\":\"actions\",\"meta\":\"actions/meta.json\"},\"icon\":\"$L1f\"},{\"type\":\"folder\",\"name\":\"Flick\",\"root\":true,\"defaultOpen\":\"$undefined\",\"description\":\"Typed, driver-based feature flags for AdonisJS: variants, per-scope caching, Edge tags, and test fakes.\",\"collapsible\":\"$undefined\",\"children\":[{\"$id\":\"flick/index.mdx\",\"type\":\"page\",\"name\":\"Introduction\",\"description\":\"AdonisJS Flick is a typed, driver-based feature flag system: define a feature class once, then resolve it per user, tenant, or request.\",\"icon\":\"$L20\",\"url\":\"/docs/flick\",\"$ref\":\"flick/index.mdx\"},{\"$id\":\"flick/getting-started.mdx\",\"type\":\"page\",\"name\":\"Getting Started\",\"description\":\"Set up @foadonis/flick end to end: configure the memory driver, compose the HasFeatures mixin into a model, and resolve a flag with flick.for(user).\",\"icon\":\"$L21\",\"url\":\"/docs/flick/getting-started\",\"$ref\":\"flick/getting-started.mdx\"},{\"$id\":\"_15\",\"type\":\"separator\",\"icon\":\"$undefined\",\"name\":\" Guides \"},{\"$id\":\"flick/(guides)/defining-features.mdx\",\"type\":\"page\",\"name\":\"Defining Features\",\"description\":\"Feature classes extend BaseFeature and return booleans or variants from resolve, short
35-circuit with before(), and identify scopes via FeatureScopeable.\",\"icon\":\"$L22\",\"url\":\"/docs/flick/defining-features\",\"$ref\":\"flick/(guides)/defining-features.mdx\"},{\"$id\":\"flick/(guides)/resolving-features.mdx\",\"type\":\"page\",\"name\":\"Resolving Features\",\"description\":\"Read flags through flick.for(scope) with isActive, value, values and match, then write or remove stored values with define, activate, deactivate and clear.\",\"icon\":\"$L23\",\"url\":\"/docs/flick/resolving-features\",\"$ref\":\"flick/(guides)/resolving-features.mdx\"},{\"$id\":\"flick/(guides)/edge.mdx\",\"type\":\"page\",\"name\":\"Edge Templates\",\"description\":\"Gate markup in Edge templates with the @feature and @featureInactive tags, or read variant values through the flick global that AdonisJS Flick registers.\",\"icon\":\"$L24\",\"url\":\"/docs/flick/edge\",\"$ref\":\"flick/(guides)/edge.mdx\"},{\"$id\":\"flick/(guides)/drivers.mdx\",\"type\":\"page\",\"name\":\"Cache Drivers\",\"description\":\"Cache resolved flag values per scope with the memory and Redis drivers, or implement FlickDriverContract to back AdonisJS Flick with your own store.\",\"icon\":\"$L25\",\"url\":\"/docs/flick/drivers\",\"$ref\":\"flick/(guides)/drivers.mdx\"},{\"$id\":\"flick/(guides)/testing.mdx\",\"type\":\"page\",\"name\":\"Testing Features\",\"description\":\"Swap real resolution for flick.fake(), pin flags with override, and assert what your code checked using assertResolved and assertResolvedFor in Japa.\",\"icon\":\"$L26\",\"url\":\"/docs/flick/testing\",\"$ref\":\"flick/(guides)/testing.mdx\"}],\"$id\":\"flick\",\"$ref\":{\"folder\":\"flick\",\"meta\":\"flick/meta.json\"},\"icon\":\"$L27\"},{\"type\":\"folder\",\"name\":\"Maintenance\",\"root\":true,\"defaultOpen\":\"$undefined\",\"description\":\"Put your AdonisJS application in maintenance mode with simple Ace commands and bypass secrets\",\"collapsible\":\"$undefined\",\"children\":[{\"$id\":\"_16\",\"type\":\"separator\",\"icon\":\"$undefined\",\"name\":\"Guide\"},{\"$id\":\"maintenance/index.mdx\",\"type\":\"page\",\"name\":\"Introduction\",\"description\":\"AdonisJS Maintenance adds down and up Ace commands to take your app offline safely, with bypass secrets, custom Edge pages and distributed drivers\",\"icon\":\"$L28\",\"url\":\"/docs/maintenance\",\"$ref\":\"maintenance/index.mdx\"},{\"$id\":\"maintenance/getting-started.mdx\",\"type\":\"page\",\"name\":\"Getting Started\",\"description\":\"Adding @foadonis/maintenance registers its provider for you, so node ace maintenance:down takes the app offline and maintenance:up brings it back live.\",\"icon\":\"$L29\",\"url\":\"/docs/maintenance/getting-started\",\"$ref\":\"maintenance/getting-started.mdx\"},{\"$id\":\"maintenance/commands.mdx\",\"type\":\"page\",\"name\":\"Commands\",\"description\":\"Flags for the maintenance:down command in AdonisJS: --secret to bypass, --template for a custom Edge page, --redirect, plus --retry and --refresh\",\"icon\":\"$undefined\",\"url\":\"/docs/maintenance/commands\",\"$ref\":\"maintenance/commands.mdx\"},{\"$id\":\"maintenance/drivers.mdx\",\"type\":\"page\",\"name\":\"Drivers\",\"description\":\"Configure the file or cache driver in config/maintenance.ts to store maintenance state, or extend MaintenanceDriver to build your own custom driver\",\"icon\":\"$undefined\",\"url\":\"/docs/maintenance/drivers\",\"$ref\":\"maintenance/drivers.mdx\"}],\"$id\":\"maintenance\",\"$ref\":{\"folder\":\"maintenance\",\"meta\":\"maintenance/meta.json\"},\"icon\":\"$L2a\"},{\"type\":\"folder\",\"name\":\"Crypt\",\"root\":true,\"defaultOpen\":\"$undefined\",\"description\":\"Public-key encryption for AdonisJS dotenv files, so secrets live in version control and only the private key stays out of the repository.\",\"collapsible\":\"$undefined\",\"children\":[{\"$id\":\"_17\",\"type\":\"separator\",\"icon\":\"$undefined\",\"name\":\"Guide\"},{\"$id\":\"crypt/index.mdx\",\"type\":\"page\",\"name\":\"Introduction\",\"description\":\"AdonisJS Crypt encrypts your .env values with a public key so dotenv files can be committed safely, then decrypts them at boot through @adonisjs/env.\",\"icon\":\"$L2b\",\"url\":\"/docs/crypt\",\"$ref\":\"crypt/index.mdx\"},{\"$id\":\"crypt/getting_started.mdx\",\"type\":\"page\",\"name\":\"Getting Started\",\"description\":\"Install @foadonis/crypt, generate a keypair with crypt:init, encrypt your first secret, and g
35itignore the .env.keys file holding your private key.\",\"icon\":\"$L2c\",\"url\":\"/docs/crypt/getting_started\",\"$ref\":\"crypt/getting_started.mdx\"},{\"$id\":\"crypt/commands.mdx\",\"type\":\"page\",\"name\":\"Commands\",\"description\":\"Every Crypt Ace command in one place: crypt:init to create a keypair, crypt:set and crypt:get to write or read encrypted values, all scoped with --env.\",\"icon\":\"$undefined\",\"url\":\"/docs/crypt/commands\",\"$ref\":\"crypt/commands.mdx\"}],\"$id\":\"crypt\",\"$ref\":{\"folder\":\"crypt\",\"meta\":\"crypt/meta.json\"},\"icon\":\"$L2d\"}],\"fallback\":{\"type\":\"root\",\"$ref\":{\"folder\":\"\",\"meta\":\"$undefined\"},\"$id\":\"fallback:root\",\"name\":\"Docs\",\"description\":\"$undefined\",\"children\":[{\"type\":\"folder\",\"name\":\"Graphql\",\"root\":\"$undefined\",\"defaultOpen\":\"$undefined\",\"description\":\"$undefined\",\"collapsible\":\"$undefined\",\"children\":[{\"type\":\"folder\",\"name\":\"Advanced\",\"root\":\"$undefined\",\"defaultOpen\":\"$undefined\",\"description\":\"$undefined\",\"collapsible\":\"$undefined\",\"children\":[{\"$id\":\"fallback:graphql/(advanced)/generic-types.mdx\",\"type\":\"page\",\"name\":\"Generic Types\",\"description\":\"Generic types are not documented here yet. The TypeGraphQL generic types guide covers reusable wrappers such as paginated response payloads.\",\"icon\":\"$undefined\",\"url\":\"/docs/graphql/generic-types\",\"$ref\":\"graphql/(advanced)/generic-types.mdx\"}],\"$id\":\"fallback:graphql/(advanced)\",\"$ref\":{\"folder\":\"graphql/(advanced)\",\"meta\":\"$undefined\"},\"icon\":\"$undefined\"}],\"$id\":\"fallback:graphql\",\"$ref\":{\"folder\":\"graphql\",\"meta\":\"$undefined\"},\"icon\":\"$undefined\"},{\"type\":\"folder\",\"name\":\"Introduction\",\"root\":\"$undefined\",\"defaultOpen\":\"$undefined\",\"description\":\"$undefined\",\"collapsible\":\"$undefined\",\"children\":[],\"$id\":\"fallback:lucid-parser\",\"$ref\":{\"folder\":\"lucid-parser\",\"meta\":\"$undefined\"},\"index\":{\"$id\":\"fallback:lucid-parser/index.mdx\",\"type\":\"page\",\"name\":\"Introduction\",\"description\":\"Parse AdonisJS Lucid models from their AST: parseModel returns each @column and @computed key with its declared type plus nullable, optional and array flags\",\"icon\":\"$L2e\",\"url\":\"/docs/lucid-parser\",\"$ref\":\"lucid-parser/index.mdx\"},\"icon\":\"$2e\"},{\"type\":\"folder\",\"name\":\"Magnify\",\"root\":\"$undefined\",\"defaultOpen\":\"$undefined\",\"description\":\"$undefined\",\"collapsible\":\"$undefined\",\"children\":[{\"$id\":\"fallback:magnify/advanced.mdx\",\"type\":\"page\",\"name\":\"Advanced\",\"description\":\"Customize how a Searchable model is indexed and serialized, then import, flush and query your search indexes with where clauses and pagination.\",\"icon\":\"$undefined\",\"url\":\"/docs/magnify/advanced\",\"$ref\":\"magnify/advanced.mdx\"}],\"$id\":\"fallback:magnify\",\"$ref\":{\"folder\":\"magnify\",\"meta\":\"$undefined\"},\"icon\":\"$undefined\"},{\"type\":\"folder\",\"name\":\"Openapi\",\"root\":\"$undefined\",\"defaultOpen\":\"$undefined\",\"description\":\"$undefined\",\"collapsible\":\"$undefined\",\"children\":[{\"type\":\"folder\",\"name\":\"Advanced\",\"root\":\"$undefined\",\"defaultOpen\":\"$undefined\",\"description\":\"$undefined\",\"collapsible\":\"$undefined\",\"children\":[{\"$id\":\"fallback:openapi/(advanced)/custom-decorators.mdx\",\"type\":\"page\",\"name\":\"Custom Decorators (Soon)\",\"description\":\"Building decorators of your own on top of the ones shipped by @foadonis/openapi is on the roadmap. This advanced guide has not been written yet.\",\"icon\":\"$undefined\",\"url\":\"/docs/openapi/custom-decorators\",\"$ref\":\"openapi/(advanced)/custom-decorators.mdx\"}],\"$id\":\"fallback:openapi/(advanced)\",\"$ref\":{\"folder\":\"openapi/(advanced)\",\"meta\":\"$undefined\"},\"icon\":\"$undefined\"}],\"$id\":\"fallback:openapi\",\"$ref\":{\"folder\":\"openapi\",\"meta\":\"$undefined\"},\"icon\":\"$undefined\"}]}},\"tabs\":[{\"title\":\"Magnify\",\"icon\":\"$L2f\",\"description\":\"Full-text search for your Lucid models with Algolia, Meilisearch or Typesense, kept in sync automatically\",\"url\":\"/docs/magnify\",\"unlisted\":\"$undefined\",\"$folder\":\"$0:f:0:1:1:children:0:props:children:1:props:tree:children:0\"},{\"title\":\"Shopkeeper\",\"icon\":\"$L30\",\"description\":\"Expressive, fluent Stripe billing for AdonisJS: subscriptions, checkout, invoices, and webhooks\",\"url\":\"/docs/shopkeeper\",\"unlisted\":\"$undefined\",\"$folder\":\"$0:f:0:1:1:children:0:props:children:1:props:tree:children:1\"},{\"title\":\"OpenAPI\",\"icon\":\"$L31\",\"description\":\"Generate OpenAPI V3 documentation from your AdonisJS controllers and models using TypeScript decorators.\",\"url\":\"/docs/openapi\",\"unlisted\":\"$undefined\",\"$folder\":\"$0:f:0:1:1:children:0:props:children:1:props:tree:children:2\"},{\"title\":\"GraphQL\",\"icon\":\"$L32\",\"description\":\"Build code-first GraphQL APIs in AdonisJS with decorators, Apollo or Yoga, auth and realtime subscriptions\",\"url\":\"/docs/graphql\",\"unlisted\":\"$undefined\",\"$folder\":\"$0:f:0:1:1:children:0:props:children:1:props:tree:children:3\"},{\"title\":\"Actions\",\"icon\":\"$L33\",\"description\":\"One action class per use case, invoked as a route handler, an Ace command or an event listener, with the business logic living in handle\",\"url\":\"/docs/actions\",\"unlisted\":\"$undefined\",\"$folder\":\"$0:f:0:1:1:children:0:props:children:1:props:tree:children:4\"},{\"title\":\"Flick\",\"icon\":\"$L34\",\"description\":\"Typed, driver-based feature flags for AdonisJS: variants, per-scope caching, Edge tags, and test fakes.\",\"url\":\"/docs/flick\",\"unlisted\":\"$undefined\",\"$folder\":\"$0:f:0:1:1:children:0:props:children:1:props:tree:children:5\"},{\"title\":\"Maintenance\",\"icon\":\"$L35\",\"description\":\"Put your AdonisJS application in maintenance mode with simple Ace commands and bypass secrets\",\"url\":\"/docs/maintenance\",\"unlisted\":\"$undefined\",\"$folder\":\"$0:f:0:1:1:children:0:props:children:1:props:tree:children:6\"},{\"title\":\"Crypt\",\"icon\":\"$L36\",\"description\":\"Public-key encryption for AdonisJS dotenv files, so secrets live in ver
35sion control and only the private key stays out of the repository.\",\"url\":\"/docs/crypt\",\"unlisted\":\"$undefined\",\"$folder\":\"$0:f:0:1:1:children:0:props:children:1:props:tree:children:7\"}],\"tabMode\":\"sidebar\",\"sidebar\":{\"components\":{\"Folder\":\"$37\"}},\"nav\":{\"url\":\"/docs\",\"title\":\"$L38\"},\"links\":[{\"type\":\"menu\",\"text\":\"Packages\",\"url\":\"/docs\",\"items\":[{\"icon\":\"$L39\",\"text\":\"OpenAPI\",\"description\":\"Generate OpenAPI specifications\",\"url\":\"/docs/openapi\"},{\"icon\":\"$L3a\",\"text\":\"GraphQL\",\"description\":\"Create GraphQL APIs using AdonisJS\",\"url\":\"/docs/graphql\"},{\"icon\":\"$L3b\",\"text\":\"Shopkeeper\",\"description\":\"Fluent interface for Stripe\",\"url\":\"/docs/shopkeeper\"},{\"icon\":\"$L3c\",\"text\":\"Magnify\",\"description\":\"Plug'n Play full-text search\",\"url\":\"/docs/magnify\"},{\"icon\":\"$L3d\",\"text\":\"Crypt\",\"description\":\"Safely and easily manage your credentials\",\"url\":\"/docs/crypt\"},{\"icon\":\"$L3e\",\"text\":\"View more\",\"description\":\"Discover all our packages\",\"url\":\"/docs\"}]},{\"icon\":\"$L3f\",\"text\":\"Blog\",\"url\":\"/blog\",\"active\":\"nested-url\"},{\"type\":\"custom\",\"children\":\"$L40\"}],\"children\":\"$L41\"}]]}],{\"children\":[\"$L42\",{\"children\":[\"$L43\",{},null,false,null]},null,false,\"$@44\"]},null,false,null]},null,false,null],\"$L45\",false]],\"m\":\"$undefined\",\"G\":[\"$46\",[\"$L47\"]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"Oej9RGk8zuKwwF6BPa6Jm\"}\n"])</script>
35<script>self.__next_f.push([1,"48:I[605500,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\",\"/_next/static/chunks/2yl3qg5sau_m1.js\",\"/_next/static/chunks/3q7cnnq64z-47.js\",\"/_next/static/chunks/0ysnn4qn15cl9.js\"],\"Image\"]\n49:I[339756,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\"],\"default\"]\n4a:I[837457,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\"],\"default\"]\n4c:I[897367,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\"],\"OutletBoundary\"]\n4d:\"$Sreact.suspense\"\n50:I[897367,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\"],\"ViewportBoundary\"]\n52:I[897367,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\"],\"MetadataBoundary\"]\n4:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-search\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"14j7rj\",{\"d\":\"m21 21-4.34-4.34\"}],[\"$\",\"circle\",\"4ej97u\",{\"cx\":\"11\",\"cy\":\"11\",\"r\":\"8\"}],\"$undefined\"]}]\n5:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-search\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"14j7rj\",{\"d\":\"m21 21-4.34-4.34\"}],[\"$\",\"circle\",\"4ej97u\",{\"cx\":\"11\",\"cy\":\"11\",\"r\":\"8\"}],\"$undefined\"]}]\n6:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-album\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"rect\",\"1m3agn\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\",\"ry\":\"2\"}],[\"$\",\"polyline\",\"1wcwz3\",{\"points\":\"11 3 11 11 14 8 17 11 17 3\"}],\"$undefined\"]}]\n7:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-rocket\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"m3kijz\",{\"d\":\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z\"}],[\"$\",\"path\",\"1fmvmk\",{\"d\":\"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\"}],[\"$\",\"path\",\"1f8sc4\",{\"d\":\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\"}],[\"$\",\"path\",\"qeys4\",{\"d\":\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\"}],\"$undefined\"]}]\n8:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\"
35:24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"st"])</script>
35<script>self.__next_f.push([1,"roke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-shopping-cart\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"circle\",\"jimo8o\",{\"cx\":\"8\",\"cy\":\"21\",\"r\":\"1\"}],[\"$\",\"circle\",\"13723u\",{\"cx\":\"19\",\"cy\":\"21\",\"r\":\"1\"}],[\"$\",\"path\",\"9zh506\",{\"d\":\"M2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12\"}],\"$undefined\"]}]\n9:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-circle-dollar-sign\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"circle\",\"1mglay\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"$\",\"path\",\"1h4pet\",{\"d\":\"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8\"}],[\"$\",\"path\",\"zqpxq5\",{\"d\":\"M12 18V6\"}],\"$undefined\"]}]\na:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-receipt\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"q3az6g\",{\"d\":\"M4 2v20l2-1 2 1 2-1 2 1 2-1 2 1 2-1 2 1V2l-2 1-2-1-2 1-2-1-2 1-2-1-2 1Z\"}],[\"$\",\"path\",\"1h4pet\",{\"d\":\"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8\"}],[\"$\",\"path\",\"1jc1ny\",{\"d\":\"M12 17.5v-11\"}],\"$undefined\"]}]\nb:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-repeat\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"nntrym\",{\"d\":\"m17 2 4 4-4 4\"}],[\"$\",\"path\",\"84bu3i\",{\"d\":\"M3 11v-1a4 4 0 0 1 4-4h14\"}],[\"$\",\"path\",\"1wqhfi\",{\"d\":\"m7 22-4-4 4-4\"}],[\"$\",\"path\",\"1rx37r\",{\"d\":\"M21 13v1a4 4 0 0 1-4 4H3\"}],\"$undefined\"]}]\nc:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-clock\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"mmk7yg\",{\"d\":\"M12 6v6l4 2\"}],[\"$\",\"circle\",\"1mglay\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],\"$undefined\"]}]\nd:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-chart-bar\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"c24i48\",{\"d\":\"M3 3v16a2 2 0 0 0 2 2h16\"}],[\"$\",\"path\",\"srdodz\",{\"d\":\"M7 16h8\"}],[\"$\",\"path\",\"127s9w\",{\"d\":\"M7 11h12\"}],[\"$\",\"path\",\"w9rmul\",{\"d\":\"M7 6h3\"}],\"$undefined\"]}]\ne:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-webhook\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"q3hayz\",{\"d\":\"M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2\"}],[\"$\",\"path\",\"1go1hn\",{\"d\":\"m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06\"}],[\"$\",\"path\",\"qlwsc0\",{\"d\":\"m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8\"}],\"$undefined\"]}]\nf:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\"
35:24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-users\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"1yyitq\",{\"d\":\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"}],[\"$\",\"path\",\"16gr8j\",{\"d\":\"M16 3.128a4 4 0 0 1 0 7.744\"}],[\"$\",\"path\",\"kshegd\",{\"d\":\"M22 21v-2a4 4 0 0 0-3-3.87\"}],[\"$\",\"circle\",\"nufk8\",{\"cx\":\"9\",\"cy\":\"7\",\"r\":\"4\"}],\"$undefined\"]}]\n10:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"s"])</script>
35<script>self.__next_f.push([1,"trokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-credit-card\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"rect\",\"ynyp8z\",{\"width\":\"20\",\"height\":\"14\",\"x\":\"2\",\"y\":\"5\",\"rx\":\"2\"}],[\"$\",\"line\",\"1b3vmo\",{\"x1\":\"2\",\"x2\":\"22\",\"y1\":\"10\",\"y2\":\"10\"}],\"$undefined\"]}]\n11:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-landmark\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"wt116b\",{\"d\":\"M10 18v-7\"}],[\"$\",\"path\",\"1m329m\",{\"d\":\"M11.12 2.198a2 2 0 0 1 1.76.006l7.866 3.847c.476.233.31.949-.22.949H3.474c-.53 0-.695-.716-.22-.949z\"}],[\"$\",\"path\",\"vav6t3\",{\"d\":\"M14 18v-7\"}],[\"$\",\"path\",\"aexdmj\",{\"d\":\"M18 18v-7\"}],[\"$\",\"path\",\"8prr45\",{\"d\":\"M3 22h18\"}],[\"$\",\"path\",\"1ivflk\",{\"d\":\"M6 18v-7\"}],\"$undefined\"]}]\n12:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-arrow-up\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"hav0vg\",{\"d\":\"m5 12 7-7 7 7\"}],[\"$\",\"path\",\"x0mq9r\",{\"d\":\"M12 19V5\"}],\"$undefined\"]}]\n13:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-circle-dollar-sign\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"circle\",\"1mglay\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"$\",\"path\",\"1h4pet\",{\"d\":\"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8\"}],[\"$\",\"path\",\"zqpxq5\",{\"d\":\"M12 18V6\"}],\"$undefined\"]}]\n14:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-album\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"rect\",\"1m3agn\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\",\"ry\":\"2\"}],[\"$\",\"polyline\",\"1wcwz3\",{\"points\":\"11 3 11 11 14 8 17 11 17 3\"}],\"$undefined\"]}]\n15:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-rocket\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"m3kijz\",{\"d\":\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z\"}],[\"$\",\"path\",\"1fmvmk\",{\"d\":\"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\"}],[\"$\",\"path\",\"1f8sc4\",{\"d\":\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\"}],[\"$\",\"path\",\"qeys4\",{\"d\":\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\"}],\"$undefined\"]}]\n16:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-server\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"rect\",\"ngkwjq\",{\"width\":\"20\",\"height\":\"8\",\"x\":\"2\",\"y\":\"2\",\"rx\":\"2\",\"ry\":\"2\"}],[\"$\",\"rect\",\"iecqi9\",{\"width\":\"20\",\"height\":\"8\",\"x\":\"2\",\"y\":\"14\",\"rx\":\"2\",\"ry\":\"2\"}],[\"$\",\"line\",\"16zg32\",{\"x1\":\"6\",\"x2\":\"6.01\",\"y1\":\"6\",\"y2\":\"6\"}],[\"$\",\"line\",\"nzw8ys\",{\"x1\":\"6\",\"x2\":\"6.01\",\"y1\":\"18\",\"y2\":\"18\"}],\"$undefined\"]}]\n17:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\"
35:24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-album\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"rect\",\"1m3agn\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\",\"ry\":\"2\"}],[\"$\",\"polyline\",\"1wcwz3\",{\"points\":\"11 3 11 11 14 8 17 11 17 3\"}],\"$undefined\"]}]\n18:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"hei"])</script>
35<script>self.__next_f.push([1,"ght\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-rocket\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"m3kijz\",{\"d\":\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z\"}],[\"$\",\"path\",\"1fmvmk\",{\"d\":\"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\"}],[\"$\",\"path\",\"1f8sc4\",{\"d\":\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\"}],[\"$\",\"path\",\"qeys4\",{\"d\":\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\"}],\"$undefined\"]}]\n19:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-server-crash\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"4b9dqc\",{\"d\":\"M6 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-2\"}],[\"$\",\"path\",\"22nnkd\",{\"d\":\"M6 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-2\"}],[\"$\",\"path\",\"1utrut\",{\"d\":\"M6 6h.01\"}],[\"$\",\"path\",\"uhywen\",{\"d\":\"M6 18h.01\"}],[\"$\",\"path\",\"14hqih\",{\"d\":\"m13 6-4 6h6l-4 6\"}],\"$undefined\"]}]\n1a:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-braces\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"ezmyqa\",{\"d\":\"M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5c0 1.1.9 2 2 2h1\"}],[\"$\",\"path\",\"e1hn23\",{\"d\":\"M16 21h1a2 2 0 0 0 2-2v-5c0-1.1.9-2 2-2a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1\"}],\"$undefined\"]}]\n1b:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-album\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"rect\",\"1m3agn\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\",\"ry\":\"2\"}],[\"$\",\"polyline\",\"1wcwz3\",{\"points\":\"11 3 11 11 14 8 17 11 17 3\"}],\"$undefined\"]}]\n1c:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-rocket\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"m3kijz\",{\"d\":\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z\"}],[\"$\",\"path\",\"1fmvmk\",{\"d\":\"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\"}],[\"$\",\"path\",\"1f8sc4\",{\"d\":\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\"}],[\"$\",\"path\",\"qeys4\",{\"d\":\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\"}],\"$undefined\"]}]\n1d:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-braces\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"ezmyqa\",{\"d\":\"M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5c0 1.1.9 2 2 2h1\"}],[\"$\",\"path\",\"e1hn23\",{\"d\":\"M16 21h1a2 2 0 0 0 2-2v-5c0-1.1.9-2 2-2a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1\"}],\"$undefined\"]}]\n1e:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-info\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"circle\",\"1mglay\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"$\",\"path\",\"1dtifu\",{\"d\":\"M12 16v-4\"}],[\"$\",\"path\",\"e9boi3\",{\"d\":\"M12 8h.01\"}],\"$undefined\"]}]\n1f:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\"
35:24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\""])</script>
35<script>self.__next_f.push([1,":\"lucide lucide-zap\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"1xq2db\",{\"d\":\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\"}],\"$undefined\"]}]\n20:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-album\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"rect\",\"1m3agn\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\",\"ry\":\"2\"}],[\"$\",\"polyline\",\"1wcwz3\",{\"points\":\"11 3 11 11 14 8 17 11 17 3\"}],\"$undefined\"]}]\n21:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-rocket\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"m3kijz\",{\"d\":\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z\"}],[\"$\",\"path\",\"1fmvmk\",{\"d\":\"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\"}],[\"$\",\"path\",\"1f8sc4\",{\"d\":\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\"}],[\"$\",\"path\",\"qeys4\",{\"d\":\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\"}],\"$undefined\"]}]\n22:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-flag\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"1jaruq\",{\"d\":\"M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528\"}],\"$undefined\"]}]\n23:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-toggle-right\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"circle\",\"1afu0r\",{\"cx\":\"15\",\"cy\":\"12\",\"r\":\"3\"}],[\"$\",\"rect\",\"g7kal2\",{\"width\":\"20\",\"height\":\"14\",\"x\":\"2\",\"y\":\"5\",\"rx\":\"7\"}],\"$undefined\"]}]\n24:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-layout-template\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"rect\",\"f1a2em\",{\"width\":\"18\",\"height\":\"7\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"1\"}],[\"$\",\"rect\",\"jqznyg\",{\"width\":\"9\",\"height\":\"7\",\"x\":\"3\",\"y\":\"14\",\"rx\":\"1\"}],[\"$\",\"rect\",\"q5h2i8\",{\"width\":\"5\",\"height\":\"7\",\"x\":\"16\",\"y\":\"14\",\"rx\":\"1\"}],\"$undefined\"]}]\n25:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-database\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"ellipse\",\"msslwz\",{\"cx\":\"12\",\"cy\":\"5\",\"rx\":\"9\",\"ry\":\"3\"}],[\"$\",\"path\",\"1wlel7\",{\"d\":\"M3 5V19A9 3 0 0 0 21 19V5\"}],[\"$\",\"path\",\"mv7ke4\",{\"d\":\"M3 12A9 3 0 0 0 21 12\"}],\"$undefined\"]}]\n26:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-flask-conical\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"18mbvz\",{\"d\":\"M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2\"}],[\"$\",\"path\",\"3shlmq\",{\"d\":\"M6.453 15h11.094\"}],[\"$\",\"path\",\"csnxdl\",{\"d\":\"M8.5 2h7\"}],\"$undefined\"]}]\n27:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\"
35:24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"str"])</script>
35<script>self.__next_f.push([1,"okeLinejoin\":\"round\",\"className\":\"lucide lucide-toggle-right\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"circle\",\"1afu0r\",{\"cx\":\"15\",\"cy\":\"12\",\"r\":\"3\"}],[\"$\",\"rect\",\"g7kal2\",{\"width\":\"20\",\"height\":\"14\",\"x\":\"2\",\"y\":\"5\",\"rx\":\"7\"}],\"$undefined\"]}]\n28:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-album\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"rect\",\"1m3agn\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\",\"ry\":\"2\"}],[\"$\",\"polyline\",\"1wcwz3\",{\"points\":\"11 3 11 11 14 8 17 11 17 3\"}],\"$undefined\"]}]\n29:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-rocket\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"m3kijz\",{\"d\":\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z\"}],[\"$\",\"path\",\"1fmvmk\",{\"d\":\"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\"}],[\"$\",\"path\",\"1f8sc4\",{\"d\":\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\"}],[\"$\",\"path\",\"qeys4\",{\"d\":\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\"}],\"$undefined\"]}]\n2a:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-wrench\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"1ngwbx\",{\"d\":\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z\"}],\"$undefined\"]}]\n2b:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-album\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"rect\",\"1m3agn\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\",\"ry\":\"2\"}],[\"$\",\"polyline\",\"1wcwz3\",{\"points\":\"11 3 11 11 14 8 17 11 17 3\"}],\"$undefined\"]}]\n2c:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-rocket\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"m3kijz\",{\"d\":\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z\"}],[\"$\",\"path\",\"1fmvmk\",{\"d\":\"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\"}],[\"$\",\"path\",\"1f8sc4\",{\"d\":\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\"}],[\"$\",\"path\",\"qeys4\",{\"d\":\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\"}],\"$undefined\"]}]\n2d:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-vault\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"rect\",\"afitv7\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\"}],[\"$\",\"circle\",\"kqv944\",{\"cx\":\"7.5\",\"cy\":\"7.5\",\"r\":\".5\",\"fill\":\"currentColor\"}],[\"$\",\"path\",\"hpeyl3\",{\"d\":\"m7.9 7.9 2.7 2.7\"}],[\"$\",\"circle\",\"w0ekpg\",{\"cx\":\"16.5\",\"cy\":\"7.5\",\"r\":\".5\",\"fill\":\"currentColor\"}
35],[\"$\",\"path\",\"264c1n\",{\"d\":\"m13.4 10.6 2.7-2.7\"}],[\"$\",\"circle\",\"nkw3mc\",{\"cx\":\"7.5\",\"cy\":\"16.5\",\"r\":\".5\",\"fill\":\"currentColor\"}],[\"$\",\"path\",\"p81g5e\",{\"d\":\"m7.9 16.1 2.7-2.7\"}],[\"$\",\"circle\",\"fubopw\",{\"cx\":\"16.5\",\"cy\":\"16.5\",\"r\":\".5\",\"fill\":\"currentColor\"}],[\"$\",\"path\",\"abhel3\",{\"d\":\"m13.4 13.4 2.7 2.7\"}],[\"$\",\"circle\",\"1c9p78\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"2\"}],\"$undefined\"]}]\n2e:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/sv"])</script>
35<script>self.__next_f.push([1,"g\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-database\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"ellipse\",\"msslwz\",{\"cx\":\"12\",\"cy\":\"5\",\"rx\":\"9\",\"ry\":\"3\"}],[\"$\",\"path\",\"1wlel7\",{\"d\":\"M3 5V19A9 3 0 0 0 21 19V5\"}],[\"$\",\"path\",\"mv7ke4\",{\"d\":\"M3 12A9 3 0 0 0 21 12\"}],\"$undefined\"]}]\n2f:[\"$\",\"div\",null,{\"className\":\"[\u0026_svg]:size-full rounded-lg size-full text-(--tab-color) max-md:bg-(--tab-color)/10 max-md:border max-md:p-1.5\",\"style\":{\"--tab-color\":\"var(--magnify-color, var(--color-fd-foreground))\"},\"children\":\"$5\"}]\n30:[\"$\",\"div\",null,{\"className\":\"[\u0026_svg]:size-full rounded-lg size-full text-(--tab-color) max-md:bg-(--tab-color)/10 max-md:border max-md:p-1.5\",\"style\":{\"--tab-color\":\"var(--shopkeeper-color, var(--color-fd-foreground))\"},\"children\":\"$13\"}]\n31:[\"$\",\"div\",null,{\"className\":\"[\u0026_svg]:size-full rounded-lg size-full text-(--tab-color) max-md:bg-(--tab-color)/10 max-md:border max-md:p-1.5\",\"style\":{\"--tab-color\":\"var(--openapi-color, var(--color-fd-foreground))\"},\"children\":\"$16\"}]\n32:[\"$\",\"div\",null,{\"className\":\"[\u0026_svg]:size-full rounded-lg size-full text-(--tab-color) max-md:bg-(--tab-color)/10 max-md:border max-md:p-1.5\",\"style\":{\"--tab-color\":\"var(--graphql-color, var(--color-fd-foreground))\"},\"children\":\"$1a\"}]\n33:[\"$\",\"div\",null,{\"className\":\"[\u0026_svg]:size-full rounded-lg size-full text-(--tab-color) max-md:bg-(--tab-color)/10 max-md:border max-md:p-1.5\",\"style\":{\"--tab-color\":\"var(--actions-color, var(--color-fd-foreground))\"},\"children\":\"$1f\"}]\n34:[\"$\",\"div\",null,{\"className\":\"[\u0026_svg]:size-full rounded-lg size-full text-(--tab-color) max-md:bg-(--tab-color)/10 max-md:border max-md:p-1.5\",\"style\":{\"--tab-color\":\"var(--flick-color, var(--color-fd-foreground))\"},\"children\":\"$27\"}]\n35:[\"$\",\"div\",null,{\"className\":\"[\u0026_svg]:size-full rounded-lg size-full text-(--tab-color) max-md:bg-(--tab-color)/10 max-md:border max-md:p-1.5\",\"style\":{\"--tab-color\":\"var(--maintenance-color, var(--color-fd-foreground))\"},\"children\":\"$2a\"}]\n36:[\"$\",\"div\",null,{\"className\":\"[\u0026_svg]:size-full rounded-lg size-full text-(--tab-color) max-md:bg-(--tab-color)/10 max-md:border max-md:p-1.5\",\"style\":{\"--tab-color\":\"var(--crypt-color, var(--color-fd-foreground))\"},\"children\":\"$2d\"}]\n38:[\"$\",\"div\",null,{\"className\":\"flex items-center gap-3 my-2\",\"children\":[[\"$\",\"$L48\",null,{\"alt\":\"Friends Of Adonis\",\"height\":32,\"src\":\"/logo.png\",\"width\":32}],\"Friends Of Adonis\"]}]\n39:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-server\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"rect\",\"ngkwjq\",{\"width\":\"20\",\"height\":\"8\",\"x\":\"2\",\"y\":\"2\",\"rx\":\"2\",\"ry\":\"2\"}],[\"$\",\"rect\",\"iecqi9\",{\"width\":\"20\",\"height\":\"8\",\"x\":\"2\",\"y\":\"14\",\"rx\":\"2\",\"ry\":\"2\"}],[\"$\",\"line\",\"16zg32\",{\"x1\":\"6\",\"x2\":\"6.01\",\"y1\":\"6\",\"y2\":\"6\"}],[\"$\",\"line\",\"nzw8ys\",{\"x1\":\"6\",\"x2\":\"6.01\",\"y1\":\"18\",\"y2\":\"18\"}],\"$undefined\"]}]\n3a:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-braces\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"ezmyqa\",{\"d\":\"M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5c0 1.1.9 2 2 2h1\"}],[\"$\",\"path\",\"e1hn23\",{\"d\":\"M16 21h1a2 2 0 0 0 2-2v-5c0-1.1.9-2 2-2a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1\"}],\"$undefined\"]}]\n3b:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\"
35:24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-circle-dollar-sign\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"circle\",\"1mglay\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"$\",\"path\",\"1h4pet\",{\"d\":\"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8\"}],[\"$\",\"path\",\"zqpxq5\",{\"d\":\"M12 18V6"])</script>
35<script>self.__next_f.push([1,"\"}],\"$undefined\"]}]\n3c:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-search\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"14j7rj\",{\"d\":\"m21 21-4.34-4.34\"}],[\"$\",\"circle\",\"4ej97u\",{\"cx\":\"11\",\"cy\":\"11\",\"r\":\"8\"}],\"$undefined\"]}]\n3d:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-vault\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"rect\",\"afitv7\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\"}],[\"$\",\"circle\",\"kqv944\",{\"cx\":\"7.5\",\"cy\":\"7.5\",\"r\":\".5\",\"fill\":\"currentColor\"}],[\"$\",\"path\",\"hpeyl3\",{\"d\":\"m7.9 7.9 2.7 2.7\"}],[\"$\",\"circle\",\"w0ekpg\",{\"cx\":\"16.5\",\"cy\":\"7.5\",\"r\":\".5\",\"fill\":\"currentColor\"}],[\"$\",\"path\",\"264c1n\",{\"d\":\"m13.4 10.6 2.7-2.7\"}],[\"$\",\"circle\",\"nkw3mc\",{\"cx\":\"7.5\",\"cy\":\"16.5\",\"r\":\".5\",\"fill\":\"currentColor\"}],[\"$\",\"path\",\"p81g5e\",{\"d\":\"m7.9 16.1 2.7-2.7\"}],[\"$\",\"circle\",\"fubopw\",{\"cx\":\"16.5\",\"cy\":\"16.5\",\"r\":\".5\",\"fill\":\"currentColor\"}],[\"$\",\"path\",\"abhel3\",{\"d\":\"m13.4 13.4 2.7 2.7\"}],[\"$\",\"circle\",\"1c9p78\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"2\"}],\"$undefined\"]}]\n3e:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-plus\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"1ays0h\",{\"d\":\"M5 12h14\"}],[\"$\",\"path\",\"s699le\",{\"d\":\"M12 5v14\"}],\"$undefined\"]}]\n3f:[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-album\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"rect\",\"1m3agn\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\",\"ry\":\"2\"}],[\"$\",\"polyline\",\"1wcwz3\",{\"points\":\"11 3 11 11 14 8 17 11 17 3\"}],\"$undefined\"]}]\n41:[\"$\",\"$L49\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4a\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]\n42:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L49\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4a\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\n43:[\"$\",\"$1\",\"c\",{\"children\":[\"$L4b\",[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/2hkj29w79i1yj.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/0zn7bsfaggbks.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/0k01ihl9igxe4.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/_next/static/chunks/2l26d-3l2mfkz.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L4c\",null,{\"children\":[\"$\",\"$4d\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@4e\"}]}]]}]\n4f:[]\n44:\"$W4f\"\n45:[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L50\",null,{\"children\":\"$L51\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L52\",null,{\"children\":[\"$\",\"$4d\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L53\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}]\n47:[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1781sbja7e0bq.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n"])</script>
35<script>self.__next_f.push([1,"54:I[635770,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\",\"/_next/static/chunks/2yl3qg5sau_m1.js\",\"/_next/static/chunks/3q7cnnq64z-47.js\",\"/_next/static/chunks/0ysnn4qn15cl9.js\"],\"Body\"]\n55:I[673649,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\"],\"NextProvider\"]\n56:I[214072,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\"],\"TreeContextProvider\"]\n57:I[453606,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\"],\"Provider\"]\n58:I[302355,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\"],\"Analytics\"]\n"])</script>
35<script>self.__next_f.push([1,"2:[\"$\",\"html\",null,{\"className\":\"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable\",\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"$L54\",null,{\"children\":[[\"$\",\"$L55\",null,{\"children\":[\"$\",\"$L56\",null,{\"tree\":\"$0:f:0:1:1:children:0:props:children:1:props:tree\",\"children\":[\"$\",\"$L57\",null,{\"tags\":[{\"name\":\"Magnify\",\"value\":\"magnify\",\"description\":\"Full-text search for your Lucid models with Algolia, Meilisearch or Typesense, kept in sync automatically\"},{\"name\":\"Shopkeeper\",\"value\":\"shopkeeper\",\"description\":\"Expressive, fluent Stripe billing for AdonisJS: subscriptions, checkout, invoices, and webhooks\"},{\"name\":\"OpenAPI\",\"value\":\"openapi\",\"description\":\"Generate OpenAPI V3 documentation from your AdonisJS controllers and models using TypeScript decorators.\"},{\"name\":\"GraphQL\",\"value\":\"graphql\",\"description\":\"Build code-first GraphQL APIs in AdonisJS with decorators, Apollo or Yoga, auth and realtime subscriptions\"},{\"name\":\"Actions\",\"value\":\"actions\",\"description\":\"One action class per use case, invoked as a route handler, an Ace command or an event listener, with the business logic living in handle\"},{\"name\":\"Flick\",\"value\":\"flick\",\"description\":\"Typed, driver-based feature flags for AdonisJS: variants, per-scope caching, Edge tags, and test fakes.\"},{\"name\":\"Maintenance\",\"value\":\"maintenance\",\"description\":\"Put your AdonisJS application in maintenance mode with simple Ace commands and bypass secrets\"},{\"name\":\"Crypt\",\"value\":\"crypt\",\"description\":\"Public-key encryption for AdonisJS dotenv files, so secrets live in version control and only the private key stays out of the repository.\"}],\"children\":[\"$\",\"$L49\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4a\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}],[\"$\",\"$L58\",null,{}]]}]}]\n"])</script>
35<script>self.__next_f.push([1,"59:I[353266,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\",\"/_next/static/chunks/2yl3qg5sau_m1.js\",\"/_next/static/chunks/3q7cnnq64z-47.js\",\"/_next/static/chunks/0ysnn4qn15cl9.js\",\"/_next/static/chunks/2hkj29w79i1yj.js\",\"/_next/static/chunks/0zn7bsfaggbks.js\",\"/_next/static/chunks/0k01ihl9igxe4.js\",\"/_next/static/chunks/2l26d-3l2mfkz.js\"],\"DocsPage\"]\n5a:I[353266,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\",\"/_next/static/chunks/2yl3qg5sau_m1.js\",\"/_next/static/chunks/3q7cnnq64z-47.js\",\"/_next/static/chunks/0ysnn4qn15cl9.js\",\"/_next/static/chunks/2hkj29w79i1yj.js\",\"/_next/static/chunks/0zn7bsfaggbks.js\",\"/_next/static/chunks/0k01ihl9igxe4.js\",\"/_next/static/chunks/2l26d-3l2mfkz.js\"],\"DocsTitle\"]\n5b:I[353266,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\",\"/_next/static/chunks/2yl3qg5sau_m1.js\",\"/_next/static/chunks/3q7cnnq64z-47.js\",\"/_next/static/chunks/0ysnn4qn15cl9.js\",\"/_next/static/chunks/2hkj29w79i1yj.js\",\"/_next/static/chunks/0zn7bsfaggbks.js\",\"/_next/static/chunks/0k01ihl9igxe4.js\",\"/_next/static/chunks/2l26d-3l2mfkz.js\"],\"DocsDescription\"]\n5c:I[352298,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\",\"/_next/static/chunks/2yl3qg5sau_m1.js\",\"/_next/static/chunks/3q7cnnq64z-47.js\",\"/_next/static/chunks/0ysnn4qn15cl9.js\",\"/_next/static/chunks/2hkj29w79i1yj.js\",\"/_next/static/chunks/0zn7bsfaggbks.js\",\"/_next/static/chunks/0k01ihl9igxe4.js\",\"/_next/static/chunks/2l26d-3l2mfkz.js\"],\"LLMCopyButton\"]\n5d:I[352298,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\",\"/_next/static/chunks/2yl3qg5sau_m1.js\",\"/_next/static/chunks/3q7cnnq64z-47.js\",\"/_next/static/chunks/0ysnn4qn15cl9.js\",\"/_next/static/chunks/2hkj29w79i1yj.js\",\"/_next/static/chunks/0zn7bsfaggbks.js\",\"/_next/static/chunks/0k01ihl9igxe4.js\",\"/_next/static/chunks/2l26d-3l2mfkz.js\"],\"ViewOptions\"]\n5e:I[353266,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\",\"/_next/static/chunks/2yl3qg5sau_m1.js\",\"/_next/static/chunks/3q7cnnq64z-47.js\",\"/_next/static/chunks/0ysnn4qn15cl9.js\",\"/_next/static/chunks/2hkj29w79i1yj.js\",\"/_next/static/chunks/0zn7bsfaggbks.js\",\"/_next/static/chunks/0k01ihl9igxe4.js\",\"/_next/static/chunks/2l26d-3l2mfkz.js\"],\"DocsBody\"]\n5f:I[647873,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\",\"/_next/static/chunks/2yl3qg5sau_m1.js\",\"/_next/static/chunks/3q7cnnq64z-47.js\",\"/_next/static/chunks/0ysnn4qn15cl9.js\",\"/_next/static/chunks/2hkj29w79i1yj.js\",\"/_next/static/chunks/0zn7bsfaggbks.js\",\"/_next/static/chunks/0k01ihl9igxe4.js\",\"/_next/static/chunks/2l26d-3l2"])</script>
35<script>self.__next_f.push([1,"mfkz.js\"],\"default\"]\n60:I[144324,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\",\"/_next/static/chunks/2yl3qg5sau_m1.js\",\"/_next/static/chunks/3q7cnnq64z-47.js\",\"/_next/static/chunks/0ysnn4qn15cl9.js\",\"/_next/static/chunks/2hkj29w79i1yj.js\",\"/_next/static/chunks/0zn7bsfaggbks.js\",\"/_next/static/chunks/0k01ihl9igxe4.js\",\"/_next/static/chunks/2l26d-3l2mfkz.js\"],\"CodeBlock\"]\n62:I[144324,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\",\"/_next/static/chunks/2yl3qg5sau_m1.js\",\"/_next/static/chunks/3q7cnnq64z-47.js\",\"/_next/static/chunks/0ysnn4qn15cl9.js\",\"/_next/static/chunks/2hkj29w79i1yj.js\",\"/_next/static/chunks/0zn7bsfaggbks.js\",\"/_next/static/chunks/0k01ihl9igxe4.js\",\"/_next/static/chunks/2l26d-3l2mfkz.js\"],\"Pre\"]\n61:T4dc,\u003csvg viewBox=\"0 0 24 24\"\u003e\u003cpath d=\"M1.125 0C.502 0 0 .502 0 1.125v21.75C0 23.498.502 24 1.125 24h21.75c.623 0 1.125-.502 1.125-1.125V1.125C24 .502 23.498 0 22.875 0zm17.363 9.75c.612 0 1.154.037 1.627.111a6.38 6.38 0 0 1 1.306.34v2.458a3.95 3.95 0 0 0-.643-.361 5.093 5.093 0 0 0-.717-.26 5.453 5.453 0 0 0-1.426-.2c-.3 0-.573.028-.819.086a2.1 2.1 0 0 0-.623.242c-.17.104-.3.229-.393.374a.888.888 0 0 0-.14.49c0 .196.053.373.156.529.104.156.252.304.443.444s.423.276.696.41c.273.135.582.274.926.416.47.197.892.407 1.266.628.374.222.695.473.963.753.268.279.472.598.614.957.142.359.214.776.214 1.253 0 .657-.125 1.21-.373 1.656a3.033 3.033 0 0 1-1.012 1.085 4.38 4.38 0 0 1-1.487.596c-.566.12-1.163.18-1.79.18a9.916 9.916 0 0 1-1.84-.164 5.544 5.544 0 0 1-1.512-.493v-2.63a5.033 5.033 0 0 0 3.237 1.2c.333 0 .624-.03.872-.09.249-.06.456-.144.623-.25.166-.108.29-.234.373-.38a1.023 1.023 0 0 0-.074-1.089 2.12 2.12 0 0 0-.537-.5 5.597 5.597 0 0 0-.807-.444 27.72 27.72 0 0 0-1.007-.436c-.918-.383-1.602-.852-2.053-1.405-.45-.553-.676-1.222-.676-2.005 0-.614.123-1.141.369-1.582.246-.441.58-.804 1.004-1.089a4.494 4.494 0 0 1 1.47-.629 7.536 7.536 0 0 1 1.77-.201zm-15.113.188h9.563v2.166H9.506v9.646H6.789v-9.646H3.375z\" fill=\"currentColor\" /\u003e\u003c/svg\u003e"])</script>
35<script>self.__next_f.push([1,"4b:[\"$\",\"$L59\",null,{\"tableOfContent\":{\"style\":\"clerk\",\"single\":false},\"toc\":[{\"depth\":2,\"url\":\"#features\",\"title\":\"Features\"},{\"depth\":2,\"url\":\"#next-steps\",\"title\":\"Next steps\"}],\"children\":[[\"$\",\"$L5a\",null,{\"children\":\"Introduction\"}],[\"$\",\"$L5b\",null,{\"children\":\"AdonisJS Shopkeeper gives Stripe billing a fluent, expressive API so you can add subscriptions, trials, one-off charges, and invoices in minutes.\"}],[\"$\",\"div\",null,{\"className\":\"flex flex-row flex-wrap gap-2 items-center border-b pb-6\",\"children\":[[\"$\",\"$L5c\",null,{\"markdownUrl\":\"/docs/shopkeeper.mdx\"}],[\"$\",\"$L5d\",null,{\"githubUrl\":\"https://github.com/FriendsOfAdonis/FriendsOfAdonis/blob/main/apps/docs/content/docs/shopkeeper/index.mdx\",\"markdownUrl\":\"/docs/shopkeeper.mdx\"}]]}],[\"$\",\"$L5e\",null,{\"className\":\"text-fd-foreground/80\",\"children\":[[[\"$\",\"p\",null,{\"children\":[\"Adonis Shopkeeper provides an expressive, fluent interface to \",[\"$\",\"$L5f\",null,{\"href\":\"https://stripe.com\",\"children\":\"Stripe's\"}],\" billing services. It handles the boilerplate subscription billing code you are dreading writing, so you can focus on building your product.\"]}],\"\\n\",[\"$\",\"$L60\",null,{\"className\":\"shiki shiki-themes catppuccin-latte catppuccin-mocha\",\"style\":{\"--shiki-light\":\"#4c4f69\",\"--shiki-dark\":\"#cdd6f4\",\"--shiki-light-bg\":\"#eff1f5\",\"--shiki-dark-bg\":\"#1e1e2e\"},\"tabIndex\":\"0\",\"icon\":\"$61\",\"children\":[\"$\",\"$L62\",null,{\"children\":[\"$\",\"code\",null,{\"children\":[[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#8839EF\",\"--shiki-dark\":\"#CBA6F7\"},\"children\":\"import\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\" router \"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#8839EF\",\"--shiki-dark\":\"#CBA6F7\"},\"children\":\"from\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#40A02B\",\"--shiki-dark\":\"#A6E3A1\"},\"children\":\" '@adonisjs/core/services/router'\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#8839EF\",\"--shiki-dark\":\"#CBA6F7\"},\"children\":\"import\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#7C7F93\",\"--shiki-dark\":\"#9399B2\"},\"children\":\" {\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\" urlFor \"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#7C7F93\",\"--shiki-dark\":\"#9399B2\"},\"children\":\"}\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#8839EF\",\"--shiki-dark\":\"#CBA6F7\"},\"children\":\" from\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#40A02B\",\"--shiki-dark\":\"#A6E3A1\"},\"children\":\" '@adonisjs/core/services/url_builder'\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\"router\"}],\"$L63\",\"$L64\",\"$L65\",\"$L66\",\"$L67\",\"$L68\",\"$L69\",\"$L6a\",\"$L6b\",\"$L6c\",\"$L6d\",\"$L6e\",\"$L6f\"]}],\"\\n\",\"$L70\",\"\\n\",\"$L71\",\"\\n\",\"$L72\",\"\\n\",\"$L73\",\"\\n\",\"$L74\",\"\\n\",\"$L75\",\"\\n\",\"$L76\",\"\\n\",\"$L77\",\"\\n\",\"$L78\",\"\\n\",\"$L79\",\"\\n\",\"$L7a\",\"\\n\",\"$L7b\"]}]}]}],\"\\n\",\"$L7c\",\"\\n\",\"$L7d\",\"\\n\",\"$L7e\",\"\\n\",\"$L7f\",\"\\n\",\"$L80\"],null]}]]}]\n"])</script>
35<script>self.__next_f.push([1,"81:I[494157,[\"/_next/static/chunks/2ap1fvadncvz3.js\",\"/_next/static/chunks/02_uo_bw4zs_c.js\",\"/_next/static/chunks/0ud1d1a31uilc.js\",\"/_next/static/chunks/0dcuc-_nnvwsq.js\",\"/_next/static/chunks/1ntn7efqc-iiw.js\",\"/_next/static/chunks/2x_fbhg2m9d65.js\",\"/_next/static/chunks/1buygnwj9jkxn.js\",\"/_next/static/chunks/2yl3qg5sau_m1.js\",\"/_next/static/chunks/3q7cnnq64z-47.js\",\"/_next/static/chunks/0ysnn4qn15cl9.js\",\"/_next/static/chunks/2hkj29w79i1yj.js\",\"/_next/static/chunks/0zn7bsfaggbks.js\",\"/_next/static/chunks/0k01ihl9igxe4.js\",\"/_next/static/chunks/2l26d-3l2mfkz.js\"],\"Heading\"]\n63:[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#179299\",\"--shiki-dark\":\"#94E2D5\"},\"children\":\".\"}]\n64:[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#1E66F5\",\"--shiki-light-font-style\":\"italic\",\"--shiki-dark\":\"#89B4FA\",\"--shiki-dark-font-style\":\"italic\"},\"children\":\"get\"}]\n65:[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\"(\"}]\n66:[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#40A02B\",\"--shiki-dark\":\"#A6E3A1\"},\"children\":\"'/subscribe'\"}]\n67:[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#7C7F93\",\"--shiki-dark\":\"#9399B2\"},\"children\":\",\"}]\n68:[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#8839EF\",\"--shiki-dark\":\"#CBA6F7\"},\"children\":\" async\"}]\n69:[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#7C7F93\",\"--shiki-dark\":\"#9399B2\"},\"children\":\" ({\"}]\n6a:[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#E64553\",\"--shiki-light-font-style\":\"italic\",\"--shiki-dark\":\"#EBA0AC\",\"--shiki-dark-font-style\":\"italic\"},\"children\":\" auth\"}]\n6b:[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#7C7F93\",\"--shiki-dark\":\"#9399B2\"},\"children\":\",\"}]\n6c:[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#E64553\",\"--shiki-light-font-style\":\"italic\",\"--shiki-dark\":\"#EBA0AC\",\"--shiki-dark-font-style\":\"italic\"},\"children\":\" response\"}]\n6d:[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#7C7F93\",\"--shiki-dark\":\"#9399B2\"},\"children\":\" })\"}]\n6e:[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#179299\",\"--shiki-dark\":\"#94E2D5\"},\"children\":\" =\u003e\"}]\n6f:[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#7C7F93\",\"--shiki-dark\":\"#9399B2\"},\"children\":\" {\"}]\n70:[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#8839EF\",\"--shiki-dark\":\"#CBA6F7\"},\"children\":\" const\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\" user \"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#179299\",\"--shiki-dark\":\"#94E2D5\"},\"children\":\"=\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\" auth\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#179299\",\"--shiki-dark\":\"#94E2D5\"},\"children\":\".\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#1E66F5\",\"--shiki-light-font-style\":\"italic\",\"--shiki-dark\":\"#89B4FA\",\"--shiki-dark-font-style\":\"italic\"},\"children\":\"getUserOrFail\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\"()\"}]]}]\n71:[\"$\",\"span\",null,{\"className\":\"line\"}]\n72:[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#8839EF\",\"--shiki-dark\":\"#CBA6F7\"},\"children\":\" const\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\" checkout \"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#179299\",\"--shiki-dark\":\"#94E2D5\"},\"children\":\"=\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#8839EF\",\"--shiki-dark\":\"#CBA6F7\"},\"children\":\" await\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\" user\"}]]}]\n73:[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"--shiki-light\"
35:\"#179299\",\"--shiki-dark\":\"#94E2D5\"},\"children\":\" .\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#1E66F5\",\"--shiki-light-font-style\":\"italic\",\"--shiki-dark\":\"#89B4FA\",\"--shiki-dark-font-style\":\"italic\"},\"children\":\"newSubscription\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\"(\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#40A02B\",\"--shiki-dark\":\"#A6E3A1\"},\"children\":\"'default'\"}],[\"$\",\"span\",nu"])</script>
35<script>self.__next_f.push([1,"ll,{\"style\":{\"--shiki-light\":\"#7C7F93\",\"--shiki-dark\":\"#9399B2\"},\"children\":\",\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#40A02B\",\"--shiki-dark\":\"#A6E3A1\"},\"children\":\" 'price_monthly'\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\")\"}]]}]\n74:[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#179299\",\"--shiki-dark\":\"#94E2D5\"},\"children\":\" .\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#1E66F5\",\"--shiki-light-font-style\":\"italic\",\"--shiki-dark\":\"#89B4FA\",\"--shiki-dark-font-style\":\"italic\"},\"children\":\"allowPromotionCodes\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\"()\"}]]}]\n75:[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#179299\",\"--shiki-dark\":\"#94E2D5\"},\"children\":\" .\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#1E66F5\",\"--shiki-light-font-style\":\"italic\",\"--shiki-dark\":\"#89B4FA\",\"--shiki-dark-font-style\":\"italic\"},\"children\":\"checkout\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\"(\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#7C7F93\",\"--shiki-dark\":\"#9399B2\"},\"children\":\"{\"}]]}]\n76:[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\" success_url\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#179299\",\"--shiki-dark\":\"#94E2D5\"},\"children\":\":\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#1E66F5\",\"--shiki-light-font-style\":\"italic\",\"--shiki-dark\":\"#89B4FA\",\"--shiki-dark-font-style\":\"italic\"},\"children\":\" urlFor\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\"(\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#40A02B\",\"--shiki-dark\":\"#A6E3A1\"},\"children\":\"'checkout.success'\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\")\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#7C7F93\",\"--shiki-dark\":\"#9399B2\"},\"children\":\",\"}]]}]\n77:[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\" cancel_url\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#179299\",\"--shiki-dark\":\"#94E2D5\"},\"children\":\":\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#1E66F5\",\"--shiki-light-font-style\":\"italic\",\"--shiki-dark\":\"#89B4FA\",\"--shiki-dark-font-style\":\"italic\"},\"children\":\" urlFor\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\"(\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#40A02B\",\"--shiki-dark\":\"#A6E3A1\"},\"children\":\"'checkout.cancel'\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\")\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#7C7F93\",\"--shiki-dark\":\"#9399B2\"},\"children\":\",\"}]]}]\n78:[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#7C7F93\",\"--shiki-dark\":\"#9399B2\"},\"children\":\" }\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\")\"}]]}]\n79:[\"$\",\"span\",null,{\"className\":\"line\"}]\n"])</script>
35<script>self.__next_f.push([1,"7a:[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#8839EF\",\"--shiki-dark\":\"#CBA6F7\"},\"children\":\" return\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\" response\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#179299\",\"--shiki-dark\":\"#94E2D5\"},\"children\":\".\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#1E66F5\",\"--shiki-light-font-style\":\"italic\",\"--shiki-dark\":\"#89B4FA\",\"--shiki-dark-font-style\":\"italic\"},\"children\":\"redirect\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\"()\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#179299\",\"--shiki-dark\":\"#94E2D5\"},\"children\":\".\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#1E66F5\",\"--shiki-light-font-style\":\"italic\",\"--shiki-dark\":\"#89B4FA\",\"--shiki-dark-font-style\":\"italic\"},\"children\":\"status\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\"(\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#FE640B\",\"--shiki-dark\":\"#FAB387\"},\"children\":\"303\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\")\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#179299\",\"--shiki-dark\":\"#94E2D5\"},\"children\":\".\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#1E66F5\",\"--shiki-light-font-style\":\"italic\",\"--shiki-dark\":\"#89B4FA\",\"--shiki-dark-font-style\":\"italic\"},\"children\":\"toPath\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\"(checkout\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#179299\",\"--shiki-dark\":\"#94E2D5\"},\"children\":\".\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#1E66F5\",\"--shiki-light-font-style\":\"italic\",\"--shiki-dark\":\"#89B4FA\",\"--shiki-dark-font-style\":\"italic\"},\"children\":\"asStripeSession\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\"()\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#179299\",\"--shiki-dark\":\"#94E2D5\"},\"children\":\".\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\"url)\"}]]}]\n"])</script>
35<script>self.__next_f.push([1,"7b:[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#7C7F93\",\"--shiki-dark\":\"#9399B2\"},\"children\":\"}\"}],[\"$\",\"span\",null,{\"style\":{\"--shiki-light\":\"#4C4F69\",\"--shiki-dark\":\"#CDD6F4\"},\"children\":\")\"}]]}]\n7c:[\"$\",\"$L81\",null,{\"as\":\"h2\",\"id\":\"features\",\"children\":\"Features\"}]\n7d:[\"$\",\"p\",null,{\"children\":\"Shopkeeper takes care of the most common billing scenarios out of the box:\"}]\n"])</script>
35<script>self.__next_f.push([1,"7e:[\"$\",\"ul\",null,{\"children\":[\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"Stripe Checkout:\"}],\" Redirect your customers to Stripe's hosted payment page with a few lines of code\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"Subscriptions:\"}],\" Create, swap, cancel, and resume subscriptions\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"Trial periods:\"}],\" Offer free trials with or without collecting a payment method\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"One-off charges:\"}],\" Charge customers for individual products or services\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"Invoices:\"}],\" Retrieve and display invoices for your customers\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"Webhooks:\"}],\" Sync subscription state with opt-in idempotent webhook handling\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"Payment methods:\"}],\" Store, update, and manage customer payment methods\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"Coupons \u0026 promotions:\"}],\" Apply discounts and promotion codes to subscriptions and checkouts\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"Metered billing:\"}],\" Charge customers based on usage during a billing cycle\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"Taxes:\"}],\" Handle tax rates manually or automatically with \",[\"$\",\"$L5f\",null,{\"href\":\"https://stripe.com/tax\",\"children\":\"Stripe Tax\"}]]}],\"\\n\"]}]\n"])</script>
35<script>self.__next_f.push([1,"7f:[\"$\",\"$L81\",null,{\"as\":\"h2\",\"id\":\"next-steps\",\"children\":\"Next steps\"}]\n80:[\"$\",\"p\",null,{\"children\":[\"Ready to get started? Head over to the \",[\"$\",\"$L5f\",null,{\"href\":\"/docs/shopkeeper/getting-started\",\"children\":\"Getting Started\"}],\" guide to install Shopkeeper and accept your first payment in minutes.\"]}]\n"])</script>
35<script>self.__next_f.push([1,"51:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script>
35<script>self.__next_f.push([1,"4e:null\n"])</script>
35<script>self.__next_f.push([1,"53:[[\"$\",\"title\",\"0\",{\"children\":\"AdonisJS Shopkeeper - Introduction\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"AdonisJS Shopkeeper gives Stripe billing a fluent, expressive API so you can add subscriptions, trials, one-off charges, and invoices in minutes.\"}],[\"$\",\"meta\",\"2\",{\"name\":\"application-name\",\"content\":\"Friends Of Adonis\"}],[\"$\",\"link\",\"3\",{\"rel\":\"author\",\"href\":\"https://github.com/FriendsOfAdonis\"}],[\"$\",\"meta\",\"4\",{\"name\":\"author\",\"content\":\"Friends Of Adonis\"}],[\"$\",\"meta\",\"5\",{\"name\":\"keywords\",\"content\":\"AdonisJS,Adonis,TypeScript,Node.js,AdonisJS packages\"}],[\"$\",\"meta\",\"6\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"meta\",\"7\",{\"name\":\"googlebot\",\"content\":\"index, follow, max-image-preview:large, max-snippet:-1\"}],[\"$\",\"link\",\"8\",{\"rel\":\"canonical\",\"href\":\"https://friendsofadonis.com/docs/shopkeeper\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:title\",\"content\":\"AdonisJS Shopkeeper - Introduction\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:description\",\"content\":\"AdonisJS Shopkeeper gives Stripe billing a fluent, expressive API so you can add subscriptions, trials, one-off charges, and invoices in minutes.\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:url\",\"content\":\"https://friendsofadonis.com/docs/shopkeeper\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:site_name\",\"content\":\"Friends Of Adonis\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:locale\",\"content\":\"en_US\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:image\",\"content\":\"https://friendsofadonis.com/og/shopkeeper/image.webp\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"16\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"17\",{\"property\":\"og:image:alt\",\"content\":\"AdonisJS Shopkeeper - Introduction\"}],[\"$\",\"meta\",\"18\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"20\",{\"name\":\"twitter:site\",\"content\":\"@PaucotMartin\"}],[\"$\",\"meta\",\"21\",{\"name\":\"twitter:creator\",\"content\":\"@PaucotMartin\"}],[\"$\",\"meta\",\"22\",{\"name\":\"twitter:title\",\"content\":\"AdonisJS Shopkeeper - Introduction\"}],[\"$\",\"meta\",\"23\",{\"name\":\"twitter:description\",\"content\":\"AdonisJS Shopkeeper gives Stripe billing a fluent, expressive API so you can add subscriptions, trials, one-off charges, and invoices in minutes.\"}],[\"$\",\"meta\",\"24\",{\"name\":\"twitter:image\",\"content\":\"https://friendsofadonis.com/og/shopkeeper/image.webp\"}],[\"$\",\"meta\",\"25\",{\"name\":\"twitter:image:alt\",\"content\":\"AdonisJS Shopkeeper - Introduction\"}],[\"$\",\"meta\",\"26\",{\"name\":\"twitter:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"27\",{\"name\":\"twitter:image:height\",\"content\":\"630\"}]]\n"])</script>
35<script>self.__next_f.push([1,"40:[\"$\",\"a\",null,{\"href\":\"https://github.com/FriendsOfAdonis/FriendsOfAdonis\",\"rel\":\"noreferrer noopener\",\"target\":\"_blank\",\"className\":\"flex flex-col gap-1.5 p-2 rounded-lg text-sm text-fd-foreground/80 transition-colors lg:flex-row lg:items-center lg:justify-center hover:text-fd-accent-foreground hover:bg-fd-accent\",\"children\":[[\"$\",\"p\",null,{\"className\":\"flex items-center gap-2 truncate\",\"children\":[[\"$\",\"svg\",null,{\"className\":\"size-3.5\",\"fill\":\"currentColor\",\"viewBox\":\"0 0 24 24\",\"children\":[[\"$\",\"title\",null,{\"children\":\"GitHub\"}],[\"$\",\"path\",null,{\"d\":\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"}]]}],\"FriendsOfAdonis\"]}],[\"$\",\"p\",null,{\"className\":\"flex text-xs items-center gap-1 text-fd-muted-foreground\",\"children\":[[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-star size-3\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",\"r04s7s\",{\"d\":\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\"}],\"$undefined\"]}],\"164\"]}]]}]\n"])</script>
35</body></html>
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.